packages feed

SHA 1.5.1 → 1.6.0

raw patch · 3 files changed

+191/−170 lines, 3 filesdep ~test-frameworkdep ~test-framework-quickcheck2new-uploaderPVP ok

version bump matches the API change (PVP)

Dependency ranges changed: test-framework, test-framework-quickcheck2

API changes (from Hackage documentation)

Files

Data/Digest/Pure/SHA.hs view
@@ -22,19 +22,20 @@        , hmacSha384        , hmacSha512 #ifdef SHA_TEST-       , toBigEndianBS, fromBigEndianBS+       , toBigEndianSBS, fromBigEndianSBS        , calc_k        , padSHA1, padSHA512 #endif        )  where-+  import Data.Binary import Data.Binary.Get import Data.Binary.Put import Data.Bits import Data.ByteString.Lazy(ByteString) import qualified Data.ByteString.Lazy as BS+import qualified Data.ByteString as SBS import Data.Char (intToDigit)  -- | An abstract datatype for digests.@@ -44,15 +45,15 @@   show = showDigest  instance Binary (Digest SHA1State) where-  get = fmap Digest $ getLazyByteString 20+  get = Digest `fmap` getLazyByteString 20   put (Digest bs) = put bs  instance Binary (Digest SHA256State) where-  get = fmap Digest $ getLazyByteString 32+  get = Digest `fmap` getLazyByteString 32   put (Digest bs) = put bs  instance Binary (Digest SHA512State) where-  get = fmap Digest $ getLazyByteString 64+  get = Digest `fmap` getLazyByteString 64   put (Digest bs) = put bs  -- --------------------------------------------------------------------------@@ -114,8 +115,8 @@   c <- getWord32be   d <- getWord32be   e <- getWord32be-  return $ SHA1S a b c d e-  +  return $! SHA1S a b c d e+ synthesizeSHA224 :: SHA256State -> Put synthesizeSHA224 (SHA256S a b c d e f g _) = do   putWord32be a@@ -125,7 +126,7 @@   putWord32be e   putWord32be f   putWord32be g-  + synthesizeSHA256 :: SHA256State -> Put synthesizeSHA256 (SHA256S a b c d e f g h) = do   putWord32be a@@ -146,8 +147,8 @@   e <- getWord32be   f <- getWord32be   g <- getWord32be-  h <- getWord32be  -  return $ SHA256S a b c d e f g h+  h <- getWord32be+  return $! SHA256S a b c d e f g h  synthesizeSHA384 :: SHA512State -> Put synthesizeSHA384 (SHA512S a b c d e f _ _) = do@@ -157,7 +158,7 @@   putWord64be d   putWord64be e   putWord64be f-  + synthesizeSHA512 :: SHA512State -> Put synthesizeSHA512 (SHA512S a b c d e f g h) = do   putWord64be a@@ -179,12 +180,12 @@   f <- getWord64be   g <- getWord64be   h <- getWord64be-  return $ SHA512S a b c d e f g h+  return $! SHA512S a b c d e f g h  instance Binary SHA1State where   put = synthesizeSHA1   get = getSHA1-  + instance Binary SHA256State where   put = synthesizeSHA256   get = getSHA256@@ -207,16 +208,26 @@ padSHA512 = generic_pad 896 1024 128  generic_pad :: Word64 -> Word64 -> Int -> ByteString -> ByteString-generic_pad a b lSize bs = BS.concat [bs, pad_bytes, pad_length]+generic_pad a b lSize bs =+  BS.fromChunks $! go 0 chunks  where-  l = fromIntegral $ BS.length bs * 8-  k = calc_k a b l-  -- INVARIANT: k is necessarily > 0, and (k + 1) is a multiple of 8.-  k_bytes    = (k + 1) `div` 8-  pad_bytes  = BS.singleton 0x80 `BS.append` BS.replicate nZeroBytes 0-  nZeroBytes = fromIntegral $ k_bytes - 1-  pad_length = toBigEndianBS lSize l+  chunks = BS.toChunks bs +  -- Generates the padded ByteString at the same time it computes the length+  -- of input. If the length is computed before the computation of the hash, it+  -- will break the lazy evaluation of the input and no longer run in constant+  -- memory space.+  go !len [] =+    let lenBits = fromIntegral $ len * 8+        k = calc_k a b lenBits+        -- INVARIANT: k is necessarily > 0, and (k + 1) is a multiple of 8.+        kBytes = (k + 1) `div` 8+        nZeroBytes = fromIntegral $! kBytes - 1+        padLength = toBigEndianSBS lSize lenBits+    in [SBS.singleton 0x80, SBS.replicate nZeroBytes 0, padLength]+  go !len (c:cs) =+      c : go (len + SBS.length c) cs+ -- Given a, b, and l, calculate the smallest k such that (l + 1 + k) mod b = a. calc_k :: Word64 -> Word64 -> Word64 -> Word64 calc_k a b l =@@ -226,15 +237,15 @@  where   r = toInteger a - toInteger l `mod` toInteger b - 1 -toBigEndianBS :: (Integral a, Bits a) => Int -> a -> ByteString-toBigEndianBS s val = BS.pack $ map getBits [s - 8, s - 16 .. 0]+toBigEndianSBS :: (Integral a, Bits a) => Int -> a -> SBS.ByteString+toBigEndianSBS s val = SBS.pack $ map getBits [s - 8, s - 16 .. 0]  where    getBits x = fromIntegral $ (val `shiftR` x) .&. 0xFF  #ifdef SHA_TEST-fromBigEndianBS :: (Integral a, Bits a) => ByteString -> a-fromBigEndianBS =-  BS.foldl (\ acc x -> (acc `shiftL` 8) + fromIntegral x) 0+fromBigEndianSBS :: (Integral a, Bits a) => SBS.ByteString -> a+fromBigEndianSBS =+  SBS.foldl (\ acc x -> (acc `shiftL` 8) + fromIntegral x) 0 #endif  -- --------------------------------------------------------------------------@@ -261,28 +272,28 @@ --   which saves us one operation.  bsig256_0 :: Word32 -> Word32-bsig256_0 x = rotate x (-2) `xor` rotate x (-13) `xor` rotate x (-22)+bsig256_0 x = rotateR x 2 `xor` rotateR x 13 `xor` rotateR x 22  bsig256_1 :: Word32 -> Word32-bsig256_1 x = rotate x (-6) `xor` rotate x (-11) `xor` rotate x (-25)+bsig256_1 x = rotateR x 6 `xor` rotateR x 11 `xor` rotateR x 25  lsig256_0 :: Word32 -> Word32-lsig256_0 x = rotate x (-7) `xor` rotate x (-18) `xor` shiftR x 3+lsig256_0 x = rotateR x 7 `xor` rotateR x 18 `xor` shiftR x 3  lsig256_1 :: Word32 -> Word32-lsig256_1 x = rotate x (-17) `xor` rotate x (-19) `xor` shiftR x 10+lsig256_1 x = rotateR x 17 `xor` rotateR x 19 `xor` shiftR x 10  bsig512_0 :: Word64 -> Word64-bsig512_0 x = rotate x (-28) `xor` rotate x (-34) `xor` rotate x (-39)+bsig512_0 x = rotateR x 28 `xor` rotateR x 34 `xor` rotateR x 39  bsig512_1 :: Word64 -> Word64-bsig512_1 x = rotate x (-14) `xor` rotate x (-18) `xor` rotate x (-41)+bsig512_1 x = rotateR x 14 `xor` rotateR x 18 `xor` rotateR x 41  lsig512_0 :: Word64 -> Word64-lsig512_0 x = rotate x (-1) `xor` rotate x (-8) `xor` shiftR x 7+lsig512_0 x = rotateR x 1 `xor` rotateR x 8 `xor` shiftR x 7  lsig512_1 :: Word64 -> Word64-lsig512_1 x = rotate x (-19) `xor` rotate x (-61) `xor` shiftR x 6+lsig512_1 x = rotateR x 19 `xor` rotateR x 61 `xor` shiftR x 6  -- -------------------------------------------------------------------------- --@@ -325,78 +336,78 @@   w13 <- getWord32be   w14 <- getWord32be   w15 <- getWord32be-  let w16 = rotate (w13 `xor` w08 `xor` w02 `xor` w00) 1-      w17 = rotate (w14 `xor` w09 `xor` w03 `xor` w01) 1-      w18 = rotate (w15 `xor` w10 `xor` w04 `xor` w02) 1-      w19 = rotate (w16 `xor` w11 `xor` w05 `xor` w03) 1-      w20 = rotate (w17 `xor` w12 `xor` w06 `xor` w04) 1-      w21 = rotate (w18 `xor` w13 `xor` w07 `xor` w05) 1-      w22 = rotate (w19 `xor` w14 `xor` w08 `xor` w06) 1-      w23 = rotate (w20 `xor` w15 `xor` w09 `xor` w07) 1-      w24 = rotate (w21 `xor` w16 `xor` w10 `xor` w08) 1-      w25 = rotate (w22 `xor` w17 `xor` w11 `xor` w09) 1-      w26 = rotate (w23 `xor` w18 `xor` w12 `xor` w10) 1-      w27 = rotate (w24 `xor` w19 `xor` w13 `xor` w11) 1-      w28 = rotate (w25 `xor` w20 `xor` w14 `xor` w12) 1-      w29 = rotate (w26 `xor` w21 `xor` w15 `xor` w13) 1-      w30 = rotate (w27 `xor` w22 `xor` w16 `xor` w14) 1-      w31 = rotate (w28 `xor` w23 `xor` w17 `xor` w15) 1-      w32 = rotate (w29 `xor` w24 `xor` w18 `xor` w16) 1-      w33 = rotate (w30 `xor` w25 `xor` w19 `xor` w17) 1-      w34 = rotate (w31 `xor` w26 `xor` w20 `xor` w18) 1-      w35 = rotate (w32 `xor` w27 `xor` w21 `xor` w19) 1-      w36 = rotate (w33 `xor` w28 `xor` w22 `xor` w20) 1-      w37 = rotate (w34 `xor` w29 `xor` w23 `xor` w21) 1-      w38 = rotate (w35 `xor` w30 `xor` w24 `xor` w22) 1-      w39 = rotate (w36 `xor` w31 `xor` w25 `xor` w23) 1-      w40 = rotate (w37 `xor` w32 `xor` w26 `xor` w24) 1-      w41 = rotate (w38 `xor` w33 `xor` w27 `xor` w25) 1-      w42 = rotate (w39 `xor` w34 `xor` w28 `xor` w26) 1-      w43 = rotate (w40 `xor` w35 `xor` w29 `xor` w27) 1-      w44 = rotate (w41 `xor` w36 `xor` w30 `xor` w28) 1-      w45 = rotate (w42 `xor` w37 `xor` w31 `xor` w29) 1-      w46 = rotate (w43 `xor` w38 `xor` w32 `xor` w30) 1-      w47 = rotate (w44 `xor` w39 `xor` w33 `xor` w31) 1-      w48 = rotate (w45 `xor` w40 `xor` w34 `xor` w32) 1-      w49 = rotate (w46 `xor` w41 `xor` w35 `xor` w33) 1-      w50 = rotate (w47 `xor` w42 `xor` w36 `xor` w34) 1-      w51 = rotate (w48 `xor` w43 `xor` w37 `xor` w35) 1-      w52 = rotate (w49 `xor` w44 `xor` w38 `xor` w36) 1-      w53 = rotate (w50 `xor` w45 `xor` w39 `xor` w37) 1-      w54 = rotate (w51 `xor` w46 `xor` w40 `xor` w38) 1-      w55 = rotate (w52 `xor` w47 `xor` w41 `xor` w39) 1-      w56 = rotate (w53 `xor` w48 `xor` w42 `xor` w40) 1-      w57 = rotate (w54 `xor` w49 `xor` w43 `xor` w41) 1-      w58 = rotate (w55 `xor` w50 `xor` w44 `xor` w42) 1-      w59 = rotate (w56 `xor` w51 `xor` w45 `xor` w43) 1-      w60 = rotate (w57 `xor` w52 `xor` w46 `xor` w44) 1-      w61 = rotate (w58 `xor` w53 `xor` w47 `xor` w45) 1-      w62 = rotate (w59 `xor` w54 `xor` w48 `xor` w46) 1-      w63 = rotate (w60 `xor` w55 `xor` w49 `xor` w47) 1-      w64 = rotate (w61 `xor` w56 `xor` w50 `xor` w48) 1-      w65 = rotate (w62 `xor` w57 `xor` w51 `xor` w49) 1-      w66 = rotate (w63 `xor` w58 `xor` w52 `xor` w50) 1-      w67 = rotate (w64 `xor` w59 `xor` w53 `xor` w51) 1-      w68 = rotate (w65 `xor` w60 `xor` w54 `xor` w52) 1-      w69 = rotate (w66 `xor` w61 `xor` w55 `xor` w53) 1-      w70 = rotate (w67 `xor` w62 `xor` w56 `xor` w54) 1-      w71 = rotate (w68 `xor` w63 `xor` w57 `xor` w55) 1-      w72 = rotate (w69 `xor` w64 `xor` w58 `xor` w56) 1-      w73 = rotate (w70 `xor` w65 `xor` w59 `xor` w57) 1-      w74 = rotate (w71 `xor` w66 `xor` w60 `xor` w58) 1-      w75 = rotate (w72 `xor` w67 `xor` w61 `xor` w59) 1-      w76 = rotate (w73 `xor` w68 `xor` w62 `xor` w60) 1-      w77 = rotate (w74 `xor` w69 `xor` w63 `xor` w61) 1-      w78 = rotate (w75 `xor` w70 `xor` w64 `xor` w62) 1-      w79 = rotate (w76 `xor` w71 `xor` w65 `xor` w63) 1-  return $ SHA1Sched w00 w01 w02 w03 w04 w05 w06 w07 w08 w09-                     w10 w11 w12 w13 w14 w15 w16 w17 w18 w19-                     w20 w21 w22 w23 w24 w25 w26 w27 w28 w29-                     w30 w31 w32 w33 w34 w35 w36 w37 w38 w39-                     w40 w41 w42 w43 w44 w45 w46 w47 w48 w49-                     w50 w51 w52 w53 w54 w55 w56 w57 w58 w59-                     w60 w61 w62 w63 w64 w65 w66 w67 w68 w69-                     w70 w71 w72 w73 w74 w75 w76 w77 w78 w79+  let w16 = rotateL (w13 `xor` w08 `xor` w02 `xor` w00) 1+      w17 = rotateL (w14 `xor` w09 `xor` w03 `xor` w01) 1+      w18 = rotateL (w15 `xor` w10 `xor` w04 `xor` w02) 1+      w19 = rotateL (w16 `xor` w11 `xor` w05 `xor` w03) 1+      w20 = rotateL (w17 `xor` w12 `xor` w06 `xor` w04) 1+      w21 = rotateL (w18 `xor` w13 `xor` w07 `xor` w05) 1+      w22 = rotateL (w19 `xor` w14 `xor` w08 `xor` w06) 1+      w23 = rotateL (w20 `xor` w15 `xor` w09 `xor` w07) 1+      w24 = rotateL (w21 `xor` w16 `xor` w10 `xor` w08) 1+      w25 = rotateL (w22 `xor` w17 `xor` w11 `xor` w09) 1+      w26 = rotateL (w23 `xor` w18 `xor` w12 `xor` w10) 1+      w27 = rotateL (w24 `xor` w19 `xor` w13 `xor` w11) 1+      w28 = rotateL (w25 `xor` w20 `xor` w14 `xor` w12) 1+      w29 = rotateL (w26 `xor` w21 `xor` w15 `xor` w13) 1+      w30 = rotateL (w27 `xor` w22 `xor` w16 `xor` w14) 1+      w31 = rotateL (w28 `xor` w23 `xor` w17 `xor` w15) 1+      w32 = rotateL (w29 `xor` w24 `xor` w18 `xor` w16) 1+      w33 = rotateL (w30 `xor` w25 `xor` w19 `xor` w17) 1+      w34 = rotateL (w31 `xor` w26 `xor` w20 `xor` w18) 1+      w35 = rotateL (w32 `xor` w27 `xor` w21 `xor` w19) 1+      w36 = rotateL (w33 `xor` w28 `xor` w22 `xor` w20) 1+      w37 = rotateL (w34 `xor` w29 `xor` w23 `xor` w21) 1+      w38 = rotateL (w35 `xor` w30 `xor` w24 `xor` w22) 1+      w39 = rotateL (w36 `xor` w31 `xor` w25 `xor` w23) 1+      w40 = rotateL (w37 `xor` w32 `xor` w26 `xor` w24) 1+      w41 = rotateL (w38 `xor` w33 `xor` w27 `xor` w25) 1+      w42 = rotateL (w39 `xor` w34 `xor` w28 `xor` w26) 1+      w43 = rotateL (w40 `xor` w35 `xor` w29 `xor` w27) 1+      w44 = rotateL (w41 `xor` w36 `xor` w30 `xor` w28) 1+      w45 = rotateL (w42 `xor` w37 `xor` w31 `xor` w29) 1+      w46 = rotateL (w43 `xor` w38 `xor` w32 `xor` w30) 1+      w47 = rotateL (w44 `xor` w39 `xor` w33 `xor` w31) 1+      w48 = rotateL (w45 `xor` w40 `xor` w34 `xor` w32) 1+      w49 = rotateL (w46 `xor` w41 `xor` w35 `xor` w33) 1+      w50 = rotateL (w47 `xor` w42 `xor` w36 `xor` w34) 1+      w51 = rotateL (w48 `xor` w43 `xor` w37 `xor` w35) 1+      w52 = rotateL (w49 `xor` w44 `xor` w38 `xor` w36) 1+      w53 = rotateL (w50 `xor` w45 `xor` w39 `xor` w37) 1+      w54 = rotateL (w51 `xor` w46 `xor` w40 `xor` w38) 1+      w55 = rotateL (w52 `xor` w47 `xor` w41 `xor` w39) 1+      w56 = rotateL (w53 `xor` w48 `xor` w42 `xor` w40) 1+      w57 = rotateL (w54 `xor` w49 `xor` w43 `xor` w41) 1+      w58 = rotateL (w55 `xor` w50 `xor` w44 `xor` w42) 1+      w59 = rotateL (w56 `xor` w51 `xor` w45 `xor` w43) 1+      w60 = rotateL (w57 `xor` w52 `xor` w46 `xor` w44) 1+      w61 = rotateL (w58 `xor` w53 `xor` w47 `xor` w45) 1+      w62 = rotateL (w59 `xor` w54 `xor` w48 `xor` w46) 1+      w63 = rotateL (w60 `xor` w55 `xor` w49 `xor` w47) 1+      w64 = rotateL (w61 `xor` w56 `xor` w50 `xor` w48) 1+      w65 = rotateL (w62 `xor` w57 `xor` w51 `xor` w49) 1+      w66 = rotateL (w63 `xor` w58 `xor` w52 `xor` w50) 1+      w67 = rotateL (w64 `xor` w59 `xor` w53 `xor` w51) 1+      w68 = rotateL (w65 `xor` w60 `xor` w54 `xor` w52) 1+      w69 = rotateL (w66 `xor` w61 `xor` w55 `xor` w53) 1+      w70 = rotateL (w67 `xor` w62 `xor` w56 `xor` w54) 1+      w71 = rotateL (w68 `xor` w63 `xor` w57 `xor` w55) 1+      w72 = rotateL (w69 `xor` w64 `xor` w58 `xor` w56) 1+      w73 = rotateL (w70 `xor` w65 `xor` w59 `xor` w57) 1+      w74 = rotateL (w71 `xor` w66 `xor` w60 `xor` w58) 1+      w75 = rotateL (w72 `xor` w67 `xor` w61 `xor` w59) 1+      w76 = rotateL (w73 `xor` w68 `xor` w62 `xor` w60) 1+      w77 = rotateL (w74 `xor` w69 `xor` w63 `xor` w61) 1+      w78 = rotateL (w75 `xor` w70 `xor` w64 `xor` w62) 1+      w79 = rotateL (w76 `xor` w71 `xor` w65 `xor` w63) 1+  return $! SHA1Sched w00 w01 w02 w03 w04 w05 w06 w07 w08 w09+                      w10 w11 w12 w13 w14 w15 w16 w17 w18 w19+                      w20 w21 w22 w23 w24 w25 w26 w27 w28 w29+                      w30 w31 w32 w33 w34 w35 w36 w37 w38 w39+                      w40 w41 w42 w43 w44 w45 w46 w47 w48 w49+                      w50 w51 w52 w53 w54 w55 w56 w57 w58 w59+                      w60 w61 w62 w63 w64 w65 w66 w67 w68 w69+                      w70 w71 w72 w73 w74 w75 w76 w77 w78 w79  data SHA256Sched = SHA256Sched !Word32 !Word32 !Word32 !Word32 !Word32 -- 00-04                                !Word32 !Word32 !Word32 !Word32 !Word32 -- 05-09@@ -478,13 +489,13 @@       w61 = lsig256_1 w59 + w54 + lsig256_0 w46 + w45       w62 = lsig256_1 w60 + w55 + lsig256_0 w47 + w46       w63 = lsig256_1 w61 + w56 + lsig256_0 w48 + w47-  return $ SHA256Sched w00 w01 w02 w03 w04 w05 w06 w07 w08 w09-                       w10 w11 w12 w13 w14 w15 w16 w17 w18 w19-                       w20 w21 w22 w23 w24 w25 w26 w27 w28 w29-                       w30 w31 w32 w33 w34 w35 w36 w37 w38 w39-                       w40 w41 w42 w43 w44 w45 w46 w47 w48 w49-                       w50 w51 w52 w53 w54 w55 w56 w57 w58 w59-                       w60 w61 w62 w63+  return $! SHA256Sched w00 w01 w02 w03 w04 w05 w06 w07 w08 w09+                        w10 w11 w12 w13 w14 w15 w16 w17 w18 w19+                        w20 w21 w22 w23 w24 w25 w26 w27 w28 w29+                        w30 w31 w32 w33 w34 w35 w36 w37 w38 w39+                        w40 w41 w42 w43 w44 w45 w46 w47 w48 w49+                        w50 w51 w52 w53 w54 w55 w56 w57 w58 w59+                        w60 w61 w62 w63  data SHA512Sched = SHA512Sched !Word64 !Word64 !Word64 !Word64 !Word64 --  0- 4                                !Word64 !Word64 !Word64 !Word64 !Word64 --  5- 9@@ -585,14 +596,14 @@       w77 = lsig512_1 w75 + w70 + lsig512_0 w62 + w61       w78 = lsig512_1 w76 + w71 + lsig512_0 w63 + w62       w79 = lsig512_1 w77 + w72 + lsig512_0 w64 + w63-  return $ SHA512Sched w00 w01 w02 w03 w04 w05 w06 w07 w08 w09-                       w10 w11 w12 w13 w14 w15 w16 w17 w18 w19-                       w20 w21 w22 w23 w24 w25 w26 w27 w28 w29-                       w30 w31 w32 w33 w34 w35 w36 w37 w38 w39-                       w40 w41 w42 w43 w44 w45 w46 w47 w48 w49-                       w50 w51 w52 w53 w54 w55 w56 w57 w58 w59-                       w60 w61 w62 w63 w64 w65 w66 w67 w68 w69-                       w70 w71 w72 w73 w74 w75 w76 w77 w78 w79+  return $! SHA512Sched w00 w01 w02 w03 w04 w05 w06 w07 w08 w09+                        w10 w11 w12 w13 w14 w15 w16 w17 w18 w19+                        w20 w21 w22 w23 w24 w25 w26 w27 w28 w29+                        w30 w31 w32 w33 w34 w35 w36 w37 w38 w39+                        w40 w41 w42 w43 w44 w45 w46 w47 w48 w49+                        w50 w51 w52 w53 w54 w55 w56 w57 w58 w59+                        w60 w61 w62 w63 w64 w65 w66 w67 w68 w69+                        w70 w71 w72 w73 w74 w75 w76 w77 w78 w79  -- -------------------------------------------------------------------------- --@@ -691,32 +702,32 @@       s79 = step1_par s78 0xca62c1d6 w78       s80 = step1_par s79 0xca62c1d6 w79       SHA1S a80 b80 c80 d80 e80 = s80-  return $ SHA1S (a00 + a80) (b00 + b80) (c00 + c80) (d00 + d80) (e00 + e80)+  return $! SHA1S (a00 + a80) (b00 + b80) (c00 + c80) (d00 + d80) (e00 + e80)  {-# INLINE step1_ch #-} step1_ch :: SHA1State -> Word32 -> Word32 -> SHA1State step1_ch !(SHA1S a b c d e) k w = SHA1S a' b' c' d' e'- where a' = rotate a 5 + ((b .&. c) `xor` (complement b .&. d)) + e + k + w+ where a' = rotateL a 5 + ((b .&. c) `xor` (complement b .&. d)) + e + k + w        b' = a-       c' = rotate b 30+       c' = rotateL b 30        d' = c        e' = d  {-# INLINE step1_par #-} step1_par :: SHA1State -> Word32 -> Word32 -> SHA1State step1_par !(SHA1S a b c d e) k w = SHA1S a' b' c' d' e'- where a' = rotate a 5 + (b `xor` c `xor` d) + e + k + w+ where a' = rotateL a 5 + (b `xor` c `xor` d) + e + k + w        b' = a-       c' = rotate b 30+       c' = rotateL b 30        d' = c        e' = d  {-# INLINE step1_maj #-} step1_maj :: SHA1State -> Word32 -> Word32 -> SHA1State step1_maj !(SHA1S a b c d e) k w = SHA1S a' b' c' d' e'- where a' = rotate a 5 + ((b .&. (c .|. d)) .|. (c .&. d)) + e + k + w+ where a' = rotateL a 5 + ((b .&. (c .|. d)) .|. (c .&. d)) + e + k + w        b' = a-       c' = rotate b 30+       c' = rotateL b 30        d' = c        e' = d -- See the note on maj, above@@ -795,8 +806,8 @@       s63 = step256 s62 0xbef9a3f7 w62       s64 = step256 s63 0xc67178f2 w63       SHA256S a64 b64 c64 d64 e64 f64 g64 h64 = s64-  return $ SHA256S (a00 + a64) (b00 + b64) (c00 + c64) (d00 + d64)-                   (e00 + e64) (f00 + f64) (g00 + g64) (h00 + h64)+  return $! SHA256S (a00 + a64) (b00 + b64) (c00 + c64) (d00 + d64)+                    (e00 + e64) (f00 + f64) (g00 + g64) (h00 + h64)  {-# INLINE step256 #-} step256 :: SHA256State -> Word32 -> Word32 -> SHA256State@@ -904,8 +915,8 @@       s79 = step512 s78 0x5fcb6fab3ad6faec w78       s80 = step512 s79 0x6c44198c4a475817 w79       SHA512S a80 b80 c80 d80 e80 f80 g80 h80 = s80-  return $ SHA512S (a00 + a80) (b00 + b80) (c00 + c80) (d00 + d80)-                   (e00 + e80) (f00 + f80) (g00 + g80) (h00 + h80)+  return $! SHA512S (a00 + a80) (b00 + b80) (c00 + c80) (d00 + d80)+                    (e00 + e80) (f00 + f80) (g00 + g80) (h00 + h80)  {-# INLINE step512 #-} step512 :: SHA512State -> Word64 -> Word64 -> SHA512State@@ -945,7 +956,7 @@  where   bs_pad = padSHA1 bs_in   fstate = runSHA initialSHA1State processSHA1Block bs_pad-  bs_out = runPut $ synthesizeSHA1 fstate+  bs_out = runPut $! synthesizeSHA1 fstate  -- |Compute the SHA-224 hash of the given ByteString. Note that SHA-224 and -- SHA-384 differ only slightly from SHA-256 and SHA-512, and use truncated@@ -956,7 +967,7 @@  where   bs_pad = padSHA1 bs_in   fstate = runSHA initialSHA224State processSHA256Block bs_pad-  bs_out = runPut $ synthesizeSHA224 fstate+  bs_out = runPut $! synthesizeSHA224 fstate  -- |Compute the SHA-256 hash of the given ByteString. The output is guaranteed -- to be exactly 256 bits, or 32 bytes, long. If your security requirements@@ -967,7 +978,7 @@  where   bs_pad = padSHA1 bs_in   fstate = runSHA initialSHA256State processSHA256Block bs_pad-  bs_out = runPut $ synthesizeSHA256 fstate+  bs_out = runPut $! synthesizeSHA256 fstate  -- |Compute the SHA-384 hash of the given ByteString. Yup, you guessed it, -- the output will be exactly 384 bits, or 48 bytes, long.@@ -976,7 +987,7 @@  where   bs_pad = padSHA512 bs_in   fstate = runSHA initialSHA384State processSHA512Block bs_pad-  bs_out = runPut $ synthesizeSHA384 fstate+  bs_out = runPut $! synthesizeSHA384 fstate  -- |For those for whom only the biggest hashes will do, this computes the -- SHA-512 hash of the given ByteString. The output will be 64 bytes, or@@ -986,7 +997,7 @@  where   bs_pad = padSHA512 bs_in   fstate = runSHA initialSHA512State processSHA512Block bs_pad-  bs_out = runPut $ synthesizeSHA512 fstate+  bs_out = runPut $! synthesizeSHA512 fstate  -- -------------------------------------------------------------------------- 
SHA.cabal view
@@ -1,14 +1,15 @@ name:       SHA category:   Cryptography, Codec-version:    1.5.1+version:    1.6.0 license:    BSD3 license-file: LICENSE author:     Adam Wick <awick@galois.com>, Brian Lewis <brian@lorf.org>-maintainer: Adam Wick <awick@galois.com>+maintainer: Adam Wick <awick@galois.com>,+            Raphael Javaux <raphaeljavaux@gmail.com> stability:  stable build-type: Simple cabal-version: >= 1.6-tested-with: GHC ==6.8.0+tested-with: GHC == 7.6.1 synopsis: Implementations of the SHA suite of message digest functions description: This library implements the SHA suite of message digest functions,              according to NIST FIPS 180-2 (with the SHA-224 addendum), as well@@ -18,61 +19,70 @@              these do not presently reach the speed of well-tuned libraries,               like OpenSSL. -Flag Test- Description: Build the SHA test suite.- Default: False+Flag test+  Description: Build the SHA test suite.+  Default: False  Flag exe- Description: Build a SHA2-384 executable similar to 'md5sum'- Default: False+  Description: Build a sha1 and a sha384 executable similar to 'md5sum'.+  Default: False  Library- build-depends: base >= 4 && < 6, bytestring, binary, array- exposed-modules: Data.Digest.Pure.SHA- GHC-Options: -O2 -Wall -fno-ignore-asserts -funbox-strict-fields -fwarn-tabs- extensions: CPP, BangPatterns- if impl(ghc >= 6.12)-   Ghc-Options: -fregs-graph+  build-depends: base >= 4 && < 6, bytestring, binary, array+  exposed-modules: Data.Digest.Pure.SHA+  GHC-Options: -O2 -Wall -fno-ignore-asserts -fno-warn-orphans+               -funbox-strict-fields -fwarn-tabs+  extensions: CPP, BangPatterns+  if impl(ghc >= 6.12)+    Ghc-Options: -fregs-graph  Executable test_sha-  build-depends: base >= 4 && < 6, bytestring, binary, array-  GHC-Options: -O2 -Wall -fno-ignore-asserts -fno-warn-orphans -funbox-strict-fields -fwarn-tabs-  cpp-options: -DSHA_TEST+  build-depends: base >= 4 && < 6, bytestring, binary, array,+                 QuickCheck == 2.*, test-framework >= 0.3,+                 test-framework-quickcheck2 >= 0.2   Main-Is: Test.hs   Other-Modules: Data.Digest.Pure.SHA+   extensions: CPP, BangPatterns, MultiParamTypeClasses-  if !flag(test)-    buildable: False-  else-    build-depends: QuickCheck == 2.*, test-framework == 0.3.*, test-framework-quickcheck2 == 0.2.*+  GHC-Options: -O2 -Wall -fno-ignore-asserts -fno-warn-orphans+               -funbox-strict-fields -fwarn-tabs+  cpp-options: -DSHA_TEST+   if impl(ghc >= 6.12)     Ghc-Options: -fregs-graph +  if !flag(test)+    buildable: False+ Executable sha1-  build-depends: base >= 4 && < 6, bytestring, binary, array-  GHC-Options: -O2 -Wall -fno-ignore-asserts -funbox-strict-fields -fwarn-tabs+  build-depends: base >= 4 && < 6, bytestring, binary, array, directory   Main-Is: Main.hs+   extensions: CPP, BangPatterns+  GHC-Options: -O2 -Wall -fno-ignore-asserts -fno-warn-orphans+               -funbox-strict-fields -fwarn-tabs   cpp-options: -DALGORITHM=sha1-  if !flag(exe)-    buildable: False-  else-    build-depends: directory+   if impl(ghc >= 6.12)     Ghc-Options: -fregs-graph +  if !flag(exe)+    buildable: False+ Executable sha384-  build-depends: base >= 4 && < 6, bytestring, binary, array-  GHC-Options: -O2 -Wall -fno-ignore-asserts -funbox-strict-fields -fwarn-tabs+  build-depends: base >= 4 && < 6, bytestring, binary, array, directory+  GHC-Options: -O2 -Wall -fno-ignore-asserts -fno-warn-orphans+               -funbox-strict-fields -fwarn-tabs   Main-Is: Main.hs+   extensions: CPP, BangPatterns   cpp-options: -DALGORITHM=sha384-  if !flag(exe)-    buildable: False-  else-    build-depends: directory+   if impl(ghc >= 6.12)     Ghc-Options: -fregs-graph++  if !flag(exe)+    buildable: False  source-repository head   type:     git
Test.hs view

file too large to diff