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

-- |
-- 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 (
    Block(..)
  , pattern B
  , Registers(..)
  , pattern R

  , MAC(..)

  , iv
  , block_hash
  , cat

  , word32be
  , parse_block
  , unsafe_hash_alg
  , unsafe_padding
  ) 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 Foreign.Marshal.Utils (copyBytes, fillBytes)
import Foreign.Ptr (Ptr, plusPtr)
import Foreign.Storable (poke)
import GHC.Exts (Int#)
import qualified GHC.Exts as Exts
import qualified GHC.Word (Word8(..))

-- | 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

-- https://datatracker.ietf.org/doc/html/rfc6234

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 #-}

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 #-}

-- given a bytestring and offset, parse word32. length 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 #-}

parse_block :: BS.ByteString -> Int -> Block
parse_block :: ByteString -> Int -> Block
parse_block 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_block #-}

-- 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# #-}

-- 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##)

block_hash :: Registers -> Block -> Registers
block_hash :: Registers -> Block -> Registers
block_hash
    (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 (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 #-}

-- RFC 6234 6.2 block pipeline
--
-- invariant:
--   the input bytestring is exactly 512 bits in length
unsafe_hash_alg :: Registers -> BS.ByteString -> Registers
unsafe_hash_alg :: Registers -> ByteString -> Registers
unsafe_hash_alg Registers
rs ByteString
bs = Registers -> Block -> Registers
block_hash Registers
rs (ByteString -> Int -> Block
parse_block ByteString
bs Int
0)

-- register concatenation
cat :: Registers -> BS.ByteString
cat :: Registers -> ByteString
cat (R Word32#
h0 Word32#
h1 Word32#
h2 Word32#
h3 Word32#
h4 Word32#
h5 Word32#
h6 Word32#
h7) = Int -> (Ptr Word8 -> IO ()) -> ByteString
BI.unsafeCreate Int
32 ((Ptr Word8 -> IO ()) -> ByteString)
-> (Ptr Word8 -> IO ()) -> ByteString
forall a b. (a -> b) -> a -> b
$ \Ptr Word8
ptr -> do
    Ptr Word8 -> Int -> Word32# -> IO ()
poke32be Ptr Word8
ptr Int
0  Word32#
h0
    Ptr Word8 -> Int -> Word32# -> IO ()
poke32be Ptr Word8
ptr Int
4  Word32#
h1
    Ptr Word8 -> Int -> Word32# -> IO ()
poke32be Ptr Word8
ptr Int
8  Word32#
h2
    Ptr Word8 -> Int -> Word32# -> IO ()
poke32be Ptr Word8
ptr Int
12 Word32#
h3
    Ptr Word8 -> Int -> Word32# -> IO ()
poke32be Ptr Word8
ptr Int
16 Word32#
h4
    Ptr Word8 -> Int -> Word32# -> IO ()
poke32be Ptr Word8
ptr Int
20 Word32#
h5
    Ptr Word8 -> Int -> Word32# -> IO ()
poke32be Ptr Word8
ptr Int
24 Word32#
h6
    Ptr Word8 -> Int -> Word32# -> IO ()
poke32be Ptr Word8
ptr Int
28 Word32#
h7
  where
    poke32be :: Ptr Word8 -> Int -> Exts.Word32# -> IO ()
    poke32be :: Ptr Word8 -> Int -> Word32# -> IO ()
poke32be Ptr Word8
p Int
off Word32#
w = do
      Ptr Word8 -> Word8 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr Word8
p Ptr Word8 -> Int -> Ptr Word8
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
off)       (Word32# -> Int# -> Word8
byte Word32#
w Int#
24#)
      Ptr Word8 -> Word8 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr Word8
p Ptr Word8 -> Int -> Ptr Word8
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` (Int
off Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)) (Word32# -> Int# -> Word8
byte Word32#
w Int#
16#)
      Ptr Word8 -> Word8 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr Word8
p Ptr Word8 -> Int -> Ptr Word8
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` (Int
off Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
2)) (Word32# -> Int# -> Word8
byte Word32#
w Int#
8#)
      Ptr Word8 -> Word8 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr Word8
p Ptr Word8 -> Int -> Ptr Word8
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` (Int
off Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
3)) (Word32# -> Int# -> Word8
byte Word32#
w Int#
0#)

    byte :: Exts.Word32# -> Int# -> Word8
    byte :: Word32# -> Int# -> Word8
byte Word32#
w Int#
n = Word8# -> Word8
GHC.Word.W8# (Word# -> Word8#
Exts.wordToWord8#
      (Word32# -> Word#
Exts.word32ToWord# (Word32# -> Int# -> Word32#
Exts.uncheckedShiftRLWord32# Word32#
w Int#
n)))

-- keystroke saver
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 #-}

-- RFC 6234 4.1 message padding
unsafe_padding :: BS.ByteString -> Word64 -> BS.ByteString
unsafe_padding :: ByteString -> Word64 -> ByteString
unsafe_padding (BI.PS ForeignPtr Word8
fp Int
off Int
r) Word64
len
    | Int
r Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
56 = Int -> (Ptr Word8 -> IO ()) -> ByteString
BI.unsafeCreate Int
64 ((Ptr Word8 -> IO ()) -> ByteString)
-> (Ptr Word8 -> IO ()) -> ByteString
forall a b. (a -> b) -> a -> b
$ \Ptr Word8
p -> do
        ForeignPtr Word8 -> (Ptr Word8 -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
BI.unsafeWithForeignPtr ForeignPtr Word8
fp ((Ptr Word8 -> IO ()) -> IO ()) -> (Ptr Word8 -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr Word8
src ->
          Ptr Word8 -> Ptr Word8 -> Int -> IO ()
forall a. Ptr a -> Ptr a -> Int -> IO ()
copyBytes Ptr Word8
p (Ptr Word8
src Ptr Word8 -> Int -> Ptr Word8
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
off) Int
r
        Ptr Word8 -> Word8 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr Word8
p Ptr Word8 -> Int -> Ptr Word8
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
r) (Word8
0x80 :: Word8)
        Ptr (ZonkAny 0) -> Word8 -> Int -> IO ()
forall a. Ptr a -> Word8 -> Int -> IO ()
fillBytes (Ptr Word8
p Ptr Word8 -> Int -> Ptr (ZonkAny 0)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` (Int
r Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)) Word8
0 (Int
55 Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
r)
        Ptr Word8 -> Word64 -> IO ()
poke_word64be (Ptr Word8
p Ptr Word8 -> Int -> Ptr Word8
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
56) (Word64
len Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
* Word64
8)
    | Bool
otherwise = Int -> (Ptr Word8 -> IO ()) -> ByteString
BI.unsafeCreate Int
128 ((Ptr Word8 -> IO ()) -> ByteString)
-> (Ptr Word8 -> IO ()) -> ByteString
forall a b. (a -> b) -> a -> b
$ \Ptr Word8
p -> do
        ForeignPtr Word8 -> (Ptr Word8 -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
BI.unsafeWithForeignPtr ForeignPtr Word8
fp ((Ptr Word8 -> IO ()) -> IO ()) -> (Ptr Word8 -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr Word8
src ->
          Ptr Word8 -> Ptr Word8 -> Int -> IO ()
forall a. Ptr a -> Ptr a -> Int -> IO ()
copyBytes Ptr Word8
p (Ptr Word8
src Ptr Word8 -> Int -> Ptr Word8
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
off) Int
r
        Ptr Word8 -> Word8 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr Word8
p Ptr Word8 -> Int -> Ptr Word8
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
r) (Word8
0x80 :: Word8)
        Ptr (ZonkAny 1) -> Word8 -> Int -> IO ()
forall a. Ptr a -> Word8 -> Int -> IO ()
fillBytes (Ptr Word8
p Ptr Word8 -> Int -> Ptr (ZonkAny 1)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` (Int
r Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)) Word8
0 (Int
63 Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
r)
        Ptr (ZonkAny 2) -> Word8 -> Int -> IO ()
forall a. Ptr a -> Word8 -> Int -> IO ()
fillBytes (Ptr Word8
p Ptr Word8 -> Int -> Ptr (ZonkAny 2)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
64) Word8
0 Int
56
        Ptr Word8 -> Word64 -> IO ()
poke_word64be (Ptr Word8
p Ptr Word8 -> Int -> Ptr Word8
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
120) (Word64
len Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
* Word64
8)
  where
    poke_word64be :: Ptr Word8 -> Word64 -> IO ()
    poke_word64be :: Ptr Word8 -> Word64 -> IO ()
poke_word64be Ptr Word8
p Word64
w = do
      Ptr Word8 -> Word8 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke Ptr Word8
p               (Word64 -> Word8
forall a b. (Integral a, Num b) => a -> b
fi (Word64
w Word64 -> Int -> Word64
forall a. Bits a => a -> Int -> a
`B.unsafeShiftR` Int
56) :: Word8)
      Ptr Word8 -> Word8 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr Word8
p Ptr Word8 -> Int -> Ptr Word8
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
1) (Word64 -> Word8
forall a b. (Integral a, Num b) => a -> b
fi (Word64
w Word64 -> Int -> Word64
forall a. Bits a => a -> Int -> a
`B.unsafeShiftR` Int
48) :: Word8)
      Ptr Word8 -> Word8 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr Word8
p Ptr Word8 -> Int -> Ptr Word8
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
2) (Word64 -> Word8
forall a b. (Integral a, Num b) => a -> b
fi (Word64
w Word64 -> Int -> Word64
forall a. Bits a => a -> Int -> a
`B.unsafeShiftR` Int
40) :: Word8)
      Ptr Word8 -> Word8 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr Word8
p Ptr Word8 -> Int -> Ptr Word8
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
3) (Word64 -> Word8
forall a b. (Integral a, Num b) => a -> b
fi (Word64
w Word64 -> Int -> Word64
forall a. Bits a => a -> Int -> a
`B.unsafeShiftR` Int
32) :: Word8)
      Ptr Word8 -> Word8 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr Word8
p Ptr Word8 -> Int -> Ptr Word8
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
4) (Word64 -> Word8
forall a b. (Integral a, Num b) => a -> b
fi (Word64
w Word64 -> Int -> Word64
forall a. Bits a => a -> Int -> a
`B.unsafeShiftR` Int
24) :: Word8)
      Ptr Word8 -> Word8 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr Word8
p Ptr Word8 -> Int -> Ptr Word8
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
5) (Word64 -> Word8
forall a b. (Integral a, Num b) => a -> b
fi (Word64
w Word64 -> Int -> Word64
forall a. Bits a => a -> Int -> a
`B.unsafeShiftR` Int
16) :: Word8)
      Ptr Word8 -> Word8 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr Word8
p Ptr Word8 -> Int -> Ptr Word8
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
6) (Word64 -> Word8
forall a b. (Integral a, Num b) => a -> b
fi (Word64
w Word64 -> Int -> Word64
forall a. Bits a => a -> Int -> a
`B.unsafeShiftR`  Int
8) :: Word8)
      Ptr Word8 -> Word8 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr Word8
p Ptr Word8 -> Int -> Ptr Word8
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
7) (Word64 -> Word8
forall a b. (Integral a, Num b) => a -> b
fi Word64
w                       :: Word8)