Support signed multiplication and division, for ECDSA.

This commit is contained in:
2018-12-23 20:24:20 -08:00
parent b52dd4d355
commit 6c40ee5109
113 changed files with 399012 additions and 10 deletions

View File

@@ -99,6 +99,8 @@ main = do
SignedCmp -> hPutStrLn hndl ("cmp_impls!(I" ++ show size ++ ");")
SignedShift -> hPutStrLn hndl ("shift_impls!(I" ++ show size ++ ", U" ++ show size ++ ");")
SignedSub -> hPutStrLn hndl ("subtraction_impls!(I" ++ show size ++ ", I" ++ show (size + 64) ++ ", U" ++ show (size + 64) ++ ");")
SignedMul -> hPutStrLn hndl ("mul_impls!(I" ++ show size ++ ", I" ++ show (size * 2) ++ ");")
SignedDiv -> hPutStrLn hndl ("div_impls!(I" ++ show size ++ ", U" ++ show size ++ ");")
EGCD -> hPutStrLn hndl ("egcd_impls!(I" ++ show (size + 64) ++ ", U" ++ show size ++ ", I" ++ show size ++ ");")
ModInv -> hPutStrLn hndl ("modinv_impls!(U" ++ show size ++ ", I" ++ show (size + 64) ++ ", U" ++ show (size + 64) ++ ");")
SigConvert v -> hPutStrLn hndl ("conversion_impls!(I" ++ show size ++ ", U" ++ show size ++ ", I" ++ show v ++ ", U" ++ show v ++ ");")
@@ -111,6 +113,8 @@ main = do
generateSigTestBlock hndl "signed" SignedBase True 90000 [] []
generateSigTestBlock hndl "sigconversion" SignedBase False 90000 [] []
generateSigTestBlock hndl "sigcmp" SignedCmp True 90000 [] []
generateSigTestBlock hndl "sigmul" SignedMul True 9000 [(* 2)] [(* 2)]
generateSigTestBlock hndl "sigdiv" SignedDiv True 2049 [] []
generateSigTestBlock hndl "sigshiftl" SignedShift True 16384 [] []
generateSigTestBlock hndl "sigshiftr" SignedShift True 16384 [] []
generateSigTestBlock hndl "egcd" EGCD True 1024 [(+ 64)] [(+ 64)]

View File

@@ -24,6 +24,8 @@ data Operation = Add
| SignedCmp
| SignedShift
| SignedSub
| SignedMul
| SignedDiv
| SigConvert Int
| SquareRoot
| EGCD
@@ -31,6 +33,7 @@ data Operation = Add
| PrimeGen
| RSA
| DSA
| ECDSA
deriving (Eq, Ord, Show)
data Requirement = Req Int Operation
@@ -49,7 +52,24 @@ needs = [ Need RSA (\ size -> [Req (size `div` 2) Sub,
, Need DSA (\ size -> [Req size BaseOps,
Req size Shifts,
Req size Add,
Req size SquareRoot])
Req size SquareRoot,
Req size PrimeGen,
Req size ModInv,
Req size Mul,
Req (size * 2) Add,
Req (((size * 2) + 64) * 2) Div,
Req size (Convert 512),
Req size (Convert (size + 128)),
Req size (Convert ((size * 2) + 64)),
Req size (Convert (((size * 2) + 64) * 2))
])
, Need ECDSA (\ size -> [Req size SignedSub,
Req (size + 64) SignedMul,
Req ((size + 64) * 2) SignedSub,
Req ((size + 64) * 2) SignedDiv,
Req size (Convert ((size + 64) * 2)),
Req size (SigConvert ((size + 64) * 2))
])
, Need PrimeGen (\ size -> [Req size Div,
Req size Shifts,
Req size ModExp,
@@ -131,9 +151,16 @@ needs = [ Need RSA (\ size -> [Req (size `div` 2) Sub,
Req (size + 64) BaseOps,
Req size Add,
Req size Sub,
Req (size + 64) Sub,
Req size (Convert (size + 64)),
Req size (SigConvert (size + 64))
])
, Need SignedMul (\ size -> [Req size Mul,
Req (size * 2) SignedBase,
Req size (SigConvert (size * 2))
])
, Need SignedDiv (\ size -> [Req size Div
])
, Need EGCD (\ size -> [Req size SignedBase,
Req size BaseOps,
Req (size + 64) SignedBase,
@@ -170,10 +197,15 @@ rsaSizes = [512,1024,2048,3072,4096,8192,15360]
dsaSizes :: [Int]
dsaSizes = [192,256,1024,2048,3072]
ecdsaSizes :: [Int]
ecdsaSizes = [192,256,384,576]
baseRequirements :: [Requirement]
baseRequirements = concatMap (\ x -> [Req x RSA]) rsaSizes
++ concatMap (\ x -> [Req x DSA]) dsaSizes
++ concatMap (\ x -> [Req x ECDSA]) ecdsaSizes
++ [Req 192 (Convert 1024), Req 256 (Convert 2048), Req 256 (Convert 3072)] -- used in DSA
++ [Req 384 (Convert 1024), Req 512 (Convert 2048), Req 512 (Convert 3072)] -- used in DSA
++ [Req 192 Add, Req 256 Add, Req 384 Add] -- used for testing
++ [Req 192 Mul, Req 384 Mul] -- used for testing
++ [Req 448 (Convert 512)] -- used for testing
@@ -181,17 +213,20 @@ baseRequirements = concatMap (\ x -> [Req x RSA]) rsaSizes
requirements :: [Requirement]
requirements = go baseRequirements
where
step ls = let news = concatMap newRequirements ls
destBits = concatMap destRequirements (news ++ ls)
in ls ++ news ++ destBits
step ls = let news = concatMap newRequirements ls
ls' = concatMap sanitizeConverts (news ++ ls)
ls'' = removeDups (sort ls')
in ls''
--
go ls = let ls' = removeDups (sort (step ls))
go ls = let ls' = step ls
in if ls == ls' then ls else go ls'
--
removeDups [] = []
removeDups (x:xs) | x `elem` xs = removeDups xs
| otherwise = x : removeDups xs
--
destRequirements (Req _ (Convert t)) = [Req t BaseOps]
destRequirements _ = []
sanitizeConverts (Req x (Convert y))
| x == y = []
| x < y = [Req x (Convert y), Req y BaseOps]
| otherwise = [Req y (Convert x), Req x BaseOps]
sanitizeConverts x = [x]

View File

@@ -36,6 +36,8 @@ testDatabase = [
(SignedAdd, "sigadd", "signed addition", sigaddTest),
(SignedBase, "signed", "signed base", signedTest),
(SignedCmp, "sigcmp", "signed compare", sigcmpTest),
(SignedMul, "sigmul", "signed multiply", sigmulTest),
(SignedDiv, "sigdiv", "signed division", sigdivTest),
(SignedShift, "sigshiftr", "signed shift right", sigshiftrTest),
(SignedShift, "sigshiftl", "signed shift left", sigshiftlTest),
(SignedSub, "sigsub", "signed subtraction", sigsubTest),
@@ -244,6 +246,25 @@ sigcmpTest size memory0 =
("e", showB (a == b))]
in (res, a, memory2)
sigdivTest :: Test
sigdivTest size memory0 =
let (a, memory1) = genSign (generateNum memory0 "a" size)
(b, memory2) = genSign (generateNum memory1 "b" size)
q = a `div` b
r = a `mod` b
res = Map.fromList [("a", showX a), ("b", showX b),
("q", showX q), ("r", showX r)]
in (res, q, memory2)
sigmulTest :: Test
sigmulTest size memory0 =
let (a, memory1) = genSign (generateNum memory0 "a" size)
(b, memory2) = genSign (generateNum memory1 "b" size)
c = a * b
res = Map.fromList [("a", showX a), ("b", showX b),
("c", showX c)]
in (res, c, memory2)
egcdTest :: Test
egcdTest size memory0 =
let (x, memory1) = generateNum memory0 "x" size

BIN
test-generator/dist/cabal-config-flags vendored Normal file

Binary file not shown.

View File

@@ -22,7 +22,7 @@ executable gen-invocs
main-is: Invocs.hs
other-modules: Requirements
-- other-extensions:
build-depends: base >=4.11 && < 4.12, ascii-progress, random
build-depends: base >=4.11 && < 4.14, ascii-progress, random
hs-source-dirs: .
default-language: Haskell2010
ghc-options: -Wall -O2 -threaded -rtsopts -with-rtsopts=-N
@@ -31,7 +31,7 @@ executable gen-tests
main-is: Main.hs
other-modules: Database, Math, Requirements, Tests
-- other-extensions:
build-depends: base >=4.11 && < 4.12, ascii-progress, containers, directory, filepath, integer-gmp, random
build-depends: base >=4.11 && < 4.14, ascii-progress, containers, directory, filepath, integer-gmp, random
hs-source-dirs: .
default-language: Haskell2010
ghc-options: -Wall -O2 -threaded -rtsopts -with-rtsopts=-N