| 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(Integer.valueOf(192), new ECGenParameterSpec("prime192v1")); |
| // ecParameters.put(Integer.valueOf(239), new ECGenParameterSpec("prime239v1")); |
| // ecParameters.put(Integer.valueOf(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(Integer.valueOf(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 |
| } |