1-- | Signature generation. 2module Crypto.PubKey.ECC.Generate where 3 4import Crypto.Random.Types 5import Crypto.PubKey.ECC.Types 6import Crypto.PubKey.ECC.ECDSA 7import Crypto.Number.Generate 8import Crypto.PubKey.ECC.Prim 9 10-- | Generate Q given d. 11-- 12-- /WARNING:/ Vulnerable to timing attacks. 13generateQ :: Curve 14 -> Integer 15 -> Point 16generateQ curve d = pointMul curve d g 17 where g = ecc_g $ common_curve curve 18 19-- | Generate a pair of (private, public) key. 20-- 21-- /WARNING:/ Vulnerable to timing attacks. 22generate :: MonadRandom m 23 => Curve -- ^ Elliptic Curve 24 -> m (PublicKey, PrivateKey) 25generate curve = do 26 d <- generateBetween 1 (n - 1) 27 let q = generateQ curve d 28 return (PublicKey curve q, PrivateKey curve d) 29 where 30 n = ecc_n $ common_curve curve 31