14c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompackage org.bouncycastle.jcajce.provider.asymmetric.dsa; 24c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 34c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.InvalidAlgorithmParameterException; 44c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.InvalidParameterException; 54c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.KeyPair; 64c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.SecureRandom; 74c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.spec.AlgorithmParameterSpec; 84c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.spec.DSAParameterSpec; 94c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.crypto.AsymmetricCipherKeyPair; 114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.crypto.generators.DSAKeyPairGenerator; 124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.crypto.generators.DSAParametersGenerator; 134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.crypto.params.DSAKeyGenerationParameters; 144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.crypto.params.DSAParameters; 154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.crypto.params.DSAPrivateKeyParameters; 164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.crypto.params.DSAPublicKeyParameters; 174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompublic class KeyPairGeneratorSpi 194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom extends java.security.KeyPairGenerator 204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom{ 214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom DSAKeyGenerationParameters param; 224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom DSAKeyPairGenerator engine = new DSAKeyPairGenerator(); 234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom int strength = 1024; 244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom int certainty = 20; 254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom SecureRandom random = new SecureRandom(); 264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom boolean initialised = false; 274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public KeyPairGeneratorSpi() 294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom super("DSA"); 314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public void initialize( 344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom int strength, 354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom SecureRandom random) 364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (strength < 512 || strength > 1024 || strength % 64 != 0) 384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throw new InvalidParameterException("strength must be from 512 - 1024 and a multiple of 64"); 404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom this.strength = strength; 434c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom this.random = random; 444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 454c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 464c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public void initialize( 474c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom AlgorithmParameterSpec params, 484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom SecureRandom random) 494c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throws InvalidAlgorithmParameterException 504c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 514c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (!(params instanceof DSAParameterSpec)) 524c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 534c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throw new InvalidAlgorithmParameterException("parameter object not a DSAParameterSpec"); 544c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 554c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom DSAParameterSpec dsaParams = (DSAParameterSpec)params; 564c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 574c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom param = new DSAKeyGenerationParameters(random, new DSAParameters(dsaParams.getP(), dsaParams.getQ(), dsaParams.getG())); 584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom engine.init(param); 604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom initialised = true; 614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 624c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 634c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public KeyPair generateKeyPair() 644c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (!initialised) 664c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 674c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom DSAParametersGenerator pGen = new DSAParametersGenerator(); 684c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 694c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom pGen.init(strength, certainty, random); 704c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom param = new DSAKeyGenerationParameters(random, pGen.generateParameters()); 714c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom engine.init(param); 724c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom initialised = true; 734c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 744c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 754c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom AsymmetricCipherKeyPair pair = engine.generateKeyPair(); 764c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom DSAPublicKeyParameters pub = (DSAPublicKeyParameters)pair.getPublic(); 774c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom DSAPrivateKeyParameters priv = (DSAPrivateKeyParameters)pair.getPrivate(); 784c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 794c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return new KeyPair(new BCDSAPublicKey(pub), 804c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom new BCDSAPrivateKey(priv)); 814c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 824c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom} 83