nettle-0.4: src/Tests/MAC.hs
{-# LANGUAGE OverloadedStrings #-}
import qualified Data.ByteString as B
import Crypto.Nettle.CMAC
import Crypto.Nettle.KeyedHash
import Crypto.Nettle.Poly1305
import TestUtils
assertKeyedHash
:: KeyedHashAlgorithm k
=> (B.ByteString, B.ByteString, String) -> Tagged k Assertion
assertKeyedHash (key, msg, tag) = do
t' <- keyedHash key msg
return $ assertEqualHex "" (hs tag) t'
testCMAC :: KeyedHashAlgorithm k => Tagged k Test
testCMAC = do
name <- implKeyedHashName
results <- mapM assertKeyedHash (cmacTestVectors name)
return $ testCases ("testing CMAC " ++ name) results
cmacTestVectors
:: String -> [(B.ByteString, B.ByteString, String)]
cmacTestVectors "CMAC-AES128" =
-- source: NIST SP 800-38B test vectors
[
( hs "2b7e151628aed2a6abf7158809cf4f3c"
, ""
, "bb1d6929e95937287fa37d129b756746"
)
,
( hs "2b7e151628aed2a6abf7158809cf4f3c"
, hs "6bc1bee22e409f96e93d7e117393172a"
, "070a16b46b4d4144f79bdd9dd04a287c"
)
,
( hs "2b7e151628aed2a6abf7158809cf4f3c"
, hs
"6bc1bee22e409f96e93d7e117393172a ae2d8a571e03ac9c9eb76fac45af8e51 30c81c46a35ce411"
, "dfa66747de9ae63030ca32611497c827"
)
]
cmacTestVectors "CMAC-AES256" =
-- source: NIST SP 800-38B test vectors
[
( hs
"603deb1015ca71be2b73aef0857d7781 1f352c073b6108d72d9810a30914dff4"
, ""
, "028962f61b7bf89efc6b551f4667d983"
)
,
( hs
"603deb1015ca71be2b73aef0857d7781 1f352c073b6108d72d9810a30914dff4"
, hs "6bc1bee22e409f96e93d7e117393172a"
, "28a7023f452e8f82bd4bf28d8c37c35c"
)
]
cmacTestVectors "CMAC-DES3" =
-- source: nettle tests
[
( hs "0123456789abcdeffedcba9876543210 0123456789abcdef"
, hs "6bc1bee22e409f96e93d7e117393172a"
, "b45081a29a5df4d0"
)
]
cmacTestVectors _ = []
assertPoly1305
:: (B.ByteString, B.ByteString, B.ByteString, String) -> Assertion
assertPoly1305 (key, nonce, msg, tag) =
assertEqualHex "" (hs tag) (poly1305AES key nonce msg)
testPoly1305 :: Test
testPoly1305 =
testCases
"testing Poly1305-AES"
-- source: D. J. Bernstein "The Poly1305-AES message-authentication code",
-- as used in the nettle test suite
[ assertPoly1305
( hs
"75deaa25c09f208e1dc4ce6b5cad3fbfa0f3080000f46400d0c7e9076c834403"
, hs "61ee09218d29b0aaed7e154a2c5509cc"
, hs ""
, "dd3fab2251f11ac759f0887129cc2ee7"
)
, assertPoly1305
( hs
"ec074c835580741701425b623235add6851fc40c3467ac0be05cc20404f3f700"
, hs "fb447350c4e868c52ac3275cf9d4327e"
, hs "f3f6"
, "f4c633c3044fc145f84f335cb81953de"
)
, assertPoly1305
( hs
"6acb5f61a7176dd320c5c1eb2edcdc74 48443d0bb0d21109c89a100b5ce2c208"
, hs "ae212a55399729595dea458bc621ff0e"
, hs
"663cea190ffb83d89593f3f476b6bc24 d7e679107ea26adb8caf6652d0656136"
, "0ee1c16bb73f0f4fd19881753c01cdbe"
)
, assertPoly1305
( hs
"e1a5668a4d5b66a5f68cc5424ed5982d 12976a08c4426d0ce8a82407c4f48207"
, hs "9ae831e743978d3a23527c7128149e3a"
, hs
"ab0812724a7f1e342742cbed374d94d1 36c6b8795d45b3819830f2c04491 faf0990c62e48b8018b2c3e4a0fa3134 cb67fa83e158c994d961c4cb21095c1bf9"
, "5154ad0d2cb26e01274fc51148491f1b"
)
]
main =
defaultMain
[ testCMAC `witness` (undefined :: CMAC_AES128)
, testCMAC `witness` (undefined :: CMAC_AES256)
, testCMAC `witness` (undefined :: CMAC_DES3)
, testPoly1305
]