use the typeclass for the lowest IO impure C bindings definitions, and define the pure interface as generic on top of this. At the same time define an Hash.IO interface to allow mutable manipulations of hash contextes when necessary. Use HashAlgorithm instead of HashFunction in the [PubKey] sections Tweak the HMAC, PBKDF2 functions to be more efficient and use the new interface
46 lines
2.0 KiB
Haskell
46 lines
2.0 KiB
Haskell
{-# LANGUAGE OverloadedStrings #-}
|
|
{-# LANGUAGE ExistentialQuantification #-}
|
|
module KAT_AFIS (tests) where
|
|
|
|
import Imports
|
|
|
|
import Crypto.Hash
|
|
import Crypto.Random
|
|
import qualified Crypto.Data.AFIS as AFIS
|
|
import qualified Data.ByteString as B
|
|
|
|
mergeVec :: [ (Int, SHA1, B.ByteString, B.ByteString) ]
|
|
mergeVec =
|
|
[ (3
|
|
, SHA1
|
|
, "\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02"
|
|
, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\xd4\x76\xc8\x58\xbd\xf0\x15\xbe\x9f\x40\xe3\x65\x20\x1c\x9c\xb8\xd8\x1c\x16\x64"
|
|
)
|
|
, (3
|
|
, SHA1
|
|
, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17"
|
|
, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\xd6\x75\xc8\x59\xbb\xf7\x11\xbb\x95\x4b\xeb\x6c\x2e\x13\x90\xb5\xca\x0f\x06\x75\x17\x70\x39\x28"
|
|
)
|
|
]
|
|
|
|
mergeKATs = map toProp $ zip mergeVec [(0 :: Int)..]
|
|
where toProp ((nbExpands, hashAlg, expected, dat), i) =
|
|
testCase ("merge " ++ show i) (expected @=? AFIS.merge hashAlg nbExpands dat)
|
|
|
|
data AFISParams = AFISParams B.ByteString Int SHA1 ChaChaDRG
|
|
|
|
instance Show AFISParams where
|
|
show (AFISParams dat expand _ _) = "data: " ++ show dat ++ " expanded: " ++ show expand
|
|
|
|
instance Arbitrary AFISParams where
|
|
arbitrary = AFISParams <$> arbitraryBS <*> choose (2,2) <*> elements [SHA1] <*> arbitrary
|
|
where arbitraryBS = choose (3,46) >>= \sz -> B.pack <$> replicateM sz arbitrary
|
|
|
|
instance Arbitrary ChaChaDRG where
|
|
arbitrary = drgNewTest <$> arbitrary
|
|
|
|
tests = testGroup "AFIS"
|
|
[ testGroup "KAT merge" mergeKATs
|
|
, testProperty "merge.split == id" $ \(AFISParams bs e hf rng) -> bs == (AFIS.merge hf e $ fst (AFIS.split hf rng e bs))
|
|
]
|