{-# LANGUAGE OverloadedStrings #-} module KAT_Argon2 (tests) where import Crypto.Error import qualified Crypto.KDF.Argon2 as Argon2 import qualified Data.ByteString as B import Imports data KDFVector = KDFVector { kdfPass :: ByteString , kdfSalt :: ByteString , kdfOptions :: Argon2.Options , kdfResult :: ByteString } argon2i_13 :: Argon2.TimeCost -> Argon2.MemoryCost -> Argon2.Options argon2i_13 iters memory = Argon2.Options { Argon2.iterations = iters , Argon2.memory = memory , Argon2.parallelism = 1 , Argon2.variant = Argon2.Argon2i , Argon2.version = Argon2.Version13 } vectors = [ KDFVector "password" "somesalt" (argon2i_13 2 65536) "\xc1\x62\x88\x32\x14\x7d\x97\x20\xc5\xbd\x1c\xfd\x61\x36\x70\x78\x72\x9f\x6d\xfb\x6f\x8f\xea\x9f\xf9\x81\x58\xe0\xd7\x81\x6e\xd0" ] kdfTests :: [TestTree] kdfTests = map toKDFTest $ zip is vectors where toKDFTest (i, v) = testCase (show i) (CryptoPassed (kdfResult v) @=? Argon2.hash (kdfOptions v) (kdfPass v) (kdfSalt v) (B.length $ kdfResult v)) is :: [Int] is = [1..] tests = testGroup "Argon2" [ testGroup "KATs" kdfTests ]