packages feed

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

module Main where

import Test.Prelude

import Botan.Low.MPI
import Botan.Low.RNG
import Botan.Low.PubKey
import Botan.Low.PubKey.ECDSA

-- TODO: Consolidate
ecGroups :: [ByteString]
ecGroups =
    [ "secp160k1"
    ,  "secp160r1"
    ,  "secp160r2"
    ,  "secp192k1"
    ,  "secp192r1"
    ,  "secp224k1"
    ,  "secp224r1"
    ,  "secp256k1"
    ,  "secp256r1"
    ,  "secp384r1"
    ,  "secp521r1"
    ,  "brainpool160r1"
    ,  "brainpool192r1"
    ,  "brainpool224r1"
    ,  "brainpool256r1"
    ,  "brainpool320r1"
    ,  "brainpool384r1"
    ,  "brainpool512r1"
    ,  "x962_p192v2"
    ,  "x962_p192v3"
    ,  "x962_p239v1"
    ,  "x962_p239v2"
    ,  "x962_p239v3"
    ,  "gost_256A"
    ,  "gost_512A"
    ,  "frp256v1"
    ,  "sm2p256v1"
    ]

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

-- TODO: Don't assume just "ECDSA", other elliptic curve DSA might be valid here
main :: IO ()
main = hspec $ testSuite ecGroups chars $ \ ecGroup -> do
    it "privKeyLoadECDSA" $ do
        rng <- rngInit "system"
        privKey <- privKeyCreate "ECDSA" ecGroup rng
        x <- privKeyField privKey "x"
        loadedPrivKey <- privKeyLoadECDSA x ecGroup
        pass
    it "pubKeyLoadECDSA" $ do
        rng <- rngInit "system"
        privKey <- privKeyCreate "ECDSA" ecGroup rng
        pubKey <- privKeyExportPubKey privKey
        public_x <- pubKeyField pubKey "public_x"
        public_y <- pubKeyField pubKey "public_y"
        loadedPubKey <- pubKeyLoadECDSA public_x public_y ecGroup
        pass