Support signed multiplication and division, for ECDSA.
This commit is contained in:
@@ -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)]
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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
BIN
test-generator/dist/cabal-config-flags
vendored
Normal file
Binary file not shown.
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user