summaryrefslogtreecommitdiff
path: root/gnu/javax/crypto/key/dh/GnuDHKeyPairGenerator.java
diff options
context:
space:
mode:
authorCasey Marshall <csm@gnu.org>2006-04-22 17:57:18 +0000
committerCasey Marshall <csm@gnu.org>2006-04-22 17:57:18 +0000
commitb533ee3377a19da635e4f89efe1938597b5e5af0 (patch)
tree49c70e68b04b77045c84e409757cf321529ace7f /gnu/javax/crypto/key/dh/GnuDHKeyPairGenerator.java
parenta4afaf34e4de7767915b42800c78b70e5c2e7753 (diff)
downloadclasspath-b533ee3377a19da635e4f89efe1938597b5e5af0.tar.gz
2006-04-22 Casey Marshall <csm@gnu.org>
Fixes PR classpath/27228. * gnu/javax/crypto/jce/sig/DHKeyPairGeneratorSpi.java (initialize): also accept `DHParameterSpec.' * gnu/javax/crypto/key/dh/GnuDHKeyPairGenerator.java (setup): handle a passed-in `DHParameterSpec' properly. (generate): don't check if the random exponent is less than `q - 1' if no `q' was specified.
Diffstat (limited to 'gnu/javax/crypto/key/dh/GnuDHKeyPairGenerator.java')
-rw-r--r--gnu/javax/crypto/key/dh/GnuDHKeyPairGenerator.java21
1 files changed, 18 insertions, 3 deletions
diff --git a/gnu/javax/crypto/key/dh/GnuDHKeyPairGenerator.java b/gnu/javax/crypto/key/dh/GnuDHKeyPairGenerator.java
index eafc8d01c..5626a2979 100644
--- a/gnu/javax/crypto/key/dh/GnuDHKeyPairGenerator.java
+++ b/gnu/javax/crypto/key/dh/GnuDHKeyPairGenerator.java
@@ -187,9 +187,19 @@ public class GnuDHKeyPairGenerator implements IKeyPairGenerator
}
else if (params instanceof DHParameterSpec)
{
+ // FIXME: I'm not sure this is correct. It seems to behave the
+ // same way as Sun's RI, but I don't know if this behavior is
+ // documented anywhere.
DHParameterSpec jceSpec = (DHParameterSpec) params;
- l = jceSpec.getP().bitLength();
+ p = jceSpec.getP();
+ g = jceSpec.getG();
+ l = p.bitLength();
m = jceSpec.getL();
+
+ // If no exponent size was given, generate an exponent as
+ // large as the prime.
+ if (m == 0)
+ m = l;
}
else
{
@@ -242,7 +252,12 @@ public class GnuDHKeyPairGenerator implements IKeyPairGenerator
}
// generate a private number x of length m such as: 1 < x < q - 1
- BigInteger q_minus_1 = q.subtract(BigInteger.ONE);
+ BigInteger q_minus_1 = null;
+ if (q != null)
+ q_minus_1 = q.subtract(BigInteger.ONE);
+
+ // We already check if m is modulo 8 in `setup.' This could just
+ // be m >>> 3.
byte[] mag = new byte[(m + 7) / 8];
BigInteger x;
while (true)
@@ -250,7 +265,7 @@ public class GnuDHKeyPairGenerator implements IKeyPairGenerator
nextRandomBytes(mag);
x = new BigInteger(1, mag);
if (x.bitLength() == m && x.compareTo(BigInteger.ONE) > 0
- && x.compareTo(q_minus_1) < 0)
+ && (q_minus_1 == null || x.compareTo(q_minus_1) < 0))
{
break;
}