1:
37:
38:
39: package ;
40:
41: import ;
42: import ;
43: import ;
44: import ;
45: import ;
46: import ;
47: import ;
48: import ;
49: import ;
50: import ;
51: import ;
52: import ;
53: import ;
54: import ;
55:
56: public class DSAKeyPairGenerator extends KeyPairGeneratorSpi
57: implements java.security.interfaces.DSAKeyPairGenerator
58: {
59: int keysize;
60: SecureRandom random;
61: private BigInteger q = null;
62: private BigInteger p = null;
63: private BigInteger g = null;
64:
65: public DSAKeyPairGenerator()
66: {
67: keysize = 1024;
68: getDefaults ();
69: }
70:
71: public void initialize(int keysize, SecureRandom random)
72: {
73: initialize (keysize, false, random);
74: }
75:
76: public void initialize(AlgorithmParameterSpec params,
77: SecureRandom random)
78: throws InvalidAlgorithmParameterException
79: {
80: if( !( params instanceof DSAParameterSpec ) )
81: throw new InvalidAlgorithmParameterException("Must be DSAParameterSpec");
82:
83: try
84: {
85: initialize ((DSAParams) params, random);
86: }
87: catch (InvalidParameterException ipe)
88: {
89: InvalidAlgorithmParameterException iape =
90: new InvalidAlgorithmParameterException();
91: iape.initCause (ipe);
92: throw iape;
93: }
94: }
95:
96: public void initialize (DSAParams params, SecureRandom random)
97: {
98: DSAParameterSpec dsaparameterspec = (DSAParameterSpec)params;
99: if (dsaparameterspec.getP() == null
100: || dsaparameterspec.getQ() == null
101: || dsaparameterspec.getG() == null)
102: {
103: throw new InvalidParameterException ("none of p, q, or g may be null");
104: }
105: p = dsaparameterspec.getP();
106: q = dsaparameterspec.getQ();
107: g = dsaparameterspec.getG();
108: this.random = random;
109: }
110:
111: public void initialize(int modlen, boolean genParams, SecureRandom random)
112: throws InvalidParameterException
113: {
114: if( ((modlen % 64) != 0) || (modlen < 512) || (modlen > 1024) )
115: throw new InvalidParameterException();
116:
117: this.keysize = modlen;
118: this.random = random;
119: if (this.random == null)
120: {
121: this.random = new SecureRandom ();
122: }
123: if (genParams)
124: {
125: try
126: {
127: AlgorithmParameterGenerator apgDSA = AlgorithmParameterGenerator.getInstance("DSA");
128: apgDSA.init (modlen, random);
129: AlgorithmParameters apDSA = apgDSA.generateParameters();
130: DSAParameterSpec dsaparameterspec = (DSAParameterSpec)apDSA.getParameterSpec( DSAParameterSpec.class );
131: p = dsaparameterspec.getP();
132: q = dsaparameterspec.getQ();
133: g = dsaparameterspec.getG();
134: }
135: catch (NoSuchAlgorithmException nsae)
136: {
137: InvalidParameterException ipe =
138: new InvalidParameterException ("can't generate DSA parameters");
139: ipe.initCause (nsae);
140: throw ipe;
141: }
142: catch (InvalidParameterSpecException ipse)
143: {
144: InvalidParameterException ipe =
145: new InvalidParameterException ("can't generate DSA parameters");
146: ipe.initCause (ipse);
147: throw ipe;
148: }
149: }
150: else if (!getDefaults ())
151: {
152: throw new InvalidParameterException ("unsupported key size: " + modlen);
153: }
154: }
155:
156: public KeyPair generateKeyPair()
157: {
158: if (random == null)
159: {
160: random = new SecureRandom ();
161: }
162:
163: BigInteger x = new BigInteger( 159, random );
164:
165: BigInteger y = g.modPow( x, p );
166:
167: return new KeyPair( new GnuDSAPublicKey(y,p,q,g), new GnuDSAPrivateKey(x,p,q,g));
168:
169: }
170:
171:
172:
173: private boolean getDefaults()
174: {
175: if( keysize == 512) {
176: p = new BigInteger("fca682ce8e12caba26efccf7110e526db078b05edecbcd1eb4a208f3ae1617ae01f35b91a47e6df63413c5e12ed0899bcd132acd50d99151bdc43ee737592e17", 16);
177: q = new BigInteger("962eddcc369cba8ebb260ee6b6a126d9346e38c5", 16);
178: g = new BigInteger("678471b27a9cf44ee91a49c5147db1a9aaf244f05a434d6486931d2d14271b9e35030b71fd73da179069b32e2935630e1c2062354d0da20a6c416e50be794ca4", 16);
179: return true;
180: } else if( keysize == 768) {
181: p = new BigInteger("e9e642599d355f37c97ffd3567120b8e25c9cd43e927b3a9670fbec5d890141922d2c3b3ad2480093799869d1e846aab49fab0ad26d2ce6a22219d470bce7d777d4a21fbe9c270b57f607002f3cef8393694cf45ee3688c11a8c56ab127a3daf", 16);
182: q = new BigInteger("9cdbd84c9f1ac2f38d0f80f42ab952e7338bf511", 16);
183: g = new BigInteger("30470ad5a005fb14ce2d9dcd87e38bc7d1b1c5facbaecbe95f190aa7a31d23c4dbbcbe06174544401a5b2c020965d8c2bd2171d3668445771f74ba084d2029d83c1c158547f3a9f1a2715be23d51ae4d3e5a1f6a7064f316933a346d3f529252", 16);
184: return true;
185: } else if( keysize == 1024) {
186: p = new BigInteger("fd7f53811d75122952df4a9c2eece4e7f611b7523cef4400c31e3f80b6512669455d402251fb593d8d58fabfc5f5ba30f6cb9b556cd7813b801d346ff26660b76b9950a5a49f9fe8047b1022c24fbba9d7feb7c61bf83b57e7c6a8a6150f04fb83f6d3c51ec3023554135a169132f675f3ae2b61d72aeff22203199dd14801c7", 16);
187: q = new BigInteger("9760508f15230bccb292b982a2eb840bf0581cf5", 16);
188: g = new BigInteger("f7e1a085d69b3ddecbbcab5c36b857b97994afbbfa3aea82f9574c0b3d0782675159578ebad4594fe67107108180b449167123e84c281613b7cf09328cc8a6e13c167a8b547c8d28e0a3ae1e2bb3a675916ea37f0bfa213562f1fb627a01243bcca4f1bea8519089a883dfe15ae59f06928b665e807b552564014c3bfecf492a", 16);
189: return true;
190: }
191: return false;
192: }
193:
194: }