crypto-pubkey 0.2.0 → 0.2.1
raw patch · 3 files changed
+45/−26 lines, 3 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Crypto.PubKey.RSA: generateWith :: (Integer, Integer) -> Int -> Integer -> (PublicKey, PrivateKey)
+ Crypto.PubKey.RSA: generateWith :: (Integer, Integer) -> Int -> Integer -> Maybe (PublicKey, PrivateKey)
Files
- Crypto/PubKey/DSA.hs +1/−0
- Crypto/PubKey/RSA.hs +43/−25
- crypto-pubkey.cabal +1/−1
Crypto/PubKey/DSA.hs view
@@ -5,6 +5,7 @@ -- Stability : experimental -- Portability : Good --+-- An implementation of the Digital Signature Algorithm (DSA) module Crypto.PubKey.DSA ( Params(..)
Crypto/PubKey/RSA.hs view
@@ -18,41 +18,60 @@ import Crypto.Random.API import Crypto.Types.PubKey.RSA-import Crypto.Number.ModArithmetic (inverseCoprimes)+import Crypto.Number.ModArithmetic (inverse, inverseCoprimes) import Crypto.Number.Generate (generateMax) import Crypto.Number.Prime (generatePrime) import Crypto.PubKey.RSA.Types --- | generate a public key and private key with p and q.+-- | Generate a key pair given p and q. ----- p and q need to be distinct primes numbers.+-- p and q need to be distinct prime numbers. ----- e need to be coprime to phi=(p-1)*(q-1). a small hamming weight results in better performance.--- 0x10001 is a popular choice. 3 is popular as well, but proven to not be as secure for some cases.-generateWith :: (Integer, Integer) -> Int -> Integer -> (PublicKey, PrivateKey)-generateWith (p,q) size e = (pub,priv)- where n = p*q- phi = (p-1)*(q-1)- d = inverseCoprimes e phi -- e and phi need to be coprime- pub = PublicKey { public_size = size- , public_n = n- , public_e = e- }- priv = PrivateKey { private_pub = pub+-- e need to be coprime to phi=(p-1)*(q-1). If that's not the+-- case, the function will not return a key pair.+-- A small hamming weight results in better performance.+--+-- * e=0x10001 is a popular choice+--+-- * e=3 is popular as well, but proven to not be as secure for some cases.+--+generateWith :: (Integer, Integer) -- ^ chosen distinct primes p and q+ -> Int -- ^ size in bytes+ -> Integer -- ^ RSA public exponant 'e'+ -> Maybe (PublicKey, PrivateKey)+generateWith (p,q) size e =+ case inverse e phi of+ Nothing -> Nothing+ Just d -> Just (pub,priv d)+ where n = p*q+ phi = (p-1)*(q-1)+ -- q and p should be *distinct* *prime* numbers, hence always coprime+ qinv = inverseCoprimes q p+ pub = PublicKey { public_size = size+ , public_n = n+ , public_e = e+ }+ priv d = PrivateKey { private_pub = pub , private_d = d , private_p = p , private_q = q , private_dP = d `mod` (p-1) , private_dQ = d `mod` (q-1)- , private_qinv = inverseCoprimes q p -- q and p are coprime+ , private_qinv = qinv } -- | generate a pair of (private, public) key of size in bytes.-generate :: CPRG g => g -> Int -> Integer -> ((PublicKey, PrivateKey), g)-generate rng size e = do- let (pq, rng') = generatePQ rng- in (generateWith pq size e, rng')- where+generate :: CPRG g+ => g -- ^ CPRG+ -> Int -- ^ size in bytes+ -> Integer -- ^ RSA public exponant 'e'+ -> ((PublicKey, PrivateKey), g)+generate rng size e = loop rng+ where loop g = -- loop until we find a valid key pair given e+ let (pq, g') = generatePQ g+ in case generateWith pq size e of+ Nothing -> loop g'+ Just pp -> (pp, g') generatePQ g = let (p, g') = generatePrime g (8 * (size `div` 2)) (q, g'') = generateQ p g'@@ -67,8 +86,7 @@ -- public key value N. generateBlinder :: CPRG g => g -- ^ CPRG to use.- -> Integer -- ^ RSA public N parameters.+ -> Integer -- ^ RSA public N parameter. -> (Blinder, g)-generateBlinder rng n =- let (r, rng') = generateMax rng n- in (Blinder r (inverseCoprimes r n), rng')+generateBlinder rng n = (Blinder r (inverseCoprimes r n), rng')+ where (r, rng') = generateMax rng n
crypto-pubkey.cabal view
@@ -1,5 +1,5 @@ Name: crypto-pubkey-Version: 0.2.0+Version: 0.2.1 Description: Public Key cryptography .