packages feed

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

{-# LANGUAGE OverloadedStrings #-}

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

import           Botan.Low.MPI
import           Botan.Low.PubKey
import           Botan.Low.PubKey.ECDSA
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_ecdsa" spec_ecdsa
    pure $ testGroup "Test.Botan.Low.PubKey.ECDSA" [
        specs
      ]

-- 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
spec_ecdsa :: Spec
spec_ecdsa = 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