packages feed

crypton-1.1.4: tests/KAT_HKDF.hs

{-# LANGUAGE OverloadedStrings #-}

module KAT_HKDF (tests) where

import Crypto.Hash (HashAlgorithm, SHA256 (..))
import qualified Crypto.KDF.HKDF as HKDF
import qualified Data.ByteString as B

import Imports

data KDFVector hash = KDFVector
    { kdfIKM :: ByteString
    , kdfSalt :: ByteString
    , kdfInfo :: ByteString
    , kdfResult :: ByteString
    }

sha256KDFVectors :: [KDFVector SHA256]
sha256KDFVectors =
    [ KDFVector
        "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
        ( B.pack
            [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c]
        )
        "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9"
        "\x3c\xb2\x5f\x25\xfa\xac\xd5\x7a\x90\x43\x4f\x64\xd0\x36\x2f\x2a\x2d\x2d\x0a\x90\xcf\x1a\x5a\x4c\x5d\xb0\x2d\x56\xec\xc4\xc5\xbf\x34\x00\x72\x08\xd5\xb8\x87\x18\x58\x65"
    , KDFVector
        ( B.pack
            [ 0x00
            , 0x01
            , 0x02
            , 0x03
            , 0x04
            , 0x05
            , 0x06
            , 0x07
            , 0x08
            , 0x09
            , 0x0a
            , 0x0b
            , 0x0c
            , 0x0d
            , 0x0e
            , 0x0f
            , 0x10
            , 0x11
            , 0x12
            , 0x13
            , 0x14
            , 0x15
            , 0x16
            , 0x17
            , 0x18
            , 0x19
            , 0x1a
            , 0x1b
            , 0x1c
            , 0x1d
            , 0x1e
            , 0x1f
            , 0x20
            , 0x21
            , 0x22
            , 0x23
            , 0x24
            , 0x25
            , 0x26
            , 0x27
            , 0x28
            , 0x29
            , 0x2a
            , 0x2b
            , 0x2c
            , 0x2d
            , 0x2e
            , 0x2f
            , 0x30
            , 0x31
            , 0x32
            , 0x33
            , 0x34
            , 0x35
            , 0x36
            , 0x37
            , 0x38
            , 0x39
            , 0x3a
            , 0x3b
            , 0x3c
            , 0x3d
            , 0x3e
            , 0x3f
            , 0x40
            , 0x41
            , 0x42
            , 0x43
            , 0x44
            , 0x45
            , 0x46
            , 0x47
            , 0x48
            , 0x49
            , 0x4a
            , 0x4b
            , 0x4c
            , 0x4d
            , 0x4e
            , 0x4f
            ]
        )
        ( B.pack
            [ 0x60
            , 0x61
            , 0x62
            , 0x63
            , 0x64
            , 0x65
            , 0x66
            , 0x67
            , 0x68
            , 0x69
            , 0x6a
            , 0x6b
            , 0x6c
            , 0x6d
            , 0x6e
            , 0x6f
            , 0x70
            , 0x71
            , 0x72
            , 0x73
            , 0x74
            , 0x75
            , 0x76
            , 0x77
            , 0x78
            , 0x79
            , 0x7a
            , 0x7b
            , 0x7c
            , 0x7d
            , 0x7e
            , 0x7f
            , 0x80
            , 0x81
            , 0x82
            , 0x83
            , 0x84
            , 0x85
            , 0x86
            , 0x87
            , 0x88
            , 0x89
            , 0x8a
            , 0x8b
            , 0x8c
            , 0x8d
            , 0x8e
            , 0x8f
            , 0x90
            , 0x91
            , 0x92
            , 0x93
            , 0x94
            , 0x95
            , 0x96
            , 0x97
            , 0x98
            , 0x99
            , 0x9a
            , 0x9b
            , 0x9c
            , 0x9d
            , 0x9e
            , 0x9f
            , 0xa0
            , 0xa1
            , 0xa2
            , 0xa3
            , 0xa4
            , 0xa5
            , 0xa6
            , 0xa7
            , 0xa8
            , 0xa9
            , 0xaa
            , 0xab
            , 0xac
            , 0xad
            , 0xae
            , 0xaf
            ]
        )
        ( B.pack
            [ 0xb0
            , 0xb1
            , 0xb2
            , 0xb3
            , 0xb4
            , 0xb5
            , 0xb6
            , 0xb7
            , 0xb8
            , 0xb9
            , 0xba
            , 0xbb
            , 0xbc
            , 0xbd
            , 0xbe
            , 0xbf
            , 0xc0
            , 0xc1
            , 0xc2
            , 0xc3
            , 0xc4
            , 0xc5
            , 0xc6
            , 0xc7
            , 0xc8
            , 0xc9
            , 0xca
            , 0xcb
            , 0xcc
            , 0xcd
            , 0xce
            , 0xcf
            , 0xd0
            , 0xd1
            , 0xd2
            , 0xd3
            , 0xd4
            , 0xd5
            , 0xd6
            , 0xd7
            , 0xd8
            , 0xd9
            , 0xda
            , 0xdb
            , 0xdc
            , 0xdd
            , 0xde
            , 0xdf
            , 0xe0
            , 0xe1
            , 0xe2
            , 0xe3
            , 0xe4
            , 0xe5
            , 0xe6
            , 0xe7
            , 0xe8
            , 0xe9
            , 0xea
            , 0xeb
            , 0xec
            , 0xed
            , 0xee
            , 0xef
            , 0xf0
            , 0xf1
            , 0xf2
            , 0xf3
            , 0xf4
            , 0xf5
            , 0xf6
            , 0xf7
            , 0xf8
            , 0xf9
            , 0xfa
            , 0xfb
            , 0xfc
            , 0xfd
            , 0xfe
            , 0xff
            ]
        )
        ( B.pack
            [ 0xb1
            , 0x1e
            , 0x39
            , 0x8d
            , 0xc8
            , 0x03
            , 0x27
            , 0xa1
            , 0xc8
            , 0xe7
            , 0xf7
            , 0x8c
            , 0x59
            , 0x6a
            , 0x49
            , 0x34
            , 0x4f
            , 0x01
            , 0x2e
            , 0xda
            , 0x2d
            , 0x4e
            , 0xfa
            , 0xd8
            , 0xa0
            , 0x50
            , 0xcc
            , 0x4c
            , 0x19
            , 0xaf
            , 0xa9
            , 0x7c
            , 0x59
            , 0x04
            , 0x5a
            , 0x99
            , 0xca
            , 0xc7
            , 0x82
            , 0x72
            , 0x71
            , 0xcb
            , 0x41
            , 0xc6
            , 0x5e
            , 0x59
            , 0x0e
            , 0x09
            , 0xda
            , 0x32
            , 0x75
            , 0x60
            , 0x0c
            , 0x2f
            , 0x09
            , 0xb8
            , 0x36
            , 0x77
            , 0x93
            , 0xa9
            , 0xac
            , 0xa3
            , 0xdb
            , 0x71
            , 0xcc
            , 0x30
            , 0xc5
            , 0x81
            , 0x79
            , 0xec
            , 0x3e
            , 0x87
            , 0xc1
            , 0x4c
            , 0x01
            , 0xd5
            , 0xc1
            , 0xf3
            , 0x43
            , 0x4f
            , 0x1d
            , 0x87
            ]
        )
    ]

kdfTests :: [TestTree]
kdfTests =
    [ testGroup "sha256" $ concatMap toKDFTest $ zip is sha256KDFVectors
    ]
  where
    toKDFTest (i, kdfVector) =
        [ testCase (show i) (t HKDF.extract kdfVector)
        ]

    t
        :: HashAlgorithm a
        => (ByteString -> ByteString -> HKDF.PRK a) -> KDFVector a -> Assertion
    t ext v =
        let prk = ext (kdfSalt v) (kdfIKM v)
         in kdfResult v @=? HKDF.expand prk (kdfInfo v) (B.length $ kdfResult v)

    is :: [Int]
    is = [1 ..]

tests =
    testGroup
        "HKDF"
        [ testGroup "KATs" kdfTests
        ]