1package org.bouncycastle.crypto.generators;
2
3import java.math.BigInteger;
4import java.security.SecureRandom;
5
6import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
7import org.bouncycastle.crypto.AsymmetricCipherKeyPairGenerator;
8import org.bouncycastle.crypto.KeyGenerationParameters;
9import org.bouncycastle.crypto.params.ECDomainParameters;
10import org.bouncycastle.crypto.params.ECKeyGenerationParameters;
11import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
12import org.bouncycastle.crypto.params.ECPublicKeyParameters;
13import org.bouncycastle.math.ec.ECConstants;
14import org.bouncycastle.math.ec.ECPoint;
15
16public class ECKeyPairGenerator
17    implements AsymmetricCipherKeyPairGenerator, ECConstants
18{
19    ECDomainParameters  params;
20    SecureRandom        random;
21
22    public void init(
23        KeyGenerationParameters param)
24    {
25        ECKeyGenerationParameters  ecP = (ECKeyGenerationParameters)param;
26
27        this.random = ecP.getRandom();
28        this.params = ecP.getDomainParameters();
29    }
30
31    /**
32     * Given the domain parameters this routine generates an EC key
33     * pair in accordance with X9.62 section 5.2.1 pages 26, 27.
34     */
35    public AsymmetricCipherKeyPair generateKeyPair()
36    {
37        BigInteger n = params.getN();
38        int        nBitLength = n.bitLength();
39        BigInteger d;
40
41        do
42        {
43            d = new BigInteger(nBitLength, random);
44        }
45        while (d.equals(ZERO)  || (d.compareTo(n) >= 0));
46
47        ECPoint Q = params.getG().multiply(d);
48
49        return new AsymmetricCipherKeyPair(
50            new ECPublicKeyParameters(Q, params),
51            new ECPrivateKeyParameters(d, params));
52    }
53}
54