packages feed

botan-low-0.0.1.0: test/Botan/Low/PubKey/KeyAgreementSpec.hs

module Main where

import Test.Prelude

import Botan.Low.PubKey
import Botan.Low.PubKey.KeyAgreement
import Botan.Low.RNG

-- TODO: More thorough test with different KDFs and curves / groups
pks :: [(ByteString, ByteString)]
pks =
    [ ("DH", "modp/ietf/1024")
    , ("ECDH", "secp256r1")
    , ("Curve25519", "")
    ]

pkTestName :: (ByteString, ByteString) -> String
pkTestName (pk, param) = chars $ pk <> " " <> param

main :: IO ()
main = hspec $ testSuite pks pkTestName $ \ (pk, param) -> do
    it "keyAgreementCreate" $ do
        rng <- rngInit "system"
        privKey <- privKeyCreate pk param rng
        ka <- keyAgreementCreate privKey "HKDF(SHA-256)"
        pass
    it "keyAgreementExportPublic" $ do
        rng <- rngInit "system"
        privKey <- privKeyCreate pk param rng
        ka <- keyAgreementCreate privKey "HKDF(SHA-256)"
        pubKey <- keyAgreementExportPublic privKey
        pass
    it "keyAgreementSize" $ do
        rng <- rngInit "system"
        privKey <- privKeyCreate pk param rng
        ka <- keyAgreementCreate privKey "HKDF(SHA-256)"
        kaSz <- keyAgreementSize ka
        pass
    it "keyAgreement" $ do
        rng <- rngInit "system"
        privKeyA <- privKeyCreate pk param rng
        pubKeyA <- keyAgreementExportPublic privKeyA
        privKeyB <- privKeyCreate pk param rng
        pubKeyB <- keyAgreementExportPublic privKeyB
        kaA <- keyAgreementCreate privKeyA "HKDF(SHA-256)"
        kaB <- keyAgreementCreate privKeyB "HKDF(SHA-256)"
        sharedKeyA <- keyAgreement kaA pubKeyB "salt"
        sharedKeyB <- keyAgreement kaB pubKeyA "salt"
        sharedKeyA `shouldBe` sharedKeyB
        pass