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