235 lines
7.7 KiB
Diff
235 lines
7.7 KiB
Diff
From f6ed5c3093111ffe0276f5b5bb6241783611ab1c Mon Sep 17 00:00:00 2001
|
|
From: androidbuilder <androidbuilder@example.com>
|
|
Date: Mon, 11 Nov 2013 01:54:25 +0000
|
|
Subject: [PATCH] hack to build
|
|
|
|
---
|
|
Crypto/Number/Basic.hs | 17 -----------------
|
|
Crypto/Number/ModArithmetic.hs | 29 -----------------------------
|
|
Crypto/Number/Prime.hs | 18 ------------------
|
|
crypto-numbers.cabal | 2 +-
|
|
4 files changed, 1 insertion(+), 65 deletions(-)
|
|
|
|
diff --git a/Crypto/Number/Basic.hs b/Crypto/Number/Basic.hs
|
|
index af03052..5de8518 100644
|
|
--- a/Crypto/Number/Basic.hs
|
|
+++ b/Crypto/Number/Basic.hs
|
|
@@ -1,8 +1,5 @@
|
|
{-# LANGUAGE BangPatterns #-}
|
|
{-# LANGUAGE CPP #-}
|
|
-#if MIN_VERSION_integer_gmp(0,5,1)
|
|
-{-# LANGUAGE UnboxedTuples #-}
|
|
-#endif
|
|
-- |
|
|
-- Module : Crypto.Number.Basic
|
|
-- License : BSD-style
|
|
@@ -17,11 +14,7 @@ module Crypto.Number.Basic
|
|
, areEven
|
|
) where
|
|
|
|
-#if MIN_VERSION_integer_gmp(0,5,1)
|
|
-import GHC.Integer.GMP.Internals
|
|
-#else
|
|
import Data.Bits
|
|
-#endif
|
|
|
|
-- | sqrti returns two integer (l,b) so that l <= sqrt i <= b
|
|
-- the implementation is quite naive, use an approximation for the first number
|
|
@@ -60,25 +53,16 @@ sqrti i
|
|
-- gcde 'a' 'b' find (x,y,gcd(a,b)) where ax + by = d
|
|
--
|
|
gcde :: Integer -> Integer -> (Integer, Integer, Integer)
|
|
-#if MIN_VERSION_integer_gmp(0,5,1)
|
|
-gcde a b = (s, t, g)
|
|
- where (# g, s #) = gcdExtInteger a b
|
|
- t = (g - s * a) `div` b
|
|
-#else
|
|
gcde a b = if d < 0 then (-x,-y,-d) else (x,y,d) where
|
|
(d, x, y) = f (a,1,0) (b,0,1)
|
|
f t (0, _, _) = t
|
|
f (a', sa, ta) t@(b', sb, tb) =
|
|
let (q, r) = a' `divMod` b' in
|
|
f t (r, sa - (q * sb), ta - (q * tb))
|
|
-#endif
|
|
|
|
-- | get the extended GCD of two integer using the extended binary algorithm (HAC 14.61)
|
|
-- get (x,y,d) where d = gcd(a,b) and x,y satisfying ax + by = d
|
|
gcde_binary :: Integer -> Integer -> (Integer, Integer, Integer)
|
|
-#if MIN_VERSION_integer_gmp(0,5,1)
|
|
-gcde_binary = gcde
|
|
-#else
|
|
gcde_binary a' b'
|
|
| b' == 0 = (1,0,a')
|
|
| a' >= b' = compute a' b'
|
|
@@ -102,7 +86,6 @@ gcde_binary a' b'
|
|
in if u2 >= v2
|
|
then loop g x y (u2 - v2) v2 (a2 - c2) (b2 - d2) c2 d2
|
|
else loop g x y u2 (v2 - u2) a2 b2 (c2 - a2) (d2 - b2)
|
|
-#endif
|
|
|
|
-- | check if a list of integer are all even
|
|
areEven :: [Integer] -> Bool
|
|
diff --git a/Crypto/Number/ModArithmetic.hs b/Crypto/Number/ModArithmetic.hs
|
|
index 031f477..38b22b7 100644
|
|
--- a/Crypto/Number/ModArithmetic.hs
|
|
+++ b/Crypto/Number/ModArithmetic.hs
|
|
@@ -26,12 +26,8 @@ module Crypto.Number.ModArithmetic
|
|
import Control.Exception (throw, Exception)
|
|
import Data.Typeable
|
|
|
|
-#if MIN_VERSION_integer_gmp(0,5,1)
|
|
-import GHC.Integer.GMP.Internals
|
|
-#else
|
|
import Crypto.Number.Basic (gcde_binary)
|
|
import Data.Bits
|
|
-#endif
|
|
|
|
-- | Raised when two numbers are supposed to be coprimes but are not.
|
|
data CoprimesAssertionError = CoprimesAssertionError
|
|
@@ -52,13 +48,7 @@ expSafe :: Integer -- ^ base
|
|
-> Integer -- ^ exponant
|
|
-> Integer -- ^ modulo
|
|
-> Integer -- ^ result
|
|
-#if MIN_VERSION_integer_gmp(0,5,1)
|
|
-expSafe b e m
|
|
- | odd m = powModSecInteger b e m
|
|
- | otherwise = powModInteger b e m
|
|
-#else
|
|
expSafe = exponentiation
|
|
-#endif
|
|
|
|
-- | Compute the modular exponentiation of base^exponant using
|
|
-- the fastest algorithm without any consideration for
|
|
@@ -71,11 +61,7 @@ expFast :: Integer -- ^ base
|
|
-> Integer -- ^ modulo
|
|
-> Integer -- ^ result
|
|
expFast =
|
|
-#if MIN_VERSION_integer_gmp(0,5,1)
|
|
- powModInteger
|
|
-#else
|
|
exponentiation
|
|
-#endif
|
|
|
|
-- note on exponentiation: 0^0 is treated as 1 for mimicking the standard library;
|
|
-- the mathematic debate is still open on whether or not this is true, but pratically
|
|
@@ -84,22 +70,15 @@ expFast =
|
|
-- | exponentiation_rtl_binary computes modular exponentiation as b^e mod m
|
|
-- using the right-to-left binary exponentiation algorithm (HAC 14.79)
|
|
exponentiation_rtl_binary :: Integer -> Integer -> Integer -> Integer
|
|
-#if MIN_VERSION_integer_gmp(0,5,1)
|
|
-exponentiation_rtl_binary = expSafe
|
|
-#else
|
|
exponentiation_rtl_binary 0 0 m = 1 `mod` m
|
|
exponentiation_rtl_binary b e m = loop e b 1
|
|
where sq x = (x * x) `mod` m
|
|
loop !0 _ !a = a `mod` m
|
|
loop !i !s !a = loop (i `shiftR` 1) (sq s) (if odd i then a * s else a)
|
|
-#endif
|
|
|
|
-- | exponentiation computes modular exponentiation as b^e mod m
|
|
-- using repetitive squaring.
|
|
exponentiation :: Integer -> Integer -> Integer -> Integer
|
|
-#if MIN_VERSION_integer_gmp(0,5,1)
|
|
-exponentiation = expSafe
|
|
-#else
|
|
exponentiation b e m
|
|
| b == 1 = b
|
|
| e == 0 = 1
|
|
@@ -107,7 +86,6 @@ exponentiation b e m
|
|
| even e = let p = (exponentiation b (e `div` 2) m) `mod` m
|
|
in (p^(2::Integer)) `mod` m
|
|
| otherwise = (b * exponentiation b (e-1) m) `mod` m
|
|
-#endif
|
|
|
|
--{-# DEPRECATED exponantiation_rtl_binary "typo in API name it's called exponentiation_rtl_binary #-}
|
|
exponantiation_rtl_binary :: Integer -> Integer -> Integer -> Integer
|
|
@@ -119,17 +97,10 @@ exponantiation = exponentiation
|
|
|
|
-- | inverse computes the modular inverse as in g^(-1) mod m
|
|
inverse :: Integer -> Integer -> Maybe Integer
|
|
-#if MIN_VERSION_integer_gmp(0,5,1)
|
|
-inverse g m
|
|
- | r == 0 = Nothing
|
|
- | otherwise = Just r
|
|
- where r = recipModInteger g m
|
|
-#else
|
|
inverse g m
|
|
| d > 1 = Nothing
|
|
| otherwise = Just (x `mod` m)
|
|
where (x,_,d) = gcde_binary g m
|
|
-#endif
|
|
|
|
-- | Compute the modular inverse of 2 coprime numbers.
|
|
-- This is equivalent to inverse except that the result
|
|
diff --git a/Crypto/Number/Prime.hs b/Crypto/Number/Prime.hs
|
|
index 2060f4d..61d37c0 100644
|
|
--- a/Crypto/Number/Prime.hs
|
|
+++ b/Crypto/Number/Prime.hs
|
|
@@ -1,8 +1,6 @@
|
|
{-# LANGUAGE CPP #-}
|
|
{-# LANGUAGE BangPatterns #-}
|
|
-#if MIN_VERSION_integer_gmp(0,5,1)
|
|
{-# LANGUAGE MagicHash #-}
|
|
-#endif
|
|
-- |
|
|
-- Module : Crypto.Number.Prime
|
|
-- License : BSD-style
|
|
@@ -27,12 +25,7 @@ import Crypto.Number.Generate
|
|
import Crypto.Number.Basic (sqrti, gcde_binary)
|
|
import Crypto.Number.ModArithmetic (exponantiation)
|
|
|
|
-#if MIN_VERSION_integer_gmp(0,5,1)
|
|
-import GHC.Integer.GMP.Internals
|
|
-import GHC.Base
|
|
-#else
|
|
import Data.Bits
|
|
-#endif
|
|
|
|
-- | returns if the number is probably prime.
|
|
-- first a list of small primes are implicitely tested for divisibility,
|
|
@@ -75,21 +68,11 @@ findPrimeFromWith rng prop !n
|
|
-- | find a prime from a starting point with no specific property.
|
|
findPrimeFrom :: CPRG g => g -> Integer -> (Integer, g)
|
|
findPrimeFrom rng n =
|
|
-#if MIN_VERSION_integer_gmp(0,5,1)
|
|
- (nextPrimeInteger n, rng)
|
|
-#else
|
|
findPrimeFromWith rng (\g _ -> (True, g)) n
|
|
-#endif
|
|
|
|
-- | Miller Rabin algorithm return if the number is probably prime or composite.
|
|
-- the tries parameter is the number of recursion, that determines the accuracy of the test.
|
|
primalityTestMillerRabin :: CPRG g => g -> Int -> Integer -> (Bool, g)
|
|
-#if MIN_VERSION_integer_gmp(0,5,1)
|
|
-primalityTestMillerRabin rng (I# tries) !n =
|
|
- case testPrimeInteger n tries of
|
|
- 0# -> (False, rng)
|
|
- _ -> (True, rng)
|
|
-#else
|
|
primalityTestMillerRabin rng tries !n
|
|
| n <= 3 = error "Miller-Rabin requires tested value to be > 3"
|
|
| even n = (False, rng)
|
|
@@ -126,7 +109,6 @@ primalityTestMillerRabin rng tries !n
|
|
| x2 == 1 = False
|
|
| x2 /= nm1 = loop' ws ((x2*x2) `mod` n) (r+1)
|
|
| otherwise = loop ws
|
|
-#endif
|
|
|
|
{-
|
|
n < z -> witness to test
|
|
diff --git a/crypto-numbers.cabal b/crypto-numbers.cabal
|
|
index 05c00c1..8da5e2a 100644
|
|
--- a/crypto-numbers.cabal
|
|
+++ b/crypto-numbers.cabal
|
|
@@ -15,7 +15,7 @@ Extra-Source-Files: Tests/*.hs
|
|
|
|
Flag integer-gmp
|
|
Description: Are we using integer-gmp?
|
|
- Default: True
|
|
+ Default: False
|
|
|
|
Library
|
|
Build-Depends: base >= 4 && < 5
|
|
--
|
|
1.7.10.4
|
|
|