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