packages feed

botan-low-0.1.0.0: test/Test/Botan/Low/PubKey/ElGamal.hs

{-# LANGUAGE OverloadedStrings #-}

module Test.Botan.Low.PubKey.ElGamal (tests) where

import           Botan.Low.MPI
import           Botan.Low.PubKey
import           Botan.Low.PubKey.ElGamal
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_elGamal" spec_elGamal
    pure $ testGroup "Test.Botan.Low.PubKey.ElGamal" [
        specs
      ]


-- TODO: Consolidate
dlGroups :: [ByteString]
dlGroups =
    [ "ffdhe/ietf/2048"
    , "ffdhe/ietf/3072"
    , "ffdhe/ietf/4096"
    , "ffdhe/ietf/6144"
    , "ffdhe/ietf/8192"
    , "modp/ietf/1024"
    , "modp/ietf/1536"
    , "modp/ietf/2048"
    , "modp/ietf/3072"
    , "modp/ietf/4096"
    , "modp/ietf/6144"
    , "modp/ietf/8192"
    , "modp/srp/1024"
    , "modp/srp/1536"
    , "modp/srp/2048"
    , "modp/srp/3072"
    , "modp/srp/4096"
    , "modp/srp/6144"
    , "modp/srp/8192"
    , "dsa/jce/1024"
    , "dsa/botan/2048"
    , "dsa/botan/3072"
    ]

-- TODO: Consolidate
privKeyField :: PrivKey -> ByteString -> IO MP
privKeyField privKey field = do
    mp <- mpInit
    privKeyGetField mp privKey field
    return mp

spec_elGamal :: Spec
spec_elGamal = testSuite dlGroups chars $ \ dlGroup -> do
    it "privKeyLoadELGamal" $ do
        rng <- rngInit "system"
        privKey <- privKeyCreate "DH" dlGroup rng
        p <- privKeyField privKey "p"
        _q <- privKeyField privKey "q"
        g <- privKeyField privKey "g"
        x <- privKeyField privKey "x"
        _loadedKey <- privKeyLoadElGamal p g x
        pass
    it "pubKeyLoadELGamal" $ do
        rng <- rngInit "system"
        privKey <- privKeyCreate "DH" dlGroup rng
        _pubKey <- privKeyExportPubKey privKey
        p <- privKeyField privKey "p"
        _q <- privKeyField privKey "q"
        g <- privKeyField privKey "g"
        y <- privKeyField privKey "y"
        _loadedKey <- pubKeyLoadElGamal p g y
        pass