packages feed

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