{-# OPTIONS_HADDOCK hide #-}
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE UnboxedTuples #-}
{-# LANGUAGE UnliftedNewtypes #-}
{-# LANGUAGE ViewPatterns #-}

-- |
-- Module: Crypto.Hash.SHA512.Internal
-- Copyright: (c) 2024 Jared Tobin
-- License: MIT
-- Maintainer: Jared Tobin <jared@ppad.tech>
--
-- SHA-512 internals.

module Crypto.Hash.SHA512.Internal (
  -- * Types
    Block(B, ..)
  , Registers(R, ..)
  , MAC(..)

  -- * Parsing
  , parse
  , parse_pad1
  , parse_pad2

  -- * Serializing
  , cat
  , cat_into

  -- * Hash function internals
  , update
  , iv

  -- * HMAC utilities
  , pad_registers
  , pad_registers_with_length
  , xor
  , parse_key

  -- * HMAC-DRBG utilities
  , parse_vsb
  , parse_pad1_vsb
  , parse_pad2_vsb

  -- * Pointer-based IO utilities
  , poke_registers
  ) where

import qualified Data.Bits as B
import qualified Data.ByteString as BS
import qualified Data.ByteString.Internal as BI
import qualified Data.ByteString.Unsafe as BU
import Data.Word (Word8, Word64)
import qualified GHC.IO (IO(..))
import GHC.Ptr (Ptr(..))
import GHC.Exts (Int#)
import qualified GHC.Exts as Exts
import qualified GHC.Word (Word64(..), Word8(..))

-- types ----------------------------------------------------------------------

-- | A message authentication code.
--
--   Note that you should compare MACs for equality using the 'Eq'
--   instance, which performs the comparison in constant time, instead
--   of unwrapping and comparing the underlying 'ByteStrings'.
--
--   >>> let foo@(MAC bs0) = hmac key "hi"
--   >>> let bar@(MAC bs1) = hmac key "there"
--   >>> foo == bar -- do this
--   False
--   >>> bs0 == bs1 -- don't do this
--   False
newtype MAC = MAC BS.ByteString
  deriving newtype Int -> MAC -> ShowS
[MAC] -> ShowS
MAC -> String
(Int -> MAC -> ShowS)
-> (MAC -> String) -> ([MAC] -> ShowS) -> Show MAC
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> MAC -> ShowS
showsPrec :: Int -> MAC -> ShowS
$cshow :: MAC -> String
show :: MAC -> String
$cshowList :: [MAC] -> ShowS
showList :: [MAC] -> ShowS
Show

instance Eq MAC where
  -- | A constant-time equality check for message authentication codes.
  --
  --   Runs in variable-time only for invalid inputs.
  (MAC a :: ByteString
a@(BI.PS ForeignPtr Word8
_ Int
_ Int
la)) == :: MAC -> MAC -> Bool
== (MAC b :: ByteString
b@(BI.PS ForeignPtr Word8
_ Int
_ Int
lb))
    | Int
la Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
lb  = Bool
False
    | Bool
otherwise = (Word8 -> Word8 -> Word8) -> Word8 -> ByteString -> Word8
forall a. (a -> Word8 -> a) -> a -> ByteString -> a
BS.foldl' Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
(B..|.) Word8
0 ((Word8 -> Word8 -> Word8) -> ByteString -> ByteString -> ByteString
BS.packZipWith Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
B.xor ByteString
a ByteString
b) Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
0

-- | SHA512 block.
newtype Block = Block
  (# Exts.Word64#, Exts.Word64#, Exts.Word64#, Exts.Word64#
  ,  Exts.Word64#, Exts.Word64#, Exts.Word64#, Exts.Word64#
  ,  Exts.Word64#, Exts.Word64#, Exts.Word64#, Exts.Word64#
  ,  Exts.Word64#, Exts.Word64#, Exts.Word64#, Exts.Word64#
  #)

pattern B
  :: Exts.Word64# -> Exts.Word64# -> Exts.Word64# -> Exts.Word64#
  -> Exts.Word64# -> Exts.Word64# -> Exts.Word64# -> Exts.Word64#
  -> Exts.Word64# -> Exts.Word64# -> Exts.Word64# -> Exts.Word64#
  -> Exts.Word64# -> Exts.Word64# -> Exts.Word64# -> Exts.Word64#
  -> Block
pattern $mB :: forall {r}.
Block
-> (Word64#
    -> Word64#
    -> Word64#
    -> Word64#
    -> Word64#
    -> Word64#
    -> Word64#
    -> Word64#
    -> Word64#
    -> Word64#
    -> Word64#
    -> Word64#
    -> Word64#
    -> Word64#
    -> Word64#
    -> Word64#
    -> r)
-> ((# #) -> r)
-> r
$bB :: Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Block
B w00 w01 w02 w03 w04 w05 w06 w07 w08 w09 w10 w11 w12 w13 w14 w15 =
  Block
    (# w00, w01, w02, w03, w04, w05, w06, w07
    ,  w08, w09, w10, w11, w12, w13, w14, w15
    #)
{-# COMPLETE B #-}

-- | SHA512 state.
newtype Registers = Registers
  (# Exts.Word64#, Exts.Word64#, Exts.Word64#, Exts.Word64#
  ,  Exts.Word64#, Exts.Word64#, Exts.Word64#, Exts.Word64#
  #)

pattern R
  :: Exts.Word64# -> Exts.Word64# -> Exts.Word64# -> Exts.Word64#
  -> Exts.Word64# -> Exts.Word64# -> Exts.Word64# -> Exts.Word64#
  -> Registers
pattern $mR :: forall {r}.
Registers
-> (Word64#
    -> Word64#
    -> Word64#
    -> Word64#
    -> Word64#
    -> Word64#
    -> Word64#
    -> Word64#
    -> r)
-> ((# #) -> r)
-> r
$bR :: Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
R w00 w01 w02 w03 w04 w05 w06 w07 = Registers
  (# w00, w01, w02, w03
  ,  w04, w05, w06, w07
  #)
{-# COMPLETE R #-}

-- parsing (nonfinal input) ---------------------------------------------------

-- | Given a bytestring and offset, parse a full block.
--
--   The length of the input is not checked.
parse :: BS.ByteString -> Int -> Block
parse :: ByteString -> Int -> Block
parse ByteString
bs Int
m = Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Block
B
  (ByteString -> Int -> Word64#
word64be ByteString
bs Int
m)
  (ByteString -> Int -> Word64#
word64be ByteString
bs (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
08))
  (ByteString -> Int -> Word64#
word64be ByteString
bs (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
16))
  (ByteString -> Int -> Word64#
word64be ByteString
bs (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
24))
  (ByteString -> Int -> Word64#
word64be ByteString
bs (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
32))
  (ByteString -> Int -> Word64#
word64be ByteString
bs (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
40))
  (ByteString -> Int -> Word64#
word64be ByteString
bs (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
48))
  (ByteString -> Int -> Word64#
word64be ByteString
bs (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
56))
  (ByteString -> Int -> Word64#
word64be ByteString
bs (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
64))
  (ByteString -> Int -> Word64#
word64be ByteString
bs (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
72))
  (ByteString -> Int -> Word64#
word64be ByteString
bs (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
80))
  (ByteString -> Int -> Word64#
word64be ByteString
bs (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
88))
  (ByteString -> Int -> Word64#
word64be ByteString
bs (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
96))
  (ByteString -> Int -> Word64#
word64be ByteString
bs (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
104))
  (ByteString -> Int -> Word64#
word64be ByteString
bs (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
112))
  (ByteString -> Int -> Word64#
word64be ByteString
bs (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
120))
{-# INLINE parse #-}

-- | Parse the 64-bit word encoded at the given offset.
--
--   The length of the input is not checked.
word64be :: BS.ByteString -> Int -> Exts.Word64#
word64be :: ByteString -> Int -> Word64#
word64be ByteString
bs Int
m =
  let !(GHC.Word.W8# Word8#
r0) = ByteString -> Int -> Word8
BU.unsafeIndex ByteString
bs Int
m
      !(GHC.Word.W8# Word8#
r1) = ByteString -> Int -> Word8
BU.unsafeIndex ByteString
bs (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
      !(GHC.Word.W8# Word8#
r2) = ByteString -> Int -> Word8
BU.unsafeIndex ByteString
bs (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
2)
      !(GHC.Word.W8# Word8#
r3) = ByteString -> Int -> Word8
BU.unsafeIndex ByteString
bs (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
3)
      !(GHC.Word.W8# Word8#
r4) = ByteString -> Int -> Word8
BU.unsafeIndex ByteString
bs (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
4)
      !(GHC.Word.W8# Word8#
r5) = ByteString -> Int -> Word8
BU.unsafeIndex ByteString
bs (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
5)
      !(GHC.Word.W8# Word8#
r6) = ByteString -> Int -> Word8
BU.unsafeIndex ByteString
bs (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
6)
      !(GHC.Word.W8# Word8#
r7) = ByteString -> Int -> Word8
BU.unsafeIndex ByteString
bs (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
7)
      !w0 :: Word#
w0 = Word8# -> Word#
Exts.word8ToWord# Word8#
r0
      !w1 :: Word#
w1 = Word8# -> Word#
Exts.word8ToWord# Word8#
r1
      !w2 :: Word#
w2 = Word8# -> Word#
Exts.word8ToWord# Word8#
r2
      !w3 :: Word#
w3 = Word8# -> Word#
Exts.word8ToWord# Word8#
r3
      !w4 :: Word#
w4 = Word8# -> Word#
Exts.word8ToWord# Word8#
r4
      !w5 :: Word#
w5 = Word8# -> Word#
Exts.word8ToWord# Word8#
r5
      !w6 :: Word#
w6 = Word8# -> Word#
Exts.word8ToWord# Word8#
r6
      !w7 :: Word#
w7 = Word8# -> Word#
Exts.word8ToWord# Word8#
r7
      !s0 :: Word#
s0 = Word# -> Int# -> Word#
Exts.uncheckedShiftL# Word#
w0 Int#
56#
      !s1 :: Word#
s1 = Word# -> Int# -> Word#
Exts.uncheckedShiftL# Word#
w1 Int#
48#
      !s2 :: Word#
s2 = Word# -> Int# -> Word#
Exts.uncheckedShiftL# Word#
w2 Int#
40#
      !s3 :: Word#
s3 = Word# -> Int# -> Word#
Exts.uncheckedShiftL# Word#
w3 Int#
32#
      !s4 :: Word#
s4 = Word# -> Int# -> Word#
Exts.uncheckedShiftL# Word#
w4 Int#
24#
      !s5 :: Word#
s5 = Word# -> Int# -> Word#
Exts.uncheckedShiftL# Word#
w5 Int#
16#
      !s6 :: Word#
s6 = Word# -> Int# -> Word#
Exts.uncheckedShiftL# Word#
w6 Int#
8#
  in  Word# -> Word64#
Exts.wordToWord64#
        (Word#
s0 Word# -> Word# -> Word#
`Exts.or#` Word#
s1 Word# -> Word# -> Word#
`Exts.or#` Word#
s2 Word# -> Word# -> Word#
`Exts.or#` Word#
s3 Word# -> Word# -> Word#
`Exts.or#`
         Word#
s4 Word# -> Word# -> Word#
`Exts.or#` Word#
s5 Word# -> Word# -> Word#
`Exts.or#` Word#
s6 Word# -> Word# -> Word#
`Exts.or#` Word#
w7)
{-# INLINE word64be #-}

-- parsing (final input) ------------------------------------------------------

-- | Parse the final chunk of an input message, assuming it is less than
--   112 bytes in length (unchecked!).
--
--   Returns one block consisting of the chunk and padding.
parse_pad1
  :: BS.ByteString -- ^ final input chunk (< 112 bytes)
  -> Word64        -- ^ length of all input
  -> Block         -- ^ resulting block
parse_pad1 :: ByteString -> Word64 -> Block
parse_pad1 ByteString
bs Word64
l =
  let !bits :: Word64
bits = Word64
l Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
* Word64
8
      !(GHC.Word.W64# Word64#
llo) = Word64
bits
  in  Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Block
B (ByteString -> Int -> Word64#
w64_at ByteString
bs Int
000) (ByteString -> Int -> Word64#
w64_at ByteString
bs Int
008) (ByteString -> Int -> Word64#
w64_at ByteString
bs Int
016) (ByteString -> Int -> Word64#
w64_at ByteString
bs Int
024)
        (ByteString -> Int -> Word64#
w64_at ByteString
bs Int
032) (ByteString -> Int -> Word64#
w64_at ByteString
bs Int
040) (ByteString -> Int -> Word64#
w64_at ByteString
bs Int
048) (ByteString -> Int -> Word64#
w64_at ByteString
bs Int
056)
        (ByteString -> Int -> Word64#
w64_at ByteString
bs Int
064) (ByteString -> Int -> Word64#
w64_at ByteString
bs Int
072) (ByteString -> Int -> Word64#
w64_at ByteString
bs Int
080) (ByteString -> Int -> Word64#
w64_at ByteString
bs Int
088)
        (ByteString -> Int -> Word64#
w64_at ByteString
bs Int
096) (ByteString -> Int -> Word64#
w64_at ByteString
bs Int
104) (Word# -> Word64#
Exts.wordToWord64# Word#
0##) Word64#
llo
{-# INLINABLE parse_pad1 #-}

-- | Parse the final chunk of an input message, assuming it is at least 112
--   bytes in length (unchecked!).
--
--   Returns two blocks consisting of the chunk and padding.
parse_pad2
  :: BS.ByteString       -- ^ final input chunk (>= 112 bytes)
  -> Word64              -- ^ length of all input
  -> (# Block, Block #)  -- ^ resulting blocks
parse_pad2 :: ByteString -> Word64 -> (# Block, Block #)
parse_pad2 ByteString
bs Word64
l =
  let !bits :: Word64
bits = Word64
l Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
* Word64
8
      !z :: Word64#
z    = Word# -> Word64#
Exts.wordToWord64# Word#
0##
      !(GHC.Word.W64# Word64#
llo) = Word64
bits
      !block0 :: Block
block0 = Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Block
B
        (ByteString -> Int -> Word64#
w64_at ByteString
bs Int
000) (ByteString -> Int -> Word64#
w64_at ByteString
bs Int
008) (ByteString -> Int -> Word64#
w64_at ByteString
bs Int
016) (ByteString -> Int -> Word64#
w64_at ByteString
bs Int
024)
        (ByteString -> Int -> Word64#
w64_at ByteString
bs Int
032) (ByteString -> Int -> Word64#
w64_at ByteString
bs Int
040) (ByteString -> Int -> Word64#
w64_at ByteString
bs Int
048) (ByteString -> Int -> Word64#
w64_at ByteString
bs Int
056)
        (ByteString -> Int -> Word64#
w64_at ByteString
bs Int
064) (ByteString -> Int -> Word64#
w64_at ByteString
bs Int
072) (ByteString -> Int -> Word64#
w64_at ByteString
bs Int
080) (ByteString -> Int -> Word64#
w64_at ByteString
bs Int
088)
        (ByteString -> Int -> Word64#
w64_at ByteString
bs Int
096) (ByteString -> Int -> Word64#
w64_at ByteString
bs Int
104) (ByteString -> Int -> Word64#
w64_at ByteString
bs Int
112) (ByteString -> Int -> Word64#
w64_at ByteString
bs Int
120)
      !block1 :: Block
block1 = Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Block
B Word64#
z Word64#
z Word64#
z Word64#
z Word64#
z Word64#
z Word64#
z Word64#
z Word64#
z Word64#
z Word64#
z Word64#
z Word64#
z Word64#
z Word64#
z Word64#
llo
  in  (# Block
block0, Block
block1 #)
{-# INLINABLE parse_pad2 #-}

-- | Return the byte at offset 'i', or a padding separator or zero byte
--   beyond the input bounds, as an unboxed word.
w8_as_w64_at
  :: BS.ByteString  -- ^ input chunk
  -> Int            -- ^ offset
  -> Exts.Word#
w8_as_w64_at :: ByteString -> Int -> Word#
w8_as_w64_at bs :: ByteString
bs@(BI.PS ForeignPtr Word8
_ Int
_ Int
l) Int
i = case Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Int
i Int
l of
  Ordering
LT -> let !(GHC.Word.W8# Word8#
w) = ByteString -> Int -> Word8
BU.unsafeIndex ByteString
bs Int
i
        in  Word8# -> Word#
Exts.word8ToWord# Word8#
w
  Ordering
EQ -> Word#
0x80##
  Ordering
_  -> Word#
0x00##
{-# INLINE w8_as_w64_at #-}

-- | Return the 64-bit word encoded by eight consecutive bytes at the
--   provided offset.
w64_at
  :: BS.ByteString
  -> Int
  -> Exts.Word64#
w64_at :: ByteString -> Int -> Word64#
w64_at ByteString
bs Int
i =
  let !w0 :: Word#
w0 = ByteString -> Int -> Word#
w8_as_w64_at ByteString
bs Int
i       Word# -> Int# -> Word#
`Exts.uncheckedShiftL#` Int#
56#
      !w1 :: Word#
w1 = ByteString -> Int -> Word#
w8_as_w64_at ByteString
bs (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) Word# -> Int# -> Word#
`Exts.uncheckedShiftL#` Int#
48#
      !w2 :: Word#
w2 = ByteString -> Int -> Word#
w8_as_w64_at ByteString
bs (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
2) Word# -> Int# -> Word#
`Exts.uncheckedShiftL#` Int#
40#
      !w3 :: Word#
w3 = ByteString -> Int -> Word#
w8_as_w64_at ByteString
bs (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
3) Word# -> Int# -> Word#
`Exts.uncheckedShiftL#` Int#
32#
      !w4 :: Word#
w4 = ByteString -> Int -> Word#
w8_as_w64_at ByteString
bs (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
4) Word# -> Int# -> Word#
`Exts.uncheckedShiftL#` Int#
24#
      !w5 :: Word#
w5 = ByteString -> Int -> Word#
w8_as_w64_at ByteString
bs (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
5) Word# -> Int# -> Word#
`Exts.uncheckedShiftL#` Int#
16#
      !w6 :: Word#
w6 = ByteString -> Int -> Word#
w8_as_w64_at ByteString
bs (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
6) Word# -> Int# -> Word#
`Exts.uncheckedShiftL#` Int#
08#
      !w7 :: Word#
w7 = ByteString -> Int -> Word#
w8_as_w64_at ByteString
bs (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
7)
  in  Word# -> Word64#
Exts.wordToWord64#
        (Word#
w0 Word# -> Word# -> Word#
`Exts.or#` Word#
w1 Word# -> Word# -> Word#
`Exts.or#` Word#
w2 Word# -> Word# -> Word#
`Exts.or#` Word#
w3 Word# -> Word# -> Word#
`Exts.or#`
         Word#
w4 Word# -> Word# -> Word#
`Exts.or#` Word#
w5 Word# -> Word# -> Word#
`Exts.or#` Word#
w6 Word# -> Word# -> Word#
`Exts.or#` Word#
w7)
{-# INLINE w64_at #-}

-- update ---------------------------------------------------------------------

-- | Update register state, given new input block.
update :: Registers -> Block -> Registers
update :: Registers -> Block -> Registers
update
    (R Word64#
h0 Word64#
h1 Word64#
h2 Word64#
h3 Word64#
h4 Word64#
h5 Word64#
h6 Word64#
h7)
    (B Word64#
b00 Word64#
b01 Word64#
b02 Word64#
b03 Word64#
b04 Word64#
b05 Word64#
b06 Word64#
b07 Word64#
b08 Word64#
b09 Word64#
b10 Word64#
b11 Word64#
b12 Word64#
b13 Word64#
b14 Word64#
b15)
  =
  let -- message schedule
      !w00 :: Word64#
w00 = Word64#
b00; !w01 :: Word64#
w01 = Word64#
b01; !w02 :: Word64#
w02 = Word64#
b02; !w03 :: Word64#
w03 = Word64#
b03
      !w04 :: Word64#
w04 = Word64#
b04; !w05 :: Word64#
w05 = Word64#
b05; !w06 :: Word64#
w06 = Word64#
b06; !w07 :: Word64#
w07 = Word64#
b07
      !w08 :: Word64#
w08 = Word64#
b08; !w09 :: Word64#
w09 = Word64#
b09; !w10 :: Word64#
w10 = Word64#
b10; !w11 :: Word64#
w11 = Word64#
b11
      !w12 :: Word64#
w12 = Word64#
b12; !w13 :: Word64#
w13 = Word64#
b13; !w14 :: Word64#
w14 = Word64#
b14; !w15 :: Word64#
w15 = Word64#
b15
      !w16 :: Word64#
w16 = Word64# -> Word64#
ssig1# Word64#
w14 Word64# -> Word64# -> Word64#
`p` Word64#
w09 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w01 Word64# -> Word64# -> Word64#
`p` Word64#
w00
      !w17 :: Word64#
w17 = Word64# -> Word64#
ssig1# Word64#
w15 Word64# -> Word64# -> Word64#
`p` Word64#
w10 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w02 Word64# -> Word64# -> Word64#
`p` Word64#
w01
      !w18 :: Word64#
w18 = Word64# -> Word64#
ssig1# Word64#
w16 Word64# -> Word64# -> Word64#
`p` Word64#
w11 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w03 Word64# -> Word64# -> Word64#
`p` Word64#
w02
      !w19 :: Word64#
w19 = Word64# -> Word64#
ssig1# Word64#
w17 Word64# -> Word64# -> Word64#
`p` Word64#
w12 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w04 Word64# -> Word64# -> Word64#
`p` Word64#
w03
      !w20 :: Word64#
w20 = Word64# -> Word64#
ssig1# Word64#
w18 Word64# -> Word64# -> Word64#
`p` Word64#
w13 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w05 Word64# -> Word64# -> Word64#
`p` Word64#
w04
      !w21 :: Word64#
w21 = Word64# -> Word64#
ssig1# Word64#
w19 Word64# -> Word64# -> Word64#
`p` Word64#
w14 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w06 Word64# -> Word64# -> Word64#
`p` Word64#
w05
      !w22 :: Word64#
w22 = Word64# -> Word64#
ssig1# Word64#
w20 Word64# -> Word64# -> Word64#
`p` Word64#
w15 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w07 Word64# -> Word64# -> Word64#
`p` Word64#
w06
      !w23 :: Word64#
w23 = Word64# -> Word64#
ssig1# Word64#
w21 Word64# -> Word64# -> Word64#
`p` Word64#
w16 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w08 Word64# -> Word64# -> Word64#
`p` Word64#
w07
      !w24 :: Word64#
w24 = Word64# -> Word64#
ssig1# Word64#
w22 Word64# -> Word64# -> Word64#
`p` Word64#
w17 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w09 Word64# -> Word64# -> Word64#
`p` Word64#
w08
      !w25 :: Word64#
w25 = Word64# -> Word64#
ssig1# Word64#
w23 Word64# -> Word64# -> Word64#
`p` Word64#
w18 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w10 Word64# -> Word64# -> Word64#
`p` Word64#
w09
      !w26 :: Word64#
w26 = Word64# -> Word64#
ssig1# Word64#
w24 Word64# -> Word64# -> Word64#
`p` Word64#
w19 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w11 Word64# -> Word64# -> Word64#
`p` Word64#
w10
      !w27 :: Word64#
w27 = Word64# -> Word64#
ssig1# Word64#
w25 Word64# -> Word64# -> Word64#
`p` Word64#
w20 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w12 Word64# -> Word64# -> Word64#
`p` Word64#
w11
      !w28 :: Word64#
w28 = Word64# -> Word64#
ssig1# Word64#
w26 Word64# -> Word64# -> Word64#
`p` Word64#
w21 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w13 Word64# -> Word64# -> Word64#
`p` Word64#
w12
      !w29 :: Word64#
w29 = Word64# -> Word64#
ssig1# Word64#
w27 Word64# -> Word64# -> Word64#
`p` Word64#
w22 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w14 Word64# -> Word64# -> Word64#
`p` Word64#
w13
      !w30 :: Word64#
w30 = Word64# -> Word64#
ssig1# Word64#
w28 Word64# -> Word64# -> Word64#
`p` Word64#
w23 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w15 Word64# -> Word64# -> Word64#
`p` Word64#
w14
      !w31 :: Word64#
w31 = Word64# -> Word64#
ssig1# Word64#
w29 Word64# -> Word64# -> Word64#
`p` Word64#
w24 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w16 Word64# -> Word64# -> Word64#
`p` Word64#
w15
      !w32 :: Word64#
w32 = Word64# -> Word64#
ssig1# Word64#
w30 Word64# -> Word64# -> Word64#
`p` Word64#
w25 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w17 Word64# -> Word64# -> Word64#
`p` Word64#
w16
      !w33 :: Word64#
w33 = Word64# -> Word64#
ssig1# Word64#
w31 Word64# -> Word64# -> Word64#
`p` Word64#
w26 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w18 Word64# -> Word64# -> Word64#
`p` Word64#
w17
      !w34 :: Word64#
w34 = Word64# -> Word64#
ssig1# Word64#
w32 Word64# -> Word64# -> Word64#
`p` Word64#
w27 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w19 Word64# -> Word64# -> Word64#
`p` Word64#
w18
      !w35 :: Word64#
w35 = Word64# -> Word64#
ssig1# Word64#
w33 Word64# -> Word64# -> Word64#
`p` Word64#
w28 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w20 Word64# -> Word64# -> Word64#
`p` Word64#
w19
      !w36 :: Word64#
w36 = Word64# -> Word64#
ssig1# Word64#
w34 Word64# -> Word64# -> Word64#
`p` Word64#
w29 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w21 Word64# -> Word64# -> Word64#
`p` Word64#
w20
      !w37 :: Word64#
w37 = Word64# -> Word64#
ssig1# Word64#
w35 Word64# -> Word64# -> Word64#
`p` Word64#
w30 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w22 Word64# -> Word64# -> Word64#
`p` Word64#
w21
      !w38 :: Word64#
w38 = Word64# -> Word64#
ssig1# Word64#
w36 Word64# -> Word64# -> Word64#
`p` Word64#
w31 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w23 Word64# -> Word64# -> Word64#
`p` Word64#
w22
      !w39 :: Word64#
w39 = Word64# -> Word64#
ssig1# Word64#
w37 Word64# -> Word64# -> Word64#
`p` Word64#
w32 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w24 Word64# -> Word64# -> Word64#
`p` Word64#
w23
      !w40 :: Word64#
w40 = Word64# -> Word64#
ssig1# Word64#
w38 Word64# -> Word64# -> Word64#
`p` Word64#
w33 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w25 Word64# -> Word64# -> Word64#
`p` Word64#
w24
      !w41 :: Word64#
w41 = Word64# -> Word64#
ssig1# Word64#
w39 Word64# -> Word64# -> Word64#
`p` Word64#
w34 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w26 Word64# -> Word64# -> Word64#
`p` Word64#
w25
      !w42 :: Word64#
w42 = Word64# -> Word64#
ssig1# Word64#
w40 Word64# -> Word64# -> Word64#
`p` Word64#
w35 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w27 Word64# -> Word64# -> Word64#
`p` Word64#
w26
      !w43 :: Word64#
w43 = Word64# -> Word64#
ssig1# Word64#
w41 Word64# -> Word64# -> Word64#
`p` Word64#
w36 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w28 Word64# -> Word64# -> Word64#
`p` Word64#
w27
      !w44 :: Word64#
w44 = Word64# -> Word64#
ssig1# Word64#
w42 Word64# -> Word64# -> Word64#
`p` Word64#
w37 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w29 Word64# -> Word64# -> Word64#
`p` Word64#
w28
      !w45 :: Word64#
w45 = Word64# -> Word64#
ssig1# Word64#
w43 Word64# -> Word64# -> Word64#
`p` Word64#
w38 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w30 Word64# -> Word64# -> Word64#
`p` Word64#
w29
      !w46 :: Word64#
w46 = Word64# -> Word64#
ssig1# Word64#
w44 Word64# -> Word64# -> Word64#
`p` Word64#
w39 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w31 Word64# -> Word64# -> Word64#
`p` Word64#
w30
      !w47 :: Word64#
w47 = Word64# -> Word64#
ssig1# Word64#
w45 Word64# -> Word64# -> Word64#
`p` Word64#
w40 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w32 Word64# -> Word64# -> Word64#
`p` Word64#
w31
      !w48 :: Word64#
w48 = Word64# -> Word64#
ssig1# Word64#
w46 Word64# -> Word64# -> Word64#
`p` Word64#
w41 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w33 Word64# -> Word64# -> Word64#
`p` Word64#
w32
      !w49 :: Word64#
w49 = Word64# -> Word64#
ssig1# Word64#
w47 Word64# -> Word64# -> Word64#
`p` Word64#
w42 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w34 Word64# -> Word64# -> Word64#
`p` Word64#
w33
      !w50 :: Word64#
w50 = Word64# -> Word64#
ssig1# Word64#
w48 Word64# -> Word64# -> Word64#
`p` Word64#
w43 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w35 Word64# -> Word64# -> Word64#
`p` Word64#
w34
      !w51 :: Word64#
w51 = Word64# -> Word64#
ssig1# Word64#
w49 Word64# -> Word64# -> Word64#
`p` Word64#
w44 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w36 Word64# -> Word64# -> Word64#
`p` Word64#
w35
      !w52 :: Word64#
w52 = Word64# -> Word64#
ssig1# Word64#
w50 Word64# -> Word64# -> Word64#
`p` Word64#
w45 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w37 Word64# -> Word64# -> Word64#
`p` Word64#
w36
      !w53 :: Word64#
w53 = Word64# -> Word64#
ssig1# Word64#
w51 Word64# -> Word64# -> Word64#
`p` Word64#
w46 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w38 Word64# -> Word64# -> Word64#
`p` Word64#
w37
      !w54 :: Word64#
w54 = Word64# -> Word64#
ssig1# Word64#
w52 Word64# -> Word64# -> Word64#
`p` Word64#
w47 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w39 Word64# -> Word64# -> Word64#
`p` Word64#
w38
      !w55 :: Word64#
w55 = Word64# -> Word64#
ssig1# Word64#
w53 Word64# -> Word64# -> Word64#
`p` Word64#
w48 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w40 Word64# -> Word64# -> Word64#
`p` Word64#
w39
      !w56 :: Word64#
w56 = Word64# -> Word64#
ssig1# Word64#
w54 Word64# -> Word64# -> Word64#
`p` Word64#
w49 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w41 Word64# -> Word64# -> Word64#
`p` Word64#
w40
      !w57 :: Word64#
w57 = Word64# -> Word64#
ssig1# Word64#
w55 Word64# -> Word64# -> Word64#
`p` Word64#
w50 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w42 Word64# -> Word64# -> Word64#
`p` Word64#
w41
      !w58 :: Word64#
w58 = Word64# -> Word64#
ssig1# Word64#
w56 Word64# -> Word64# -> Word64#
`p` Word64#
w51 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w43 Word64# -> Word64# -> Word64#
`p` Word64#
w42
      !w59 :: Word64#
w59 = Word64# -> Word64#
ssig1# Word64#
w57 Word64# -> Word64# -> Word64#
`p` Word64#
w52 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w44 Word64# -> Word64# -> Word64#
`p` Word64#
w43
      !w60 :: Word64#
w60 = Word64# -> Word64#
ssig1# Word64#
w58 Word64# -> Word64# -> Word64#
`p` Word64#
w53 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w45 Word64# -> Word64# -> Word64#
`p` Word64#
w44
      !w61 :: Word64#
w61 = Word64# -> Word64#
ssig1# Word64#
w59 Word64# -> Word64# -> Word64#
`p` Word64#
w54 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w46 Word64# -> Word64# -> Word64#
`p` Word64#
w45
      !w62 :: Word64#
w62 = Word64# -> Word64#
ssig1# Word64#
w60 Word64# -> Word64# -> Word64#
`p` Word64#
w55 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w47 Word64# -> Word64# -> Word64#
`p` Word64#
w46
      !w63 :: Word64#
w63 = Word64# -> Word64#
ssig1# Word64#
w61 Word64# -> Word64# -> Word64#
`p` Word64#
w56 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w48 Word64# -> Word64# -> Word64#
`p` Word64#
w47
      !w64 :: Word64#
w64 = Word64# -> Word64#
ssig1# Word64#
w62 Word64# -> Word64# -> Word64#
`p` Word64#
w57 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w49 Word64# -> Word64# -> Word64#
`p` Word64#
w48
      !w65 :: Word64#
w65 = Word64# -> Word64#
ssig1# Word64#
w63 Word64# -> Word64# -> Word64#
`p` Word64#
w58 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w50 Word64# -> Word64# -> Word64#
`p` Word64#
w49
      !w66 :: Word64#
w66 = Word64# -> Word64#
ssig1# Word64#
w64 Word64# -> Word64# -> Word64#
`p` Word64#
w59 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w51 Word64# -> Word64# -> Word64#
`p` Word64#
w50
      !w67 :: Word64#
w67 = Word64# -> Word64#
ssig1# Word64#
w65 Word64# -> Word64# -> Word64#
`p` Word64#
w60 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w52 Word64# -> Word64# -> Word64#
`p` Word64#
w51
      !w68 :: Word64#
w68 = Word64# -> Word64#
ssig1# Word64#
w66 Word64# -> Word64# -> Word64#
`p` Word64#
w61 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w53 Word64# -> Word64# -> Word64#
`p` Word64#
w52
      !w69 :: Word64#
w69 = Word64# -> Word64#
ssig1# Word64#
w67 Word64# -> Word64# -> Word64#
`p` Word64#
w62 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w54 Word64# -> Word64# -> Word64#
`p` Word64#
w53
      !w70 :: Word64#
w70 = Word64# -> Word64#
ssig1# Word64#
w68 Word64# -> Word64# -> Word64#
`p` Word64#
w63 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w55 Word64# -> Word64# -> Word64#
`p` Word64#
w54
      !w71 :: Word64#
w71 = Word64# -> Word64#
ssig1# Word64#
w69 Word64# -> Word64# -> Word64#
`p` Word64#
w64 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w56 Word64# -> Word64# -> Word64#
`p` Word64#
w55
      !w72 :: Word64#
w72 = Word64# -> Word64#
ssig1# Word64#
w70 Word64# -> Word64# -> Word64#
`p` Word64#
w65 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w57 Word64# -> Word64# -> Word64#
`p` Word64#
w56
      !w73 :: Word64#
w73 = Word64# -> Word64#
ssig1# Word64#
w71 Word64# -> Word64# -> Word64#
`p` Word64#
w66 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w58 Word64# -> Word64# -> Word64#
`p` Word64#
w57
      !w74 :: Word64#
w74 = Word64# -> Word64#
ssig1# Word64#
w72 Word64# -> Word64# -> Word64#
`p` Word64#
w67 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w59 Word64# -> Word64# -> Word64#
`p` Word64#
w58
      !w75 :: Word64#
w75 = Word64# -> Word64#
ssig1# Word64#
w73 Word64# -> Word64# -> Word64#
`p` Word64#
w68 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w60 Word64# -> Word64# -> Word64#
`p` Word64#
w59
      !w76 :: Word64#
w76 = Word64# -> Word64#
ssig1# Word64#
w74 Word64# -> Word64# -> Word64#
`p` Word64#
w69 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w61 Word64# -> Word64# -> Word64#
`p` Word64#
w60
      !w77 :: Word64#
w77 = Word64# -> Word64#
ssig1# Word64#
w75 Word64# -> Word64# -> Word64#
`p` Word64#
w70 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w62 Word64# -> Word64# -> Word64#
`p` Word64#
w61
      !w78 :: Word64#
w78 = Word64# -> Word64#
ssig1# Word64#
w76 Word64# -> Word64# -> Word64#
`p` Word64#
w71 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w63 Word64# -> Word64# -> Word64#
`p` Word64#
w62
      !w79 :: Word64#
w79 = Word64# -> Word64#
ssig1# Word64#
w77 Word64# -> Word64# -> Word64#
`p` Word64#
w72 Word64# -> Word64# -> Word64#
`p` Word64# -> Word64#
ssig0# Word64#
w64 Word64# -> Word64# -> Word64#
`p` Word64#
w63

      -- rounds (constants are cube roots of first 80 primes)
      !(R Word64#
s00a Word64#
s00b Word64#
s00c Word64#
s00d Word64#
s00e Word64#
s00f Word64#
s00g Word64#
s00h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
h0 Word64#
h1 Word64#
h2 Word64#
h3 Word64#
h4 Word64#
h5 Word64#
h6 Word64#
h7 (Word# -> Word64#
k Word#
0x428a2f98d728ae22##) Word64#
w00
      !(R Word64#
s01a Word64#
s01b Word64#
s01c Word64#
s01d Word64#
s01e Word64#
s01f Word64#
s01g Word64#
s01h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s00a Word64#
s00b Word64#
s00c Word64#
s00d Word64#
s00e Word64#
s00f Word64#
s00g Word64#
s00h
          (Word# -> Word64#
k Word#
0x7137449123ef65cd##) Word64#
w01
      !(R Word64#
s02a Word64#
s02b Word64#
s02c Word64#
s02d Word64#
s02e Word64#
s02f Word64#
s02g Word64#
s02h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s01a Word64#
s01b Word64#
s01c Word64#
s01d Word64#
s01e Word64#
s01f Word64#
s01g Word64#
s01h
          (Word# -> Word64#
k Word#
0xb5c0fbcfec4d3b2f##) Word64#
w02
      !(R Word64#
s03a Word64#
s03b Word64#
s03c Word64#
s03d Word64#
s03e Word64#
s03f Word64#
s03g Word64#
s03h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s02a Word64#
s02b Word64#
s02c Word64#
s02d Word64#
s02e Word64#
s02f Word64#
s02g Word64#
s02h
          (Word# -> Word64#
k Word#
0xe9b5dba58189dbbc##) Word64#
w03
      !(R Word64#
s04a Word64#
s04b Word64#
s04c Word64#
s04d Word64#
s04e Word64#
s04f Word64#
s04g Word64#
s04h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s03a Word64#
s03b Word64#
s03c Word64#
s03d Word64#
s03e Word64#
s03f Word64#
s03g Word64#
s03h
          (Word# -> Word64#
k Word#
0x3956c25bf348b538##) Word64#
w04
      !(R Word64#
s05a Word64#
s05b Word64#
s05c Word64#
s05d Word64#
s05e Word64#
s05f Word64#
s05g Word64#
s05h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s04a Word64#
s04b Word64#
s04c Word64#
s04d Word64#
s04e Word64#
s04f Word64#
s04g Word64#
s04h
          (Word# -> Word64#
k Word#
0x59f111f1b605d019##) Word64#
w05
      !(R Word64#
s06a Word64#
s06b Word64#
s06c Word64#
s06d Word64#
s06e Word64#
s06f Word64#
s06g Word64#
s06h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s05a Word64#
s05b Word64#
s05c Word64#
s05d Word64#
s05e Word64#
s05f Word64#
s05g Word64#
s05h
          (Word# -> Word64#
k Word#
0x923f82a4af194f9b##) Word64#
w06
      !(R Word64#
s07a Word64#
s07b Word64#
s07c Word64#
s07d Word64#
s07e Word64#
s07f Word64#
s07g Word64#
s07h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s06a Word64#
s06b Word64#
s06c Word64#
s06d Word64#
s06e Word64#
s06f Word64#
s06g Word64#
s06h
          (Word# -> Word64#
k Word#
0xab1c5ed5da6d8118##) Word64#
w07
      !(R Word64#
s08a Word64#
s08b Word64#
s08c Word64#
s08d Word64#
s08e Word64#
s08f Word64#
s08g Word64#
s08h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s07a Word64#
s07b Word64#
s07c Word64#
s07d Word64#
s07e Word64#
s07f Word64#
s07g Word64#
s07h
          (Word# -> Word64#
k Word#
0xd807aa98a3030242##) Word64#
w08
      !(R Word64#
s09a Word64#
s09b Word64#
s09c Word64#
s09d Word64#
s09e Word64#
s09f Word64#
s09g Word64#
s09h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s08a Word64#
s08b Word64#
s08c Word64#
s08d Word64#
s08e Word64#
s08f Word64#
s08g Word64#
s08h
          (Word# -> Word64#
k Word#
0x12835b0145706fbe##) Word64#
w09
      !(R Word64#
s10a Word64#
s10b Word64#
s10c Word64#
s10d Word64#
s10e Word64#
s10f Word64#
s10g Word64#
s10h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s09a Word64#
s09b Word64#
s09c Word64#
s09d Word64#
s09e Word64#
s09f Word64#
s09g Word64#
s09h
          (Word# -> Word64#
k Word#
0x243185be4ee4b28c##) Word64#
w10
      !(R Word64#
s11a Word64#
s11b Word64#
s11c Word64#
s11d Word64#
s11e Word64#
s11f Word64#
s11g Word64#
s11h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s10a Word64#
s10b Word64#
s10c Word64#
s10d Word64#
s10e Word64#
s10f Word64#
s10g Word64#
s10h
          (Word# -> Word64#
k Word#
0x550c7dc3d5ffb4e2##) Word64#
w11
      !(R Word64#
s12a Word64#
s12b Word64#
s12c Word64#
s12d Word64#
s12e Word64#
s12f Word64#
s12g Word64#
s12h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s11a Word64#
s11b Word64#
s11c Word64#
s11d Word64#
s11e Word64#
s11f Word64#
s11g Word64#
s11h
          (Word# -> Word64#
k Word#
0x72be5d74f27b896f##) Word64#
w12
      !(R Word64#
s13a Word64#
s13b Word64#
s13c Word64#
s13d Word64#
s13e Word64#
s13f Word64#
s13g Word64#
s13h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s12a Word64#
s12b Word64#
s12c Word64#
s12d Word64#
s12e Word64#
s12f Word64#
s12g Word64#
s12h
          (Word# -> Word64#
k Word#
0x80deb1fe3b1696b1##) Word64#
w13
      !(R Word64#
s14a Word64#
s14b Word64#
s14c Word64#
s14d Word64#
s14e Word64#
s14f Word64#
s14g Word64#
s14h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s13a Word64#
s13b Word64#
s13c Word64#
s13d Word64#
s13e Word64#
s13f Word64#
s13g Word64#
s13h
          (Word# -> Word64#
k Word#
0x9bdc06a725c71235##) Word64#
w14
      !(R Word64#
s15a Word64#
s15b Word64#
s15c Word64#
s15d Word64#
s15e Word64#
s15f Word64#
s15g Word64#
s15h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s14a Word64#
s14b Word64#
s14c Word64#
s14d Word64#
s14e Word64#
s14f Word64#
s14g Word64#
s14h
          (Word# -> Word64#
k Word#
0xc19bf174cf692694##) Word64#
w15
      !(R Word64#
s16a Word64#
s16b Word64#
s16c Word64#
s16d Word64#
s16e Word64#
s16f Word64#
s16g Word64#
s16h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s15a Word64#
s15b Word64#
s15c Word64#
s15d Word64#
s15e Word64#
s15f Word64#
s15g Word64#
s15h
          (Word# -> Word64#
k Word#
0xe49b69c19ef14ad2##) Word64#
w16
      !(R Word64#
s17a Word64#
s17b Word64#
s17c Word64#
s17d Word64#
s17e Word64#
s17f Word64#
s17g Word64#
s17h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s16a Word64#
s16b Word64#
s16c Word64#
s16d Word64#
s16e Word64#
s16f Word64#
s16g Word64#
s16h
          (Word# -> Word64#
k Word#
0xefbe4786384f25e3##) Word64#
w17
      !(R Word64#
s18a Word64#
s18b Word64#
s18c Word64#
s18d Word64#
s18e Word64#
s18f Word64#
s18g Word64#
s18h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s17a Word64#
s17b Word64#
s17c Word64#
s17d Word64#
s17e Word64#
s17f Word64#
s17g Word64#
s17h
          (Word# -> Word64#
k Word#
0x0fc19dc68b8cd5b5##) Word64#
w18
      !(R Word64#
s19a Word64#
s19b Word64#
s19c Word64#
s19d Word64#
s19e Word64#
s19f Word64#
s19g Word64#
s19h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s18a Word64#
s18b Word64#
s18c Word64#
s18d Word64#
s18e Word64#
s18f Word64#
s18g Word64#
s18h
          (Word# -> Word64#
k Word#
0x240ca1cc77ac9c65##) Word64#
w19
      !(R Word64#
s20a Word64#
s20b Word64#
s20c Word64#
s20d Word64#
s20e Word64#
s20f Word64#
s20g Word64#
s20h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s19a Word64#
s19b Word64#
s19c Word64#
s19d Word64#
s19e Word64#
s19f Word64#
s19g Word64#
s19h
          (Word# -> Word64#
k Word#
0x2de92c6f592b0275##) Word64#
w20
      !(R Word64#
s21a Word64#
s21b Word64#
s21c Word64#
s21d Word64#
s21e Word64#
s21f Word64#
s21g Word64#
s21h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s20a Word64#
s20b Word64#
s20c Word64#
s20d Word64#
s20e Word64#
s20f Word64#
s20g Word64#
s20h
          (Word# -> Word64#
k Word#
0x4a7484aa6ea6e483##) Word64#
w21
      !(R Word64#
s22a Word64#
s22b Word64#
s22c Word64#
s22d Word64#
s22e Word64#
s22f Word64#
s22g Word64#
s22h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s21a Word64#
s21b Word64#
s21c Word64#
s21d Word64#
s21e Word64#
s21f Word64#
s21g Word64#
s21h
          (Word# -> Word64#
k Word#
0x5cb0a9dcbd41fbd4##) Word64#
w22
      !(R Word64#
s23a Word64#
s23b Word64#
s23c Word64#
s23d Word64#
s23e Word64#
s23f Word64#
s23g Word64#
s23h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s22a Word64#
s22b Word64#
s22c Word64#
s22d Word64#
s22e Word64#
s22f Word64#
s22g Word64#
s22h
          (Word# -> Word64#
k Word#
0x76f988da831153b5##) Word64#
w23
      !(R Word64#
s24a Word64#
s24b Word64#
s24c Word64#
s24d Word64#
s24e Word64#
s24f Word64#
s24g Word64#
s24h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s23a Word64#
s23b Word64#
s23c Word64#
s23d Word64#
s23e Word64#
s23f Word64#
s23g Word64#
s23h
          (Word# -> Word64#
k Word#
0x983e5152ee66dfab##) Word64#
w24
      !(R Word64#
s25a Word64#
s25b Word64#
s25c Word64#
s25d Word64#
s25e Word64#
s25f Word64#
s25g Word64#
s25h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s24a Word64#
s24b Word64#
s24c Word64#
s24d Word64#
s24e Word64#
s24f Word64#
s24g Word64#
s24h
          (Word# -> Word64#
k Word#
0xa831c66d2db43210##) Word64#
w25
      !(R Word64#
s26a Word64#
s26b Word64#
s26c Word64#
s26d Word64#
s26e Word64#
s26f Word64#
s26g Word64#
s26h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s25a Word64#
s25b Word64#
s25c Word64#
s25d Word64#
s25e Word64#
s25f Word64#
s25g Word64#
s25h
          (Word# -> Word64#
k Word#
0xb00327c898fb213f##) Word64#
w26
      !(R Word64#
s27a Word64#
s27b Word64#
s27c Word64#
s27d Word64#
s27e Word64#
s27f Word64#
s27g Word64#
s27h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s26a Word64#
s26b Word64#
s26c Word64#
s26d Word64#
s26e Word64#
s26f Word64#
s26g Word64#
s26h
          (Word# -> Word64#
k Word#
0xbf597fc7beef0ee4##) Word64#
w27
      !(R Word64#
s28a Word64#
s28b Word64#
s28c Word64#
s28d Word64#
s28e Word64#
s28f Word64#
s28g Word64#
s28h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s27a Word64#
s27b Word64#
s27c Word64#
s27d Word64#
s27e Word64#
s27f Word64#
s27g Word64#
s27h
          (Word# -> Word64#
k Word#
0xc6e00bf33da88fc2##) Word64#
w28
      !(R Word64#
s29a Word64#
s29b Word64#
s29c Word64#
s29d Word64#
s29e Word64#
s29f Word64#
s29g Word64#
s29h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s28a Word64#
s28b Word64#
s28c Word64#
s28d Word64#
s28e Word64#
s28f Word64#
s28g Word64#
s28h
          (Word# -> Word64#
k Word#
0xd5a79147930aa725##) Word64#
w29
      !(R Word64#
s30a Word64#
s30b Word64#
s30c Word64#
s30d Word64#
s30e Word64#
s30f Word64#
s30g Word64#
s30h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s29a Word64#
s29b Word64#
s29c Word64#
s29d Word64#
s29e Word64#
s29f Word64#
s29g Word64#
s29h
          (Word# -> Word64#
k Word#
0x06ca6351e003826f##) Word64#
w30
      !(R Word64#
s31a Word64#
s31b Word64#
s31c Word64#
s31d Word64#
s31e Word64#
s31f Word64#
s31g Word64#
s31h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s30a Word64#
s30b Word64#
s30c Word64#
s30d Word64#
s30e Word64#
s30f Word64#
s30g Word64#
s30h
          (Word# -> Word64#
k Word#
0x142929670a0e6e70##) Word64#
w31
      !(R Word64#
s32a Word64#
s32b Word64#
s32c Word64#
s32d Word64#
s32e Word64#
s32f Word64#
s32g Word64#
s32h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s31a Word64#
s31b Word64#
s31c Word64#
s31d Word64#
s31e Word64#
s31f Word64#
s31g Word64#
s31h
          (Word# -> Word64#
k Word#
0x27b70a8546d22ffc##) Word64#
w32
      !(R Word64#
s33a Word64#
s33b Word64#
s33c Word64#
s33d Word64#
s33e Word64#
s33f Word64#
s33g Word64#
s33h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s32a Word64#
s32b Word64#
s32c Word64#
s32d Word64#
s32e Word64#
s32f Word64#
s32g Word64#
s32h
          (Word# -> Word64#
k Word#
0x2e1b21385c26c926##) Word64#
w33
      !(R Word64#
s34a Word64#
s34b Word64#
s34c Word64#
s34d Word64#
s34e Word64#
s34f Word64#
s34g Word64#
s34h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s33a Word64#
s33b Word64#
s33c Word64#
s33d Word64#
s33e Word64#
s33f Word64#
s33g Word64#
s33h
          (Word# -> Word64#
k Word#
0x4d2c6dfc5ac42aed##) Word64#
w34
      !(R Word64#
s35a Word64#
s35b Word64#
s35c Word64#
s35d Word64#
s35e Word64#
s35f Word64#
s35g Word64#
s35h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s34a Word64#
s34b Word64#
s34c Word64#
s34d Word64#
s34e Word64#
s34f Word64#
s34g Word64#
s34h
          (Word# -> Word64#
k Word#
0x53380d139d95b3df##) Word64#
w35
      !(R Word64#
s36a Word64#
s36b Word64#
s36c Word64#
s36d Word64#
s36e Word64#
s36f Word64#
s36g Word64#
s36h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s35a Word64#
s35b Word64#
s35c Word64#
s35d Word64#
s35e Word64#
s35f Word64#
s35g Word64#
s35h
          (Word# -> Word64#
k Word#
0x650a73548baf63de##) Word64#
w36
      !(R Word64#
s37a Word64#
s37b Word64#
s37c Word64#
s37d Word64#
s37e Word64#
s37f Word64#
s37g Word64#
s37h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s36a Word64#
s36b Word64#
s36c Word64#
s36d Word64#
s36e Word64#
s36f Word64#
s36g Word64#
s36h
          (Word# -> Word64#
k Word#
0x766a0abb3c77b2a8##) Word64#
w37
      !(R Word64#
s38a Word64#
s38b Word64#
s38c Word64#
s38d Word64#
s38e Word64#
s38f Word64#
s38g Word64#
s38h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s37a Word64#
s37b Word64#
s37c Word64#
s37d Word64#
s37e Word64#
s37f Word64#
s37g Word64#
s37h
          (Word# -> Word64#
k Word#
0x81c2c92e47edaee6##) Word64#
w38
      !(R Word64#
s39a Word64#
s39b Word64#
s39c Word64#
s39d Word64#
s39e Word64#
s39f Word64#
s39g Word64#
s39h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s38a Word64#
s38b Word64#
s38c Word64#
s38d Word64#
s38e Word64#
s38f Word64#
s38g Word64#
s38h
          (Word# -> Word64#
k Word#
0x92722c851482353b##) Word64#
w39
      !(R Word64#
s40a Word64#
s40b Word64#
s40c Word64#
s40d Word64#
s40e Word64#
s40f Word64#
s40g Word64#
s40h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s39a Word64#
s39b Word64#
s39c Word64#
s39d Word64#
s39e Word64#
s39f Word64#
s39g Word64#
s39h
          (Word# -> Word64#
k Word#
0xa2bfe8a14cf10364##) Word64#
w40
      !(R Word64#
s41a Word64#
s41b Word64#
s41c Word64#
s41d Word64#
s41e Word64#
s41f Word64#
s41g Word64#
s41h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s40a Word64#
s40b Word64#
s40c Word64#
s40d Word64#
s40e Word64#
s40f Word64#
s40g Word64#
s40h
          (Word# -> Word64#
k Word#
0xa81a664bbc423001##) Word64#
w41
      !(R Word64#
s42a Word64#
s42b Word64#
s42c Word64#
s42d Word64#
s42e Word64#
s42f Word64#
s42g Word64#
s42h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s41a Word64#
s41b Word64#
s41c Word64#
s41d Word64#
s41e Word64#
s41f Word64#
s41g Word64#
s41h
          (Word# -> Word64#
k Word#
0xc24b8b70d0f89791##) Word64#
w42
      !(R Word64#
s43a Word64#
s43b Word64#
s43c Word64#
s43d Word64#
s43e Word64#
s43f Word64#
s43g Word64#
s43h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s42a Word64#
s42b Word64#
s42c Word64#
s42d Word64#
s42e Word64#
s42f Word64#
s42g Word64#
s42h
          (Word# -> Word64#
k Word#
0xc76c51a30654be30##) Word64#
w43
      !(R Word64#
s44a Word64#
s44b Word64#
s44c Word64#
s44d Word64#
s44e Word64#
s44f Word64#
s44g Word64#
s44h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s43a Word64#
s43b Word64#
s43c Word64#
s43d Word64#
s43e Word64#
s43f Word64#
s43g Word64#
s43h
          (Word# -> Word64#
k Word#
0xd192e819d6ef5218##) Word64#
w44
      !(R Word64#
s45a Word64#
s45b Word64#
s45c Word64#
s45d Word64#
s45e Word64#
s45f Word64#
s45g Word64#
s45h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s44a Word64#
s44b Word64#
s44c Word64#
s44d Word64#
s44e Word64#
s44f Word64#
s44g Word64#
s44h
          (Word# -> Word64#
k Word#
0xd69906245565a910##) Word64#
w45
      !(R Word64#
s46a Word64#
s46b Word64#
s46c Word64#
s46d Word64#
s46e Word64#
s46f Word64#
s46g Word64#
s46h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s45a Word64#
s45b Word64#
s45c Word64#
s45d Word64#
s45e Word64#
s45f Word64#
s45g Word64#
s45h
          (Word# -> Word64#
k Word#
0xf40e35855771202a##) Word64#
w46
      !(R Word64#
s47a Word64#
s47b Word64#
s47c Word64#
s47d Word64#
s47e Word64#
s47f Word64#
s47g Word64#
s47h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s46a Word64#
s46b Word64#
s46c Word64#
s46d Word64#
s46e Word64#
s46f Word64#
s46g Word64#
s46h
          (Word# -> Word64#
k Word#
0x106aa07032bbd1b8##) Word64#
w47
      !(R Word64#
s48a Word64#
s48b Word64#
s48c Word64#
s48d Word64#
s48e Word64#
s48f Word64#
s48g Word64#
s48h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s47a Word64#
s47b Word64#
s47c Word64#
s47d Word64#
s47e Word64#
s47f Word64#
s47g Word64#
s47h
          (Word# -> Word64#
k Word#
0x19a4c116b8d2d0c8##) Word64#
w48
      !(R Word64#
s49a Word64#
s49b Word64#
s49c Word64#
s49d Word64#
s49e Word64#
s49f Word64#
s49g Word64#
s49h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s48a Word64#
s48b Word64#
s48c Word64#
s48d Word64#
s48e Word64#
s48f Word64#
s48g Word64#
s48h
          (Word# -> Word64#
k Word#
0x1e376c085141ab53##) Word64#
w49
      !(R Word64#
s50a Word64#
s50b Word64#
s50c Word64#
s50d Word64#
s50e Word64#
s50f Word64#
s50g Word64#
s50h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s49a Word64#
s49b Word64#
s49c Word64#
s49d Word64#
s49e Word64#
s49f Word64#
s49g Word64#
s49h
          (Word# -> Word64#
k Word#
0x2748774cdf8eeb99##) Word64#
w50
      !(R Word64#
s51a Word64#
s51b Word64#
s51c Word64#
s51d Word64#
s51e Word64#
s51f Word64#
s51g Word64#
s51h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s50a Word64#
s50b Word64#
s50c Word64#
s50d Word64#
s50e Word64#
s50f Word64#
s50g Word64#
s50h
          (Word# -> Word64#
k Word#
0x34b0bcb5e19b48a8##) Word64#
w51
      !(R Word64#
s52a Word64#
s52b Word64#
s52c Word64#
s52d Word64#
s52e Word64#
s52f Word64#
s52g Word64#
s52h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s51a Word64#
s51b Word64#
s51c Word64#
s51d Word64#
s51e Word64#
s51f Word64#
s51g Word64#
s51h
          (Word# -> Word64#
k Word#
0x391c0cb3c5c95a63##) Word64#
w52
      !(R Word64#
s53a Word64#
s53b Word64#
s53c Word64#
s53d Word64#
s53e Word64#
s53f Word64#
s53g Word64#
s53h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s52a Word64#
s52b Word64#
s52c Word64#
s52d Word64#
s52e Word64#
s52f Word64#
s52g Word64#
s52h
          (Word# -> Word64#
k Word#
0x4ed8aa4ae3418acb##) Word64#
w53
      !(R Word64#
s54a Word64#
s54b Word64#
s54c Word64#
s54d Word64#
s54e Word64#
s54f Word64#
s54g Word64#
s54h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s53a Word64#
s53b Word64#
s53c Word64#
s53d Word64#
s53e Word64#
s53f Word64#
s53g Word64#
s53h
          (Word# -> Word64#
k Word#
0x5b9cca4f7763e373##) Word64#
w54
      !(R Word64#
s55a Word64#
s55b Word64#
s55c Word64#
s55d Word64#
s55e Word64#
s55f Word64#
s55g Word64#
s55h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s54a Word64#
s54b Word64#
s54c Word64#
s54d Word64#
s54e Word64#
s54f Word64#
s54g Word64#
s54h
          (Word# -> Word64#
k Word#
0x682e6ff3d6b2b8a3##) Word64#
w55
      !(R Word64#
s56a Word64#
s56b Word64#
s56c Word64#
s56d Word64#
s56e Word64#
s56f Word64#
s56g Word64#
s56h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s55a Word64#
s55b Word64#
s55c Word64#
s55d Word64#
s55e Word64#
s55f Word64#
s55g Word64#
s55h
          (Word# -> Word64#
k Word#
0x748f82ee5defb2fc##) Word64#
w56
      !(R Word64#
s57a Word64#
s57b Word64#
s57c Word64#
s57d Word64#
s57e Word64#
s57f Word64#
s57g Word64#
s57h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s56a Word64#
s56b Word64#
s56c Word64#
s56d Word64#
s56e Word64#
s56f Word64#
s56g Word64#
s56h
          (Word# -> Word64#
k Word#
0x78a5636f43172f60##) Word64#
w57
      !(R Word64#
s58a Word64#
s58b Word64#
s58c Word64#
s58d Word64#
s58e Word64#
s58f Word64#
s58g Word64#
s58h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s57a Word64#
s57b Word64#
s57c Word64#
s57d Word64#
s57e Word64#
s57f Word64#
s57g Word64#
s57h
          (Word# -> Word64#
k Word#
0x84c87814a1f0ab72##) Word64#
w58
      !(R Word64#
s59a Word64#
s59b Word64#
s59c Word64#
s59d Word64#
s59e Word64#
s59f Word64#
s59g Word64#
s59h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s58a Word64#
s58b Word64#
s58c Word64#
s58d Word64#
s58e Word64#
s58f Word64#
s58g Word64#
s58h
          (Word# -> Word64#
k Word#
0x8cc702081a6439ec##) Word64#
w59
      !(R Word64#
s60a Word64#
s60b Word64#
s60c Word64#
s60d Word64#
s60e Word64#
s60f Word64#
s60g Word64#
s60h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s59a Word64#
s59b Word64#
s59c Word64#
s59d Word64#
s59e Word64#
s59f Word64#
s59g Word64#
s59h
          (Word# -> Word64#
k Word#
0x90befffa23631e28##) Word64#
w60
      !(R Word64#
s61a Word64#
s61b Word64#
s61c Word64#
s61d Word64#
s61e Word64#
s61f Word64#
s61g Word64#
s61h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s60a Word64#
s60b Word64#
s60c Word64#
s60d Word64#
s60e Word64#
s60f Word64#
s60g Word64#
s60h
          (Word# -> Word64#
k Word#
0xa4506cebde82bde9##) Word64#
w61
      !(R Word64#
s62a Word64#
s62b Word64#
s62c Word64#
s62d Word64#
s62e Word64#
s62f Word64#
s62g Word64#
s62h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s61a Word64#
s61b Word64#
s61c Word64#
s61d Word64#
s61e Word64#
s61f Word64#
s61g Word64#
s61h
          (Word# -> Word64#
k Word#
0xbef9a3f7b2c67915##) Word64#
w62
      !(R Word64#
s63a Word64#
s63b Word64#
s63c Word64#
s63d Word64#
s63e Word64#
s63f Word64#
s63g Word64#
s63h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s62a Word64#
s62b Word64#
s62c Word64#
s62d Word64#
s62e Word64#
s62f Word64#
s62g Word64#
s62h
          (Word# -> Word64#
k Word#
0xc67178f2e372532b##) Word64#
w63
      !(R Word64#
s64a Word64#
s64b Word64#
s64c Word64#
s64d Word64#
s64e Word64#
s64f Word64#
s64g Word64#
s64h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s63a Word64#
s63b Word64#
s63c Word64#
s63d Word64#
s63e Word64#
s63f Word64#
s63g Word64#
s63h
          (Word# -> Word64#
k Word#
0xca273eceea26619c##) Word64#
w64
      !(R Word64#
s65a Word64#
s65b Word64#
s65c Word64#
s65d Word64#
s65e Word64#
s65f Word64#
s65g Word64#
s65h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s64a Word64#
s64b Word64#
s64c Word64#
s64d Word64#
s64e Word64#
s64f Word64#
s64g Word64#
s64h
          (Word# -> Word64#
k Word#
0xd186b8c721c0c207##) Word64#
w65
      !(R Word64#
s66a Word64#
s66b Word64#
s66c Word64#
s66d Word64#
s66e Word64#
s66f Word64#
s66g Word64#
s66h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s65a Word64#
s65b Word64#
s65c Word64#
s65d Word64#
s65e Word64#
s65f Word64#
s65g Word64#
s65h
          (Word# -> Word64#
k Word#
0xeada7dd6cde0eb1e##) Word64#
w66
      !(R Word64#
s67a Word64#
s67b Word64#
s67c Word64#
s67d Word64#
s67e Word64#
s67f Word64#
s67g Word64#
s67h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s66a Word64#
s66b Word64#
s66c Word64#
s66d Word64#
s66e Word64#
s66f Word64#
s66g Word64#
s66h
          (Word# -> Word64#
k Word#
0xf57d4f7fee6ed178##) Word64#
w67
      !(R Word64#
s68a Word64#
s68b Word64#
s68c Word64#
s68d Word64#
s68e Word64#
s68f Word64#
s68g Word64#
s68h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s67a Word64#
s67b Word64#
s67c Word64#
s67d Word64#
s67e Word64#
s67f Word64#
s67g Word64#
s67h
          (Word# -> Word64#
k Word#
0x06f067aa72176fba##) Word64#
w68
      !(R Word64#
s69a Word64#
s69b Word64#
s69c Word64#
s69d Word64#
s69e Word64#
s69f Word64#
s69g Word64#
s69h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s68a Word64#
s68b Word64#
s68c Word64#
s68d Word64#
s68e Word64#
s68f Word64#
s68g Word64#
s68h
          (Word# -> Word64#
k Word#
0x0a637dc5a2c898a6##) Word64#
w69
      !(R Word64#
s70a Word64#
s70b Word64#
s70c Word64#
s70d Word64#
s70e Word64#
s70f Word64#
s70g Word64#
s70h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s69a Word64#
s69b Word64#
s69c Word64#
s69d Word64#
s69e Word64#
s69f Word64#
s69g Word64#
s69h
          (Word# -> Word64#
k Word#
0x113f9804bef90dae##) Word64#
w70
      !(R Word64#
s71a Word64#
s71b Word64#
s71c Word64#
s71d Word64#
s71e Word64#
s71f Word64#
s71g Word64#
s71h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s70a Word64#
s70b Word64#
s70c Word64#
s70d Word64#
s70e Word64#
s70f Word64#
s70g Word64#
s70h
          (Word# -> Word64#
k Word#
0x1b710b35131c471b##) Word64#
w71
      !(R Word64#
s72a Word64#
s72b Word64#
s72c Word64#
s72d Word64#
s72e Word64#
s72f Word64#
s72g Word64#
s72h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s71a Word64#
s71b Word64#
s71c Word64#
s71d Word64#
s71e Word64#
s71f Word64#
s71g Word64#
s71h
          (Word# -> Word64#
k Word#
0x28db77f523047d84##) Word64#
w72
      !(R Word64#
s73a Word64#
s73b Word64#
s73c Word64#
s73d Word64#
s73e Word64#
s73f Word64#
s73g Word64#
s73h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s72a Word64#
s72b Word64#
s72c Word64#
s72d Word64#
s72e Word64#
s72f Word64#
s72g Word64#
s72h
          (Word# -> Word64#
k Word#
0x32caab7b40c72493##) Word64#
w73
      !(R Word64#
s74a Word64#
s74b Word64#
s74c Word64#
s74d Word64#
s74e Word64#
s74f Word64#
s74g Word64#
s74h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s73a Word64#
s73b Word64#
s73c Word64#
s73d Word64#
s73e Word64#
s73f Word64#
s73g Word64#
s73h
          (Word# -> Word64#
k Word#
0x3c9ebe0a15c9bebc##) Word64#
w74
      !(R Word64#
s75a Word64#
s75b Word64#
s75c Word64#
s75d Word64#
s75e Word64#
s75f Word64#
s75g Word64#
s75h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s74a Word64#
s74b Word64#
s74c Word64#
s74d Word64#
s74e Word64#
s74f Word64#
s74g Word64#
s74h
          (Word# -> Word64#
k Word#
0x431d67c49c100d4c##) Word64#
w75
      !(R Word64#
s76a Word64#
s76b Word64#
s76c Word64#
s76d Word64#
s76e Word64#
s76f Word64#
s76g Word64#
s76h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s75a Word64#
s75b Word64#
s75c Word64#
s75d Word64#
s75e Word64#
s75f Word64#
s75g Word64#
s75h
          (Word# -> Word64#
k Word#
0x4cc5d4becb3e42b6##) Word64#
w76
      !(R Word64#
s77a Word64#
s77b Word64#
s77c Word64#
s77d Word64#
s77e Word64#
s77f Word64#
s77g Word64#
s77h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s76a Word64#
s76b Word64#
s76c Word64#
s76d Word64#
s76e Word64#
s76f Word64#
s76g Word64#
s76h
          (Word# -> Word64#
k Word#
0x597f299cfc657e2a##) Word64#
w77
      !(R Word64#
s78a Word64#
s78b Word64#
s78c Word64#
s78d Word64#
s78e Word64#
s78f Word64#
s78g Word64#
s78h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s77a Word64#
s77b Word64#
s77c Word64#
s77d Word64#
s77e Word64#
s77f Word64#
s77g Word64#
s77h
          (Word# -> Word64#
k Word#
0x5fcb6fab3ad6faec##) Word64#
w78
      !(R Word64#
s79a Word64#
s79b Word64#
s79c Word64#
s79d Word64#
s79e Word64#
s79f Word64#
s79g Word64#
s79h) =
        Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
s78a Word64#
s78b Word64#
s78c Word64#
s78d Word64#
s78e Word64#
s78f Word64#
s78g Word64#
s78h
          (Word# -> Word64#
k Word#
0x6c44198c4a475817##) Word64#
w79
  in  Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
R (Word64#
h0 Word64# -> Word64# -> Word64#
`p` Word64#
s79a) (Word64#
h1 Word64# -> Word64# -> Word64#
`p` Word64#
s79b) (Word64#
h2 Word64# -> Word64# -> Word64#
`p` Word64#
s79c) (Word64#
h3 Word64# -> Word64# -> Word64#
`p` Word64#
s79d)
        (Word64#
h4 Word64# -> Word64# -> Word64#
`p` Word64#
s79e) (Word64#
h5 Word64# -> Word64# -> Word64#
`p` Word64#
s79f) (Word64#
h6 Word64# -> Word64# -> Word64#
`p` Word64#
s79g) (Word64#
h7 Word64# -> Word64# -> Word64#
`p` Word64#
s79h)
  where
    p :: Word64# -> Word64# -> Word64#
p = Word64# -> Word64# -> Word64#
Exts.plusWord64#
    {-# INLINE p #-}
    k :: Exts.Word# -> Exts.Word64#
    k :: Word# -> Word64#
k = Word# -> Word64#
Exts.wordToWord64#
    {-# INLINE k #-}

-- rotate right
rotr# :: Exts.Word64# -> Int# -> Exts.Word64#
rotr# :: Word64# -> Int# -> Word64#
rotr# Word64#
x Int#
n =
  Word64# -> Int# -> Word64#
Exts.uncheckedShiftRL64# Word64#
x Int#
n Word64# -> Word64# -> Word64#
`Exts.or64#`
  Word64# -> Int# -> Word64#
Exts.uncheckedShiftL64# Word64#
x (Int#
64# Int# -> Int# -> Int#
Exts.-# Int#
n)
{-# INLINE rotr# #-}

-- logical right shift
shr# :: Exts.Word64# -> Int# -> Exts.Word64#
shr# :: Word64# -> Int# -> Word64#
shr# = Word64# -> Int# -> Word64#
Exts.uncheckedShiftRL64#
{-# INLINE shr# #-}

-- ch(x, y, z) = (x & y) ^ (~x & z)
ch# :: Exts.Word64# -> Exts.Word64# -> Exts.Word64# -> Exts.Word64#
ch# :: Word64# -> Word64# -> Word64# -> Word64#
ch# Word64#
x Word64#
y Word64#
z =
  (Word64#
x Word64# -> Word64# -> Word64#
`Exts.and64#` Word64#
y) Word64# -> Word64# -> Word64#
`Exts.xor64#`
  (Word64# -> Word64#
Exts.not64# Word64#
x Word64# -> Word64# -> Word64#
`Exts.and64#` Word64#
z)
{-# INLINE ch# #-}

-- maj(x, y, z) = (x & (y | z)) | (y & z)
maj# :: Exts.Word64# -> Exts.Word64# -> Exts.Word64# -> Exts.Word64#
maj# :: Word64# -> Word64# -> Word64# -> Word64#
maj# Word64#
x Word64#
y Word64#
z =
  (Word64#
x Word64# -> Word64# -> Word64#
`Exts.and64#` (Word64#
y Word64# -> Word64# -> Word64#
`Exts.or64#` Word64#
z)) Word64# -> Word64# -> Word64#
`Exts.or64#`
  (Word64#
y Word64# -> Word64# -> Word64#
`Exts.and64#` Word64#
z)
{-# INLINE maj# #-}

-- big sigma 0: rotr28 ^ rotr34 ^ rotr39
bsig0# :: Exts.Word64# -> Exts.Word64#
bsig0# :: Word64# -> Word64#
bsig0# Word64#
x =
  Word64# -> Int# -> Word64#
rotr# Word64#
x Int#
28# Word64# -> Word64# -> Word64#
`Exts.xor64#` Word64# -> Int# -> Word64#
rotr# Word64#
x Int#
34# Word64# -> Word64# -> Word64#
`Exts.xor64#` Word64# -> Int# -> Word64#
rotr# Word64#
x Int#
39#
{-# INLINE bsig0# #-}

-- big sigma 1: rotr14 ^ rotr18 ^ rotr41
bsig1# :: Exts.Word64# -> Exts.Word64#
bsig1# :: Word64# -> Word64#
bsig1# Word64#
x =
  Word64# -> Int# -> Word64#
rotr# Word64#
x Int#
14# Word64# -> Word64# -> Word64#
`Exts.xor64#` Word64# -> Int# -> Word64#
rotr# Word64#
x Int#
18# Word64# -> Word64# -> Word64#
`Exts.xor64#` Word64# -> Int# -> Word64#
rotr# Word64#
x Int#
41#
{-# INLINE bsig1# #-}

-- small sigma 0: rotr1 ^ rotr8 ^ shr7
ssig0# :: Exts.Word64# -> Exts.Word64#
ssig0# :: Word64# -> Word64#
ssig0# Word64#
x =
  Word64# -> Int# -> Word64#
rotr# Word64#
x Int#
1# Word64# -> Word64# -> Word64#
`Exts.xor64#` Word64# -> Int# -> Word64#
rotr# Word64#
x Int#
8# Word64# -> Word64# -> Word64#
`Exts.xor64#` Word64# -> Int# -> Word64#
shr# Word64#
x Int#
7#
{-# INLINE ssig0# #-}

-- small sigma 1: rotr19 ^ rotr61 ^ shr6
ssig1# :: Exts.Word64# -> Exts.Word64#
ssig1# :: Word64# -> Word64#
ssig1# Word64#
x =
  Word64# -> Int# -> Word64#
rotr# Word64#
x Int#
19# Word64# -> Word64# -> Word64#
`Exts.xor64#` Word64# -> Int# -> Word64#
rotr# Word64#
x Int#
61# Word64# -> Word64# -> Word64#
`Exts.xor64#` Word64# -> Int# -> Word64#
shr# Word64#
x Int#
6#
{-# INLINE ssig1# #-}

-- round step
step#
  :: Exts.Word64# -> Exts.Word64# -> Exts.Word64# -> Exts.Word64#
  -> Exts.Word64# -> Exts.Word64# -> Exts.Word64# -> Exts.Word64#
  -> Exts.Word64# -> Exts.Word64#
  -> Registers
step# :: Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
step# Word64#
a Word64#
b Word64#
c Word64#
d Word64#
e Word64#
f Word64#
g Word64#
h Word64#
k Word64#
w =
  let !t1 :: Word64#
t1 =                Word64#
h
        Word64# -> Word64# -> Word64#
`Exts.plusWord64#` Word64# -> Word64#
bsig1# Word64#
e
        Word64# -> Word64# -> Word64#
`Exts.plusWord64#` Word64# -> Word64# -> Word64# -> Word64#
ch# Word64#
e Word64#
f Word64#
g
        Word64# -> Word64# -> Word64#
`Exts.plusWord64#` Word64#
k
        Word64# -> Word64# -> Word64#
`Exts.plusWord64#` Word64#
w
      !t2 :: Word64#
t2 = Word64# -> Word64#
bsig0# Word64#
a Word64# -> Word64# -> Word64#
`Exts.plusWord64#` Word64# -> Word64# -> Word64# -> Word64#
maj# Word64#
a Word64#
b Word64#
c
  in  Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
R (Word64#
t1 Word64# -> Word64# -> Word64#
`Exts.plusWord64#` Word64#
t2) Word64#
a Word64#
b Word64#
c (Word64#
d Word64# -> Word64# -> Word64#
`Exts.plusWord64#` Word64#
t1) Word64#
e Word64#
f Word64#
g
{-# INLINE step# #-}

-- initial register state; first 64 bits of the fractional parts of the
-- square roots of the first eight primes
iv :: () -> Registers
iv :: () -> Registers
iv ()
_ = Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Registers
R
  (Word# -> Word64#
Exts.wordToWord64# Word#
0x6a09e667f3bcc908##)
  (Word# -> Word64#
Exts.wordToWord64# Word#
0xbb67ae8584caa73b##)
  (Word# -> Word64#
Exts.wordToWord64# Word#
0x3c6ef372fe94f82b##)
  (Word# -> Word64#
Exts.wordToWord64# Word#
0xa54ff53a5f1d36f1##)
  (Word# -> Word64#
Exts.wordToWord64# Word#
0x510e527fade682d1##)
  (Word# -> Word64#
Exts.wordToWord64# Word#
0x9b05688c2b3e6c1f##)
  (Word# -> Word64#
Exts.wordToWord64# Word#
0x1f83d9abfb41bd6b##)
  (Word# -> Word64#
Exts.wordToWord64# Word#
0x5be0cd19137e2179##)

-- serializing ----------------------------------------------------------------

-- | Concat SHA512 state into a ByteString.
cat :: Registers -> BS.ByteString
cat :: Registers -> ByteString
cat Registers
rs = Int -> (Ptr Word8 -> IO ()) -> ByteString
BI.unsafeCreate Int
64 (Registers -> Ptr Word8 -> IO ()
cat_into Registers
rs)
{-# INLINABLE cat #-}

-- | Serialize SHA512 state to a pointer (big-endian).
cat_into :: Registers -> Ptr Word8 -> IO ()
cat_into :: Registers -> Ptr Word8 -> IO ()
cat_into (R Word64#
h0 Word64#
h1 Word64#
h2 Word64#
h3 Word64#
h4 Word64#
h5 Word64#
h6 Word64#
h7) (Ptr Addr#
addr) = (State# RealWorld -> (# State# RealWorld, () #)) -> IO ()
forall a. (State# RealWorld -> (# State# RealWorld, a #)) -> IO a
GHC.IO.IO ((State# RealWorld -> (# State# RealWorld, () #)) -> IO ())
-> (State# RealWorld -> (# State# RealWorld, () #)) -> IO ()
forall a b. (a -> b) -> a -> b
$ \State# RealWorld
s0 ->
  case Addr# -> Int# -> Word64# -> State# RealWorld -> State# RealWorld
poke64be Addr#
addr Int#
00# Word64#
h0 State# RealWorld
s0 of { State# RealWorld
s1 ->
  case Addr# -> Int# -> Word64# -> State# RealWorld -> State# RealWorld
poke64be Addr#
addr Int#
08# Word64#
h1 State# RealWorld
s1 of { State# RealWorld
s2 ->
  case Addr# -> Int# -> Word64# -> State# RealWorld -> State# RealWorld
poke64be Addr#
addr Int#
16# Word64#
h2 State# RealWorld
s2 of { State# RealWorld
s3 ->
  case Addr# -> Int# -> Word64# -> State# RealWorld -> State# RealWorld
poke64be Addr#
addr Int#
24# Word64#
h3 State# RealWorld
s3 of { State# RealWorld
s4 ->
  case Addr# -> Int# -> Word64# -> State# RealWorld -> State# RealWorld
poke64be Addr#
addr Int#
32# Word64#
h4 State# RealWorld
s4 of { State# RealWorld
s5 ->
  case Addr# -> Int# -> Word64# -> State# RealWorld -> State# RealWorld
poke64be Addr#
addr Int#
40# Word64#
h5 State# RealWorld
s5 of { State# RealWorld
s6 ->
  case Addr# -> Int# -> Word64# -> State# RealWorld -> State# RealWorld
poke64be Addr#
addr Int#
48# Word64#
h6 State# RealWorld
s6 of { State# RealWorld
s7 ->
  case Addr# -> Int# -> Word64# -> State# RealWorld -> State# RealWorld
poke64be Addr#
addr Int#
56# Word64#
h7 State# RealWorld
s7 of { State# RealWorld
s8 ->
  (# State# RealWorld
s8, () #)
  }}}}}}}}
{-# INLINE cat_into #-}

poke64be
  :: Exts.Addr#
  -> Int#
  -> Exts.Word64#
  -> Exts.State# Exts.RealWorld
  -> Exts.State# Exts.RealWorld
poke64be :: Addr# -> Int# -> Word64# -> State# RealWorld -> State# RealWorld
poke64be Addr#
a Int#
off Word64#
w State# RealWorld
s0 =
  case Addr# -> Int# -> Word8# -> State# RealWorld -> State# RealWorld
forall d. Addr# -> Int# -> Word8# -> State# d -> State# d
Exts.writeWord8OffAddr# Addr#
a Int#
off (Word64# -> Int# -> Word8#
byte# Word64#
w Int#
56#) State# RealWorld
s0 of { State# RealWorld
s1 ->
  case Addr# -> Int# -> Word8# -> State# RealWorld -> State# RealWorld
forall d. Addr# -> Int# -> Word8# -> State# d -> State# d
Exts.writeWord8OffAddr# Addr#
a (Int#
off Int# -> Int# -> Int#
Exts.+# Int#
1#) (Word64# -> Int# -> Word8#
byte# Word64#
w Int#
48#) State# RealWorld
s1 of { State# RealWorld
s2 ->
  case Addr# -> Int# -> Word8# -> State# RealWorld -> State# RealWorld
forall d. Addr# -> Int# -> Word8# -> State# d -> State# d
Exts.writeWord8OffAddr# Addr#
a (Int#
off Int# -> Int# -> Int#
Exts.+# Int#
2#) (Word64# -> Int# -> Word8#
byte# Word64#
w Int#
40#) State# RealWorld
s2 of { State# RealWorld
s3 ->
  case Addr# -> Int# -> Word8# -> State# RealWorld -> State# RealWorld
forall d. Addr# -> Int# -> Word8# -> State# d -> State# d
Exts.writeWord8OffAddr# Addr#
a (Int#
off Int# -> Int# -> Int#
Exts.+# Int#
3#) (Word64# -> Int# -> Word8#
byte# Word64#
w Int#
32#) State# RealWorld
s3 of { State# RealWorld
s4 ->
  case Addr# -> Int# -> Word8# -> State# RealWorld -> State# RealWorld
forall d. Addr# -> Int# -> Word8# -> State# d -> State# d
Exts.writeWord8OffAddr# Addr#
a (Int#
off Int# -> Int# -> Int#
Exts.+# Int#
4#) (Word64# -> Int# -> Word8#
byte# Word64#
w Int#
24#) State# RealWorld
s4 of { State# RealWorld
s5 ->
  case Addr# -> Int# -> Word8# -> State# RealWorld -> State# RealWorld
forall d. Addr# -> Int# -> Word8# -> State# d -> State# d
Exts.writeWord8OffAddr# Addr#
a (Int#
off Int# -> Int# -> Int#
Exts.+# Int#
5#) (Word64# -> Int# -> Word8#
byte# Word64#
w Int#
16#) State# RealWorld
s5 of { State# RealWorld
s6 ->
  case Addr# -> Int# -> Word8# -> State# RealWorld -> State# RealWorld
forall d. Addr# -> Int# -> Word8# -> State# d -> State# d
Exts.writeWord8OffAddr# Addr#
a (Int#
off Int# -> Int# -> Int#
Exts.+# Int#
6#) (Word64# -> Int# -> Word8#
byte# Word64#
w Int#
8#) State# RealWorld
s6 of { State# RealWorld
s7 ->
  Addr# -> Int# -> Word8# -> State# RealWorld -> State# RealWorld
forall d. Addr# -> Int# -> Word8# -> State# d -> State# d
Exts.writeWord8OffAddr# Addr#
a (Int#
off Int# -> Int# -> Int#
Exts.+# Int#
7#) (Word64# -> Int# -> Word8#
byte# Word64#
w Int#
0#) State# RealWorld
s7
  }}}}}}}
{-# INLINE poke64be #-}

byte# :: Exts.Word64# -> Int# -> Exts.Word8#
byte# :: Word64# -> Int# -> Word8#
byte# Word64#
w Int#
n = Word# -> Word8#
Exts.wordToWord8#
  (Word64# -> Word#
Exts.word64ToWord# (Word64# -> Int# -> Word64#
Exts.uncheckedShiftRL64# Word64#
w Int#
n))
{-# INLINE byte# #-}

-- | Write register state to a pointer (native endian Word64s).
poke_registers :: Ptr Word64 -> Registers -> IO ()
poke_registers :: Ptr Word64 -> Registers -> IO ()
poke_registers (Ptr Addr#
addr) (R Word64#
w0 Word64#
w1 Word64#
w2 Word64#
w3 Word64#
w4 Word64#
w5 Word64#
w6 Word64#
w7) = (State# RealWorld -> (# State# RealWorld, () #)) -> IO ()
forall a. (State# RealWorld -> (# State# RealWorld, a #)) -> IO a
GHC.IO.IO ((State# RealWorld -> (# State# RealWorld, () #)) -> IO ())
-> (State# RealWorld -> (# State# RealWorld, () #)) -> IO ()
forall a b. (a -> b) -> a -> b
$ \State# RealWorld
s0 ->
  case Addr# -> Int# -> Word64# -> State# RealWorld -> State# RealWorld
forall d. Addr# -> Int# -> Word64# -> State# d -> State# d
Exts.writeWord64OffAddr# Addr#
addr Int#
0# Word64#
w0 State# RealWorld
s0 of { State# RealWorld
s1 ->
  case Addr# -> Int# -> Word64# -> State# RealWorld -> State# RealWorld
forall d. Addr# -> Int# -> Word64# -> State# d -> State# d
Exts.writeWord64OffAddr# Addr#
addr Int#
1# Word64#
w1 State# RealWorld
s1 of { State# RealWorld
s2 ->
  case Addr# -> Int# -> Word64# -> State# RealWorld -> State# RealWorld
forall d. Addr# -> Int# -> Word64# -> State# d -> State# d
Exts.writeWord64OffAddr# Addr#
addr Int#
2# Word64#
w2 State# RealWorld
s2 of { State# RealWorld
s3 ->
  case Addr# -> Int# -> Word64# -> State# RealWorld -> State# RealWorld
forall d. Addr# -> Int# -> Word64# -> State# d -> State# d
Exts.writeWord64OffAddr# Addr#
addr Int#
3# Word64#
w3 State# RealWorld
s3 of { State# RealWorld
s4 ->
  case Addr# -> Int# -> Word64# -> State# RealWorld -> State# RealWorld
forall d. Addr# -> Int# -> Word64# -> State# d -> State# d
Exts.writeWord64OffAddr# Addr#
addr Int#
4# Word64#
w4 State# RealWorld
s4 of { State# RealWorld
s5 ->
  case Addr# -> Int# -> Word64# -> State# RealWorld -> State# RealWorld
forall d. Addr# -> Int# -> Word64# -> State# d -> State# d
Exts.writeWord64OffAddr# Addr#
addr Int#
5# Word64#
w5 State# RealWorld
s5 of { State# RealWorld
s6 ->
  case Addr# -> Int# -> Word64# -> State# RealWorld -> State# RealWorld
forall d. Addr# -> Int# -> Word64# -> State# d -> State# d
Exts.writeWord64OffAddr# Addr#
addr Int#
6# Word64#
w6 State# RealWorld
s6 of { State# RealWorld
s7 ->
  case Addr# -> Int# -> Word64# -> State# RealWorld -> State# RealWorld
forall d. Addr# -> Int# -> Word64# -> State# d -> State# d
Exts.writeWord64OffAddr# Addr#
addr Int#
7# Word64#
w7 State# RealWorld
s7 of { State# RealWorld
s8 ->
  (# State# RealWorld
s8, () #) }}}}}}}}
{-# INLINE poke_registers #-}

-- hmac utilities -------------------------------------------------------------

-- pad registers to block
pad_registers :: Registers -> Block
pad_registers :: Registers -> Block
pad_registers (R Word64#
w0 Word64#
w1 Word64#
w2 Word64#
w3 Word64#
w4 Word64#
w5 Word64#
w6 Word64#
w7) = Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Block
B
  Word64#
w0 Word64#
w1 Word64#
w2 Word64#
w3 Word64#
w4 Word64#
w5 Word64#
w6 Word64#
w7
  (Word# -> Word64#
Exts.wordToWord64# Word#
0##) (Word# -> Word64#
Exts.wordToWord64# Word#
0##) (Word# -> Word64#
Exts.wordToWord64# Word#
0##)
  (Word# -> Word64#
Exts.wordToWord64# Word#
0##) (Word# -> Word64#
Exts.wordToWord64# Word#
0##) (Word# -> Word64#
Exts.wordToWord64# Word#
0##)
  (Word# -> Word64#
Exts.wordToWord64# Word#
0##) (Word# -> Word64#
Exts.wordToWord64# Word#
0##)
{-# INLINE pad_registers #-}

-- pad registers to block, using padding separator and augmented length
-- (assumes existence of a leading block)
-- length = (128 + 64) * 8 = 1536 = 0x600
pad_registers_with_length :: Registers -> Block
pad_registers_with_length :: Registers -> Block
pad_registers_with_length (R Word64#
h0 Word64#
h1 Word64#
h2 Word64#
h3 Word64#
h4 Word64#
h5 Word64#
h6 Word64#
h7) = Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Block
B
  Word64#
h0 Word64#
h1 Word64#
h2 Word64#
h3 Word64#
h4 Word64#
h5 Word64#
h6 Word64#
h7           -- inner hash
  (Word# -> Word64#
Exts.wordToWord64# Word#
0x8000000000000000##) -- padding separator
  (Word# -> Word64#
Exts.wordToWord64# Word#
0x0000000000000000##)
  (Word# -> Word64#
Exts.wordToWord64# Word#
0x0000000000000000##)
  (Word# -> Word64#
Exts.wordToWord64# Word#
0x0000000000000000##)
  (Word# -> Word64#
Exts.wordToWord64# Word#
0x0000000000000000##)
  (Word# -> Word64#
Exts.wordToWord64# Word#
0x0000000000000000##)
  (Word# -> Word64#
Exts.wordToWord64# Word#
0x0000000000000000##) -- high 64 bits of length
  (Word# -> Word64#
Exts.wordToWord64# Word#
0x0000000000000600##) -- low 64 bits of length
{-# INLINABLE pad_registers_with_length #-}

xor :: Block -> Exts.Word64# -> Block
xor :: Block -> Word64# -> Block
xor (B Word64#
w00 Word64#
w01 Word64#
w02 Word64#
w03 Word64#
w04 Word64#
w05 Word64#
w06 Word64#
w07 Word64#
w08 Word64#
w09 Word64#
w10 Word64#
w11 Word64#
w12 Word64#
w13 Word64#
w14 Word64#
w15) Word64#
b = Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Block
B
  (Word64# -> Word64# -> Word64#
Exts.xor64# Word64#
w00 Word64#
b)
  (Word64# -> Word64# -> Word64#
Exts.xor64# Word64#
w01 Word64#
b)
  (Word64# -> Word64# -> Word64#
Exts.xor64# Word64#
w02 Word64#
b)
  (Word64# -> Word64# -> Word64#
Exts.xor64# Word64#
w03 Word64#
b)
  (Word64# -> Word64# -> Word64#
Exts.xor64# Word64#
w04 Word64#
b)
  (Word64# -> Word64# -> Word64#
Exts.xor64# Word64#
w05 Word64#
b)
  (Word64# -> Word64# -> Word64#
Exts.xor64# Word64#
w06 Word64#
b)
  (Word64# -> Word64# -> Word64#
Exts.xor64# Word64#
w07 Word64#
b)
  (Word64# -> Word64# -> Word64#
Exts.xor64# Word64#
w08 Word64#
b)
  (Word64# -> Word64# -> Word64#
Exts.xor64# Word64#
w09 Word64#
b)
  (Word64# -> Word64# -> Word64#
Exts.xor64# Word64#
w10 Word64#
b)
  (Word64# -> Word64# -> Word64#
Exts.xor64# Word64#
w11 Word64#
b)
  (Word64# -> Word64# -> Word64#
Exts.xor64# Word64#
w12 Word64#
b)
  (Word64# -> Word64# -> Word64#
Exts.xor64# Word64#
w13 Word64#
b)
  (Word64# -> Word64# -> Word64#
Exts.xor64# Word64#
w14 Word64#
b)
  (Word64# -> Word64# -> Word64#
Exts.xor64# Word64#
w15 Word64#
b)
{-# INLINE xor #-}

parse_key :: BS.ByteString -> Block
parse_key :: ByteString -> Block
parse_key ByteString
bs = Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Block
B
  (ByteString -> Int -> Word64#
w64_zero ByteString
bs Int
000) (ByteString -> Int -> Word64#
w64_zero ByteString
bs Int
008) (ByteString -> Int -> Word64#
w64_zero ByteString
bs Int
016) (ByteString -> Int -> Word64#
w64_zero ByteString
bs Int
024)
  (ByteString -> Int -> Word64#
w64_zero ByteString
bs Int
032) (ByteString -> Int -> Word64#
w64_zero ByteString
bs Int
040) (ByteString -> Int -> Word64#
w64_zero ByteString
bs Int
048) (ByteString -> Int -> Word64#
w64_zero ByteString
bs Int
056)
  (ByteString -> Int -> Word64#
w64_zero ByteString
bs Int
064) (ByteString -> Int -> Word64#
w64_zero ByteString
bs Int
072) (ByteString -> Int -> Word64#
w64_zero ByteString
bs Int
080) (ByteString -> Int -> Word64#
w64_zero ByteString
bs Int
088)
  (ByteString -> Int -> Word64#
w64_zero ByteString
bs Int
096) (ByteString -> Int -> Word64#
w64_zero ByteString
bs Int
104) (ByteString -> Int -> Word64#
w64_zero ByteString
bs Int
112) (ByteString -> Int -> Word64#
w64_zero ByteString
bs Int
120)
{-# INLINE parse_key #-}

-- read big-endian Word64#, zero-padding beyond input length
w64_zero :: BS.ByteString -> Int -> Exts.Word64#
w64_zero :: ByteString -> Int -> Word64#
w64_zero ByteString
bs Int
i =
  let !w0 :: Word#
w0 = ByteString -> Int -> Word#
w8_zero ByteString
bs Int
i       Word# -> Int# -> Word#
`Exts.uncheckedShiftL#` Int#
56#
      !w1 :: Word#
w1 = ByteString -> Int -> Word#
w8_zero ByteString
bs (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) Word# -> Int# -> Word#
`Exts.uncheckedShiftL#` Int#
48#
      !w2 :: Word#
w2 = ByteString -> Int -> Word#
w8_zero ByteString
bs (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
2) Word# -> Int# -> Word#
`Exts.uncheckedShiftL#` Int#
40#
      !w3 :: Word#
w3 = ByteString -> Int -> Word#
w8_zero ByteString
bs (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
3) Word# -> Int# -> Word#
`Exts.uncheckedShiftL#` Int#
32#
      !w4 :: Word#
w4 = ByteString -> Int -> Word#
w8_zero ByteString
bs (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
4) Word# -> Int# -> Word#
`Exts.uncheckedShiftL#` Int#
24#
      !w5 :: Word#
w5 = ByteString -> Int -> Word#
w8_zero ByteString
bs (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
5) Word# -> Int# -> Word#
`Exts.uncheckedShiftL#` Int#
16#
      !w6 :: Word#
w6 = ByteString -> Int -> Word#
w8_zero ByteString
bs (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
6) Word# -> Int# -> Word#
`Exts.uncheckedShiftL#` Int#
08#
      !w7 :: Word#
w7 = ByteString -> Int -> Word#
w8_zero ByteString
bs (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
7)
  in  Word# -> Word64#
Exts.wordToWord64#
        (Word#
w0 Word# -> Word# -> Word#
`Exts.or#` Word#
w1 Word# -> Word# -> Word#
`Exts.or#` Word#
w2 Word# -> Word# -> Word#
`Exts.or#` Word#
w3 Word# -> Word# -> Word#
`Exts.or#`
         Word#
w4 Word# -> Word# -> Word#
`Exts.or#` Word#
w5 Word# -> Word# -> Word#
`Exts.or#` Word#
w6 Word# -> Word# -> Word#
`Exts.or#` Word#
w7)
{-# INLINE w64_zero #-}

-- read byte as Word#, returning zero beyond input length
w8_zero :: BS.ByteString -> Int -> Exts.Word#
w8_zero :: ByteString -> Int -> Word#
w8_zero bs :: ByteString
bs@(BI.PS ForeignPtr Word8
_ Int
_ Int
l) Int
i
  | Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
l     = let !(GHC.Word.W8# Word8#
w) = ByteString -> Int -> Word8
BU.unsafeIndex ByteString
bs Int
i
                in  Word8# -> Word#
Exts.word8ToWord# Word8#
w
  | Bool
otherwise = Word#
0##
{-# INLINE w8_zero #-}

-- hmac-drbg utilities --------------------------------------------------------

-- | Parse first complete block from v || sep || dat[0:63].
--
--   Requires len(dat) >= 63.
parse_vsb :: Registers -> Word8 -> BS.ByteString -> Block
parse_vsb :: Registers -> Word8 -> ByteString -> Block
parse_vsb (R Word64#
v0 Word64#
v1 Word64#
v2 Word64#
v3 Word64#
v4 Word64#
v5 Word64#
v6 Word64#
v7) (GHC.Word.W8# Word8#
sep) ByteString
dat =
  let !(GHC.Word.W8# Word8#
b0) = ByteString -> Int -> Word8
BU.unsafeIndex ByteString
dat Int
0
      !(GHC.Word.W8# Word8#
b1) = ByteString -> Int -> Word8
BU.unsafeIndex ByteString
dat Int
1
      !(GHC.Word.W8# Word8#
b2) = ByteString -> Int -> Word8
BU.unsafeIndex ByteString
dat Int
2
      !(GHC.Word.W8# Word8#
b3) = ByteString -> Int -> Word8
BU.unsafeIndex ByteString
dat Int
3
      !(GHC.Word.W8# Word8#
b4) = ByteString -> Int -> Word8
BU.unsafeIndex ByteString
dat Int
4
      !(GHC.Word.W8# Word8#
b5) = ByteString -> Int -> Word8
BU.unsafeIndex ByteString
dat Int
5
      !(GHC.Word.W8# Word8#
b6) = ByteString -> Int -> Word8
BU.unsafeIndex ByteString
dat Int
6
      !w08 :: Word#
w08 =
            Word# -> Int# -> Word#
Exts.uncheckedShiftL# (Word8# -> Word#
Exts.word8ToWord# Word8#
sep) Int#
56#
            Word# -> Word# -> Word#
`Exts.or#`
            Word# -> Int# -> Word#
Exts.uncheckedShiftL# (Word8# -> Word#
Exts.word8ToWord# Word8#
b0) Int#
48#
            Word# -> Word# -> Word#
`Exts.or#`
            Word# -> Int# -> Word#
Exts.uncheckedShiftL# (Word8# -> Word#
Exts.word8ToWord# Word8#
b1) Int#
40#
            Word# -> Word# -> Word#
`Exts.or#`
            Word# -> Int# -> Word#
Exts.uncheckedShiftL# (Word8# -> Word#
Exts.word8ToWord# Word8#
b2) Int#
32#
            Word# -> Word# -> Word#
`Exts.or#`
            Word# -> Int# -> Word#
Exts.uncheckedShiftL# (Word8# -> Word#
Exts.word8ToWord# Word8#
b3) Int#
24#
            Word# -> Word# -> Word#
`Exts.or#`
            Word# -> Int# -> Word#
Exts.uncheckedShiftL# (Word8# -> Word#
Exts.word8ToWord# Word8#
b4) Int#
16#
            Word# -> Word# -> Word#
`Exts.or#`
            Word# -> Int# -> Word#
Exts.uncheckedShiftL# (Word8# -> Word#
Exts.word8ToWord# Word8#
b5) Int#
8#
            Word# -> Word# -> Word#
`Exts.or#`
            Word8# -> Word#
Exts.word8ToWord# Word8#
b6
  in  Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Block
B Word64#
v0 Word64#
v1 Word64#
v2 Word64#
v3 Word64#
v4 Word64#
v5 Word64#
v6 Word64#
v7
        (Word# -> Word64#
Exts.wordToWord64# Word#
w08)
        (ByteString -> Int -> Word64#
word64be ByteString
dat Int
07) (ByteString -> Int -> Word64#
word64be ByteString
dat Int
15) (ByteString -> Int -> Word64#
word64be ByteString
dat Int
23)
        (ByteString -> Int -> Word64#
word64be ByteString
dat Int
31) (ByteString -> Int -> Word64#
word64be ByteString
dat Int
39) (ByteString -> Int -> Word64#
word64be ByteString
dat Int
47) (ByteString -> Int -> Word64#
word64be ByteString
dat Int
55)
{-# INLINE parse_vsb #-}

-- | Parse single padding block from v || sep || dat.
--
--   Requires (65 + len(dat)) < 112.
parse_pad1_vsb :: Registers -> Word8 -> BS.ByteString -> Word64 -> Block
parse_pad1_vsb :: Registers -> Word8 -> ByteString -> Word64 -> Block
parse_pad1_vsb (R Word64#
v0 Word64#
v1 Word64#
v2 Word64#
v3 Word64#
v4 Word64#
v5 Word64#
v6 Word64#
v7) Word8
sep ByteString
dat Word64
total =
  let !bits :: Word64
bits = Word64
total Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
* Word64
8
      !(GHC.Word.W64# Word64#
llo) = Word64
bits
  in  Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Block
B Word64#
v0 Word64#
v1 Word64#
v2 Word64#
v3 Word64#
v4 Word64#
v5 Word64#
v6 Word64#
v7
        (Word8 -> ByteString -> Int -> Word64#
w64_sdp Word8
sep ByteString
dat Int
064) (Word8 -> ByteString -> Int -> Word64#
w64_sdp Word8
sep ByteString
dat Int
072)
        (Word8 -> ByteString -> Int -> Word64#
w64_sdp Word8
sep ByteString
dat Int
080) (Word8 -> ByteString -> Int -> Word64#
w64_sdp Word8
sep ByteString
dat Int
088)
        (Word8 -> ByteString -> Int -> Word64#
w64_sdp Word8
sep ByteString
dat Int
096) (Word8 -> ByteString -> Int -> Word64#
w64_sdp Word8
sep ByteString
dat Int
104)
        (Word# -> Word64#
Exts.wordToWord64# Word#
0##) Word64#
llo
{-# INLINABLE parse_pad1_vsb #-}

-- | Parse two padding blocks from v || sep || dat.
--
--   Requires 112 <= (65 + len(dat)) < 128.
parse_pad2_vsb
  :: Registers -> Word8 -> BS.ByteString -> Word64 -> (# Block, Block #)
parse_pad2_vsb :: Registers -> Word8 -> ByteString -> Word64 -> (# Block, Block #)
parse_pad2_vsb (R Word64#
v0 Word64#
v1 Word64#
v2 Word64#
v3 Word64#
v4 Word64#
v5 Word64#
v6 Word64#
v7) Word8
sep ByteString
dat Word64
total =
  let !bits :: Word64
bits = Word64
total Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
* Word64
8
      !z :: Word64#
z = Word# -> Word64#
Exts.wordToWord64# Word#
0##
      !(GHC.Word.W64# Word64#
llo) = Word64
bits
      !b0 :: Block
b0 = Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Block
B Word64#
v0 Word64#
v1 Word64#
v2 Word64#
v3 Word64#
v4 Word64#
v5 Word64#
v6 Word64#
v7
              (Word8 -> ByteString -> Int -> Word64#
w64_sdp Word8
sep ByteString
dat Int
064) (Word8 -> ByteString -> Int -> Word64#
w64_sdp Word8
sep ByteString
dat Int
072)
              (Word8 -> ByteString -> Int -> Word64#
w64_sdp Word8
sep ByteString
dat Int
080) (Word8 -> ByteString -> Int -> Word64#
w64_sdp Word8
sep ByteString
dat Int
088)
              (Word8 -> ByteString -> Int -> Word64#
w64_sdp Word8
sep ByteString
dat Int
096) (Word8 -> ByteString -> Int -> Word64#
w64_sdp Word8
sep ByteString
dat Int
104)
              (Word8 -> ByteString -> Int -> Word64#
w64_sdp Word8
sep ByteString
dat Int
112) (Word8 -> ByteString -> Int -> Word64#
w64_sdp Word8
sep ByteString
dat Int
120)
      !b1 :: Block
b1 = Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Word64#
-> Block
B Word64#
z Word64#
z Word64#
z Word64#
z Word64#
z Word64#
z Word64#
z Word64#
z Word64#
z Word64#
z Word64#
z Word64#
z Word64#
z Word64#
z Word64#
z Word64#
llo
  in  (# Block
b0, Block
b1 #)
{-# INLINABLE parse_pad2_vsb #-}

-- Read Word64 at offset i (>= 64) from (sep || dat || 0x80 || zeros).
w64_sdp :: Word8 -> BS.ByteString -> Int -> Exts.Word64#
w64_sdp :: Word8 -> ByteString -> Int -> Word64#
w64_sdp Word8
sep ByteString
dat Int
i =
  let !(GHC.Word.W8# Word8#
a) = Word8 -> ByteString -> Int -> Word8
byte_sdp Word8
sep ByteString
dat Int
i
      !(GHC.Word.W8# Word8#
b) = Word8 -> ByteString -> Int -> Word8
byte_sdp Word8
sep ByteString
dat (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
      !(GHC.Word.W8# Word8#
c) = Word8 -> ByteString -> Int -> Word8
byte_sdp Word8
sep ByteString
dat (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
2)
      !(GHC.Word.W8# Word8#
d) = Word8 -> ByteString -> Int -> Word8
byte_sdp Word8
sep ByteString
dat (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
3)
      !(GHC.Word.W8# Word8#
e) = Word8 -> ByteString -> Int -> Word8
byte_sdp Word8
sep ByteString
dat (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
4)
      !(GHC.Word.W8# Word8#
f) = Word8 -> ByteString -> Int -> Word8
byte_sdp Word8
sep ByteString
dat (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
5)
      !(GHC.Word.W8# Word8#
g) = Word8 -> ByteString -> Int -> Word8
byte_sdp Word8
sep ByteString
dat (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
6)
      !(GHC.Word.W8# Word8#
h) = Word8 -> ByteString -> Int -> Word8
byte_sdp Word8
sep ByteString
dat (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
7)
  in  Word# -> Word64#
Exts.wordToWord64#
        (Word# -> Int# -> Word#
Exts.uncheckedShiftL# (Word8# -> Word#
Exts.word8ToWord# Word8#
a) Int#
56#
         Word# -> Word# -> Word#
`Exts.or#`
         Word# -> Int# -> Word#
Exts.uncheckedShiftL# (Word8# -> Word#
Exts.word8ToWord# Word8#
b) Int#
48#
         Word# -> Word# -> Word#
`Exts.or#`
         Word# -> Int# -> Word#
Exts.uncheckedShiftL# (Word8# -> Word#
Exts.word8ToWord# Word8#
c) Int#
40#
         Word# -> Word# -> Word#
`Exts.or#`
         Word# -> Int# -> Word#
Exts.uncheckedShiftL# (Word8# -> Word#
Exts.word8ToWord# Word8#
d) Int#
32#
         Word# -> Word# -> Word#
`Exts.or#`
         Word# -> Int# -> Word#
Exts.uncheckedShiftL# (Word8# -> Word#
Exts.word8ToWord# Word8#
e) Int#
24#
         Word# -> Word# -> Word#
`Exts.or#`
         Word# -> Int# -> Word#
Exts.uncheckedShiftL# (Word8# -> Word#
Exts.word8ToWord# Word8#
f) Int#
16#
         Word# -> Word# -> Word#
`Exts.or#`
         Word# -> Int# -> Word#
Exts.uncheckedShiftL# (Word8# -> Word#
Exts.word8ToWord# Word8#
g) Int#
8#
         Word# -> Word# -> Word#
`Exts.or#`
         Word8# -> Word#
Exts.word8ToWord# Word8#
h)
{-# INLINE w64_sdp #-}

-- Read byte at offset i (>= 64) from (sep || dat || 0x80 || zeros).
byte_sdp :: Word8 -> BS.ByteString -> Int -> Word8
byte_sdp :: Word8 -> ByteString -> Int -> Word8
byte_sdp Word8
sep dat :: ByteString
dat@(BI.PS ForeignPtr Word8
_ Int
_ Int
l) Int
i
  | Int
i Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
64     = Word8
sep
  | Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
65 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
l  = ByteString -> Int -> Word8
BU.unsafeIndex ByteString
dat (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
65)
  | Int
i Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
65 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
l = Word8
0x80
  | Bool
otherwise   = Word8
0x00
{-# INLINE byte_sdp #-}