packages feed

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 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