-- | Signature generation. module Crypto.PubKey.ECC.Generate where import Crypto.Random (CPRG) import Crypto.Types.PubKey.ECC import Crypto.Types.PubKey.ECDSA import Crypto.Number.Generate import Crypto.PubKey.ECC.Prim -- | Generate Q given d. -- -- /WARNING:/ Vulnerable to timing attacks. generateQ :: Curve -> Integer -> Point generateQ curve d = pointMul curve d g where g = ecc_g $ common_curve curve -- | Generate a pair of (private, public) key. -- -- /WARNING:/ Vulnerable to timing attacks. generate :: CPRG g => g -- ^ CPRG -> Curve -- ^ Elliptic Curve -> ((PublicKey, PrivateKey), g) generate rng curve = ((PublicKey curve q, PrivateKey curve d), rng') where (d, rng') = generateBetween rng 1 (n - 1) q = generateQ curve d n = ecc_n $ common_curve curve