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

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

module Crypto.Hash.SHA256.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, Word32, Word64)
import qualified GHC.IO (IO(..))
import GHC.Ptr (Ptr(..))
import GHC.Exts (Int#)
import qualified GHC.Exts as Exts
import qualified GHC.Word (Word32(..), 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

-- | SHA256 block.
newtype Block = Block
  (# Exts.Word32#, Exts.Word32#, Exts.Word32#, Exts.Word32#
  ,  Exts.Word32#, Exts.Word32#, Exts.Word32#, Exts.Word32#
  ,  Exts.Word32#, Exts.Word32#, Exts.Word32#, Exts.Word32#
  ,  Exts.Word32#, Exts.Word32#, Exts.Word32#, Exts.Word32#
  #)

pattern B
  :: Exts.Word32# -> Exts.Word32# -> Exts.Word32# -> Exts.Word32#
  -> Exts.Word32# -> Exts.Word32# -> Exts.Word32# -> Exts.Word32#
  -> Exts.Word32# -> Exts.Word32# -> Exts.Word32# -> Exts.Word32#
  -> Exts.Word32# -> Exts.Word32# -> Exts.Word32# -> Exts.Word32#
  -> Block
pattern $mB :: forall {r}.
Block
-> (Word32#
    -> Word32#
    -> Word32#
    -> Word32#
    -> Word32#
    -> Word32#
    -> Word32#
    -> Word32#
    -> Word32#
    -> Word32#
    -> Word32#
    -> Word32#
    -> Word32#
    -> Word32#
    -> Word32#
    -> Word32#
    -> r)
-> ((# #) -> r)
-> r
$bB :: Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> 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 #-}

-- | SHA256 state.
newtype Registers = Registers
  (# Exts.Word32#, Exts.Word32#, Exts.Word32#, Exts.Word32#
  ,  Exts.Word32#, Exts.Word32#, Exts.Word32#, Exts.Word32#
  #)

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

-- utilities ------------------------------------------------------------------

fi :: (Integral a, Num b) => a -> b
fi :: forall a b. (Integral a, Num b) => a -> b
fi = a -> b
forall a b. (Integral a, Num b) => a -> b
fromIntegral
{-# INLINE fi #-}

-- 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 = Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Block
B
  (ByteString -> Int -> Word32#
word32be ByteString
bs Int
m)
  (ByteString -> Int -> Word32#
word32be ByteString
bs (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
04))
  (ByteString -> Int -> Word32#
word32be ByteString
bs (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
08))
  (ByteString -> Int -> Word32#
word32be ByteString
bs (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
12))
  (ByteString -> Int -> Word32#
word32be ByteString
bs (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
16))
  (ByteString -> Int -> Word32#
word32be ByteString
bs (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
20))
  (ByteString -> Int -> Word32#
word32be ByteString
bs (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
24))
  (ByteString -> Int -> Word32#
word32be ByteString
bs (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
28))
  (ByteString -> Int -> Word32#
word32be ByteString
bs (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
32))
  (ByteString -> Int -> Word32#
word32be ByteString
bs (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
36))
  (ByteString -> Int -> Word32#
word32be ByteString
bs (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
40))
  (ByteString -> Int -> Word32#
word32be ByteString
bs (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
44))
  (ByteString -> Int -> Word32#
word32be ByteString
bs (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
48))
  (ByteString -> Int -> Word32#
word32be ByteString
bs (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
52))
  (ByteString -> Int -> Word32#
word32be ByteString
bs (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
56))
  (ByteString -> Int -> Word32#
word32be ByteString
bs (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
60))
{-# INLINE parse #-}

-- | Parse the 32-bit word encoded at the given ofset.
--
--   The length of the input is not checked.
word32be :: BS.ByteString -> Int -> Exts.Word32#
word32be :: ByteString -> Int -> Word32#
word32be ByteString
bs Int
m =
  let !(GHC.Word.W8# Word8#
ra) = ByteString -> Int -> Word8
BU.unsafeIndex ByteString
bs Int
m
      !(GHC.Word.W8# Word8#
rb) = 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#
rc) = 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#
rd) = ByteString -> Int -> Word8
BU.unsafeIndex ByteString
bs (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
3)
      !a :: Word32#
a  = Word# -> Word32#
Exts.wordToWord32# (Word8# -> Word#
Exts.word8ToWord# Word8#
ra)
      !b :: Word32#
b  = Word# -> Word32#
Exts.wordToWord32# (Word8# -> Word#
Exts.word8ToWord# Word8#
rb)
      !c :: Word32#
c  = Word# -> Word32#
Exts.wordToWord32# (Word8# -> Word#
Exts.word8ToWord# Word8#
rc)
      !d :: Word32#
d  = Word# -> Word32#
Exts.wordToWord32# (Word8# -> Word#
Exts.word8ToWord# Word8#
rd)
      !sa :: Word32#
sa = Word32# -> Int# -> Word32#
Exts.uncheckedShiftLWord32# Word32#
a Int#
24#
      !sb :: Word32#
sb = Word32# -> Int# -> Word32#
Exts.uncheckedShiftLWord32# Word32#
b Int#
16#
      !sc :: Word32#
sc = Word32# -> Int# -> Word32#
Exts.uncheckedShiftLWord32# Word32#
c Int#
08#
  in  Word32#
sa Word32# -> Word32# -> Word32#
`Exts.orWord32#` Word32#
sb Word32# -> Word32# -> Word32#
`Exts.orWord32#` Word32#
sc Word32# -> Word32# -> Word32#
`Exts.orWord32#` Word32#
d
{-# INLINE word32be #-}

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

-- | Parse the final chunk of an input message, assuming it is less than
--   56 bytes in length (unchecked!).
--
--   Returns one block consisting of the chunk and padding.
parse_pad1
  :: BS.ByteString -- ^ final input chunk (< 56 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.W32# Word32#
lhi) = Word64 -> Word32
forall a b. (Integral a, Num b) => a -> b
fi (Word64
bits Word64 -> Int -> Word64
forall a. Bits a => a -> Int -> a
`B.unsafeShiftR` Int
32)
      !(GHC.Word.W32# Word32#
llo) = Word64 -> Word32
forall a b. (Integral a, Num b) => a -> b
fi Word64
bits
  in  Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Block
B (ByteString -> Int -> Word32#
w32_at ByteString
bs Int
00) (ByteString -> Int -> Word32#
w32_at ByteString
bs Int
04) (ByteString -> Int -> Word32#
w32_at ByteString
bs Int
08) (ByteString -> Int -> Word32#
w32_at ByteString
bs Int
12)
        (ByteString -> Int -> Word32#
w32_at ByteString
bs Int
16) (ByteString -> Int -> Word32#
w32_at ByteString
bs Int
20) (ByteString -> Int -> Word32#
w32_at ByteString
bs Int
24) (ByteString -> Int -> Word32#
w32_at ByteString
bs Int
28)
        (ByteString -> Int -> Word32#
w32_at ByteString
bs Int
32) (ByteString -> Int -> Word32#
w32_at ByteString
bs Int
36) (ByteString -> Int -> Word32#
w32_at ByteString
bs Int
40) (ByteString -> Int -> Word32#
w32_at ByteString
bs Int
44)
        (ByteString -> Int -> Word32#
w32_at ByteString
bs Int
48) (ByteString -> Int -> Word32#
w32_at ByteString
bs Int
52) Word32#
lhi            Word32#
llo
{-# INLINABLE parse_pad1 #-}

-- | Parse the final chunk of an input message, assuming it is at least 56
--   bytes in length (unchecked!).
--
--   Returns two blocks consisting of the chunk and padding.
parse_pad2
  :: BS.ByteString       -- ^ final input chunk (>= 56 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 :: Word32#
z    = Word# -> Word32#
Exts.wordToWord32# Word#
0##
      !(GHC.Word.W32# Word32#
lhi) = Word64 -> Word32
forall a b. (Integral a, Num b) => a -> b
fi (Word64
bits Word64 -> Int -> Word64
forall a. Bits a => a -> Int -> a
`B.unsafeShiftR` Int
32)
      !(GHC.Word.W32# Word32#
llo) = Word64 -> Word32
forall a b. (Integral a, Num b) => a -> b
fi Word64
bits
      !block0 :: Block
block0 = Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Block
B
        (ByteString -> Int -> Word32#
w32_at ByteString
bs Int
00) (ByteString -> Int -> Word32#
w32_at ByteString
bs Int
04) (ByteString -> Int -> Word32#
w32_at ByteString
bs Int
08) (ByteString -> Int -> Word32#
w32_at ByteString
bs Int
12)
        (ByteString -> Int -> Word32#
w32_at ByteString
bs Int
16) (ByteString -> Int -> Word32#
w32_at ByteString
bs Int
20) (ByteString -> Int -> Word32#
w32_at ByteString
bs Int
24) (ByteString -> Int -> Word32#
w32_at ByteString
bs Int
28)
        (ByteString -> Int -> Word32#
w32_at ByteString
bs Int
32) (ByteString -> Int -> Word32#
w32_at ByteString
bs Int
36) (ByteString -> Int -> Word32#
w32_at ByteString
bs Int
40) (ByteString -> Int -> Word32#
w32_at ByteString
bs Int
44)
        (ByteString -> Int -> Word32#
w32_at ByteString
bs Int
48) (ByteString -> Int -> Word32#
w32_at ByteString
bs Int
52) (ByteString -> Int -> Word32#
w32_at ByteString
bs Int
56) (ByteString -> Int -> Word32#
w32_at ByteString
bs Int
60)
      !block1 :: Block
block1 = Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Block
B Word32#
z Word32#
z Word32#
z Word32#
z Word32#
z Word32#
z Word32#
z Word32#
z Word32#
z Word32#
z Word32#
z Word32#
z Word32#
z Word32#
z Word32#
lhi Word32#
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 32-bit word.
w8_as_w32_at
  :: BS.ByteString  -- ^ input chunk
  -> Int            -- ^ offset
  -> Exts.Word32#
w8_as_w32_at :: ByteString -> Int -> Word32#
w8_as_w32_at bs :: ByteString
bs@(BI.PS ForeignPtr Word8
_ Int
_ Int
l) Int
i = Word# -> Word32#
Exts.wordToWord32# (Word# -> Word32#) -> Word# -> Word32#
forall a b. (a -> b) -> a -> b
$ 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_w32_at #-}

-- | Return the 32-bit word encoded by four consecutive bytes at the
--   provided offset.
w32_at
  :: BS.ByteString
  -> Int
  -> Exts.Word32#
w32_at :: ByteString -> Int -> Word32#
w32_at ByteString
bs Int
i =
  let !wa :: Word32#
wa = ByteString -> Int -> Word32#
w8_as_w32_at ByteString
bs Int
i       Word32# -> Int# -> Word32#
`Exts.uncheckedShiftLWord32#` Int#
24#
      !wb :: Word32#
wb = ByteString -> Int -> Word32#
w8_as_w32_at ByteString
bs (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) Word32# -> Int# -> Word32#
`Exts.uncheckedShiftLWord32#` Int#
16#
      !wc :: Word32#
wc = ByteString -> Int -> Word32#
w8_as_w32_at ByteString
bs (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
2) Word32# -> Int# -> Word32#
`Exts.uncheckedShiftLWord32#` Int#
08#
      !wd :: Word32#
wd = ByteString -> Int -> Word32#
w8_as_w32_at ByteString
bs (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
3)
  in  Word32#
wa Word32# -> Word32# -> Word32#
`Exts.orWord32#` Word32#
wb Word32# -> Word32# -> Word32#
`Exts.orWord32#` Word32#
wc Word32# -> Word32# -> Word32#
`Exts.orWord32#` Word32#
wd
{-# INLINE w32_at #-}

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

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

      -- rounds (constants are cube roots of first 64 primes)
      !(R Word32#
s00a Word32#
s00b Word32#
s00c Word32#
s00d Word32#
s00e Word32#
s00f Word32#
s00g Word32#
s00h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
h0 Word32#
h1 Word32#
h2 Word32#
h3 Word32#
h4 Word32#
h5 Word32#
h6 Word32#
h7 (Word# -> Word32#
k Word#
0x428a2f98##) Word32#
w00
      !(R Word32#
s01a Word32#
s01b Word32#
s01c Word32#
s01d Word32#
s01e Word32#
s01f Word32#
s01g Word32#
s01h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s00a Word32#
s00b Word32#
s00c Word32#
s00d Word32#
s00e Word32#
s00f Word32#
s00g Word32#
s00h (Word# -> Word32#
k Word#
0x71374491##) Word32#
w01
      !(R Word32#
s02a Word32#
s02b Word32#
s02c Word32#
s02d Word32#
s02e Word32#
s02f Word32#
s02g Word32#
s02h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s01a Word32#
s01b Word32#
s01c Word32#
s01d Word32#
s01e Word32#
s01f Word32#
s01g Word32#
s01h (Word# -> Word32#
k Word#
0xb5c0fbcf##) Word32#
w02
      !(R Word32#
s03a Word32#
s03b Word32#
s03c Word32#
s03d Word32#
s03e Word32#
s03f Word32#
s03g Word32#
s03h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s02a Word32#
s02b Word32#
s02c Word32#
s02d Word32#
s02e Word32#
s02f Word32#
s02g Word32#
s02h (Word# -> Word32#
k Word#
0xe9b5dba5##) Word32#
w03
      !(R Word32#
s04a Word32#
s04b Word32#
s04c Word32#
s04d Word32#
s04e Word32#
s04f Word32#
s04g Word32#
s04h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s03a Word32#
s03b Word32#
s03c Word32#
s03d Word32#
s03e Word32#
s03f Word32#
s03g Word32#
s03h (Word# -> Word32#
k Word#
0x3956c25b##) Word32#
w04
      !(R Word32#
s05a Word32#
s05b Word32#
s05c Word32#
s05d Word32#
s05e Word32#
s05f Word32#
s05g Word32#
s05h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s04a Word32#
s04b Word32#
s04c Word32#
s04d Word32#
s04e Word32#
s04f Word32#
s04g Word32#
s04h (Word# -> Word32#
k Word#
0x59f111f1##) Word32#
w05
      !(R Word32#
s06a Word32#
s06b Word32#
s06c Word32#
s06d Word32#
s06e Word32#
s06f Word32#
s06g Word32#
s06h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s05a Word32#
s05b Word32#
s05c Word32#
s05d Word32#
s05e Word32#
s05f Word32#
s05g Word32#
s05h (Word# -> Word32#
k Word#
0x923f82a4##) Word32#
w06
      !(R Word32#
s07a Word32#
s07b Word32#
s07c Word32#
s07d Word32#
s07e Word32#
s07f Word32#
s07g Word32#
s07h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s06a Word32#
s06b Word32#
s06c Word32#
s06d Word32#
s06e Word32#
s06f Word32#
s06g Word32#
s06h (Word# -> Word32#
k Word#
0xab1c5ed5##) Word32#
w07
      !(R Word32#
s08a Word32#
s08b Word32#
s08c Word32#
s08d Word32#
s08e Word32#
s08f Word32#
s08g Word32#
s08h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s07a Word32#
s07b Word32#
s07c Word32#
s07d Word32#
s07e Word32#
s07f Word32#
s07g Word32#
s07h (Word# -> Word32#
k Word#
0xd807aa98##) Word32#
w08
      !(R Word32#
s09a Word32#
s09b Word32#
s09c Word32#
s09d Word32#
s09e Word32#
s09f Word32#
s09g Word32#
s09h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s08a Word32#
s08b Word32#
s08c Word32#
s08d Word32#
s08e Word32#
s08f Word32#
s08g Word32#
s08h (Word# -> Word32#
k Word#
0x12835b01##) Word32#
w09
      !(R Word32#
s10a Word32#
s10b Word32#
s10c Word32#
s10d Word32#
s10e Word32#
s10f Word32#
s10g Word32#
s10h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s09a Word32#
s09b Word32#
s09c Word32#
s09d Word32#
s09e Word32#
s09f Word32#
s09g Word32#
s09h (Word# -> Word32#
k Word#
0x243185be##) Word32#
w10
      !(R Word32#
s11a Word32#
s11b Word32#
s11c Word32#
s11d Word32#
s11e Word32#
s11f Word32#
s11g Word32#
s11h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s10a Word32#
s10b Word32#
s10c Word32#
s10d Word32#
s10e Word32#
s10f Word32#
s10g Word32#
s10h (Word# -> Word32#
k Word#
0x550c7dc3##) Word32#
w11
      !(R Word32#
s12a Word32#
s12b Word32#
s12c Word32#
s12d Word32#
s12e Word32#
s12f Word32#
s12g Word32#
s12h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s11a Word32#
s11b Word32#
s11c Word32#
s11d Word32#
s11e Word32#
s11f Word32#
s11g Word32#
s11h (Word# -> Word32#
k Word#
0x72be5d74##) Word32#
w12
      !(R Word32#
s13a Word32#
s13b Word32#
s13c Word32#
s13d Word32#
s13e Word32#
s13f Word32#
s13g Word32#
s13h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s12a Word32#
s12b Word32#
s12c Word32#
s12d Word32#
s12e Word32#
s12f Word32#
s12g Word32#
s12h (Word# -> Word32#
k Word#
0x80deb1fe##) Word32#
w13
      !(R Word32#
s14a Word32#
s14b Word32#
s14c Word32#
s14d Word32#
s14e Word32#
s14f Word32#
s14g Word32#
s14h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s13a Word32#
s13b Word32#
s13c Word32#
s13d Word32#
s13e Word32#
s13f Word32#
s13g Word32#
s13h (Word# -> Word32#
k Word#
0x9bdc06a7##) Word32#
w14
      !(R Word32#
s15a Word32#
s15b Word32#
s15c Word32#
s15d Word32#
s15e Word32#
s15f Word32#
s15g Word32#
s15h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s14a Word32#
s14b Word32#
s14c Word32#
s14d Word32#
s14e Word32#
s14f Word32#
s14g Word32#
s14h (Word# -> Word32#
k Word#
0xc19bf174##) Word32#
w15
      !(R Word32#
s16a Word32#
s16b Word32#
s16c Word32#
s16d Word32#
s16e Word32#
s16f Word32#
s16g Word32#
s16h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s15a Word32#
s15b Word32#
s15c Word32#
s15d Word32#
s15e Word32#
s15f Word32#
s15g Word32#
s15h (Word# -> Word32#
k Word#
0xe49b69c1##) Word32#
w16
      !(R Word32#
s17a Word32#
s17b Word32#
s17c Word32#
s17d Word32#
s17e Word32#
s17f Word32#
s17g Word32#
s17h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s16a Word32#
s16b Word32#
s16c Word32#
s16d Word32#
s16e Word32#
s16f Word32#
s16g Word32#
s16h (Word# -> Word32#
k Word#
0xefbe4786##) Word32#
w17
      !(R Word32#
s18a Word32#
s18b Word32#
s18c Word32#
s18d Word32#
s18e Word32#
s18f Word32#
s18g Word32#
s18h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s17a Word32#
s17b Word32#
s17c Word32#
s17d Word32#
s17e Word32#
s17f Word32#
s17g Word32#
s17h (Word# -> Word32#
k Word#
0x0fc19dc6##) Word32#
w18
      !(R Word32#
s19a Word32#
s19b Word32#
s19c Word32#
s19d Word32#
s19e Word32#
s19f Word32#
s19g Word32#
s19h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s18a Word32#
s18b Word32#
s18c Word32#
s18d Word32#
s18e Word32#
s18f Word32#
s18g Word32#
s18h (Word# -> Word32#
k Word#
0x240ca1cc##) Word32#
w19
      !(R Word32#
s20a Word32#
s20b Word32#
s20c Word32#
s20d Word32#
s20e Word32#
s20f Word32#
s20g Word32#
s20h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s19a Word32#
s19b Word32#
s19c Word32#
s19d Word32#
s19e Word32#
s19f Word32#
s19g Word32#
s19h (Word# -> Word32#
k Word#
0x2de92c6f##) Word32#
w20
      !(R Word32#
s21a Word32#
s21b Word32#
s21c Word32#
s21d Word32#
s21e Word32#
s21f Word32#
s21g Word32#
s21h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s20a Word32#
s20b Word32#
s20c Word32#
s20d Word32#
s20e Word32#
s20f Word32#
s20g Word32#
s20h (Word# -> Word32#
k Word#
0x4a7484aa##) Word32#
w21
      !(R Word32#
s22a Word32#
s22b Word32#
s22c Word32#
s22d Word32#
s22e Word32#
s22f Word32#
s22g Word32#
s22h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s21a Word32#
s21b Word32#
s21c Word32#
s21d Word32#
s21e Word32#
s21f Word32#
s21g Word32#
s21h (Word# -> Word32#
k Word#
0x5cb0a9dc##) Word32#
w22
      !(R Word32#
s23a Word32#
s23b Word32#
s23c Word32#
s23d Word32#
s23e Word32#
s23f Word32#
s23g Word32#
s23h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s22a Word32#
s22b Word32#
s22c Word32#
s22d Word32#
s22e Word32#
s22f Word32#
s22g Word32#
s22h (Word# -> Word32#
k Word#
0x76f988da##) Word32#
w23
      !(R Word32#
s24a Word32#
s24b Word32#
s24c Word32#
s24d Word32#
s24e Word32#
s24f Word32#
s24g Word32#
s24h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s23a Word32#
s23b Word32#
s23c Word32#
s23d Word32#
s23e Word32#
s23f Word32#
s23g Word32#
s23h (Word# -> Word32#
k Word#
0x983e5152##) Word32#
w24
      !(R Word32#
s25a Word32#
s25b Word32#
s25c Word32#
s25d Word32#
s25e Word32#
s25f Word32#
s25g Word32#
s25h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s24a Word32#
s24b Word32#
s24c Word32#
s24d Word32#
s24e Word32#
s24f Word32#
s24g Word32#
s24h (Word# -> Word32#
k Word#
0xa831c66d##) Word32#
w25
      !(R Word32#
s26a Word32#
s26b Word32#
s26c Word32#
s26d Word32#
s26e Word32#
s26f Word32#
s26g Word32#
s26h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s25a Word32#
s25b Word32#
s25c Word32#
s25d Word32#
s25e Word32#
s25f Word32#
s25g Word32#
s25h (Word# -> Word32#
k Word#
0xb00327c8##) Word32#
w26
      !(R Word32#
s27a Word32#
s27b Word32#
s27c Word32#
s27d Word32#
s27e Word32#
s27f Word32#
s27g Word32#
s27h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s26a Word32#
s26b Word32#
s26c Word32#
s26d Word32#
s26e Word32#
s26f Word32#
s26g Word32#
s26h (Word# -> Word32#
k Word#
0xbf597fc7##) Word32#
w27
      !(R Word32#
s28a Word32#
s28b Word32#
s28c Word32#
s28d Word32#
s28e Word32#
s28f Word32#
s28g Word32#
s28h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s27a Word32#
s27b Word32#
s27c Word32#
s27d Word32#
s27e Word32#
s27f Word32#
s27g Word32#
s27h (Word# -> Word32#
k Word#
0xc6e00bf3##) Word32#
w28
      !(R Word32#
s29a Word32#
s29b Word32#
s29c Word32#
s29d Word32#
s29e Word32#
s29f Word32#
s29g Word32#
s29h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s28a Word32#
s28b Word32#
s28c Word32#
s28d Word32#
s28e Word32#
s28f Word32#
s28g Word32#
s28h (Word# -> Word32#
k Word#
0xd5a79147##) Word32#
w29
      !(R Word32#
s30a Word32#
s30b Word32#
s30c Word32#
s30d Word32#
s30e Word32#
s30f Word32#
s30g Word32#
s30h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s29a Word32#
s29b Word32#
s29c Word32#
s29d Word32#
s29e Word32#
s29f Word32#
s29g Word32#
s29h (Word# -> Word32#
k Word#
0x06ca6351##) Word32#
w30
      !(R Word32#
s31a Word32#
s31b Word32#
s31c Word32#
s31d Word32#
s31e Word32#
s31f Word32#
s31g Word32#
s31h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s30a Word32#
s30b Word32#
s30c Word32#
s30d Word32#
s30e Word32#
s30f Word32#
s30g Word32#
s30h (Word# -> Word32#
k Word#
0x14292967##) Word32#
w31
      !(R Word32#
s32a Word32#
s32b Word32#
s32c Word32#
s32d Word32#
s32e Word32#
s32f Word32#
s32g Word32#
s32h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s31a Word32#
s31b Word32#
s31c Word32#
s31d Word32#
s31e Word32#
s31f Word32#
s31g Word32#
s31h (Word# -> Word32#
k Word#
0x27b70a85##) Word32#
w32
      !(R Word32#
s33a Word32#
s33b Word32#
s33c Word32#
s33d Word32#
s33e Word32#
s33f Word32#
s33g Word32#
s33h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s32a Word32#
s32b Word32#
s32c Word32#
s32d Word32#
s32e Word32#
s32f Word32#
s32g Word32#
s32h (Word# -> Word32#
k Word#
0x2e1b2138##) Word32#
w33
      !(R Word32#
s34a Word32#
s34b Word32#
s34c Word32#
s34d Word32#
s34e Word32#
s34f Word32#
s34g Word32#
s34h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s33a Word32#
s33b Word32#
s33c Word32#
s33d Word32#
s33e Word32#
s33f Word32#
s33g Word32#
s33h (Word# -> Word32#
k Word#
0x4d2c6dfc##) Word32#
w34
      !(R Word32#
s35a Word32#
s35b Word32#
s35c Word32#
s35d Word32#
s35e Word32#
s35f Word32#
s35g Word32#
s35h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s34a Word32#
s34b Word32#
s34c Word32#
s34d Word32#
s34e Word32#
s34f Word32#
s34g Word32#
s34h (Word# -> Word32#
k Word#
0x53380d13##) Word32#
w35
      !(R Word32#
s36a Word32#
s36b Word32#
s36c Word32#
s36d Word32#
s36e Word32#
s36f Word32#
s36g Word32#
s36h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s35a Word32#
s35b Word32#
s35c Word32#
s35d Word32#
s35e Word32#
s35f Word32#
s35g Word32#
s35h (Word# -> Word32#
k Word#
0x650a7354##) Word32#
w36
      !(R Word32#
s37a Word32#
s37b Word32#
s37c Word32#
s37d Word32#
s37e Word32#
s37f Word32#
s37g Word32#
s37h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s36a Word32#
s36b Word32#
s36c Word32#
s36d Word32#
s36e Word32#
s36f Word32#
s36g Word32#
s36h (Word# -> Word32#
k Word#
0x766a0abb##) Word32#
w37
      !(R Word32#
s38a Word32#
s38b Word32#
s38c Word32#
s38d Word32#
s38e Word32#
s38f Word32#
s38g Word32#
s38h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s37a Word32#
s37b Word32#
s37c Word32#
s37d Word32#
s37e Word32#
s37f Word32#
s37g Word32#
s37h (Word# -> Word32#
k Word#
0x81c2c92e##) Word32#
w38
      !(R Word32#
s39a Word32#
s39b Word32#
s39c Word32#
s39d Word32#
s39e Word32#
s39f Word32#
s39g Word32#
s39h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s38a Word32#
s38b Word32#
s38c Word32#
s38d Word32#
s38e Word32#
s38f Word32#
s38g Word32#
s38h (Word# -> Word32#
k Word#
0x92722c85##) Word32#
w39
      !(R Word32#
s40a Word32#
s40b Word32#
s40c Word32#
s40d Word32#
s40e Word32#
s40f Word32#
s40g Word32#
s40h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s39a Word32#
s39b Word32#
s39c Word32#
s39d Word32#
s39e Word32#
s39f Word32#
s39g Word32#
s39h (Word# -> Word32#
k Word#
0xa2bfe8a1##) Word32#
w40
      !(R Word32#
s41a Word32#
s41b Word32#
s41c Word32#
s41d Word32#
s41e Word32#
s41f Word32#
s41g Word32#
s41h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s40a Word32#
s40b Word32#
s40c Word32#
s40d Word32#
s40e Word32#
s40f Word32#
s40g Word32#
s40h (Word# -> Word32#
k Word#
0xa81a664b##) Word32#
w41
      !(R Word32#
s42a Word32#
s42b Word32#
s42c Word32#
s42d Word32#
s42e Word32#
s42f Word32#
s42g Word32#
s42h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s41a Word32#
s41b Word32#
s41c Word32#
s41d Word32#
s41e Word32#
s41f Word32#
s41g Word32#
s41h (Word# -> Word32#
k Word#
0xc24b8b70##) Word32#
w42
      !(R Word32#
s43a Word32#
s43b Word32#
s43c Word32#
s43d Word32#
s43e Word32#
s43f Word32#
s43g Word32#
s43h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s42a Word32#
s42b Word32#
s42c Word32#
s42d Word32#
s42e Word32#
s42f Word32#
s42g Word32#
s42h (Word# -> Word32#
k Word#
0xc76c51a3##) Word32#
w43
      !(R Word32#
s44a Word32#
s44b Word32#
s44c Word32#
s44d Word32#
s44e Word32#
s44f Word32#
s44g Word32#
s44h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s43a Word32#
s43b Word32#
s43c Word32#
s43d Word32#
s43e Word32#
s43f Word32#
s43g Word32#
s43h (Word# -> Word32#
k Word#
0xd192e819##) Word32#
w44
      !(R Word32#
s45a Word32#
s45b Word32#
s45c Word32#
s45d Word32#
s45e Word32#
s45f Word32#
s45g Word32#
s45h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s44a Word32#
s44b Word32#
s44c Word32#
s44d Word32#
s44e Word32#
s44f Word32#
s44g Word32#
s44h (Word# -> Word32#
k Word#
0xd6990624##) Word32#
w45
      !(R Word32#
s46a Word32#
s46b Word32#
s46c Word32#
s46d Word32#
s46e Word32#
s46f Word32#
s46g Word32#
s46h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s45a Word32#
s45b Word32#
s45c Word32#
s45d Word32#
s45e Word32#
s45f Word32#
s45g Word32#
s45h (Word# -> Word32#
k Word#
0xf40e3585##) Word32#
w46
      !(R Word32#
s47a Word32#
s47b Word32#
s47c Word32#
s47d Word32#
s47e Word32#
s47f Word32#
s47g Word32#
s47h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s46a Word32#
s46b Word32#
s46c Word32#
s46d Word32#
s46e Word32#
s46f Word32#
s46g Word32#
s46h (Word# -> Word32#
k Word#
0x106aa070##) Word32#
w47
      !(R Word32#
s48a Word32#
s48b Word32#
s48c Word32#
s48d Word32#
s48e Word32#
s48f Word32#
s48g Word32#
s48h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s47a Word32#
s47b Word32#
s47c Word32#
s47d Word32#
s47e Word32#
s47f Word32#
s47g Word32#
s47h (Word# -> Word32#
k Word#
0x19a4c116##) Word32#
w48
      !(R Word32#
s49a Word32#
s49b Word32#
s49c Word32#
s49d Word32#
s49e Word32#
s49f Word32#
s49g Word32#
s49h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s48a Word32#
s48b Word32#
s48c Word32#
s48d Word32#
s48e Word32#
s48f Word32#
s48g Word32#
s48h (Word# -> Word32#
k Word#
0x1e376c08##) Word32#
w49
      !(R Word32#
s50a Word32#
s50b Word32#
s50c Word32#
s50d Word32#
s50e Word32#
s50f Word32#
s50g Word32#
s50h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s49a Word32#
s49b Word32#
s49c Word32#
s49d Word32#
s49e Word32#
s49f Word32#
s49g Word32#
s49h (Word# -> Word32#
k Word#
0x2748774c##) Word32#
w50
      !(R Word32#
s51a Word32#
s51b Word32#
s51c Word32#
s51d Word32#
s51e Word32#
s51f Word32#
s51g Word32#
s51h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s50a Word32#
s50b Word32#
s50c Word32#
s50d Word32#
s50e Word32#
s50f Word32#
s50g Word32#
s50h (Word# -> Word32#
k Word#
0x34b0bcb5##) Word32#
w51
      !(R Word32#
s52a Word32#
s52b Word32#
s52c Word32#
s52d Word32#
s52e Word32#
s52f Word32#
s52g Word32#
s52h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s51a Word32#
s51b Word32#
s51c Word32#
s51d Word32#
s51e Word32#
s51f Word32#
s51g Word32#
s51h (Word# -> Word32#
k Word#
0x391c0cb3##) Word32#
w52
      !(R Word32#
s53a Word32#
s53b Word32#
s53c Word32#
s53d Word32#
s53e Word32#
s53f Word32#
s53g Word32#
s53h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s52a Word32#
s52b Word32#
s52c Word32#
s52d Word32#
s52e Word32#
s52f Word32#
s52g Word32#
s52h (Word# -> Word32#
k Word#
0x4ed8aa4a##) Word32#
w53
      !(R Word32#
s54a Word32#
s54b Word32#
s54c Word32#
s54d Word32#
s54e Word32#
s54f Word32#
s54g Word32#
s54h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s53a Word32#
s53b Word32#
s53c Word32#
s53d Word32#
s53e Word32#
s53f Word32#
s53g Word32#
s53h (Word# -> Word32#
k Word#
0x5b9cca4f##) Word32#
w54
      !(R Word32#
s55a Word32#
s55b Word32#
s55c Word32#
s55d Word32#
s55e Word32#
s55f Word32#
s55g Word32#
s55h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s54a Word32#
s54b Word32#
s54c Word32#
s54d Word32#
s54e Word32#
s54f Word32#
s54g Word32#
s54h (Word# -> Word32#
k Word#
0x682e6ff3##) Word32#
w55
      !(R Word32#
s56a Word32#
s56b Word32#
s56c Word32#
s56d Word32#
s56e Word32#
s56f Word32#
s56g Word32#
s56h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s55a Word32#
s55b Word32#
s55c Word32#
s55d Word32#
s55e Word32#
s55f Word32#
s55g Word32#
s55h (Word# -> Word32#
k Word#
0x748f82ee##) Word32#
w56
      !(R Word32#
s57a Word32#
s57b Word32#
s57c Word32#
s57d Word32#
s57e Word32#
s57f Word32#
s57g Word32#
s57h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s56a Word32#
s56b Word32#
s56c Word32#
s56d Word32#
s56e Word32#
s56f Word32#
s56g Word32#
s56h (Word# -> Word32#
k Word#
0x78a5636f##) Word32#
w57
      !(R Word32#
s58a Word32#
s58b Word32#
s58c Word32#
s58d Word32#
s58e Word32#
s58f Word32#
s58g Word32#
s58h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s57a Word32#
s57b Word32#
s57c Word32#
s57d Word32#
s57e Word32#
s57f Word32#
s57g Word32#
s57h (Word# -> Word32#
k Word#
0x84c87814##) Word32#
w58
      !(R Word32#
s59a Word32#
s59b Word32#
s59c Word32#
s59d Word32#
s59e Word32#
s59f Word32#
s59g Word32#
s59h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s58a Word32#
s58b Word32#
s58c Word32#
s58d Word32#
s58e Word32#
s58f Word32#
s58g Word32#
s58h (Word# -> Word32#
k Word#
0x8cc70208##) Word32#
w59
      !(R Word32#
s60a Word32#
s60b Word32#
s60c Word32#
s60d Word32#
s60e Word32#
s60f Word32#
s60g Word32#
s60h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s59a Word32#
s59b Word32#
s59c Word32#
s59d Word32#
s59e Word32#
s59f Word32#
s59g Word32#
s59h (Word# -> Word32#
k Word#
0x90befffa##) Word32#
w60
      !(R Word32#
s61a Word32#
s61b Word32#
s61c Word32#
s61d Word32#
s61e Word32#
s61f Word32#
s61g Word32#
s61h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s60a Word32#
s60b Word32#
s60c Word32#
s60d Word32#
s60e Word32#
s60f Word32#
s60g Word32#
s60h (Word# -> Word32#
k Word#
0xa4506ceb##) Word32#
w61
      !(R Word32#
s62a Word32#
s62b Word32#
s62c Word32#
s62d Word32#
s62e Word32#
s62f Word32#
s62g Word32#
s62h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s61a Word32#
s61b Word32#
s61c Word32#
s61d Word32#
s61e Word32#
s61f Word32#
s61g Word32#
s61h (Word# -> Word32#
k Word#
0xbef9a3f7##) Word32#
w62
      !(R Word32#
s63a Word32#
s63b Word32#
s63c Word32#
s63d Word32#
s63e Word32#
s63f Word32#
s63g Word32#
s63h) =
        Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
step# Word32#
s62a Word32#
s62b Word32#
s62c Word32#
s62d Word32#
s62e Word32#
s62f Word32#
s62g Word32#
s62h (Word# -> Word32#
k Word#
0xc67178f2##) Word32#
w63
  in  Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
R (Word32#
h0 Word32# -> Word32# -> Word32#
`p` Word32#
s63a) (Word32#
h1 Word32# -> Word32# -> Word32#
`p` Word32#
s63b) (Word32#
h2 Word32# -> Word32# -> Word32#
`p` Word32#
s63c) (Word32#
h3 Word32# -> Word32# -> Word32#
`p` Word32#
s63d)
        (Word32#
h4 Word32# -> Word32# -> Word32#
`p` Word32#
s63e) (Word32#
h5 Word32# -> Word32# -> Word32#
`p` Word32#
s63f) (Word32#
h6 Word32# -> Word32# -> Word32#
`p` Word32#
s63g) (Word32#
h7 Word32# -> Word32# -> Word32#
`p` Word32#
s63h)
  where
    p :: Word32# -> Word32# -> Word32#
p = Word32# -> Word32# -> Word32#
Exts.plusWord32#
    {-# INLINE p #-}
    k :: Exts.Word# -> Exts.Word32#
    k :: Word# -> Word32#
k = Word# -> Word32#
Exts.wordToWord32#
    {-# INLINE k #-}

-- rotate right
rotr# :: Exts.Word32# -> Int# -> Exts.Word32#
rotr# :: Word32# -> Int# -> Word32#
rotr# Word32#
x Int#
n =
  Word32# -> Int# -> Word32#
Exts.uncheckedShiftRLWord32# Word32#
x Int#
n Word32# -> Word32# -> Word32#
`Exts.orWord32#`
  Word32# -> Int# -> Word32#
Exts.uncheckedShiftLWord32# Word32#
x (Int#
32# Int# -> Int# -> Int#
Exts.-# Int#
n)
{-# INLINE rotr# #-}

-- logical right shift
shr# :: Exts.Word32# -> Int# -> Exts.Word32#
shr# :: Word32# -> Int# -> Word32#
shr# = Word32# -> Int# -> Word32#
Exts.uncheckedShiftRLWord32#
{-# INLINE shr# #-}

-- ch(x, y, z) = (x & y) ^ (~x & z)
ch# :: Exts.Word32# -> Exts.Word32# -> Exts.Word32# -> Exts.Word32#
ch# :: Word32# -> Word32# -> Word32# -> Word32#
ch# Word32#
x Word32#
y Word32#
z =
  (Word32#
x Word32# -> Word32# -> Word32#
`Exts.andWord32#` Word32#
y) Word32# -> Word32# -> Word32#
`Exts.xorWord32#`
  (Word32# -> Word32#
Exts.notWord32# Word32#
x Word32# -> Word32# -> Word32#
`Exts.andWord32#` Word32#
z)
{-# INLINE ch# #-}

-- maj(x, y, z) = (x & (y | z)) | (y & z)
maj# :: Exts.Word32# -> Exts.Word32# -> Exts.Word32# -> Exts.Word32#
maj# :: Word32# -> Word32# -> Word32# -> Word32#
maj# Word32#
x Word32#
y Word32#
z =
  (Word32#
x Word32# -> Word32# -> Word32#
`Exts.andWord32#` (Word32#
y Word32# -> Word32# -> Word32#
`Exts.orWord32#` Word32#
z)) Word32# -> Word32# -> Word32#
`Exts.orWord32#`
  (Word32#
y Word32# -> Word32# -> Word32#
`Exts.andWord32#` Word32#
z)
{-# INLINE maj# #-}

-- big sigma 0: rotr2 ^ rotr13 ^ rotr22
bsig0# :: Exts.Word32# -> Exts.Word32#
bsig0# :: Word32# -> Word32#
bsig0# Word32#
x =
  Word32# -> Int# -> Word32#
rotr# Word32#
x Int#
2# Word32# -> Word32# -> Word32#
`Exts.xorWord32#` Word32# -> Int# -> Word32#
rotr# Word32#
x Int#
13# Word32# -> Word32# -> Word32#
`Exts.xorWord32#` Word32# -> Int# -> Word32#
rotr# Word32#
x Int#
22#
{-# INLINE bsig0# #-}

-- big sigma 1: rotr6 ^ rotr11 ^ rotr25
bsig1# :: Exts.Word32# -> Exts.Word32#
bsig1# :: Word32# -> Word32#
bsig1# Word32#
x =
  Word32# -> Int# -> Word32#
rotr# Word32#
x Int#
6# Word32# -> Word32# -> Word32#
`Exts.xorWord32#` Word32# -> Int# -> Word32#
rotr# Word32#
x Int#
11# Word32# -> Word32# -> Word32#
`Exts.xorWord32#` Word32# -> Int# -> Word32#
rotr# Word32#
x Int#
25#
{-# INLINE bsig1# #-}

-- small sigma 0: rotr7 ^ rotr18 ^ shr3
ssig0# :: Exts.Word32# -> Exts.Word32#
ssig0# :: Word32# -> Word32#
ssig0# Word32#
x =
  Word32# -> Int# -> Word32#
rotr# Word32#
x Int#
7# Word32# -> Word32# -> Word32#
`Exts.xorWord32#` Word32# -> Int# -> Word32#
rotr# Word32#
x Int#
18# Word32# -> Word32# -> Word32#
`Exts.xorWord32#` Word32# -> Int# -> Word32#
shr# Word32#
x Int#
3#
{-# INLINE ssig0# #-}

-- small sigma 1: rotr17 ^ rotr19 ^ shr10
ssig1# :: Exts.Word32# -> Exts.Word32#
ssig1# :: Word32# -> Word32#
ssig1# Word32#
x =
  Word32# -> Int# -> Word32#
rotr# Word32#
x Int#
17# Word32# -> Word32# -> Word32#
`Exts.xorWord32#` Word32# -> Int# -> Word32#
rotr# Word32#
x Int#
19# Word32# -> Word32# -> Word32#
`Exts.xorWord32#` Word32# -> Int# -> Word32#
shr# Word32#
x Int#
10#
{-# INLINE ssig1# #-}

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

-- initial register state; first 32 bits of the fractional parts of the
-- square roots of the first eight primes
iv :: () -> Registers
iv :: () -> Registers
iv ()
_ = Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Registers
R
  (Word# -> Word32#
Exts.wordToWord32# Word#
0x6a09e667##)
  (Word# -> Word32#
Exts.wordToWord32# Word#
0xbb67ae85##)
  (Word# -> Word32#
Exts.wordToWord32# Word#
0x3c6ef372##)
  (Word# -> Word32#
Exts.wordToWord32# Word#
0xa54ff53a##)
  (Word# -> Word32#
Exts.wordToWord32# Word#
0x510e527f##)
  (Word# -> Word32#
Exts.wordToWord32# Word#
0x9b05688c##)
  (Word# -> Word32#
Exts.wordToWord32# Word#
0x1f83d9ab##)
  (Word# -> Word32#
Exts.wordToWord32# Word#
0x5be0cd19##)

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

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

-- | Serialize SHA256 state to a pointer (big-endian).
cat_into :: Registers -> Ptr Word8 -> IO ()
cat_into :: Registers -> Ptr Word8 -> IO ()
cat_into (R Word32#
h0 Word32#
h1 Word32#
h2 Word32#
h3 Word32#
h4 Word32#
h5 Word32#
h6 Word32#
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# -> Word32# -> State# RealWorld -> State# RealWorld
poke32be Addr#
addr Int#
00# Word32#
h0 State# RealWorld
s0 of { State# RealWorld
s1 ->
  case Addr# -> Int# -> Word32# -> State# RealWorld -> State# RealWorld
poke32be Addr#
addr Int#
04# Word32#
h1 State# RealWorld
s1 of { State# RealWorld
s2 ->
  case Addr# -> Int# -> Word32# -> State# RealWorld -> State# RealWorld
poke32be Addr#
addr Int#
08# Word32#
h2 State# RealWorld
s2 of { State# RealWorld
s3 ->
  case Addr# -> Int# -> Word32# -> State# RealWorld -> State# RealWorld
poke32be Addr#
addr Int#
12# Word32#
h3 State# RealWorld
s3 of { State# RealWorld
s4 ->
  case Addr# -> Int# -> Word32# -> State# RealWorld -> State# RealWorld
poke32be Addr#
addr Int#
16# Word32#
h4 State# RealWorld
s4 of { State# RealWorld
s5 ->
  case Addr# -> Int# -> Word32# -> State# RealWorld -> State# RealWorld
poke32be Addr#
addr Int#
20# Word32#
h5 State# RealWorld
s5 of { State# RealWorld
s6 ->
  case Addr# -> Int# -> Word32# -> State# RealWorld -> State# RealWorld
poke32be Addr#
addr Int#
24# Word32#
h6 State# RealWorld
s6 of { State# RealWorld
s7 ->
  case Addr# -> Int# -> Word32# -> State# RealWorld -> State# RealWorld
poke32be Addr#
addr Int#
28# Word32#
h7 State# RealWorld
s7 of { State# RealWorld
s8 ->
  (# State# RealWorld
s8, () #)
  }}}}}}}}
{-# INLINE cat_into #-}

poke32be
  :: Exts.Addr#
  -> Int#
  -> Exts.Word32#
  -> Exts.State# Exts.RealWorld
  -> Exts.State# Exts.RealWorld
poke32be :: Addr# -> Int# -> Word32# -> State# RealWorld -> State# RealWorld
poke32be Addr#
a Int#
off Word32#
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 (Word32# -> Int# -> Word8#
byte# Word32#
w Int#
24#) 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#) (Word32# -> Int# -> Word8#
byte# Word32#
w Int#
16#) 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#) (Word32# -> Int# -> Word8#
byte# Word32#
w Int#
8#) State# RealWorld
s2 of { State# RealWorld
s3 ->
  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#) (Word32# -> Int# -> Word8#
byte# Word32#
w Int#
0#) State# RealWorld
s3
  }}}
{-# INLINE poke32be #-}

byte# :: Exts.Word32# -> Int# -> Exts.Word8#
byte# :: Word32# -> Int# -> Word8#
byte# Word32#
w Int#
n = Word# -> Word8#
Exts.wordToWord8#
  (Word32# -> Word#
Exts.word32ToWord# (Word32# -> Int# -> Word32#
Exts.uncheckedShiftRLWord32# Word32#
w Int#
n))
{-# INLINE byte# #-}

-- | Write register state to a pointer (native endian Word32s).
poke_registers :: Ptr Word32 -> Registers -> IO ()
poke_registers :: Ptr Word32 -> Registers -> IO ()
poke_registers (Ptr Addr#
addr) (R Word32#
w0 Word32#
w1 Word32#
w2 Word32#
w3 Word32#
w4 Word32#
w5 Word32#
w6 Word32#
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# -> Word32# -> State# RealWorld -> State# RealWorld
forall d. Addr# -> Int# -> Word32# -> State# d -> State# d
Exts.writeWord32OffAddr# Addr#
addr Int#
0# Word32#
w0 State# RealWorld
s0 of { State# RealWorld
s1 ->
  case Addr# -> Int# -> Word32# -> State# RealWorld -> State# RealWorld
forall d. Addr# -> Int# -> Word32# -> State# d -> State# d
Exts.writeWord32OffAddr# Addr#
addr Int#
1# Word32#
w1 State# RealWorld
s1 of { State# RealWorld
s2 ->
  case Addr# -> Int# -> Word32# -> State# RealWorld -> State# RealWorld
forall d. Addr# -> Int# -> Word32# -> State# d -> State# d
Exts.writeWord32OffAddr# Addr#
addr Int#
2# Word32#
w2 State# RealWorld
s2 of { State# RealWorld
s3 ->
  case Addr# -> Int# -> Word32# -> State# RealWorld -> State# RealWorld
forall d. Addr# -> Int# -> Word32# -> State# d -> State# d
Exts.writeWord32OffAddr# Addr#
addr Int#
3# Word32#
w3 State# RealWorld
s3 of { State# RealWorld
s4 ->
  case Addr# -> Int# -> Word32# -> State# RealWorld -> State# RealWorld
forall d. Addr# -> Int# -> Word32# -> State# d -> State# d
Exts.writeWord32OffAddr# Addr#
addr Int#
4# Word32#
w4 State# RealWorld
s4 of { State# RealWorld
s5 ->
  case Addr# -> Int# -> Word32# -> State# RealWorld -> State# RealWorld
forall d. Addr# -> Int# -> Word32# -> State# d -> State# d
Exts.writeWord32OffAddr# Addr#
addr Int#
5# Word32#
w5 State# RealWorld
s5 of { State# RealWorld
s6 ->
  case Addr# -> Int# -> Word32# -> State# RealWorld -> State# RealWorld
forall d. Addr# -> Int# -> Word32# -> State# d -> State# d
Exts.writeWord32OffAddr# Addr#
addr Int#
6# Word32#
w6 State# RealWorld
s6 of { State# RealWorld
s7 ->
  case Addr# -> Int# -> Word32# -> State# RealWorld -> State# RealWorld
forall d. Addr# -> Int# -> Word32# -> State# d -> State# d
Exts.writeWord32OffAddr# Addr#
addr Int#
7# Word32#
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 Word32#
w0 Word32#
w1 Word32#
w2 Word32#
w3 Word32#
w4 Word32#
w5 Word32#
w6 Word32#
w7) = Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Block
B
  Word32#
w0 Word32#
w1 Word32#
w2 Word32#
w3 Word32#
w4 Word32#
w5 Word32#
w6 Word32#
w7
  (Word# -> Word32#
Exts.wordToWord32# Word#
0##) (Word# -> Word32#
Exts.wordToWord32# Word#
0##) (Word# -> Word32#
Exts.wordToWord32# Word#
0##)
  (Word# -> Word32#
Exts.wordToWord32# Word#
0##) (Word# -> Word32#
Exts.wordToWord32# Word#
0##) (Word# -> Word32#
Exts.wordToWord32# Word#
0##)
  (Word# -> Word32#
Exts.wordToWord32# Word#
0##) (Word# -> Word32#
Exts.wordToWord32# Word#
0##)
{-# INLINE pad_registers #-}

-- pad registers to block, using padding separator and augmented length
-- (assumes existence of a leading block)
pad_registers_with_length :: Registers -> Block
pad_registers_with_length :: Registers -> Block
pad_registers_with_length (R Word32#
h0 Word32#
h1 Word32#
h2 Word32#
h3 Word32#
h4 Word32#
h5 Word32#
h6 Word32#
h7) = Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Block
B
  Word32#
h0 Word32#
h1 Word32#
h2 Word32#
h3 Word32#
h4 Word32#
h5 Word32#
h6 Word32#
h7           -- inner hash
  (Word# -> Word32#
Exts.wordToWord32# Word#
0x80000000##) -- padding separator
  (Word# -> Word32#
Exts.wordToWord32# Word#
0x00000000##)
  (Word# -> Word32#
Exts.wordToWord32# Word#
0x00000000##)
  (Word# -> Word32#
Exts.wordToWord32# Word#
0x00000000##)
  (Word# -> Word32#
Exts.wordToWord32# Word#
0x00000000##)
  (Word# -> Word32#
Exts.wordToWord32# Word#
0x00000000##)
  (Word# -> Word32#
Exts.wordToWord32# Word#
0x00000000##) -- high 32 bits of length
  (Word# -> Word32#
Exts.wordToWord32# Word#
0x00000300##) -- low 32 bits of length
{-# INLINABLE pad_registers_with_length #-}

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

parse_key :: BS.ByteString -> Block
parse_key :: ByteString -> Block
parse_key ByteString
bs = Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Block
B
  (ByteString -> Int -> Word32#
w32_zero ByteString
bs Int
0)  (ByteString -> Int -> Word32#
w32_zero ByteString
bs Int
4)  (ByteString -> Int -> Word32#
w32_zero ByteString
bs Int
8)  (ByteString -> Int -> Word32#
w32_zero ByteString
bs Int
12)
  (ByteString -> Int -> Word32#
w32_zero ByteString
bs Int
16) (ByteString -> Int -> Word32#
w32_zero ByteString
bs Int
20) (ByteString -> Int -> Word32#
w32_zero ByteString
bs Int
24) (ByteString -> Int -> Word32#
w32_zero ByteString
bs Int
28)
  (ByteString -> Int -> Word32#
w32_zero ByteString
bs Int
32) (ByteString -> Int -> Word32#
w32_zero ByteString
bs Int
36) (ByteString -> Int -> Word32#
w32_zero ByteString
bs Int
40) (ByteString -> Int -> Word32#
w32_zero ByteString
bs Int
44)
  (ByteString -> Int -> Word32#
w32_zero ByteString
bs Int
48) (ByteString -> Int -> Word32#
w32_zero ByteString
bs Int
52) (ByteString -> Int -> Word32#
w32_zero ByteString
bs Int
56) (ByteString -> Int -> Word32#
w32_zero ByteString
bs Int
60)
{-# INLINE parse_key #-}

-- read big-endian Word32#, zero-padding beyond input length
w32_zero :: BS.ByteString -> Int -> Exts.Word32#
w32_zero :: ByteString -> Int -> Word32#
w32_zero ByteString
bs Int
i =
  let !wa :: Word32#
wa = ByteString -> Int -> Word32#
w8_zero ByteString
bs Int
i       Word32# -> Int# -> Word32#
`Exts.uncheckedShiftLWord32#` Int#
24#
      !wb :: Word32#
wb = ByteString -> Int -> Word32#
w8_zero ByteString
bs (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) Word32# -> Int# -> Word32#
`Exts.uncheckedShiftLWord32#` Int#
16#
      !wc :: Word32#
wc = ByteString -> Int -> Word32#
w8_zero ByteString
bs (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
2) Word32# -> Int# -> Word32#
`Exts.uncheckedShiftLWord32#` Int#
08#
      !wd :: Word32#
wd = ByteString -> Int -> Word32#
w8_zero ByteString
bs (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
3)
  in  Word32#
wa Word32# -> Word32# -> Word32#
`Exts.orWord32#` Word32#
wb Word32# -> Word32# -> Word32#
`Exts.orWord32#` Word32#
wc Word32# -> Word32# -> Word32#
`Exts.orWord32#` Word32#
wd
{-# INLINE w32_zero #-}

-- read byte as Word32#, returning zero beyond input length
w8_zero :: BS.ByteString -> Int -> Exts.Word32#
w8_zero :: ByteString -> Int -> Word32#
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  Word# -> Word32#
Exts.wordToWord32# (Word8# -> Word#
Exts.word8ToWord# Word8#
w)
  | Bool
otherwise = Word# -> Word32#
Exts.wordToWord32# Word#
0##
{-# INLINE w8_zero #-}

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

-- | Parse first complete block from v || sep || dat[0:31].
--
--   Requires len(dat) >= 31.
parse_vsb :: Registers -> Word8 -> BS.ByteString -> Block
parse_vsb :: Registers -> Word8 -> ByteString -> Block
parse_vsb (R Word32#
v0 Word32#
v1 Word32#
v2 Word32#
v3 Word32#
v4 Word32#
v5 Word32#
v6 Word32#
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
      !w08 :: Word32#
w08 =
            Word32# -> Int# -> Word32#
Exts.uncheckedShiftLWord32# (Word8# -> Word32#
w8_w32 Word8#
sep) Int#
24#
            Word32# -> Word32# -> Word32#
`Exts.orWord32#`
            Word32# -> Int# -> Word32#
Exts.uncheckedShiftLWord32# (Word8# -> Word32#
w8_w32 Word8#
b0) Int#
16#
            Word32# -> Word32# -> Word32#
`Exts.orWord32#`
            Word32# -> Int# -> Word32#
Exts.uncheckedShiftLWord32# (Word8# -> Word32#
w8_w32 Word8#
b1) Int#
8#
            Word32# -> Word32# -> Word32#
`Exts.orWord32#`
            Word8# -> Word32#
w8_w32 Word8#
b2
  in  Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Block
B Word32#
v0 Word32#
v1 Word32#
v2 Word32#
v3 Word32#
v4 Word32#
v5 Word32#
v6 Word32#
v7
        Word32#
w08
        (ByteString -> Int -> Word32#
word32be ByteString
dat Int
3)  (ByteString -> Int -> Word32#
word32be ByteString
dat Int
7)  (ByteString -> Int -> Word32#
word32be ByteString
dat Int
11)
        (ByteString -> Int -> Word32#
word32be ByteString
dat Int
15) (ByteString -> Int -> Word32#
word32be ByteString
dat Int
19) (ByteString -> Int -> Word32#
word32be ByteString
dat Int
23) (ByteString -> Int -> Word32#
word32be ByteString
dat Int
27)
{-# INLINE parse_vsb #-}

-- | Parse single padding block from v || sep || dat.
--
--   Requires (33 + len(dat)) < 56.
parse_pad1_vsb :: Registers -> Word8 -> BS.ByteString -> Word64 -> Block
parse_pad1_vsb :: Registers -> Word8 -> ByteString -> Word64 -> Block
parse_pad1_vsb (R Word32#
v0 Word32#
v1 Word32#
v2 Word32#
v3 Word32#
v4 Word32#
v5 Word32#
v6 Word32#
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.W32# Word32#
lhi) = Word64 -> Word32
forall a b. (Integral a, Num b) => a -> b
fi (Word64
bits Word64 -> Int -> Word64
forall a. Bits a => a -> Int -> a
`B.unsafeShiftR` Int
32)
      !(GHC.Word.W32# Word32#
llo) = Word64 -> Word32
forall a b. (Integral a, Num b) => a -> b
fi Word64
bits
  in  Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Block
B Word32#
v0 Word32#
v1 Word32#
v2 Word32#
v3 Word32#
v4 Word32#
v5 Word32#
v6 Word32#
v7
        (Word8 -> ByteString -> Int -> Word32#
w32_sdp Word8
sep ByteString
dat Int
32) (Word8 -> ByteString -> Int -> Word32#
w32_sdp Word8
sep ByteString
dat Int
36)
        (Word8 -> ByteString -> Int -> Word32#
w32_sdp Word8
sep ByteString
dat Int
40) (Word8 -> ByteString -> Int -> Word32#
w32_sdp Word8
sep ByteString
dat Int
44)
        (Word8 -> ByteString -> Int -> Word32#
w32_sdp Word8
sep ByteString
dat Int
48) (Word8 -> ByteString -> Int -> Word32#
w32_sdp Word8
sep ByteString
dat Int
52)
        Word32#
lhi Word32#
llo
{-# INLINABLE parse_pad1_vsb #-}

-- | Parse two padding blocks from v || sep || dat.
--
--   Requires 56 <= (33 + len(dat)) < 64.
parse_pad2_vsb
  :: Registers -> Word8 -> BS.ByteString -> Word64 -> (# Block, Block #)
parse_pad2_vsb :: Registers -> Word8 -> ByteString -> Word64 -> (# Block, Block #)
parse_pad2_vsb (R Word32#
v0 Word32#
v1 Word32#
v2 Word32#
v3 Word32#
v4 Word32#
v5 Word32#
v6 Word32#
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 :: Word32#
z = Word# -> Word32#
Exts.wordToWord32# Word#
0##
      !(GHC.Word.W32# Word32#
lhi) = Word64 -> Word32
forall a b. (Integral a, Num b) => a -> b
fi (Word64
bits Word64 -> Int -> Word64
forall a. Bits a => a -> Int -> a
`B.unsafeShiftR` Int
32)
      !(GHC.Word.W32# Word32#
llo) = Word64 -> Word32
forall a b. (Integral a, Num b) => a -> b
fi Word64
bits
      !b0 :: Block
b0 = Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Block
B Word32#
v0 Word32#
v1 Word32#
v2 Word32#
v3 Word32#
v4 Word32#
v5 Word32#
v6 Word32#
v7
              (Word8 -> ByteString -> Int -> Word32#
w32_sdp Word8
sep ByteString
dat Int
32) (Word8 -> ByteString -> Int -> Word32#
w32_sdp Word8
sep ByteString
dat Int
36)
              (Word8 -> ByteString -> Int -> Word32#
w32_sdp Word8
sep ByteString
dat Int
40) (Word8 -> ByteString -> Int -> Word32#
w32_sdp Word8
sep ByteString
dat Int
44)
              (Word8 -> ByteString -> Int -> Word32#
w32_sdp Word8
sep ByteString
dat Int
48) (Word8 -> ByteString -> Int -> Word32#
w32_sdp Word8
sep ByteString
dat Int
52)
              (Word8 -> ByteString -> Int -> Word32#
w32_sdp Word8
sep ByteString
dat Int
56) (Word8 -> ByteString -> Int -> Word32#
w32_sdp Word8
sep ByteString
dat Int
60)
      !b1 :: Block
b1 = Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Word32#
-> Block
B Word32#
z Word32#
z Word32#
z Word32#
z Word32#
z Word32#
z Word32#
z Word32#
z Word32#
z Word32#
z Word32#
z Word32#
z Word32#
z Word32#
z Word32#
lhi Word32#
llo
  in  (# Block
b0, Block
b1 #)
{-# INLINABLE parse_pad2_vsb #-}

-- Read Word32 at offset i (>= 32) from (sep || dat || 0x80 || zeros).
w32_sdp :: Word8 -> BS.ByteString -> Int -> Exts.Word32#
w32_sdp :: Word8 -> ByteString -> Int -> Word32#
w32_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)
  in  Word32# -> Int# -> Word32#
Exts.uncheckedShiftLWord32# (Word8# -> Word32#
w8_w32 Word8#
a) Int#
24#
      Word32# -> Word32# -> Word32#
`Exts.orWord32#`
      Word32# -> Int# -> Word32#
Exts.uncheckedShiftLWord32# (Word8# -> Word32#
w8_w32 Word8#
b) Int#
16#
      Word32# -> Word32# -> Word32#
`Exts.orWord32#`
      Word32# -> Int# -> Word32#
Exts.uncheckedShiftLWord32# (Word8# -> Word32#
w8_w32 Word8#
c) Int#
8#
      Word32# -> Word32# -> Word32#
`Exts.orWord32#`
      Word8# -> Word32#
w8_w32 Word8#
d
{-# INLINE w32_sdp #-}

-- Read byte at offset i (>= 32) 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
32     = Word8
sep
  | Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
33 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
33)
  | Int
i Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
33 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
l = Word8
0x80
  | Bool
otherwise   = Word8
0x00
{-# INLINE byte_sdp #-}

w8_w32 :: Exts.Word8# -> Exts.Word32#
w8_w32 :: Word8# -> Word32#
w8_w32 Word8#
w = Word# -> Word32#
Exts.wordToWord32# (Word8# -> Word#
Exts.word8ToWord# Word8#
w)
{-# INLINE w8_w32 #-}