blob: cb3b17283a6c7ef79dafecdd23a67b244d431102 [file] [log] [blame]
package org.bouncycastle.jce.provider;
import java.math.BigInteger;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidParameterException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.SecureRandom;
import java.security.spec.AlgorithmParameterSpec;
import java.security.spec.DSAParameterSpec;
import java.security.spec.ECField;
import java.security.spec.ECFieldF2m;
import java.security.spec.ECFieldFp;
import java.security.spec.ECGenParameterSpec;
import java.security.spec.RSAKeyGenParameterSpec;
import java.util.Hashtable;
import javax.crypto.spec.DHParameterSpec;
import org.bouncycastle.asn1.cryptopro.CryptoProObjectIdentifiers;
// BEGIN android-removed
// import org.bouncycastle.asn1.cryptopro.ECGOST3410NamedCurves;
// import org.bouncycastle.asn1.nist.NISTNamedCurves;
// import org.bouncycastle.asn1.sec.SECNamedCurves;
// import org.bouncycastle.asn1.x9.X962NamedCurves;
// import org.bouncycastle.asn1.x9.X9ECParameters;
// END android-removed
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
import org.bouncycastle.crypto.generators.DHBasicKeyPairGenerator;
import org.bouncycastle.crypto.generators.DHParametersGenerator;
import org.bouncycastle.crypto.generators.DSAKeyPairGenerator;
import org.bouncycastle.crypto.generators.DSAParametersGenerator;
// BEGIN android-removed
// import org.bouncycastle.crypto.generators.ECKeyPairGenerator;
// import org.bouncycastle.crypto.generators.ElGamalKeyPairGenerator;
// import org.bouncycastle.crypto.generators.ElGamalParametersGenerator;
// import org.bouncycastle.crypto.generators.GOST3410KeyPairGenerator;
// END android-removed
import org.bouncycastle.crypto.generators.RSAKeyPairGenerator;
import org.bouncycastle.crypto.params.*;
// BEGIN android-removed
// import org.bouncycastle.jce.spec.ECNamedCurveParameterSpec;
// import org.bouncycastle.jce.spec.ECNamedCurveSpec;
// import org.bouncycastle.jce.spec.ECParameterSpec;
// import org.bouncycastle.jce.spec.ElGamalParameterSpec;
// import org.bouncycastle.jce.spec.GOST3410ParameterSpec;
// import org.bouncycastle.jce.spec.GOST3410PublicKeyParameterSetSpec;
// import org.bouncycastle.math.ec.ECCurve;
// import org.bouncycastle.math.ec.ECFieldElement;
// import org.bouncycastle.math.ec.ECPoint;
// END android-removed
public abstract class JDKKeyPairGenerator
extends KeyPairGenerator
{
public JDKKeyPairGenerator(
String algorithmName)
{
super(algorithmName);
}
public abstract void initialize(int strength, SecureRandom random);
public abstract KeyPair generateKeyPair();
public static class RSA
extends JDKKeyPairGenerator
{
final static BigInteger defaultPublicExponent = BigInteger.valueOf(0x10001);
final static int defaultTests = 8;
RSAKeyGenerationParameters param;
RSAKeyPairGenerator engine;
public RSA()
{
super("RSA");
engine = new RSAKeyPairGenerator();
param = new RSAKeyGenerationParameters(defaultPublicExponent,
new SecureRandom(), 2048, defaultTests);
engine.init(param);
}
public void initialize(
int strength,
SecureRandom random)
{
param = new RSAKeyGenerationParameters(defaultPublicExponent,
random, strength, defaultTests);
engine.init(param);
}
public void initialize(
AlgorithmParameterSpec params,
SecureRandom random)
throws InvalidAlgorithmParameterException
{
if (!(params instanceof RSAKeyGenParameterSpec))
{
throw new InvalidAlgorithmParameterException("parameter object not a RSAKeyGenParameterSpec");
}
RSAKeyGenParameterSpec rsaParams = (RSAKeyGenParameterSpec)params;
param = new RSAKeyGenerationParameters(
rsaParams.getPublicExponent(),
random, rsaParams.getKeysize(), defaultTests);
engine.init(param);
}
public KeyPair generateKeyPair()
{
AsymmetricCipherKeyPair pair = engine.generateKeyPair();
RSAKeyParameters pub = (RSAKeyParameters)pair.getPublic();
RSAPrivateCrtKeyParameters priv = (RSAPrivateCrtKeyParameters)pair.getPrivate();
return new KeyPair(new JCERSAPublicKey(pub),
new JCERSAPrivateCrtKey(priv));
}
}
public static class DH
extends JDKKeyPairGenerator
{
DHKeyGenerationParameters param;
DHBasicKeyPairGenerator engine = new DHBasicKeyPairGenerator();
int strength = 1024;
int certainty = 20;
SecureRandom random = new SecureRandom();
boolean initialised = false;
public DH()
{
super("DH");
}
public void initialize(
int strength,
SecureRandom random)
{
this.strength = strength;
this.random = random;
}
public void initialize(
AlgorithmParameterSpec params,
SecureRandom random)
throws InvalidAlgorithmParameterException
{
if (!(params instanceof DHParameterSpec))
{
throw new InvalidAlgorithmParameterException("parameter object not a DHParameterSpec");
}
DHParameterSpec dhParams = (DHParameterSpec)params;
param = new DHKeyGenerationParameters(random, new DHParameters(dhParams.getP(), dhParams.getG()));
engine.init(param);
initialised = true;
}
public KeyPair generateKeyPair()
{
if (!initialised)
{
DHParametersGenerator pGen = new DHParametersGenerator();
pGen.init(strength, certainty, random);
param = new DHKeyGenerationParameters(random, pGen.generateParameters());
engine.init(param);
initialised = true;
}
AsymmetricCipherKeyPair pair = engine.generateKeyPair();
DHPublicKeyParameters pub = (DHPublicKeyParameters)pair.getPublic();
DHPrivateKeyParameters priv = (DHPrivateKeyParameters)pair.getPrivate();
return new KeyPair(new JCEDHPublicKey(pub),
new JCEDHPrivateKey(priv));
}
}
public static class DSA
extends JDKKeyPairGenerator
{
DSAKeyGenerationParameters param;
DSAKeyPairGenerator engine = new DSAKeyPairGenerator();
int strength = 1024;
int certainty = 20;
SecureRandom random = new SecureRandom();
boolean initialised = false;
public DSA()
{
super("DSA");
}
public void initialize(
int strength,
SecureRandom random)
{
this.strength = strength;
this.random = random;
}
public void initialize(
AlgorithmParameterSpec params,
SecureRandom random)
throws InvalidAlgorithmParameterException
{
if (!(params instanceof DSAParameterSpec))
{
throw new InvalidAlgorithmParameterException("parameter object not a DSAParameterSpec");
}
DSAParameterSpec dsaParams = (DSAParameterSpec)params;
param = new DSAKeyGenerationParameters(random, new DSAParameters(dsaParams.getP(), dsaParams.getQ(), dsaParams.getG()));
engine.init(param);
initialised = true;
}
public KeyPair generateKeyPair()
{
if (!initialised)
{
DSAParametersGenerator pGen = new DSAParametersGenerator();
pGen.init(strength, certainty, random);
param = new DSAKeyGenerationParameters(random, pGen.generateParameters());
engine.init(param);
initialised = true;
}
AsymmetricCipherKeyPair pair = engine.generateKeyPair();
DSAPublicKeyParameters pub = (DSAPublicKeyParameters)pair.getPublic();
DSAPrivateKeyParameters priv = (DSAPrivateKeyParameters)pair.getPrivate();
return new KeyPair(new JDKDSAPublicKey(pub),
new JDKDSAPrivateKey(priv));
}
}
// BEGIN android-removed
// public static class ElGamal
// extends JDKKeyPairGenerator
// {
// ElGamalKeyGenerationParameters param;
// ElGamalKeyPairGenerator engine = new ElGamalKeyPairGenerator();
// int strength = 1024;
// int certainty = 20;
// SecureRandom random = new SecureRandom();
// boolean initialised = false;
//
// public ElGamal()
// {
// super("ElGamal");
// }
//
// public void initialize(
// int strength,
// SecureRandom random)
// {
// this.strength = strength;
// this.random = random;
// }
//
// public void initialize(
// AlgorithmParameterSpec params,
// SecureRandom random)
// throws InvalidAlgorithmParameterException
// {
// if (!(params instanceof ElGamalParameterSpec) && !(params instanceof DHParameterSpec))
// {
// throw new InvalidAlgorithmParameterException("parameter object not a DHParameterSpec or an ElGamalParameterSpec");
// }
//
// if (params instanceof ElGamalParameterSpec)
// {
// ElGamalParameterSpec elParams = (ElGamalParameterSpec)params;
//
// param = new ElGamalKeyGenerationParameters(random, new ElGamalParameters(elParams.getP(), elParams.getG()));
// }
// else
// {
// DHParameterSpec dhParams = (DHParameterSpec)params;
//
// param = new ElGamalKeyGenerationParameters(random, new ElGamalParameters(dhParams.getP(), dhParams.getG()));
// }
//
// engine.init(param);
// initialised = true;
// }
//
// public KeyPair generateKeyPair()
// {
// if (!initialised)
// {
// ElGamalParametersGenerator pGen = new ElGamalParametersGenerator();
//
// pGen.init(strength, certainty, random);
// param = new ElGamalKeyGenerationParameters(random, pGen.generateParameters());
// engine.init(param);
// initialised = true;
// }
//
// AsymmetricCipherKeyPair pair = engine.generateKeyPair();
// ElGamalPublicKeyParameters pub = (ElGamalPublicKeyParameters)pair.getPublic();
// ElGamalPrivateKeyParameters priv = (ElGamalPrivateKeyParameters)pair.getPrivate();
//
// return new KeyPair(new JCEElGamalPublicKey(pub),
// new JCEElGamalPrivateKey(priv));
// }
// }
//
// public static class GOST3410
// extends JDKKeyPairGenerator
// {
// GOST3410KeyGenerationParameters param;
// GOST3410KeyPairGenerator engine = new GOST3410KeyPairGenerator();
// GOST3410ParameterSpec gost3410Params;
// int strength = 1024;
// SecureRandom random = null;
// boolean initialised = false;
//
// public GOST3410()
// {
// super("GOST3410");
// }
//
// public void initialize(
// int strength,
// SecureRandom random)
// {
// this.strength = strength;
// this.random = random;
// }
//
// private void init(
// GOST3410ParameterSpec gParams,
// SecureRandom random)
// {
// GOST3410PublicKeyParameterSetSpec spec = gParams.getPublicKeyParameters();
//
// param = new GOST3410KeyGenerationParameters(random, new GOST3410Parameters(spec.getP(), spec.getQ(), spec.getA()));
//
// engine.init(param);
//
// initialised = true;
// gost3410Params = gParams;
// }
//
// public void initialize(
// AlgorithmParameterSpec params,
// SecureRandom random)
// throws InvalidAlgorithmParameterException
// {
// if (!(params instanceof GOST3410ParameterSpec))
// {
// throw new InvalidAlgorithmParameterException("parameter object not a GOST3410ParameterSpec");
// }
//
// init((GOST3410ParameterSpec)params, random);
// }
//
// public KeyPair generateKeyPair()
// {
// if (!initialised)
// {
// init(new GOST3410ParameterSpec(CryptoProObjectIdentifiers.gostR3410_94_CryptoPro_A.getId()), new SecureRandom());
// }
//
// AsymmetricCipherKeyPair pair = engine.generateKeyPair();
// GOST3410PublicKeyParameters pub = (GOST3410PublicKeyParameters)pair.getPublic();
// GOST3410PrivateKeyParameters priv = (GOST3410PrivateKeyParameters)pair.getPrivate();
//
// return new KeyPair(new JDKGOST3410PublicKey(pub, gost3410Params), new JDKGOST3410PrivateKey(priv, gost3410Params));
// }
// }
//
// public static class EC
// extends JDKKeyPairGenerator
// {
// ECKeyGenerationParameters param;
// ECKeyPairGenerator engine = new ECKeyPairGenerator();
// Object ecParams = null;
// int strength = 239;
// int certainty = 50;
// SecureRandom random = new SecureRandom();
// boolean initialised = false;
// String algorithm;
//
// static private Hashtable ecParameters;
//
// static {
// ecParameters = new Hashtable();
//
// ecParameters.put(new Integer(192), new ECGenParameterSpec("prime192v1"));
// ecParameters.put(new Integer(239), new ECGenParameterSpec("prime239v1"));
// ecParameters.put(new Integer(256), new ECGenParameterSpec("prime256v1"));
// }
//
// public EC()
// {
// super("EC");
// this.algorithm = "EC";
// }
//
// public EC(
// String algorithm)
// {
// super(algorithm);
// this.algorithm = algorithm;
// }
//
// public void initialize(
// int strength,
// SecureRandom random)
// {
// this.strength = strength;
// this.random = random;
// this.ecParams = (ECGenParameterSpec)ecParameters.get(new Integer(strength));
//
// if (ecParams != null)
// {
// try
// {
// initialize((ECGenParameterSpec)ecParams, random);
// }
// catch (InvalidAlgorithmParameterException e)
// {
// throw new InvalidParameterException("key size not configurable.");
// }
// }
// else
// {
// throw new InvalidParameterException("unknown key size.");
// }
// }
//
// public void initialize(
// AlgorithmParameterSpec params,
// SecureRandom random)
// throws InvalidAlgorithmParameterException
// {
// if (params instanceof ECParameterSpec)
// {
// ECParameterSpec p = (ECParameterSpec)params;
// this.ecParams = params;
//
// param = new ECKeyGenerationParameters(new ECDomainParameters(p.getCurve(), p.getG(), p.getN()), random);
//
// engine.init(param);
// initialised = true;
// }
// else if (params instanceof java.security.spec.ECParameterSpec)
// {
// java.security.spec.ECParameterSpec p = (java.security.spec.ECParameterSpec)params;
// this.ecParams = params;
//
// ECCurve curve;
// ECPoint g;
// ECField field = p.getCurve().getField();
//
// if (field instanceof ECFieldFp)
// {
// curve = new ECCurve.Fp(((ECFieldFp)p.getCurve().getField()).getP(), p.getCurve().getA(), p.getCurve().getB());
// g = new ECPoint.Fp(curve, new ECFieldElement.Fp(((ECCurve.Fp)curve).getQ(), p.getGenerator().getAffineX()), new ECFieldElement.Fp(((ECCurve.Fp)curve).getQ(), p.getGenerator().getAffineY()));
// }
// else
// {
// ECFieldF2m fieldF2m = (ECFieldF2m)field;
// int m = fieldF2m.getM();
// int ks[] = ECUtil.convertMidTerms(fieldF2m.getMidTermsOfReductionPolynomial());
// curve = new ECCurve.F2m(m, ks[0], ks[1], ks[2], p.getCurve().getA(), p.getCurve().getB());
// g = new ECPoint.F2m(curve, new ECFieldElement.F2m(m, ks[0], ks[1], ks[2], p.getGenerator().getAffineX()), new ECFieldElement.F2m(m, ks[0], ks[1], ks[2], p.getGenerator().getAffineY()), false);
// }
// param = new ECKeyGenerationParameters(new ECDomainParameters(curve, g, p.getOrder(), BigInteger.valueOf(p.getCofactor())), random);
//
// engine.init(param);
// initialised = true;
// }
// else if (params instanceof ECGenParameterSpec)
// {
// if (this.algorithm.equals("ECGOST3410"))
// {
// ECDomainParameters ecP = ECGOST3410NamedCurves.getByName(((ECGenParameterSpec)params).getName());
// if (ecP == null)
// {
// throw new InvalidAlgorithmParameterException("unknown curve name: " + ((ECGenParameterSpec)params).getName());
// }
//
// this.ecParams = new ECNamedCurveParameterSpec(
// ((ECGenParameterSpec)params).getName(),
// ecP.getCurve(),
// ecP.getG(),
// ecP.getN(),
// ecP.getH(),
// ecP.getSeed());
// }
// else
// {
// X9ECParameters ecP = X962NamedCurves.getByName(((ECGenParameterSpec)params).getName());
// if (ecP == null)
// {
// ecP = SECNamedCurves.getByName(((ECGenParameterSpec)params).getName());
// if (ecP == null)
// {
// ecP = NISTNamedCurves.getByName(((ECGenParameterSpec)params).getName());
// }
// if (ecP == null)
// {
// throw new InvalidAlgorithmParameterException("unknown curve name: " + ((ECGenParameterSpec)params).getName());
// }
// }
//
// this.ecParams = new ECNamedCurveSpec(
// ((ECGenParameterSpec)params).getName(),
// ecP.getCurve(),
// ecP.getG(),
// ecP.getN(),
// ecP.getH(),
// ecP.getSeed());
// }
//
// java.security.spec.ECParameterSpec p = (java.security.spec.ECParameterSpec)ecParams;
// ECCurve curve;
// ECPoint g;
// ECField field = p.getCurve().getField();
//
// if (field instanceof ECFieldFp)
// {
// curve = new ECCurve.Fp(((ECFieldFp)p.getCurve().getField()).getP(), p.getCurve().getA(), p.getCurve().getB());
// g = new ECPoint.Fp(curve, new ECFieldElement.Fp(((ECCurve.Fp)curve).getQ(), p.getGenerator().getAffineX()), new ECFieldElement.Fp(((ECCurve.Fp)curve).getQ(), p.getGenerator().getAffineY()));
// }
// else
// {
// ECFieldF2m fieldF2m = (ECFieldF2m)field;
// int m = fieldF2m.getM();
// int ks[] = ECUtil.convertMidTerms(fieldF2m.getMidTermsOfReductionPolynomial());
// curve = new ECCurve.F2m(m, ks[0], ks[1], ks[2], p.getCurve().getA(), p.getCurve().getB());
// g = new ECPoint.F2m(curve, new ECFieldElement.F2m(m, ks[0], ks[1], ks[2], p.getGenerator().getAffineX()), new ECFieldElement.F2m(m, ks[0], ks[1], ks[2], p.getGenerator().getAffineY()), false);
// }
//
// param = new ECKeyGenerationParameters(new ECDomainParameters(curve, g, p.getOrder(), BigInteger.valueOf(p.getCofactor())), random);
//
// engine.init(param);
// initialised = true;
// }
// else
// {
// throw new InvalidAlgorithmParameterException("parameter object not a ECParameterSpec");
// }
// }
//
// public KeyPair generateKeyPair()
// {
// if (!initialised)
// {
// throw new IllegalStateException("EC Key Pair Generator not initialised");
// }
//
// AsymmetricCipherKeyPair pair = engine.generateKeyPair();
// ECPublicKeyParameters pub = (ECPublicKeyParameters)pair.getPublic();
// ECPrivateKeyParameters priv = (ECPrivateKeyParameters)pair.getPrivate();
//
// if (ecParams instanceof ECParameterSpec)
// {
// ECParameterSpec p = (ECParameterSpec)ecParams;
//
// return new KeyPair(new JCEECPublicKey(algorithm, pub, p),
// new JCEECPrivateKey(algorithm, priv, p));
// }
// else
// {
// java.security.spec.ECParameterSpec p = (java.security.spec.ECParameterSpec)ecParams;
//
// return new KeyPair(new JCEECPublicKey(algorithm, pub, p), new JCEECPrivateKey(algorithm, priv, p));
// }
// }
// }
//
// public static class ECDSA
// extends EC
// {
// public ECDSA()
// {
// super("ECDSA");
// }
// }
//
// public static class ECGOST3410
// extends EC
// {
// public ECGOST3410()
// {
// super("ECGOST3410");
// }
// }
//
// public static class ECDH
// extends EC
// {
// public ECDH()
// {
// super("ECDH");
// }
// }
//
// public static class ECDHC
// extends EC
// {
// public ECDHC()
// {
// super("ECDHC");
// }
// }
// END android-removed
}