{-# LANGUAGE CPP, DeriveDataTypeable #-}
{-# OPTIONS_GHC -fno-warn-name-shadowing #-}
module Darcs.Util.Hash
( Hash(..)
, encodeBase16, decodeBase16, sha256, sha256sum, rawHash
, match
, sha1PS, SHA1, showAsHex, sha1Xor, sha1zero, sha1short
) where
import qualified Crypto.Hash.SHA256 as SHA256 ( hashlazy, hash )
import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy as BL
import qualified Data.ByteString.Char8 as BC
import qualified Data.ByteString.Internal as BI ( toForeignPtr )
import qualified Codec.Binary.Base16 as B16
import Data.Maybe( isJust, fromJust )
import Data.Char( toLower, toUpper, intToDigit )
import Data.Binary ( Binary(..) )
import Data.Bits (xor, (.&.), (.|.), complement, rotateL, shiftL, shiftR)
import Data.Word (Word8, Word32)
import Data.Data( Data )
import Data.Typeable( Typeable )
import Foreign.ForeignPtr ( withForeignPtr )
import Foreign.Ptr (Ptr, castPtr, plusPtr)
import Foreign.Marshal.Array (advancePtr)
import Foreign.Storable (peek, poke)
import System.IO.Unsafe (unsafePerformIO)
data Hash = SHA256 !B.ByteString
| NoHash
deriving (Int -> Hash -> ShowS
[Hash] -> ShowS
Hash -> String
(Int -> Hash -> ShowS)
-> (Hash -> String) -> ([Hash] -> ShowS) -> Show Hash
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Hash] -> ShowS
$cshowList :: [Hash] -> ShowS
show :: Hash -> String
$cshow :: Hash -> String
showsPrec :: Int -> Hash -> ShowS
$cshowsPrec :: Int -> Hash -> ShowS
Show, Hash -> Hash -> Bool
(Hash -> Hash -> Bool) -> (Hash -> Hash -> Bool) -> Eq Hash
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Hash -> Hash -> Bool
$c/= :: Hash -> Hash -> Bool
== :: Hash -> Hash -> Bool
$c== :: Hash -> Hash -> Bool
Eq, Eq Hash
Eq Hash =>
(Hash -> Hash -> Ordering)
-> (Hash -> Hash -> Bool)
-> (Hash -> Hash -> Bool)
-> (Hash -> Hash -> Bool)
-> (Hash -> Hash -> Bool)
-> (Hash -> Hash -> Hash)
-> (Hash -> Hash -> Hash)
-> Ord Hash
Hash -> Hash -> Bool
Hash -> Hash -> Ordering
Hash -> Hash -> Hash
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Hash -> Hash -> Hash
$cmin :: Hash -> Hash -> Hash
max :: Hash -> Hash -> Hash
$cmax :: Hash -> Hash -> Hash
>= :: Hash -> Hash -> Bool
$c>= :: Hash -> Hash -> Bool
> :: Hash -> Hash -> Bool
$c> :: Hash -> Hash -> Bool
<= :: Hash -> Hash -> Bool
$c<= :: Hash -> Hash -> Bool
< :: Hash -> Hash -> Bool
$c< :: Hash -> Hash -> Bool
compare :: Hash -> Hash -> Ordering
$ccompare :: Hash -> Hash -> Ordering
$cp1Ord :: Eq Hash
Ord, ReadPrec [Hash]
ReadPrec Hash
Int -> ReadS Hash
ReadS [Hash]
(Int -> ReadS Hash)
-> ReadS [Hash] -> ReadPrec Hash -> ReadPrec [Hash] -> Read Hash
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Hash]
$creadListPrec :: ReadPrec [Hash]
readPrec :: ReadPrec Hash
$creadPrec :: ReadPrec Hash
readList :: ReadS [Hash]
$creadList :: ReadS [Hash]
readsPrec :: Int -> ReadS Hash
$creadsPrec :: Int -> ReadS Hash
Read, Typeable, Typeable Hash
Constr
DataType
Typeable Hash =>
(forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Hash -> c Hash)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Hash)
-> (Hash -> Constr)
-> (Hash -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Hash))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Hash))
-> ((forall b. Data b => b -> b) -> Hash -> Hash)
-> (forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Hash -> r)
-> (forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Hash -> r)
-> (forall u. (forall d. Data d => d -> u) -> Hash -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> Hash -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Hash -> m Hash)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Hash -> m Hash)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Hash -> m Hash)
-> Data Hash
Hash -> Constr
Hash -> DataType
(forall b. Data b => b -> b) -> Hash -> Hash
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Hash -> c Hash
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Hash
forall a.
Typeable a =>
(forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> Hash -> u
forall u. (forall d. Data d => d -> u) -> Hash -> [u]
forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Hash -> r
forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Hash -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Hash -> m Hash
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Hash -> m Hash
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Hash
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Hash -> c Hash
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Hash)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Hash)
$cNoHash :: Constr
$cSHA256 :: Constr
$tHash :: DataType
gmapMo :: (forall d. Data d => d -> m d) -> Hash -> m Hash
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Hash -> m Hash
gmapMp :: (forall d. Data d => d -> m d) -> Hash -> m Hash
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Hash -> m Hash
gmapM :: (forall d. Data d => d -> m d) -> Hash -> m Hash
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Hash -> m Hash
gmapQi :: Int -> (forall d. Data d => d -> u) -> Hash -> u
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Hash -> u
gmapQ :: (forall d. Data d => d -> u) -> Hash -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> Hash -> [u]
gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Hash -> r
$cgmapQr :: forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Hash -> r
gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Hash -> r
$cgmapQl :: forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Hash -> r
gmapT :: (forall b. Data b => b -> b) -> Hash -> Hash
$cgmapT :: (forall b. Data b => b -> b) -> Hash -> Hash
dataCast2 :: (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Hash)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Hash)
dataCast1 :: (forall d. Data d => c (t d)) -> Maybe (c Hash)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Hash)
dataTypeOf :: Hash -> DataType
$cdataTypeOf :: Hash -> DataType
toConstr :: Hash -> Constr
$ctoConstr :: Hash -> Constr
gunfold :: (forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Hash
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Hash
gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Hash -> c Hash
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Hash -> c Hash
$cp1Data :: Typeable Hash
Data)
base16 :: B.ByteString -> B.ByteString
debase16 :: B.ByteString -> Maybe B.ByteString
base16 :: ByteString -> ByteString
base16 = (Char -> Char) -> ByteString -> ByteString
BC.map Char -> Char
toLower (ByteString -> ByteString)
-> (ByteString -> ByteString) -> ByteString -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ByteString
B16.b16Enc
debase16 :: ByteString -> Maybe ByteString
debase16 bs :: ByteString
bs = case ByteString
-> Either (ByteString, ByteString) (ByteString, ByteString)
B16.b16Dec (ByteString
-> Either (ByteString, ByteString) (ByteString, ByteString))
-> ByteString
-> Either (ByteString, ByteString) (ByteString, ByteString)
forall a b. (a -> b) -> a -> b
$ (Char -> Char) -> ByteString -> ByteString
BC.map Char -> Char
toUpper ByteString
bs of
Right (s :: ByteString
s, _) -> ByteString -> Maybe ByteString
forall a. a -> Maybe a
Just ByteString
s
Left _ -> Maybe ByteString
forall a. Maybe a
Nothing
encodeBase16 :: Hash -> B.ByteString
encodeBase16 :: Hash -> ByteString
encodeBase16 (SHA256 bs :: ByteString
bs) = ByteString -> ByteString
base16 ByteString
bs
encodeBase16 NoHash = ByteString
B.empty
decodeBase16 :: B.ByteString -> Hash
decodeBase16 :: ByteString -> Hash
decodeBase16 bs :: ByteString
bs | ByteString -> Int
B.length ByteString
bs Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== 64 Bool -> Bool -> Bool
&& Maybe ByteString -> Bool
forall a. Maybe a -> Bool
isJust (ByteString -> Maybe ByteString
debase16 ByteString
bs) = ByteString -> Hash
SHA256 (Maybe ByteString -> ByteString
forall a. HasCallStack => Maybe a -> a
fromJust (Maybe ByteString -> ByteString) -> Maybe ByteString -> ByteString
forall a b. (a -> b) -> a -> b
$ ByteString -> Maybe ByteString
debase16 ByteString
bs)
| Bool
otherwise = Hash
NoHash
sha256 :: BL.ByteString -> Hash
sha256 :: ByteString -> Hash
sha256 bits :: ByteString
bits = ByteString -> Hash
SHA256 (ByteString -> Hash) -> ByteString -> Hash
forall a b. (a -> b) -> a -> b
$ ByteString -> ByteString
SHA256.hashlazy ByteString
bits
sha256sum :: B.ByteString -> String
sha256sum :: ByteString -> String
sha256sum = ByteString -> String
BC.unpack (ByteString -> String)
-> (ByteString -> ByteString) -> ByteString -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ByteString
base16 (ByteString -> ByteString)
-> (ByteString -> ByteString) -> ByteString -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ByteString
SHA256.hash
rawHash :: Hash -> B.ByteString
rawHash :: Hash -> ByteString
rawHash NoHash = String -> ByteString
forall a. HasCallStack => String -> a
error "Cannot obtain raw hash from NoHash."
rawHash (SHA256 s :: ByteString
s) = ByteString
s
match :: Hash -> Hash -> Bool
NoHash match :: Hash -> Hash -> Bool
`match` _ = Bool
False
_ `match` NoHash = Bool
False
x :: Hash
x `match` y :: Hash
y = Hash
x Hash -> Hash -> Bool
forall a. Eq a => a -> a -> Bool
== Hash
y
data SHA1 = SHA1 !Word32 !Word32 !Word32 !Word32 !Word32
deriving (SHA1 -> SHA1 -> Bool
(SHA1 -> SHA1 -> Bool) -> (SHA1 -> SHA1 -> Bool) -> Eq SHA1
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SHA1 -> SHA1 -> Bool
$c/= :: SHA1 -> SHA1 -> Bool
== :: SHA1 -> SHA1 -> Bool
$c== :: SHA1 -> SHA1 -> Bool
Eq,Eq SHA1
Eq SHA1 =>
(SHA1 -> SHA1 -> Ordering)
-> (SHA1 -> SHA1 -> Bool)
-> (SHA1 -> SHA1 -> Bool)
-> (SHA1 -> SHA1 -> Bool)
-> (SHA1 -> SHA1 -> Bool)
-> (SHA1 -> SHA1 -> SHA1)
-> (SHA1 -> SHA1 -> SHA1)
-> Ord SHA1
SHA1 -> SHA1 -> Bool
SHA1 -> SHA1 -> Ordering
SHA1 -> SHA1 -> SHA1
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: SHA1 -> SHA1 -> SHA1
$cmin :: SHA1 -> SHA1 -> SHA1
max :: SHA1 -> SHA1 -> SHA1
$cmax :: SHA1 -> SHA1 -> SHA1
>= :: SHA1 -> SHA1 -> Bool
$c>= :: SHA1 -> SHA1 -> Bool
> :: SHA1 -> SHA1 -> Bool
$c> :: SHA1 -> SHA1 -> Bool
<= :: SHA1 -> SHA1 -> Bool
$c<= :: SHA1 -> SHA1 -> Bool
< :: SHA1 -> SHA1 -> Bool
$c< :: SHA1 -> SHA1 -> Bool
compare :: SHA1 -> SHA1 -> Ordering
$ccompare :: SHA1 -> SHA1 -> Ordering
$cp1Ord :: Eq SHA1
Ord)
data XYZ = XYZ !Word32 !Word32 !Word32
instance Show SHA1 where
show :: SHA1 -> String
show (SHA1 a :: Word32
a b :: Word32
b c :: Word32
c d :: Word32
d e :: Word32
e) = (Word32 -> String) -> [Word32] -> String
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap Word32 -> String
showAsHex [Word32
a, Word32
b, Word32
c, Word32
d, Word32
e]
instance Binary SHA1 where
put :: SHA1 -> Put
put (SHA1 a :: Word32
a b :: Word32
b c :: Word32
c d :: Word32
d e :: Word32
e) = Word32 -> Put
forall t. Binary t => t -> Put
put Word32
a Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Word32 -> Put
forall t. Binary t => t -> Put
put Word32
b Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Word32 -> Put
forall t. Binary t => t -> Put
put Word32
c Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Word32 -> Put
forall t. Binary t => t -> Put
put Word32
d Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Word32 -> Put
forall t. Binary t => t -> Put
put Word32
e
get :: Get SHA1
get = do Word32
a <- Get Word32
forall t. Binary t => Get t
get ; Word32
b <- Get Word32
forall t. Binary t => Get t
get ; Word32
c <- Get Word32
forall t. Binary t => Get t
get ; Word32
d <- Get Word32
forall t. Binary t => Get t
get ; Word32
e <- Get Word32
forall t. Binary t => Get t
get ; SHA1 -> Get SHA1
forall (m :: * -> *) a. Monad m => a -> m a
return (Word32 -> Word32 -> Word32 -> Word32 -> Word32 -> SHA1
SHA1 Word32
a Word32
b Word32
c Word32
d Word32
e)
sha1Xor :: SHA1 -> SHA1 -> SHA1
sha1Xor :: SHA1 -> SHA1 -> SHA1
sha1Xor (SHA1 a1 :: Word32
a1 b1 :: Word32
b1 c1 :: Word32
c1 d1 :: Word32
d1 e1 :: Word32
e1) (SHA1 a2 :: Word32
a2 b2 :: Word32
b2 c2 :: Word32
c2 d2 :: Word32
d2 e2 :: Word32
e2) =
Word32 -> Word32 -> Word32 -> Word32 -> Word32 -> SHA1
SHA1 (Word32
a1 Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
`xor` Word32
a2) (Word32
b1 Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
`xor` Word32
b2) (Word32
c1 Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
`xor` Word32
c2) (Word32
d1 Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
`xor` Word32
d2) (Word32
e1 Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
`xor` Word32
e2)
sha1zero :: SHA1
sha1zero :: SHA1
sha1zero = Word32 -> Word32 -> Word32 -> Word32 -> Word32 -> SHA1
SHA1 0 0 0 0 0
sha1short :: SHA1 -> Word32
sha1short :: SHA1 -> Word32
sha1short (SHA1 a :: Word32
a _ _ _ _) = Word32
a
unsafeWithInternals :: B.ByteString -> (Ptr Word8 -> Int -> IO a) -> IO a
unsafeWithInternals :: ByteString -> (Ptr Word8 -> Int -> IO a) -> IO a
unsafeWithInternals ps :: ByteString
ps f :: Ptr Word8 -> Int -> IO a
f
= case ByteString -> (ForeignPtr Word8, Int, Int)
BI.toForeignPtr ByteString
ps of
(fp :: ForeignPtr Word8
fp,s :: Int
s,l :: Int
l) -> ForeignPtr Word8 -> (Ptr Word8 -> IO a) -> IO a
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr Word8
fp ((Ptr Word8 -> IO a) -> IO a) -> (Ptr Word8 -> IO a) -> IO a
forall a b. (a -> b) -> a -> b
$ \p :: Ptr Word8
p -> Ptr Word8 -> Int -> IO a
f (Ptr Word8
p Ptr Word8 -> Int -> Ptr Word8
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
s) Int
l
sha1PS:: B.ByteString -> SHA1
sha1PS :: ByteString -> SHA1
sha1PS s :: ByteString
s = SHA1
abcde'
where s1_2 :: ByteString
s1_2 = ByteString -> ByteString
sha1Step12PadLength ByteString
s
abcde :: SHA1
abcde = SHA1
sha1Step3Init
abcde' :: SHA1
abcde' = IO SHA1 -> SHA1
forall a. IO a -> a
unsafePerformIO
(IO SHA1 -> SHA1) -> IO SHA1 -> SHA1
forall a b. (a -> b) -> a -> b
$ ByteString -> (Ptr Word8 -> Int -> IO SHA1) -> IO SHA1
forall a. ByteString -> (Ptr Word8 -> Int -> IO a) -> IO a
unsafeWithInternals ByteString
s1_2 (\ptr :: Ptr Word8
ptr len :: Int
len ->
do let ptr' :: Ptr b
ptr' = Ptr Word8 -> Ptr b
forall a b. Ptr a -> Ptr b
castPtr Ptr Word8
ptr
#ifndef BIGENDIAN
Ptr Word32 -> Int -> IO ()
fiddleEndianness Ptr Word32
forall b. Ptr b
ptr' Int
len
#endif
SHA1 -> Ptr Word32 -> Int -> IO SHA1
sha1Step4Main SHA1
abcde Ptr Word32
forall b. Ptr b
ptr' Int
len)
fiddleEndianness :: Ptr Word32 -> Int -> IO ()
fiddleEndianness :: Ptr Word32 -> Int -> IO ()
fiddleEndianness p :: Ptr Word32
p 0 = Ptr Word32
p Ptr Word32 -> IO () -> IO ()
forall a b. a -> b -> b
`seq` () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
fiddleEndianness p :: Ptr Word32
p n :: Int
n
= do Word32
x <- Ptr Word32 -> IO Word32
forall a. Storable a => Ptr a -> IO a
peek Ptr Word32
p
Ptr Word32 -> Word32 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke Ptr Word32
p (Word32 -> IO ()) -> Word32 -> IO ()
forall a b. (a -> b) -> a -> b
$ Word32 -> Int -> Word32
forall a. Bits a => a -> Int -> a
shiftL Word32
x 24
Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
.|. Word32 -> Int -> Word32
forall a. Bits a => a -> Int -> a
shiftL (Word32
x Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
.&. 0xff00) 8
Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
.|. (Word32 -> Int -> Word32
forall a. Bits a => a -> Int -> a
shiftR Word32
x 8 Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
.&. 0xff00)
Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
.|. Word32 -> Int -> Word32
forall a. Bits a => a -> Int -> a
shiftR Word32
x 24
Ptr Word32 -> Int -> IO ()
fiddleEndianness (Ptr Word32
p Ptr Word32 -> Int -> Ptr Word32
forall a. Storable a => Ptr a -> Int -> Ptr a
`advancePtr` 1) (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- 4)
sha1Step12PadLength :: B.ByteString -> B.ByteString
sha1Step12PadLength :: ByteString -> ByteString
sha1Step12PadLength s :: ByteString
s
= let len :: Int
len = ByteString -> Int
B.length ByteString
s
num_nuls :: Int
num_nuls = (55 Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
len) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` 64
padding :: [Word8]
padding = 128Word8 -> [Word8] -> [Word8]
forall a. a -> [a] -> [a]
:Int -> Word8 -> [Word8]
forall a. Int -> a -> [a]
replicate Int
num_nuls 0
len_w8s :: [Word8]
len_w8s = [Word8] -> [Word8]
forall a. [a] -> [a]
reverse ([Word8] -> [Word8]) -> [Word8] -> [Word8]
forall a b. (a -> b) -> a -> b
$ Int -> Integer -> [Word8]
sizeSplit 8 (Int -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
lenInteger -> Integer -> Integer
forall a. Num a => a -> a -> a
*8)
in [ByteString] -> ByteString
B.concat [ByteString
s, [Word8] -> ByteString
B.pack [Word8]
padding, [Word8] -> ByteString
B.pack [Word8]
len_w8s]
sizeSplit :: Int -> Integer -> [Word8]
sizeSplit :: Int -> Integer -> [Word8]
sizeSplit 0 _ = []
sizeSplit p :: Int
p n :: Integer
n = Integer -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
dWord8 -> [Word8] -> [Word8]
forall a. a -> [a] -> [a]
:Int -> Integer -> [Word8]
sizeSplit (Int
pInt -> Int -> Int
forall a. Num a => a -> a -> a
-1) Integer
n'
where (n' :: Integer
n', d :: Integer
d) = Integer -> Integer -> (Integer, Integer)
forall a. Integral a => a -> a -> (a, a)
divMod Integer
n 256
sha1Step3Init :: SHA1
sha1Step3Init :: SHA1
sha1Step3Init = Word32 -> Word32 -> Word32 -> Word32 -> Word32 -> SHA1
SHA1 0x67452301 0xefcdab89 0x98badcfe 0x10325476 0xc3d2e1f0
sha1Step4Main :: SHA1 -> Ptr Word32 -> Int -> IO SHA1
sha1Step4Main :: SHA1 -> Ptr Word32 -> Int -> IO SHA1
sha1Step4Main abcde :: SHA1
abcde _ 0 = SHA1 -> IO SHA1
forall (m :: * -> *) a. Monad m => a -> m a
return (SHA1 -> IO SHA1) -> SHA1 -> IO SHA1
forall a b. (a -> b) -> a -> b
$! SHA1
abcde
sha1Step4Main (SHA1 a0 :: Word32
a0@Word32
a b0 :: Word32
b0@Word32
b c0 :: Word32
c0@Word32
c d0 :: Word32
d0@Word32
d e0 :: Word32
e0@Word32
e) s :: Ptr Word32
s len :: Int
len
= do
(e :: Word32
e, b :: Word32
b) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f1 0x5a827999 (Int -> IO Word32
x 0) Word32
a Word32
b Word32
c Word32
d Word32
e
(d :: Word32
d, a :: Word32
a) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f1 0x5a827999 (Int -> IO Word32
x 1) Word32
e Word32
a Word32
b Word32
c Word32
d
(c :: Word32
c, e :: Word32
e) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f1 0x5a827999 (Int -> IO Word32
x 2) Word32
d Word32
e Word32
a Word32
b Word32
c
(b :: Word32
b, d :: Word32
d) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f1 0x5a827999 (Int -> IO Word32
x 3) Word32
c Word32
d Word32
e Word32
a Word32
b
(a :: Word32
a, c :: Word32
c) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f1 0x5a827999 (Int -> IO Word32
x 4) Word32
b Word32
c Word32
d Word32
e Word32
a
(e :: Word32
e, b :: Word32
b) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f1 0x5a827999 (Int -> IO Word32
x 5) Word32
a Word32
b Word32
c Word32
d Word32
e
(d :: Word32
d, a :: Word32
a) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f1 0x5a827999 (Int -> IO Word32
x 6) Word32
e Word32
a Word32
b Word32
c Word32
d
(c :: Word32
c, e :: Word32
e) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f1 0x5a827999 (Int -> IO Word32
x 7) Word32
d Word32
e Word32
a Word32
b Word32
c
(b :: Word32
b, d :: Word32
d) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f1 0x5a827999 (Int -> IO Word32
x 8) Word32
c Word32
d Word32
e Word32
a Word32
b
(a :: Word32
a, c :: Word32
c) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f1 0x5a827999 (Int -> IO Word32
x 9) Word32
b Word32
c Word32
d Word32
e Word32
a
(e :: Word32
e, b :: Word32
b) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f1 0x5a827999 (Int -> IO Word32
x 10) Word32
a Word32
b Word32
c Word32
d Word32
e
(d :: Word32
d, a :: Word32
a) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f1 0x5a827999 (Int -> IO Word32
x 11) Word32
e Word32
a Word32
b Word32
c Word32
d
(c :: Word32
c, e :: Word32
e) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f1 0x5a827999 (Int -> IO Word32
x 12) Word32
d Word32
e Word32
a Word32
b Word32
c
(b :: Word32
b, d :: Word32
d) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f1 0x5a827999 (Int -> IO Word32
x 13) Word32
c Word32
d Word32
e Word32
a Word32
b
(a :: Word32
a, c :: Word32
c) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f1 0x5a827999 (Int -> IO Word32
x 14) Word32
b Word32
c Word32
d Word32
e Word32
a
(e :: Word32
e, b :: Word32
b) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f1 0x5a827999 (Int -> IO Word32
x 15) Word32
a Word32
b Word32
c Word32
d Word32
e
(d :: Word32
d, a :: Word32
a) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f1 0x5a827999 (Int -> IO Word32
m 16) Word32
e Word32
a Word32
b Word32
c Word32
d
(c :: Word32
c, e :: Word32
e) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f1 0x5a827999 (Int -> IO Word32
m 17) Word32
d Word32
e Word32
a Word32
b Word32
c
(b :: Word32
b, d :: Word32
d) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f1 0x5a827999 (Int -> IO Word32
m 18) Word32
c Word32
d Word32
e Word32
a Word32
b
(a :: Word32
a, c :: Word32
c) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f1 0x5a827999 (Int -> IO Word32
m 19) Word32
b Word32
c Word32
d Word32
e Word32
a
(e :: Word32
e, b :: Word32
b) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f2 0x6ed9eba1 (Int -> IO Word32
m 20) Word32
a Word32
b Word32
c Word32
d Word32
e
(d :: Word32
d, a :: Word32
a) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f2 0x6ed9eba1 (Int -> IO Word32
m 21) Word32
e Word32
a Word32
b Word32
c Word32
d
(c :: Word32
c, e :: Word32
e) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f2 0x6ed9eba1 (Int -> IO Word32
m 22) Word32
d Word32
e Word32
a Word32
b Word32
c
(b :: Word32
b, d :: Word32
d) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f2 0x6ed9eba1 (Int -> IO Word32
m 23) Word32
c Word32
d Word32
e Word32
a Word32
b
(a :: Word32
a, c :: Word32
c) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f2 0x6ed9eba1 (Int -> IO Word32
m 24) Word32
b Word32
c Word32
d Word32
e Word32
a
(e :: Word32
e, b :: Word32
b) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f2 0x6ed9eba1 (Int -> IO Word32
m 25) Word32
a Word32
b Word32
c Word32
d Word32
e
(d :: Word32
d, a :: Word32
a) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f2 0x6ed9eba1 (Int -> IO Word32
m 26) Word32
e Word32
a Word32
b Word32
c Word32
d
(c :: Word32
c, e :: Word32
e) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f2 0x6ed9eba1 (Int -> IO Word32
m 27) Word32
d Word32
e Word32
a Word32
b Word32
c
(b :: Word32
b, d :: Word32
d) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f2 0x6ed9eba1 (Int -> IO Word32
m 28) Word32
c Word32
d Word32
e Word32
a Word32
b
(a :: Word32
a, c :: Word32
c) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f2 0x6ed9eba1 (Int -> IO Word32
m 29) Word32
b Word32
c Word32
d Word32
e Word32
a
(e :: Word32
e, b :: Word32
b) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f2 0x6ed9eba1 (Int -> IO Word32
m 30) Word32
a Word32
b Word32
c Word32
d Word32
e
(d :: Word32
d, a :: Word32
a) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f2 0x6ed9eba1 (Int -> IO Word32
m 31) Word32
e Word32
a Word32
b Word32
c Word32
d
(c :: Word32
c, e :: Word32
e) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f2 0x6ed9eba1 (Int -> IO Word32
m 32) Word32
d Word32
e Word32
a Word32
b Word32
c
(b :: Word32
b, d :: Word32
d) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f2 0x6ed9eba1 (Int -> IO Word32
m 33) Word32
c Word32
d Word32
e Word32
a Word32
b
(a :: Word32
a, c :: Word32
c) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f2 0x6ed9eba1 (Int -> IO Word32
m 34) Word32
b Word32
c Word32
d Word32
e Word32
a
(e :: Word32
e, b :: Word32
b) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f2 0x6ed9eba1 (Int -> IO Word32
m 35) Word32
a Word32
b Word32
c Word32
d Word32
e
(d :: Word32
d, a :: Word32
a) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f2 0x6ed9eba1 (Int -> IO Word32
m 36) Word32
e Word32
a Word32
b Word32
c Word32
d
(c :: Word32
c, e :: Word32
e) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f2 0x6ed9eba1 (Int -> IO Word32
m 37) Word32
d Word32
e Word32
a Word32
b Word32
c
(b :: Word32
b, d :: Word32
d) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f2 0x6ed9eba1 (Int -> IO Word32
m 38) Word32
c Word32
d Word32
e Word32
a Word32
b
(a :: Word32
a, c :: Word32
c) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f2 0x6ed9eba1 (Int -> IO Word32
m 39) Word32
b Word32
c Word32
d Word32
e Word32
a
(e :: Word32
e, b :: Word32
b) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f3 0x8f1bbcdc (Int -> IO Word32
m 40) Word32
a Word32
b Word32
c Word32
d Word32
e
(d :: Word32
d, a :: Word32
a) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f3 0x8f1bbcdc (Int -> IO Word32
m 41) Word32
e Word32
a Word32
b Word32
c Word32
d
(c :: Word32
c, e :: Word32
e) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f3 0x8f1bbcdc (Int -> IO Word32
m 42) Word32
d Word32
e Word32
a Word32
b Word32
c
(b :: Word32
b, d :: Word32
d) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f3 0x8f1bbcdc (Int -> IO Word32
m 43) Word32
c Word32
d Word32
e Word32
a Word32
b
(a :: Word32
a, c :: Word32
c) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f3 0x8f1bbcdc (Int -> IO Word32
m 44) Word32
b Word32
c Word32
d Word32
e Word32
a
(e :: Word32
e, b :: Word32
b) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f3 0x8f1bbcdc (Int -> IO Word32
m 45) Word32
a Word32
b Word32
c Word32
d Word32
e
(d :: Word32
d, a :: Word32
a) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f3 0x8f1bbcdc (Int -> IO Word32
m 46) Word32
e Word32
a Word32
b Word32
c Word32
d
(c :: Word32
c, e :: Word32
e) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f3 0x8f1bbcdc (Int -> IO Word32
m 47) Word32
d Word32
e Word32
a Word32
b Word32
c
(b :: Word32
b, d :: Word32
d) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f3 0x8f1bbcdc (Int -> IO Word32
m 48) Word32
c Word32
d Word32
e Word32
a Word32
b
(a :: Word32
a, c :: Word32
c) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f3 0x8f1bbcdc (Int -> IO Word32
m 49) Word32
b Word32
c Word32
d Word32
e Word32
a
(e :: Word32
e, b :: Word32
b) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f3 0x8f1bbcdc (Int -> IO Word32
m 50) Word32
a Word32
b Word32
c Word32
d Word32
e
(d :: Word32
d, a :: Word32
a) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f3 0x8f1bbcdc (Int -> IO Word32
m 51) Word32
e Word32
a Word32
b Word32
c Word32
d
(c :: Word32
c, e :: Word32
e) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f3 0x8f1bbcdc (Int -> IO Word32
m 52) Word32
d Word32
e Word32
a Word32
b Word32
c
(b :: Word32
b, d :: Word32
d) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f3 0x8f1bbcdc (Int -> IO Word32
m 53) Word32
c Word32
d Word32
e Word32
a Word32
b
(a :: Word32
a, c :: Word32
c) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f3 0x8f1bbcdc (Int -> IO Word32
m 54) Word32
b Word32
c Word32
d Word32
e Word32
a
(e :: Word32
e, b :: Word32
b) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f3 0x8f1bbcdc (Int -> IO Word32
m 55) Word32
a Word32
b Word32
c Word32
d Word32
e
(d :: Word32
d, a :: Word32
a) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f3 0x8f1bbcdc (Int -> IO Word32
m 56) Word32
e Word32
a Word32
b Word32
c Word32
d
(c :: Word32
c, e :: Word32
e) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f3 0x8f1bbcdc (Int -> IO Word32
m 57) Word32
d Word32
e Word32
a Word32
b Word32
c
(b :: Word32
b, d :: Word32
d) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f3 0x8f1bbcdc (Int -> IO Word32
m 58) Word32
c Word32
d Word32
e Word32
a Word32
b
(a :: Word32
a, c :: Word32
c) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f3 0x8f1bbcdc (Int -> IO Word32
m 59) Word32
b Word32
c Word32
d Word32
e Word32
a
(e :: Word32
e, b :: Word32
b) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f2 0xca62c1d6 (Int -> IO Word32
m 60) Word32
a Word32
b Word32
c Word32
d Word32
e
(d :: Word32
d, a :: Word32
a) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f2 0xca62c1d6 (Int -> IO Word32
m 61) Word32
e Word32
a Word32
b Word32
c Word32
d
(c :: Word32
c, e :: Word32
e) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f2 0xca62c1d6 (Int -> IO Word32
m 62) Word32
d Word32
e Word32
a Word32
b Word32
c
(b :: Word32
b, d :: Word32
d) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f2 0xca62c1d6 (Int -> IO Word32
m 63) Word32
c Word32
d Word32
e Word32
a Word32
b
(a :: Word32
a, c :: Word32
c) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f2 0xca62c1d6 (Int -> IO Word32
m 64) Word32
b Word32
c Word32
d Word32
e Word32
a
(e :: Word32
e, b :: Word32
b) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f2 0xca62c1d6 (Int -> IO Word32
m 65) Word32
a Word32
b Word32
c Word32
d Word32
e
(d :: Word32
d, a :: Word32
a) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f2 0xca62c1d6 (Int -> IO Word32
m 66) Word32
e Word32
a Word32
b Word32
c Word32
d
(c :: Word32
c, e :: Word32
e) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f2 0xca62c1d6 (Int -> IO Word32
m 67) Word32
d Word32
e Word32
a Word32
b Word32
c
(b :: Word32
b, d :: Word32
d) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f2 0xca62c1d6 (Int -> IO Word32
m 68) Word32
c Word32
d Word32
e Word32
a Word32
b
(a :: Word32
a, c :: Word32
c) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f2 0xca62c1d6 (Int -> IO Word32
m 69) Word32
b Word32
c Word32
d Word32
e Word32
a
(e :: Word32
e, b :: Word32
b) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f2 0xca62c1d6 (Int -> IO Word32
m 70) Word32
a Word32
b Word32
c Word32
d Word32
e
(d :: Word32
d, a :: Word32
a) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f2 0xca62c1d6 (Int -> IO Word32
m 71) Word32
e Word32
a Word32
b Word32
c Word32
d
(c :: Word32
c, e :: Word32
e) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f2 0xca62c1d6 (Int -> IO Word32
m 72) Word32
d Word32
e Word32
a Word32
b Word32
c
(b :: Word32
b, d :: Word32
d) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f2 0xca62c1d6 (Int -> IO Word32
m 73) Word32
c Word32
d Word32
e Word32
a Word32
b
(a :: Word32
a, c :: Word32
c) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f2 0xca62c1d6 (Int -> IO Word32
m 74) Word32
b Word32
c Word32
d Word32
e Word32
a
(e :: Word32
e, b :: Word32
b) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f2 0xca62c1d6 (Int -> IO Word32
m 75) Word32
a Word32
b Word32
c Word32
d Word32
e
(d :: Word32
d, a :: Word32
a) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f2 0xca62c1d6 (Int -> IO Word32
m 76) Word32
e Word32
a Word32
b Word32
c Word32
d
(c :: Word32
c, e :: Word32
e) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f2 0xca62c1d6 (Int -> IO Word32
m 77) Word32
d Word32
e Word32
a Word32
b Word32
c
(b :: Word32
b, d :: Word32
d) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f2 0xca62c1d6 (Int -> IO Word32
m 78) Word32
c Word32
d Word32
e Word32
a Word32
b
(a :: Word32
a, c :: Word32
c) <- (XYZ -> Word32)
-> Word32
-> IO Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> Word32
-> IO (Word32, Word32)
forall (m :: * -> *) a.
(Monad m, Num a, Bits a) =>
(XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit XYZ -> Word32
f2 0xca62c1d6 (Int -> IO Word32
m 79) Word32
b Word32
c Word32
d Word32
e Word32
a
let abcde' :: SHA1
abcde' = Word32 -> Word32 -> Word32 -> Word32 -> Word32 -> SHA1
SHA1 (Word32
a0 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
+ Word32
a) (Word32
b0 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
+ Word32
b) (Word32
c0 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
+ Word32
c) (Word32
d0 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
+ Word32
d) (Word32
e0 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
+ Word32
e)
SHA1 -> Ptr Word32 -> Int -> IO SHA1
sha1Step4Main SHA1
abcde' (Ptr Word32
s Ptr Word32 -> Int -> Ptr Word32
forall a. Storable a => Ptr a -> Int -> Ptr a
`advancePtr` 16) (Int
len Int -> Int -> Int
forall a. Num a => a -> a -> a
- 64)
where {-# INLINE f1 #-}
f1 :: XYZ -> Word32
f1 (XYZ x :: Word32
x y :: Word32
y z :: Word32
z) = (Word32
x Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
.&. Word32
y) Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
.|. (Word32 -> Word32
forall a. Bits a => a -> a
complement Word32
x Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
.&. Word32
z)
{-# INLINE f2 #-}
f2 :: XYZ -> Word32
f2 (XYZ x :: Word32
x y :: Word32
y z :: Word32
z) = Word32
x Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
`xor` Word32
y Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
`xor` Word32
z
{-# INLINE f3 #-}
f3 :: XYZ -> Word32
f3 (XYZ x :: Word32
x y :: Word32
y z :: Word32
z) = (Word32
x Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
.&. Word32
y) Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
.|. (Word32
x Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
.&. Word32
z) Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
.|. (Word32
y Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
.&. Word32
z)
{-# INLINE x #-}
x :: Int -> IO Word32
x n :: Int
n = Ptr Word32 -> IO Word32
forall a. Storable a => Ptr a -> IO a
peek (Ptr Word32
s Ptr Word32 -> Int -> Ptr Word32
forall a. Storable a => Ptr a -> Int -> Ptr a
`advancePtr` Int
n)
{-# INLINE m #-}
m :: Int -> IO Word32
m n :: Int
n = do let base :: Ptr Word32
base = Ptr Word32
s Ptr Word32 -> Int -> Ptr Word32
forall a. Storable a => Ptr a -> Int -> Ptr a
`advancePtr` (Int
n Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. 15)
Word32
x0 <- Ptr Word32 -> IO Word32
forall a. Storable a => Ptr a -> IO a
peek Ptr Word32
base
Word32
x1 <- Ptr Word32 -> IO Word32
forall a. Storable a => Ptr a -> IO a
peek (Ptr Word32
s Ptr Word32 -> Int -> Ptr Word32
forall a. Storable a => Ptr a -> Int -> Ptr a
`advancePtr` ((Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- 14) Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. 15))
Word32
x2 <- Ptr Word32 -> IO Word32
forall a. Storable a => Ptr a -> IO a
peek (Ptr Word32
s Ptr Word32 -> Int -> Ptr Word32
forall a. Storable a => Ptr a -> Int -> Ptr a
`advancePtr` ((Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- 8) Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. 15))
Word32
x3 <- Ptr Word32 -> IO Word32
forall a. Storable a => Ptr a -> IO a
peek (Ptr Word32
s Ptr Word32 -> Int -> Ptr Word32
forall a. Storable a => Ptr a -> Int -> Ptr a
`advancePtr` ((Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- 3) Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. 15))
let res :: Word32
res = Word32 -> Int -> Word32
forall a. Bits a => a -> Int -> a
rotateL (Word32
x0 Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
`xor` Word32
x1 Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
`xor` Word32
x2 Word32 -> Word32 -> Word32
forall a. Bits a => a -> a -> a
`xor` Word32
x3) 1
Ptr Word32 -> Word32 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke Ptr Word32
base Word32
res
Word32 -> IO Word32
forall (m :: * -> *) a. Monad m => a -> m a
return Word32
res
{-# INLINE doit #-}
doit :: (XYZ -> a)
-> a
-> m a
-> a
-> Word32
-> Word32
-> Word32
-> a
-> m (a, Word32)
doit f :: XYZ -> a
f k :: a
k i :: m a
i a :: a
a b :: Word32
b c :: Word32
c d :: Word32
d e :: a
e = a
a a -> m (a, Word32) -> m (a, Word32)
forall a b. a -> b -> b
`seq` Word32
c Word32 -> m (a, Word32) -> m (a, Word32)
forall a b. a -> b -> b
`seq`
do a
i' <- m a
i
(a, Word32) -> m (a, Word32)
forall (m :: * -> *) a. Monad m => a -> m a
return (a -> Int -> a
forall a. Bits a => a -> Int -> a
rotateL a
a 5 a -> a -> a
forall a. Num a => a -> a -> a
+ XYZ -> a
f (Word32 -> Word32 -> Word32 -> XYZ
XYZ Word32
b Word32
c Word32
d) a -> a -> a
forall a. Num a => a -> a -> a
+ a
e a -> a -> a
forall a. Num a => a -> a -> a
+ a
i' a -> a -> a
forall a. Num a => a -> a -> a
+ a
k,
Word32 -> Int -> Word32
forall a. Bits a => a -> Int -> a
rotateL Word32
b 30)
showAsHex :: Word32 -> String
showAsHex :: Word32 -> String
showAsHex n :: Word32
n = Int -> Word32 -> ShowS
showIt 8 Word32
n ""
where
showIt :: Int -> Word32 -> String -> String
showIt :: Int -> Word32 -> ShowS
showIt 0 _ r :: String
r = String
r
showIt i :: Int
i x :: Word32
x r :: String
r = case Word32 -> Word32 -> (Word32, Word32)
forall a. Integral a => a -> a -> (a, a)
quotRem Word32
x 16 of
(y :: Word32
y, z :: Word32
z) -> let c :: Char
c = Int -> Char
intToDigit (Word32 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
z)
in Char
c Char -> ShowS
forall a b. a -> b -> b
`seq` Int -> Word32 -> ShowS
showIt (Int
iInt -> Int -> Int
forall a. Num a => a -> a -> a
-1) Word32
y (Char
cChar -> ShowS
forall a. a -> [a] -> [a]
:String
r)