packages feed

sha256-0.1.0.0: test/Main.hs

{-# LANGUAGE OverloadedStrings #-}
import           Data.ByteString(ByteString)
import qualified Data.ByteString as B
import qualified Data.ByteString.Base16 as B
import           Data.Function((&))
import           Data.Word
import           Test.Tasty
import           Test.Tasty.HUnit

import Crypto.Sha256
import Crypto.Sha256.Hmac
import Crypto.Sha256.Hkdf
import qualified HMAC
import qualified HKDF
import qualified PBKDF2

d :: ByteString -> ByteString
d = B.decodeBase16Lenient

main = do
    defaultMain $ testGroup "toplevel" [
      testGroup "sha256"
        [ testCase ("sha256-" ++ show n) (run x)
        | (n,x) <- zip [1..] testVectors
        ],
      testGroup "hmac" HMAC.tests,
      testGroup "hkdf" HKDF.tests,
      testGroup "pbkdf2" PBKDF2.tests,
      testGroup "bitstrings" testBitstrings
     ]
  where
    run :: SHA256TestVector -> Assertion
    run x = B.encodeBase16 (hash (msg x)) @?= B.encodeBase16 (out x)

data SHA256TestVector = SHA256TestVector
  { msg :: !ByteString
  , out :: !ByteString
  }

testVectors :: [SHA256TestVector]
testVectors =
  [ sha256_testCase1
  , sha256_testCase2
  , sha256_testCase3
  , sha256_testCase4
  , sha256_testCase5
  , sha256_testCase6
  ]

sha256_testCase1 = SHA256TestVector
  { msg = "abc"
  , out = d "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
  }

sha256_testCase2 = SHA256TestVector
  { msg = ""
  , out = d "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  }

sha256_testCase3 = SHA256TestVector
  { msg = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
  , out = d "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1"
  }

sha256_testCase4 = SHA256TestVector
  { msg = "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"
  , out = d "cf5b16a778af8380036ce59e7b0492370b249b11e8f07a51afac45037afee9d1"
  }

sha256_testCase5 = SHA256TestVector
  { msg = "0123456789ABCDEF0123456789abcdef0123456789ABCDEF0123456789abcde"
  , out = d "a518fbe53475606f8cdf66dfeae0c416f774694843647c810c6f89fd7d24ae4c"
  }

sha256_testCase6 = SHA256TestVector
  { msg = "0123456789ABCDEF0123456789abcdef0123456789ABCDEF0123456789abcdef"
  , out = d "37e68bd16eb5be2f6d591cef9c099db166faf048122f736307fb92a1670ef552"
  }

testBitstrings :: [TestTree]
testBitstrings = [testCase "bitstrings-0" (out @?= "731590e201d1e0c020e78c6d8dbacf6e1e7ab8eae42de9e5dc370d96270f1c32")]
 where
  bitstring :: ByteString
  bitstring = hkdf (d "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f4041") "" "" 128
  myKey = hmacKey (d "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f40")
  sha256bits :: ByteString -> Word64 -> ByteString
  sha256bits x len = sha256_init &
                     sha256_finalizeBits_toByteString x len
  hmacbits :: ByteString -> Word64 -> ByteString
  hmacbits x len = hmacCtx_init myKey &
                   hmacCtx_finalizeBits_toByteString x len
  out = sha256_init &
        sha256_feeds [ sha256bits bitstring n | n <- [0..1024] ] &
        sha256_feeds [ hmacbits bitstring n  | n <- [0..1024] ] &
        sha256_finalize