A start at DSA test case generation.
This commit is contained in:
92
test-generator/DSA.hs
Normal file
92
test-generator/DSA.hs
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
{-# LANGUAGE PackageImports #-}
|
||||||
|
module DSA(dsaTasks)
|
||||||
|
where
|
||||||
|
|
||||||
|
import Codec.Crypto.DSA.Pure
|
||||||
|
import Crypto.Hash(Digest, SHA256, hash)
|
||||||
|
import "cryptonite" Crypto.Random(SystemDRG,DRG(..),getRandomBytes,withDRG)
|
||||||
|
import "crypto-api" Crypto.Random(CryptoRandomGen(..))
|
||||||
|
import Data.ByteArray(convert)
|
||||||
|
import qualified Data.ByteString as BS
|
||||||
|
import Data.ByteString.Lazy(ByteString)
|
||||||
|
import qualified Data.ByteString.Lazy as BSL
|
||||||
|
import qualified Data.Map.Strict as Map
|
||||||
|
import Math(showX,showBin)
|
||||||
|
import Task(Task(..),Test)
|
||||||
|
import Utils(HashAlg(..),generateHash,showHash)
|
||||||
|
|
||||||
|
import Debug.Trace
|
||||||
|
|
||||||
|
instance CryptoRandomGen SystemDRG where
|
||||||
|
newGen _ = undefined
|
||||||
|
genSeedLength = undefined
|
||||||
|
genBytes l g = Right (randomBytesGenerate l g)
|
||||||
|
reseedInfo = undefined
|
||||||
|
reseedPeriod = undefined
|
||||||
|
genBytesWithEntropy l _ g = Right (randomBytesGenerate l g)
|
||||||
|
reseed = undefined
|
||||||
|
newGenIO = undefined
|
||||||
|
|
||||||
|
dsaSizes :: [(ParameterSizes, Int)]
|
||||||
|
dsaSizes = [(L1024_N160, 400),
|
||||||
|
(L2048_N224, 100),
|
||||||
|
(L2048_N256, 50),
|
||||||
|
(L3072_N256, 25)]
|
||||||
|
|
||||||
|
dsaTasks :: [Task]
|
||||||
|
dsaTasks = concatMap generateTask dsaSizes
|
||||||
|
|
||||||
|
generateTask :: (ParameterSizes, Int) -> [Task]
|
||||||
|
generateTask (s, c) = [signTest s c]
|
||||||
|
|
||||||
|
signTest :: ParameterSizes -> Int -> Task
|
||||||
|
signTest sz cnt = Task {
|
||||||
|
taskName = "DSA " ++ show sz ++ " signing",
|
||||||
|
taskFile = "../testdata/dsa/sign" ++ show sz ++ ".test",
|
||||||
|
taskTest = go,
|
||||||
|
taskCount = cnt
|
||||||
|
}
|
||||||
|
where
|
||||||
|
go :: Test
|
||||||
|
go (memory, drg0) =
|
||||||
|
case generateProvablePrimes sz drg0 sha256 Nothing of
|
||||||
|
Left _ -> trace "generate primes" $ goAdvance memory drg0
|
||||||
|
Right (p, q, _, drg1) -> trace "got primes" $
|
||||||
|
case generateUnverifiableGenerator p q of
|
||||||
|
Nothing -> trace "generate g" $ goAdvance memory drg1
|
||||||
|
Just g -> trace "got g" $
|
||||||
|
let params = Params p g q
|
||||||
|
in case generateKeyPairWithParams params drg1 of
|
||||||
|
Left _ -> trace "generate key" $ goAdvance memory drg1
|
||||||
|
Right (pub, priv, drg2) -> trace "got keys" $
|
||||||
|
let (msg, drg3) = withDRG drg2 $ getRandomBytes =<< ((fromIntegral . BS.head) `fmap` getRandomBytes 1)
|
||||||
|
(hashf, drg4) = withDRG drg3 generateHash
|
||||||
|
in case signMessage' (translateHash hashf) kViaRFC6979 drg4 priv (BSL.fromStrict msg) of
|
||||||
|
Left _ ->
|
||||||
|
trace "sign failure" $ go (memory, drg4)
|
||||||
|
Right (sig, drg5) -> trace "output!" $
|
||||||
|
let res = Map.fromList [("p", showX p),
|
||||||
|
("q", showX q),
|
||||||
|
("g", showX g),
|
||||||
|
("y", showX (public_y pub)),
|
||||||
|
("x", showX (private_x priv)),
|
||||||
|
("m", showBin msg),
|
||||||
|
("h", showHash hashf),
|
||||||
|
("r", showX (sign_r sig)),
|
||||||
|
("s", showX (sign_s sig))]
|
||||||
|
in (res, p, (memory, drg5))
|
||||||
|
--
|
||||||
|
goAdvance memory drg0 =
|
||||||
|
let (bstr, drg1) = randomBytesGenerate 37 drg0
|
||||||
|
in BS.null bstr `seq` go (memory, drg1)
|
||||||
|
--
|
||||||
|
translateHash Sha224 = Codec.Crypto.DSA.Pure.SHA224
|
||||||
|
translateHash Sha256 = Codec.Crypto.DSA.Pure.SHA256
|
||||||
|
translateHash Sha384 = Codec.Crypto.DSA.Pure.SHA384
|
||||||
|
translateHash Sha512 = Codec.Crypto.DSA.Pure.SHA512
|
||||||
|
|
||||||
|
sha256 :: ByteString -> ByteString
|
||||||
|
sha256 = BSL.fromStrict . convert' . hash . BSL.toStrict
|
||||||
|
where
|
||||||
|
convert' :: Digest SHA256 -> BS.ByteString
|
||||||
|
convert' = convert
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
{-# LANGUAGE PackageImports #-}
|
||||||
module Database(
|
module Database(
|
||||||
Database,
|
Database,
|
||||||
emptyDatabase,
|
emptyDatabase,
|
||||||
@@ -5,7 +6,7 @@ module Database(
|
|||||||
)
|
)
|
||||||
where
|
where
|
||||||
|
|
||||||
import Crypto.Random(DRG(..),SystemDRG)
|
import "cryptonite" Crypto.Random(DRG(..),SystemDRG)
|
||||||
import Data.Bits(shiftL,testBit)
|
import Data.Bits(shiftL,testBit)
|
||||||
import qualified Data.ByteString as S
|
import qualified Data.ByteString as S
|
||||||
import Data.Map.Strict(Map)
|
import Data.Map.Strict(Map)
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
{-# LANGUAGE PackageImports #-}
|
||||||
module ECDSATesting(
|
module ECDSATesting(
|
||||||
ecdsaTasks
|
ecdsaTasks
|
||||||
)
|
)
|
||||||
@@ -9,7 +10,7 @@ import Crypto.PubKey.ECC.ECDSA(PrivateKey(..),PublicKey(..),Signature(..),signWi
|
|||||||
import Crypto.PubKey.ECC.Generate(generate)
|
import Crypto.PubKey.ECC.Generate(generate)
|
||||||
import Crypto.PubKey.ECC.Prim(scalarGenerate,pointAdd,pointNegate,pointDouble,pointBaseMul,pointMul,pointAddTwoMuls)
|
import Crypto.PubKey.ECC.Prim(scalarGenerate,pointAdd,pointNegate,pointDouble,pointBaseMul,pointMul,pointAddTwoMuls)
|
||||||
import Crypto.PubKey.ECC.Types(Curve,CurveName(..),Point(..),common_curve,curveSizeBits,ecc_n,getCurveByName)
|
import Crypto.PubKey.ECC.Types(Curve,CurveName(..),Point(..),common_curve,curveSizeBits,ecc_n,getCurveByName)
|
||||||
import Crypto.Random(DRG(..),getRandomBytes,withDRG)
|
import "cryptonite" Crypto.Random(DRG(..),getRandomBytes,withDRG)
|
||||||
import qualified Data.ByteString as S
|
import qualified Data.ByteString as S
|
||||||
import qualified Data.Map.Strict as Map
|
import qualified Data.Map.Strict as Map
|
||||||
import Math(showX,showBin)
|
import Math(showX,showBin)
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
{-# LANGUAGE LambdaCase #-}
|
{-# LANGUAGE LambdaCase #-}
|
||||||
|
{-# LANGUAGE PackageImports #-}
|
||||||
import Control.Concurrent(forkIO)
|
import Control.Concurrent(forkIO)
|
||||||
import Control.Concurrent.Chan(Chan,newChan,readChan,writeChan)
|
import Control.Concurrent.Chan(Chan,newChan,readChan,writeChan)
|
||||||
import Control.Concurrent.MVar(MVar,newMVar,modifyMVar)
|
import Control.Concurrent.MVar(MVar,newMVar,modifyMVar)
|
||||||
import Control.Exception(SomeException,catch)
|
import Control.Exception(SomeException,catch)
|
||||||
import Control.Monad(replicateM_,void)
|
import Control.Monad(replicateM_,void)
|
||||||
import Crypto.Random(SystemDRG,getSystemDRG)
|
import "cryptonite" Crypto.Random(SystemDRG,getSystemDRG)
|
||||||
|
import DSA(dsaTasks)
|
||||||
import ECDSATesting(ecdsaTasks)
|
import ECDSATesting(ecdsaTasks)
|
||||||
import GHC.Conc(getNumCapabilities)
|
import GHC.Conc(getNumCapabilities)
|
||||||
import RFC6979(rfcTasks)
|
import RFC6979(rfcTasks)
|
||||||
@@ -36,6 +38,6 @@ main = displayConsoleRegions $
|
|||||||
do
|
do
|
||||||
executors <- getNumCapabilities
|
executors <- getNumCapabilities
|
||||||
done <- newChan
|
done <- newChan
|
||||||
tasks <- newMVar (ecdsaTasks ++ rfcTasks ++ rsaTasks)
|
tasks <- newMVar (dsaTasks ++ ecdsaTasks ++ rfcTasks ++ rsaTasks)
|
||||||
replicateM_ executors (spawnExecutor tasks done)
|
replicateM_ executors (spawnExecutor tasks done)
|
||||||
replicateM_ executors (void $ readChan done)
|
replicateM_ executors (void $ readChan done)
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
{-# LANGUAGE PackageImports #-}
|
||||||
module RFC6979
|
module RFC6979
|
||||||
-- (
|
-- (
|
||||||
-- rfcTasks
|
-- rfcTasks
|
||||||
@@ -7,7 +8,7 @@ module RFC6979
|
|||||||
import Crypto.Hash(SHA224(..),SHA256(..),SHA384(..),SHA512(..))
|
import Crypto.Hash(SHA224(..),SHA256(..),SHA384(..),SHA512(..))
|
||||||
import Crypto.MAC.HMAC(HMAC,hmac)
|
import Crypto.MAC.HMAC(HMAC,hmac)
|
||||||
import Crypto.Number.Generate(generateBetween)
|
import Crypto.Number.Generate(generateBetween)
|
||||||
import Crypto.Random(getRandomBytes,withDRG)
|
import "cryptonite" Crypto.Random(getRandomBytes,withDRG)
|
||||||
import Data.Bits(shiftL,shiftR,(.&.))
|
import Data.Bits(shiftL,shiftR,(.&.))
|
||||||
import qualified Data.ByteArray as B
|
import qualified Data.ByteArray as B
|
||||||
import qualified Data.ByteString as S
|
import qualified Data.ByteString as S
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
|
{-# LANGUAGE PackageImports #-}
|
||||||
module RSA(rsaTasks)
|
module RSA(rsaTasks)
|
||||||
where
|
where
|
||||||
|
|
||||||
import Crypto.Hash(SHA224(..),SHA256(..),SHA384(..),SHA512(..))
|
import Crypto.Hash(SHA224(..),SHA256(..),SHA384(..),SHA512(..))
|
||||||
import Crypto.Random
|
import "cryptonite" Crypto.Random
|
||||||
import Crypto.PubKey.MaskGenFunction(mgf1)
|
import Crypto.PubKey.MaskGenFunction(mgf1)
|
||||||
import Crypto.PubKey.RSA
|
import Crypto.PubKey.RSA
|
||||||
import Crypto.PubKey.RSA.PKCS15(sign)
|
import Crypto.PubKey.RSA.PKCS15(sign)
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
{-# LANGUAGE PackageImports #-}
|
||||||
module Task(
|
module Task(
|
||||||
Test,
|
Test,
|
||||||
Task(..),
|
Task(..),
|
||||||
@@ -6,7 +7,7 @@ module Task(
|
|||||||
where
|
where
|
||||||
|
|
||||||
import Control.Monad(foldM, forM_)
|
import Control.Monad(foldM, forM_)
|
||||||
import Crypto.Random(SystemDRG)
|
import "cryptonite" Crypto.Random(SystemDRG)
|
||||||
import qualified Data.Map.Strict as Map
|
import qualified Data.Map.Strict as Map
|
||||||
import Database
|
import Database
|
||||||
import System.Console.AsciiProgress
|
import System.Console.AsciiProgress
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
|
{-# LANGUAGE PackageImports #-}
|
||||||
module Utils(HashAlg(..), generateHash, runHash, showHash)
|
module Utils(HashAlg(..), generateHash, runHash, showHash)
|
||||||
where
|
where
|
||||||
|
|
||||||
import Crypto.Hash(Digest,SHA224(..),SHA256(..),SHA384(..),SHA512(..),hash)
|
import Crypto.Hash(Digest,SHA224(..),SHA256(..),SHA384(..),SHA512(..),hash)
|
||||||
import Crypto.Number.Generate(generateBetween)
|
import Crypto.Number.Generate(generateBetween)
|
||||||
import Crypto.Random(MonadRandom)
|
import "cryptonite" Crypto.Random(MonadRandom)
|
||||||
import qualified Data.ByteArray as B
|
import qualified Data.ByteArray as B
|
||||||
import qualified Data.ByteString as S
|
import qualified Data.ByteString as S
|
||||||
import Math(showX)
|
import Math(showX)
|
||||||
|
|||||||
@@ -20,9 +20,9 @@ extra-source-files: CHANGELOG.md
|
|||||||
|
|
||||||
executable gen-tests
|
executable gen-tests
|
||||||
main-is: Main.hs
|
main-is: Main.hs
|
||||||
other-modules: Database, ECDSATesting, Math, RFC6979, RSA, Task, Utils
|
other-modules: Database, DSA, ECDSATesting, Math, RFC6979, RSA, Task, Utils
|
||||||
-- other-extensions:
|
-- other-extensions:
|
||||||
build-depends: base >=4.11 && < 4.14, ascii-progress, bytestring, containers, cryptonite, directory, filepath, integer-gmp, memory, random
|
build-depends: base >=4.11 && < 4.14, ascii-progress, bytestring, containers, crypto-api, cryptonite, directory, DSA, filepath, integer-gmp, memory, random
|
||||||
hs-source-dirs: .
|
hs-source-dirs: .
|
||||||
default-language: Haskell2010
|
default-language: Haskell2010
|
||||||
ghc-options: -Wall -O2 -threaded -rtsopts -with-rtsopts=-N
|
ghc-options: -Wall -O2 -threaded -rtsopts -with-rtsopts=-N
|
||||||
|
|||||||
Reference in New Issue
Block a user