diff --git a/generation/Main.hs b/generation/Main.hs index f0b3af2..89e8197 100644 --- a/generation/Main.hs +++ b/generation/Main.hs @@ -11,13 +11,14 @@ import Control.Monad(replicateM, void) import Conversions(conversions, signedConversions) import CryptoNum(cryptoNum) import Control.Monad(forM_,unless) +import Data.List(nub) import Data.Text.Lazy(Text, pack) import Division(divisionOps) import GHC.Conc(getNumCapabilities) import ModInv(generateModInvOps) import ModOps(modulusOps) import Multiply(safeMultiplyOps, unsafeMultiplyOps) -import RustModule(RustModule,Task(..),generateTasks) +import RustModule(RustModule(suggested),Task(..),generateTasks) import Scale(safeScaleOps, unsafeScaleOps) import Shift(shiftOps, signedShiftOps) import Signed(signedBaseOps) @@ -30,14 +31,19 @@ import System.IO(IOMode(..),withFile) import System.ProgressBar(Label(..), Progress(..), ProgressBar, Timing, defStyle, newProgressBar, stylePrefix, updateProgress) import System.Random(getStdGen) -lowestBitsize :: Word -lowestBitsize = 192 +rsaWordSizes :: [Word] +rsaWordSizes = [512, 1024, 2048, 3072, 4096, 8192, 15360] -highestBitsize :: Word -highestBitsize = 512 +dsaWordSizes :: [Word] +dsaWordSizes = [192, 256, 384, 1024, 2048, 3072] + +ecdsaIntSizes :: [Word] +ecdsaIntSizes = [192, 256, 384, 576] bitsizes :: [Word] -bitsizes = [lowestBitsize,lowestBitsize+64..highestBitsize] +bitsizes = expandSizes initialSet + where + initialSet = nub (rsaWordSizes ++ dsaWordSizes ++ ecdsaIntSizes) unsignedFiles :: [RustModule] unsignedFiles = [ @@ -75,6 +81,11 @@ signedFiles = [ allFiles :: [RustModule] allFiles = unsignedFiles ++ signedFiles +expandSizes :: [Word] -> [Word] +expandSizes ls = bigger + where + bigger = nub (ls ++ concatMap (\ f -> concatMap (\ x -> suggested f x) ls) allFiles) + printLast :: Progress String -> Timing -> Text printLast prog _ = pack (progressCustom prog) diff --git a/generation/Test.hs b/generation/Test.hs index 99cd0f5..bca2b0a 100644 --- a/generation/Test.hs +++ b/generation/Test.hs @@ -27,8 +27,8 @@ modexpLR bitsize b e m = go (bitsize - 1) 1 where go bit r0 | bit < 0 = r0 - | testBit e bit = trace ("1: r = " ++ showHex r2 "") $ go (bit - 1) r2 - | otherwise = trace ("0: r = " ++ showHex r1 "") $ go (bit - 1) r1 + | testBit e bit = go (bit - 1) r2 + | otherwise = go (bit - 1) r1 where r1 = (r0 * r0) `mod` m r2 = (r1 * b) `mod` m diff --git a/generation/generation.cabal b/generation/generation.cabal index f064665..976bf8a 100644 --- a/generation/generation.cabal +++ b/generation/generation.cabal @@ -37,7 +37,6 @@ library Conversions, CryptoNum, Division, - Gen, Generators, Karatsuba, ModInv, diff --git a/generation/src/Add.hs b/generation/src/Add.hs index c272fe3..b5f1c51 100644 --- a/generation/src/Add.hs +++ b/generation/src/Add.hs @@ -10,7 +10,6 @@ module Add( import Data.Bits((.&.)) import Data.Map.Strict(Map) import qualified Data.Map.Strict as Map -import Gen(toLit) import Generators import Language.Rust.Data.Ident import Language.Rust.Data.Position @@ -22,6 +21,7 @@ import System.Random(RandomGen) safeAddOps :: RustModule safeAddOps = RustModule { predicate = \ me others -> (me + 64) `elem` others, + suggested = \ me -> [me + 64], outputName = "safe_add", isUnsigned = True, generator = declareSafeAddOperators, @@ -31,6 +31,7 @@ safeAddOps = RustModule { unsafeAddOps :: RustModule unsafeAddOps = RustModule { predicate = \ _ _ -> True, + suggested = const [], outputName = "unsafe_add", isUnsigned = True, generator = declareUnsafeAddOperators, @@ -40,6 +41,7 @@ unsafeAddOps = RustModule { safeSignedAddOps :: RustModule safeSignedAddOps = RustModule { predicate = \ me others -> (me + 64) `elem` others, + suggested = \ me -> [me + 64], outputName = "safe_sadd", isUnsigned = False, generator = declareSafeSignedAddOperators, @@ -49,6 +51,7 @@ safeSignedAddOps = RustModule { unsafeSignedAddOps :: RustModule unsafeSignedAddOps = RustModule { predicate = \ _ _ -> True, + suggested = const [], outputName = "unsafe_sadd", isUnsigned = False, generator = declareUnsafeSignedAddOperators, diff --git a/generation/src/Base.hs b/generation/src/Base.hs index 404dada..fdd3d0f 100644 --- a/generation/src/Base.hs +++ b/generation/src/Base.hs @@ -13,6 +13,7 @@ import RustModule base :: RustModule base = RustModule { predicate = \ _ _ -> True, + suggested = const [], outputName = "base", isUnsigned = True, generator = declareBaseStructure, diff --git a/generation/src/BinaryOps.hs b/generation/src/BinaryOps.hs index 5621779..ae37058 100644 --- a/generation/src/BinaryOps.hs +++ b/generation/src/BinaryOps.hs @@ -7,7 +7,6 @@ module BinaryOps( import Data.Bits(xor,(.&.),(.|.)) import Data.Map.Strict(Map) import qualified Data.Map.Strict as Map -import Gen(toLit) import Generators import Language.Rust.Data.Ident import Language.Rust.Data.Position @@ -19,6 +18,7 @@ import System.Random(RandomGen) binaryOps :: RustModule binaryOps = RustModule { predicate = \ _ _ -> True, + suggested = const [], outputName = "binary", isUnsigned = True, generator = declareBinaryOperators, diff --git a/generation/src/Compare.hs b/generation/src/Compare.hs index 43e03e2..5909d89 100644 --- a/generation/src/Compare.hs +++ b/generation/src/Compare.hs @@ -15,6 +15,7 @@ import System.Random(RandomGen) comparisons :: RustModule comparisons = RustModule { predicate = \ _ _ -> True, + suggested = const [], outputName = "compare", isUnsigned = True, generator = declareComparators, @@ -24,6 +25,7 @@ comparisons = RustModule { signedComparisons :: RustModule signedComparisons = RustModule { predicate = \ _ _ -> True, + suggested = const [], outputName = "scompare", isUnsigned = False, generator = declareSignedComparators, diff --git a/generation/src/Conversions.hs b/generation/src/Conversions.hs index b776a77..35e9ea4 100644 --- a/generation/src/Conversions.hs +++ b/generation/src/Conversions.hs @@ -5,7 +5,7 @@ module Conversions( ) where -import Gen(toLit) +import Generators import Language.Rust.Data.Ident import Language.Rust.Data.Position import Language.Rust.Quote @@ -15,6 +15,7 @@ import RustModule conversions :: RustModule conversions = RustModule { predicate = \ _ _ -> True, + suggested = const [], outputName = "conversions", isUnsigned = True, generator = declareConversions, @@ -24,6 +25,7 @@ conversions = RustModule { signedConversions :: RustModule signedConversions = RustModule { predicate = \ _ _ -> True, + suggested = const [], outputName = "sconversions", isUnsigned = False, generator = declareSignedConversions, diff --git a/generation/src/CryptoNum.hs b/generation/src/CryptoNum.hs index 802ba62..74ee0ec 100644 --- a/generation/src/CryptoNum.hs +++ b/generation/src/CryptoNum.hs @@ -7,7 +7,6 @@ module CryptoNum( import Data.Bits(testBit) import Data.Map.Strict(Map) import qualified Data.Map.Strict as Map -import Gen import Generators import Language.Rust.Data.Ident import Language.Rust.Data.Position @@ -19,6 +18,7 @@ import System.Random(RandomGen) cryptoNum :: RustModule cryptoNum = RustModule { predicate = \ _ _ -> True, + suggested = const [], outputName = "cryptonum", isUnsigned = True, generator = declareCryptoNumInstance, diff --git a/generation/src/Division.hs b/generation/src/Division.hs index c92131e..f6fb53a 100644 --- a/generation/src/Division.hs +++ b/generation/src/Division.hs @@ -4,7 +4,6 @@ module Division(divisionOps) import Data.Map.Strict(Map) import qualified Data.Map.Strict as Map -import Gen(toLit) import Generators import Language.Rust.Data.Ident import Language.Rust.Data.Position @@ -16,6 +15,7 @@ import System.Random(RandomGen) divisionOps :: RustModule divisionOps = RustModule { predicate = \ _ _ -> True, + suggested = const [], outputName = "divmod", isUnsigned = True, generator = declareDivision, diff --git a/generation/src/Gen.hs b/generation/src/Gen.hs deleted file mode 100644 index 99dcc1a..0000000 --- a/generation/src/Gen.hs +++ /dev/null @@ -1,13 +0,0 @@ -{-# LANGUAGE GeneralizedNewtypeDeriving #-} -module Gen( - toLit - ) - where - -import Language.Rust.Data.Position -import Language.Rust.Syntax - -toLit :: Word -> Expr Span -toLit i = Lit [] (Int Dec (fromIntegral i) Unsuffixed mempty) mempty - - diff --git a/generation/src/Generators.hs b/generation/src/Generators.hs index d407a63..75482dd 100644 --- a/generation/src/Generators.hs +++ b/generation/src/Generators.hs @@ -1,9 +1,14 @@ module Generators where +import Language.Rust.Data.Position +import Language.Rust.Syntax import Numeric(showHex) import System.Random(RandomGen,random,randomR) +toLit :: Word -> Expr Span +toLit i = Lit [] (Int Dec (fromIntegral i) Unsuffixed mempty) mempty + generateNum :: RandomGen g => g -> Word -> (Integer, g) generateNum g size = let (x, g') = random g diff --git a/generation/src/ModInv.hs b/generation/src/ModInv.hs index 44fe60a..cc6e7eb 100644 --- a/generation/src/ModInv.hs +++ b/generation/src/ModInv.hs @@ -20,6 +20,7 @@ import System.Random(RandomGen) generateModInvOps :: RustModule generateModInvOps = RustModule { predicate = \ me others -> (me + 64) `elem` others, + suggested = \ me -> [me + 64], outputName = "modinv", isUnsigned = True, generator = declareModInv, diff --git a/generation/src/ModOps.hs b/generation/src/ModOps.hs index a13aae1..743b273 100644 --- a/generation/src/ModOps.hs +++ b/generation/src/ModOps.hs @@ -16,6 +16,7 @@ import System.Random(RandomGen) modulusOps :: RustModule modulusOps = RustModule { predicate = \ me others -> (me * 2) `elem` others, + suggested = \ me -> [me * 2], outputName = "modops", isUnsigned = True, generator = declareModOps, diff --git a/generation/src/Multiply.hs b/generation/src/Multiply.hs index ea1104b..b1f9354 100644 --- a/generation/src/Multiply.hs +++ b/generation/src/Multiply.hs @@ -1,9 +1,8 @@ {-# LANGUAGE QuasiQuotes #-} -module Multiply --- ( --- safeMultiplyOps --- , unsafeMultiplyOps --- ) +module Multiply( + safeMultiplyOps + , unsafeMultiplyOps + ) where import Data.Bits((.&.)) @@ -11,7 +10,6 @@ import Data.List(foldl') import Data.Map.Strict(Map) import qualified Data.Map.Strict as Map import qualified Data.Set as Set -import Gen(toLit) import Generators import Karatsuba import Language.Rust.Data.Ident @@ -24,19 +22,21 @@ import System.Random(RandomGen) safeMultiplyOps :: RustModule safeMultiplyOps = RustModule { predicate = \ me others -> (me * 2) `elem` others, + suggested = \ me -> [me * 2], outputName = "safe_mul", isUnsigned = True, generator = declareSafeMulOperators, - testCase = Nothing -- Just generateSafeTest + testCase = Just generateSafeTest } unsafeMultiplyOps :: RustModule unsafeMultiplyOps = RustModule { predicate = \ _ _ -> True, + suggested = const [], outputName = "unsafe_mul", isUnsigned = True, generator = declareUnsafeMulOperators, - testCase = Nothing -- Just generateUnsafeTest + testCase = Just generateUnsafeTest } declareSafeMulOperators :: Word -> [Word] -> SourceFile Span diff --git a/generation/src/RustModule.hs b/generation/src/RustModule.hs index 47f2ba9..1a766c2 100644 --- a/generation/src/RustModule.hs +++ b/generation/src/RustModule.hs @@ -38,6 +38,7 @@ targetTestGenerationPicos = data RustModule = RustModule { predicate :: Word -> [Word] -> Bool, + suggested :: Word -> [Word], outputName :: String, isUnsigned :: Bool, generator :: Word -> [Word] -> SourceFile Span, diff --git a/generation/src/Scale.hs b/generation/src/Scale.hs index d11bc84..177a1a0 100644 --- a/generation/src/Scale.hs +++ b/generation/src/Scale.hs @@ -8,7 +8,6 @@ module Scale( import Data.Bits((.&.)) import Data.Map.Strict(Map) import qualified Data.Map.Strict as Map -import Gen(toLit) import Generators import Language.Rust.Data.Ident import Language.Rust.Data.Position @@ -20,6 +19,7 @@ import System.Random(RandomGen) safeScaleOps :: RustModule safeScaleOps = RustModule { predicate = \ me others -> (me + 64) `elem` others, + suggested = \ me -> [me + 64], outputName = "safe_scale", isUnsigned = True, generator = declareSafeScaleOperators, @@ -29,6 +29,7 @@ safeScaleOps = RustModule { unsafeScaleOps :: RustModule unsafeScaleOps = RustModule { predicate = \ _ _ -> True, + suggested = const [], outputName = "unsafe_scale", isUnsigned = True, generator = declareUnsafeScaleOperators, diff --git a/generation/src/Shift.hs b/generation/src/Shift.hs index cab7069..93e5938 100644 --- a/generation/src/Shift.hs +++ b/generation/src/Shift.hs @@ -5,7 +5,6 @@ module Shift(shiftOps, signedShiftOps) import Data.Bits(shiftL,shiftR) import Data.Map.Strict(Map) import qualified Data.Map.Strict as Map -import Gen(toLit) import Generators import Language.Rust.Data.Ident import Language.Rust.Data.Position @@ -17,6 +16,7 @@ import System.Random(RandomGen) shiftOps :: RustModule shiftOps = RustModule { predicate = \ _ _ -> True, + suggested = const [], outputName = "shift", isUnsigned = True, generator = declareShiftOperators, @@ -26,6 +26,7 @@ shiftOps = RustModule { signedShiftOps :: RustModule signedShiftOps = RustModule { predicate = \ _ _ -> True, + suggested = const [], outputName = "sshift", isUnsigned = False, generator = declareSignedShiftOperators, diff --git a/generation/src/Signed.hs b/generation/src/Signed.hs index d51ebe2..786d1a2 100644 --- a/generation/src/Signed.hs +++ b/generation/src/Signed.hs @@ -11,6 +11,7 @@ import RustModule signedBaseOps :: RustModule signedBaseOps = RustModule { predicate = const (const True), + suggested = const [], outputName = "base", isUnsigned = False, generator = declareSigned, diff --git a/generation/src/Subtract.hs b/generation/src/Subtract.hs index f651f24..955fc74 100644 --- a/generation/src/Subtract.hs +++ b/generation/src/Subtract.hs @@ -10,7 +10,6 @@ module Subtract( import Data.Bits((.&.)) import Data.Map.Strict(Map) import qualified Data.Map.Strict as Map -import Gen(toLit) import Generators import Language.Rust.Data.Ident import Language.Rust.Data.Position @@ -22,6 +21,7 @@ import System.Random(RandomGen) safeSubtractOps :: RustModule safeSubtractOps = RustModule { predicate = \ me others -> (me + 64) `elem` others, + suggested = \ me -> [me + 64], outputName = "safe_sub", isUnsigned = True, generator = declareSafeSubtractOperators, @@ -31,6 +31,7 @@ safeSubtractOps = RustModule { safeSignedSubtractOps :: RustModule safeSignedSubtractOps = RustModule { predicate = \ me others -> (me + 64) `elem` others, + suggested = \ me -> [me + 64], outputName = "safe_ssub", isUnsigned = False, generator = declareSafeSignedSubtractOperators, @@ -40,6 +41,7 @@ safeSignedSubtractOps = RustModule { unsafeSubtractOps :: RustModule unsafeSubtractOps = RustModule { predicate = \ _ _ -> True, + suggested = const [], outputName = "unsafe_sub", isUnsigned = True, generator = declareUnsafeSubtractOperators, @@ -49,6 +51,7 @@ unsafeSubtractOps = RustModule { unsafeSignedSubtractOps :: RustModule unsafeSignedSubtractOps = RustModule { predicate = \ _ _ -> True, + suggested = const [], outputName = "unsafe_ssub", isUnsigned = False, generator = declareUnsafeSignedSubtractOperators,