packages feed

botan-low-0.0.2.0: test/Botan/Low/PubKey/DSASpec.hs

module Main where

import Test.Prelude

import Botan.Low.MPI
import Botan.Low.RNG
import Botan.Low.PubKey
import Botan.Low.PubKey.DSA

-- 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

-- TODO: Consolidate
pubKeyField :: PubKey -> ByteString -> IO MP
pubKeyField pubKey field = do
    mp <- mpInit
    pubKeyGetField mp pubKey field
    return mp

-- NOTE: Fields are
--  DLGroup PubKey: p, q, g, y
--  DLGroup PrivKey: p, q, g, x, y

-- NOTE: Fails on pubKeyLoadDSA for srp curves (but not privKeyLoadDSA?)
main :: IO ()
main = hspec $ testSuite dlGroups chars $ \ dlGroup -> do
    it "privKeyLoadDSA" $ 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 <- privKeyLoadDSA p q g x
        pass
    it "pubKeyLoadDSA" $ do
        rng <- rngInit "system"
        privKey <- privKeyCreate "DH" dlGroup rng
        pubKey <- privKeyExportPubKey privKey
        p <- pubKeyField pubKey "p"
        q <- pubKeyField pubKey "q"
        g <- pubKeyField pubKey "g"
        y <- pubKeyField pubKey "y"
        loadedKey <- pubKeyLoadDSA p q g y
        pass