-- | Signature generation. module Crypto.PubKey.ECC.Generate where import Crypto.Random.Types import Crypto.PubKey.ECC.Types import Crypto.PubKey.ECC.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 :: MonadRandom m => Curve -- ^ Elliptic Curve -> m (PublicKey, PrivateKey) generate curve = do d <- generateBetween 1 (n - 1) let q = generateQ curve d return (PublicKey curve q, PrivateKey curve d) where n = ecc_n $ common_curve curve