botan-low-0.1.0.0: test/Test/Botan/Low/PubKey/KeyEncapsulation.hs
{-# LANGUAGE OverloadedStrings #-}
module Test.Botan.Low.PubKey.KeyEncapsulation (tests) where
import Botan.Low.PubKey
import Botan.Low.PubKey.KeyEncapsulation
import Botan.Low.RNG
import Data.ByteString
import Test.Hspec
import Test.Tasty
import Test.Tasty.Hspec
import Test.Util.ByteString
import Test.Util.Hspec
tests :: IO TestTree
tests = do
specs <- testSpec "spec_keyEncapsulation" spec_keyEncapsulation
pure $ testGroup "Test.Botan.Low.PubKey.KeyEncapsulation" [
specs
]
pks :: [(ByteString, ByteString, ByteString)]
pks =
[ ( "RSA", "2048", "HKDF(SHA-256)")
, ( "Kyber", "", "HKDF(SHA-256)")
, ( "McEliece", "", "HKDF(SHA-256)")
]
pkTestName :: (ByteString, ByteString, ByteString) -> String
pkTestName (pk, param, kdf) = chars $ pk <> " " <> param <> " " <> kdf
spec_keyEncapsulation :: Spec
spec_keyEncapsulation = testSuite pks pkTestName $ \ (pk, param, _kdf) -> do
it "kemEncryptCreate" $ do
rng <- rngInit "system"
privKey <- privKeyCreate pk param rng
pubKey <- privKeyExportPubKey privKey
_kem <- kemEncryptCreate pubKey "HKDF(SHA-256)"
pass
it "kemEncryptSharedKeyLength" $ do
rng <- rngInit "system"
privKey <- privKeyCreate pk param rng
pubKey <- privKeyExportPubKey privKey
kem <- kemEncryptCreate pubKey "HKDF(SHA-256)"
_sharedKeyLength <- kemEncryptSharedKeyLength kem 256
pass
it "kemEncryptEncapsulatedKeyLength" $ do
rng <- rngInit "system"
privKey <- privKeyCreate pk param rng
pubKey <- privKeyExportPubKey privKey
kem <- kemEncryptCreate pubKey "HKDF(SHA-256)"
_encapsulatedKeyLength <- kemEncryptEncapsulatedKeyLength kem
pass
it "kemEncryptCreateSharedKey" $ do
rng <- rngInit "system"
privKey <- privKeyCreate pk param rng
pubKey <- privKeyExportPubKey privKey
kem <- kemEncryptCreate pubKey "HKDF(SHA-256)"
(_sharedKey, _encapsulatedKey) <- kemEncryptCreateSharedKey kem rng "salt" 256
pass
it "kemDecryptCreate" $ do
rng <- rngInit "system"
privKey <- privKeyCreate pk param rng
_kem <- kemDecryptCreate privKey "HKDF(SHA-256)"
pass
it "kemDecryptSharedKeyLength" $ do
rng <- rngInit "system"
privKey <- privKeyCreate pk param rng
kem <- kemDecryptCreate privKey "HKDF(SHA-256)"
_sharedKeyLen <- kemDecryptSharedKeyLength kem 256
pass
it "kemDecryptSharedKey" $ do
rng <- rngInit "system"
privKey <- privKeyCreate pk param rng
pubKey <- privKeyExportPubKey privKey
encryptCtx <- kemEncryptCreate pubKey "HKDF(SHA-256)"
(sharedKey, encapsulatedKey) <- kemEncryptCreateSharedKey encryptCtx rng "salt" 256
decryptCtx <- kemDecryptCreate privKey "HKDF(SHA-256)"
decryptedSharedKey <- kemDecryptSharedKey decryptCtx "salt" encapsulatedKey 256
sharedKey `shouldBe` decryptedSharedKey
pass