packages feed

Z-Botan-0.1.1.0: test/Z/Crypto/HashSpec.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PatternSynonyms #-}

module Z.Crypto.HashSpec where

import           Control.Monad
import           Test.Hspec
import           Test.HUnit
import           Z.IO
import qualified Z.IO.FileSystem    as FS
import qualified Z.Data.Text        as T
import           Z.Crypto.Hash
import           Utils

spec :: Spec
spec = describe "Crypto.Hash" $ do
    forM_
        [ ("adler32.vec", "Adler32", Adler32)
        , ("blake2b.vec", "BLAKE2b(224)", BLAKE2b 224)
        , ("blake2b.vec", "BLAKE2b(256)", BLAKE2b 256)
        , ("blake2b.vec", "BLAKE2b(384)", BLAKE2b 384)
        , ("blake2b.vec", "BLAKE2b(512)", BLAKE2b 512)
        , ("comp4p.vec", "Comb4P(MD4,MD5)", Comb4P MD4 MD5)
        , ("crc24.vec", "CRC24", CRC24)
        , ("crc32.vec", "CRC32", CRC32)
        , ("keccak.vec", "Keccak-1600(224)", Keccak1600_224)
        , ("keccak.vec", "Keccak-1600(256)", Keccak1600_256)
        , ("keccak.vec", "Keccak-1600(384)", Keccak1600_384)
        , ("keccak.vec", "Keccak-1600(512)", Keccak1600_512)
        , ("md4.vec", "MD4", MD4)
        , ("md5.vec", "MD5", MD5)
        , ("parallel.vec", "Parallel(MD5,SHA-160)", Parallel MD5 SHA160)
        , ("parallel.vec", "Parallel(SHA-256,SHA-512)", Parallel SHA256 SHA512)
        , ("ripemd160.vec", "RIPEMD-160", RIPEMD160)
        , ("sha1.vec", "SHA-160", SHA160)
        , ("sha2_32.vec", "SHA-224", SHA224)
        , ("sha2_32.vec", "SHA-256", SHA256)
        , ("sha2_64.vec", "SHA-384", SHA384)
        , ("sha2_64.vec", "SHA-512", SHA512)
        , ("sha2_64.vec", "SHA-512-256", SHA512_256)
        , ("sha3.vec", "SHA-3(224)", SHA3_224)
        , ("sha3.vec", "SHA-3(256)", SHA3_256)
        , ("sha3.vec", "SHA-3(384)", SHA3_384)
        , ("sha3.vec", "SHA-3(512)", SHA3_512)
        , ("shake.vec", "SHAKE-128(128)", SHAKE128 128)
        , ("shake.vec", "SHAKE-256(256)", SHAKE256 256)
        , ("shake.vec", "SHAKE-128(1120)", SHAKE128 1120)
        , ("shake.vec", "SHAKE-256(2000)", SHAKE256 2000)
        , ("skein.vec", "Skein-512(224)", Skein512 224 "")
        , ("skein.vec", "Skein-512(256)", Skein512 256 "")
        , ("skein.vec", "Skein-512(384)", Skein512 384 "")
        , ("skein.vec", "Skein-512(512)", Skein512 512 "")
        , ("skein.vec", "Skein-512(512,Test)", Skein512 512 "Test")
        , ("streebog.vec", "Streebog-256", Streebog256)
        , ("streebog.vec", "Streebog-512", Streebog512)
        , ("sm3.vec", "SM3", SM3)
        , ("whirlpool.vec", "Whirlpool", Whirlpool)
        ] $ \ (file, algoName, hashType) ->
            it (T.unpack $ T.validate algoName) $ do
                tvMap <- parseHashTestVector =<< "./third_party/botan/src/tests/data/hash/" `FS.join` file
                tvs <- unwrap' "ENOTFOUND" "no algo found" $ lookup algoName tvMap
                forM_ tvs $ \ (i, o) -> hash hashType i @?= o