1 |
/* GnuDSAKeyPairGenerator.java --- Gnu DSA Key Pair Generator |
/* GnuDSAKeyPairGenerator.java --- Gnu DSA Key Pair Generator |
2 |
Copyright (C) 1999 Free Software Foundation, Inc. |
Copyright (C) 1999, 2005 Free Software Foundation, Inc. |
3 |
|
|
4 |
This file is part of GNU Classpath. |
This file is part of GNU Classpath. |
5 |
|
|
45 |
import java.security.InvalidParameterException; |
import java.security.InvalidParameterException; |
46 |
import java.security.KeyPair; |
import java.security.KeyPair; |
47 |
import java.security.KeyPairGeneratorSpi; |
import java.security.KeyPairGeneratorSpi; |
48 |
|
import java.security.NoSuchAlgorithmException; |
49 |
import java.security.SecureRandom; |
import java.security.SecureRandom; |
50 |
import java.security.interfaces.DSAParams; |
import java.security.interfaces.DSAParams; |
51 |
import java.security.spec.AlgorithmParameterSpec; |
import java.security.spec.AlgorithmParameterSpec; |
52 |
import java.security.spec.DSAParameterSpec; |
import java.security.spec.DSAParameterSpec; |
53 |
|
import java.security.spec.InvalidParameterSpecException; |
54 |
import java.util.Random; |
import java.util.Random; |
55 |
|
|
56 |
public class DSAKeyPairGenerator extends KeyPairGeneratorSpi |
public class DSAKeyPairGenerator extends KeyPairGeneratorSpi |
62 |
private BigInteger p = null; // the big prime |
private BigInteger p = null; // the big prime |
63 |
private BigInteger g = null; |
private BigInteger g = null; |
64 |
|
|
65 |
DSAKeyPairGenerator() |
public DSAKeyPairGenerator() |
66 |
{ |
{ |
67 |
keysize = 1024; |
keysize = 1024; |
68 |
|
getDefaults (); |
69 |
} |
} |
70 |
|
|
71 |
public void initialize(int keysize, SecureRandom random) |
public void initialize(int keysize, SecureRandom random) |
72 |
{ |
{ |
73 |
//if( ((keysize % 64) != 0) || (keysize < 512) || (keysize > 1024) ) |
initialize (keysize, false, random); |
|
// throw new InvalidAlgorithmParameterException("Invalid key size"); |
|
|
|
|
|
this.keysize = keysize; |
|
|
this.random = random; |
|
74 |
} |
} |
75 |
|
|
76 |
public void initialize(AlgorithmParameterSpec params, |
public void initialize(AlgorithmParameterSpec params, |
80 |
if( !( params instanceof DSAParameterSpec ) ) |
if( !( params instanceof DSAParameterSpec ) ) |
81 |
throw new InvalidAlgorithmParameterException("Must be DSAParameterSpec"); |
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; |
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(); |
p = dsaparameterspec.getP(); |
106 |
q = dsaparameterspec.getQ(); |
q = dsaparameterspec.getQ(); |
107 |
g = dsaparameterspec.getG(); |
g = dsaparameterspec.getG(); |
108 |
this.random = random; |
this.random = random; |
109 |
} |
} |
110 |
|
|
|
public void initialize(DSAParams params, SecureRandom random) |
|
|
throws InvalidParameterException |
|
|
{ |
|
|
if(params.getP() != null) |
|
|
p = params.getP(); |
|
|
else |
|
|
throw new InvalidParameterException(); |
|
|
|
|
|
if(params.getQ() != null) |
|
|
q = params.getQ(); |
|
|
else |
|
|
throw new InvalidParameterException(); |
|
|
|
|
|
if(params.getG() != null) |
|
|
g = params.getG(); |
|
|
else |
|
|
throw new InvalidParameterException(); |
|
|
|
|
|
this.random = random; |
|
|
} |
|
|
|
|
111 |
public void initialize(int modlen, boolean genParams, SecureRandom random) |
public void initialize(int modlen, boolean genParams, SecureRandom random) |
112 |
throws InvalidParameterException |
throws InvalidParameterException |
113 |
{ |
{ |
114 |
if( ((modlen % 64) != 0) || (modlen < 512) || (modlen > 1024) ) |
if( ((modlen % 64) != 0) || (modlen < 512) || (modlen > 1024) ) |
115 |
throw new InvalidParameterException(); |
throw new InvalidParameterException(); |
116 |
|
|
117 |
if( (genParams == false) && (modlen != 512) && (modlen != 768) && (modlen != 1024) ) |
this.keysize = keysize; |
118 |
throw new InvalidParameterException(); |
this.random = random; |
119 |
this.keysize = modlen; |
if (this.random == null) |
120 |
this.random = random; |
{ |
121 |
p = null; |
this.random = new SecureRandom (); |
122 |
q = null; |
} |
123 |
g = null; |
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() |
public KeyPair generateKeyPair() |
157 |
{ |
{ |
158 |
if( getDefaults() == false) { |
if (random == null) |
159 |
try { |
{ |
160 |
AlgorithmParameterGenerator apgDSA = AlgorithmParameterGenerator.getInstance("DSA"); |
random = new SecureRandom (); |
161 |
AlgorithmParameters apDSA = apgDSA.generateParameters(); |
} |
|
DSAParameterSpec dsaparameterspec = (DSAParameterSpec)apDSA.getParameterSpec( DSAParameterSpec.class ); |
|
|
p = dsaparameterspec.getP(); |
|
|
q = dsaparameterspec.getQ(); |
|
|
g = dsaparameterspec.getG(); |
|
|
} catch ( Exception e ) { |
|
|
return null; |
|
|
} |
|
|
} |
|
162 |
|
|
163 |
BigInteger x = new BigInteger( 159, new Random() ); |
BigInteger x = new BigInteger( 159, random ); |
164 |
|
|
165 |
BigInteger y = g.modPow( x, p ); |
BigInteger y = g.modPow( x, p ); |
166 |
|
|
181 |
p = new BigInteger("e9e642599d355f37c97ffd3567120b8e25c9cd43e927b3a9670fbec5d890141922d2c3b3ad2480093799869d1e846aab49fab0ad26d2ce6a22219d470bce7d777d4a21fbe9c270b57f607002f3cef8393694cf45ee3688c11a8c56ab127a3daf", 16); |
p = new BigInteger("e9e642599d355f37c97ffd3567120b8e25c9cd43e927b3a9670fbec5d890141922d2c3b3ad2480093799869d1e846aab49fab0ad26d2ce6a22219d470bce7d777d4a21fbe9c270b57f607002f3cef8393694cf45ee3688c11a8c56ab127a3daf", 16); |
182 |
q = new BigInteger("9cdbd84c9f1ac2f38d0f80f42ab952e7338bf511", 16); |
q = new BigInteger("9cdbd84c9f1ac2f38d0f80f42ab952e7338bf511", 16); |
183 |
g = new BigInteger("30470ad5a005fb14ce2d9dcd87e38bc7d1b1c5facbaecbe95f190aa7a31d23c4dbbcbe06174544401a5b2c020965d8c2bd2171d3668445771f74ba084d2029d83c1c158547f3a9f1a2715be23d51ae4d3e5a1f6a7064f316933a346d3f529252", 16); |
g = new BigInteger("30470ad5a005fb14ce2d9dcd87e38bc7d1b1c5facbaecbe95f190aa7a31d23c4dbbcbe06174544401a5b2c020965d8c2bd2171d3668445771f74ba084d2029d83c1c158547f3a9f1a2715be23d51ae4d3e5a1f6a7064f316933a346d3f529252", 16); |
184 |
} else if( keysize == 512) { |
} else if( keysize == 1024) { |
185 |
p = new BigInteger("fd7f53811d75122952df4a9c2eece4e7f611b7523cef4400c31e3f80b6512669455d402251fb593d8d58fabfc5f5ba30f6cb9b556cd7813b801d346ff26660b76b9950a5a49f9fe8047b1022c24fbba9d7feb7c61bf83b57e7c6a8a6150f04fb83f6d3c51ec3023554135a169132f675f3ae2b61d72aeff22203199dd14801c7", 16); |
p = new BigInteger("fd7f53811d75122952df4a9c2eece4e7f611b7523cef4400c31e3f80b6512669455d402251fb593d8d58fabfc5f5ba30f6cb9b556cd7813b801d346ff26660b76b9950a5a49f9fe8047b1022c24fbba9d7feb7c61bf83b57e7c6a8a6150f04fb83f6d3c51ec3023554135a169132f675f3ae2b61d72aeff22203199dd14801c7", 16); |
186 |
q = new BigInteger("9760508f15230bccb292b982a2eb840bf0581cf5", 16); |
q = new BigInteger("9760508f15230bccb292b982a2eb840bf0581cf5", 16); |
187 |
g = new BigInteger("f7e1a085d69b3ddecbbcab5c36b857b97994afbbfa3aea82f9574c0b3d0782675159578ebad4594fe67107108180b449167123e84c281613b7cf09328cc8a6e13c167a8b547c8d28e0a3ae1e2bb3a675916ea37f0bfa213562f1fb627a01243bcca4f1bea8519089a883dfe15ae59f06928b665e807b552564014c3bfecf492a", 16); |
g = new BigInteger("f7e1a085d69b3ddecbbcab5c36b857b97994afbbfa3aea82f9574c0b3d0782675159578ebad4594fe67107108180b449167123e84c281613b7cf09328cc8a6e13c167a8b547c8d28e0a3ae1e2bb3a675916ea37f0bfa213562f1fb627a01243bcca4f1bea8519089a883dfe15ae59f06928b665e807b552564014c3bfecf492a", 16); |