cryptocipher 0.2.10 → 0.2.11
raw patch · 4 files changed
+35/−21 lines, 4 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Crypto.Cipher.RSA: generate :: CryptoRandomGen g => g -> Int -> Integer -> Either GenError ((PublicKey, PrivateKey), g)
+ Crypto.Cipher.RSA: generate :: CryptoRandomGen g => g -> Int -> Integer -> Either Error ((PublicKey, PrivateKey), g)
Files
- Crypto/Cipher/RSA.hs +14/−5
- Number/Generate.hs +6/−5
- Number/Prime.hs +14/−9
- cryptocipher.cabal +1/−2
Crypto/Cipher/RSA.hs view
@@ -1,3 +1,5 @@+{-# LANGUAGE FlexibleInstances, CPP #-}+ -- | -- Module : Crypto.Cipher.RSA -- License : BSD-style@@ -18,7 +20,6 @@ , verify ) where -import Control.Monad.Error () import Control.Arrow (first) import Crypto.Random import Data.ByteString (ByteString)@@ -57,6 +58,13 @@ type HashF = ByteString -> ByteString type HashASN1 = ByteString +#if ! (MIN_VERSION_base(4,3,0))+instance Monad (Either Error) where+ return = Right+ (Left x) >>= _ = Left x+ (Right x) >>= f = f x+#endif+ padPKCS1 :: CryptoRandomGen g => g -> Int -> ByteString -> Either Error (ByteString, g) padPKCS1 rng len m = do (padding, rng') <- getRandomBytes rng (len - B.length m - 3)@@ -119,7 +127,7 @@ Right (s == em) -- | generate a pair of (private, public) key of size in bytes.-generate :: CryptoRandomGen g => g -> Int -> Integer -> Either GenError ((PublicKey, PrivateKey), g)+generate :: CryptoRandomGen g => g -> Int -> Integer -> Either Error ((PublicKey, PrivateKey), g) generate rng size e = do ((p,q), rng') <- generatePQ rng let n = p * q@@ -142,15 +150,16 @@ , public_n = n , public_e = e }- return ((pub, priv), rng')+ Right ((pub, priv), rng') where generatePQ g = do- (p, g') <- generatePrime g (8 * (size `div` 2))+ (p, g') <- genPrime g (8 * (size `div` 2)) (q, g'') <- generateQ p g' return ((p,q), g'') generateQ p h = do- (q, h') <- generatePrime h (8 * (size - (size `div` 2)))+ (q, h') <- genPrime h (8 * (size - (size `div` 2))) if p == q then generateQ p h' else return (q, h')+ genPrime g sz = either (Left . RandomGenFailure) Right $ generatePrime g sz {- makeSignature for sign and verify -} makeSignature :: HashF -> HashASN1 -> Int -> ByteString -> Either Error ByteString
Number/Generate.hs view
@@ -4,7 +4,6 @@ , generateOfSize ) where -import Control.Monad.Error () import Number.Serialize import Crypto.Random import qualified Data.ByteString as B@@ -13,13 +12,15 @@ -- | generate a positive integer between 0 and m. -- using as many bytes as necessary to the same size as m, that are converted to integer. generateMax :: CryptoRandomGen g => g -> Integer -> Either GenError (Integer, g)-generateMax rng m = genBytes (logiBytes m) rng >>= \(bs, rng') -> return (os2ip bs `mod` m, rng')+generateMax rng m = case genBytes (logiBytes m) rng of+ Left err -> Left err+ Right (bs, rng') -> Right (os2ip bs `mod` m, rng') -- | generate a number between the inclusive bound [low,high]. generateBetween :: CryptoRandomGen g => g -> Integer -> Integer -> Either GenError (Integer, g)-generateBetween rng low high = generateMax rng rmax >>= \(v, rng') -> return (low + v, rng')- where- rmax = high - low + 1 -- relative maximum before being corrected by the low bound+generateBetween rng low high = case generateMax rng (high - low + 1) of+ Left err -> Left err+ Right (v, rng') -> Right (low + v, rng') -- | generate a positive integer of a specific size in bits. -- the number of bits need to be multiple of 8. It will always returns
Number/Prime.hs view
@@ -22,13 +22,16 @@ | otherwise = primalityTestMillerRabin rng 30 n generatePrime :: CryptoRandomGen g => g -> Int -> Either GenError (Integer, g)-generatePrime rng bits = generateOfSize rng bits >>= \(sp, rng') -> findPrimeFrom rng' sp+generatePrime rng bits = case generateOfSize rng bits of+ Left err -> Left err+ Right (sp, rng') -> findPrimeFrom rng' sp findPrimeFrom :: CryptoRandomGen g => g -> Integer -> Either GenError (Integer, g) findPrimeFrom rng n | even n = findPrimeFrom rng (n+1)- | otherwise = isProbablyPrime rng n- >>= \(isPPrime, rng') -> if isPPrime then return (n, rng') else findPrimeFrom rng' (n+2)+ | otherwise = case isProbablyPrime rng n of+ Left err -> Left err+ Right (isPPrime, rng') -> if isPPrime then Right (n, rng') else findPrimeFrom rng' (n+2) -- | 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.@@ -45,12 +48,14 @@ | otherwise = factorise (s+1) (v `shiftR` 1) expmod = exponantiation_rtl_binary -- when iteration reach zero, we have a probable prime- loop g _ 0 = return (True, g)- loop g (s,d) k = generateBetween g 2 (n-2) >>= \(a, g') ->- let x = expmod a d n in- if x == (1 :: Integer) || x == (n-1)- then loop g' (s,d) (k-1)- else loop' g' (s,d) (k-1) ((x*x) `mod` n) 1+ loop g _ 0 = Right (True, g)+ loop g (s,d) k = case generateBetween g 2 (n-2) of+ Left err -> Left err+ Right (a, g') ->+ let x = expmod a d n in+ if x == (1 :: Integer) || x == (n-1)+ then loop g' (s,d) (k-1)+ else loop' g' (s,d) (k-1) ((x*x) `mod` n) 1 -- loop from 1 to s-1. if we reach the end then it's composite loop' g o@(s,_) km1 x2 r | r == s = Right (False, g)
cryptocipher.cabal view
@@ -1,5 +1,5 @@ Name: cryptocipher-Version: 0.2.10+Version: 0.2.11 Description: Symmetrical Block, Stream and PubKey Ciphers License: BSD3 License-file: LICENSE@@ -28,7 +28,6 @@ , crypto-api >= 0.5 , tagged , cereal- , mtl Exposed-modules: Crypto.Cipher.RC4 Crypto.Cipher.AES Crypto.Cipher.Camellia