diff options
Diffstat (limited to 'android_bcprov/src/main/java/com/android/org/bouncycastle/crypto/generators/DHKeyGeneratorHelper.java')
-rw-r--r-- | android_bcprov/src/main/java/com/android/org/bouncycastle/crypto/generators/DHKeyGeneratorHelper.java | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/android_bcprov/src/main/java/com/android/org/bouncycastle/crypto/generators/DHKeyGeneratorHelper.java b/android_bcprov/src/main/java/com/android/org/bouncycastle/crypto/generators/DHKeyGeneratorHelper.java new file mode 100644 index 00000000..f4d42afa --- /dev/null +++ b/android_bcprov/src/main/java/com/android/org/bouncycastle/crypto/generators/DHKeyGeneratorHelper.java @@ -0,0 +1,68 @@ +/* GENERATED SOURCE. DO NOT MODIFY. */ +package com.android.org.bouncycastle.crypto.generators; + +import java.math.BigInteger; +import java.security.SecureRandom; + +import com.android.org.bouncycastle.crypto.params.DHParameters; +import com.android.org.bouncycastle.math.ec.WNafUtil; +import com.android.org.bouncycastle.util.BigIntegers; + +class DHKeyGeneratorHelper +{ + static final DHKeyGeneratorHelper INSTANCE = new DHKeyGeneratorHelper(); + + private static final BigInteger ONE = BigInteger.valueOf(1); + private static final BigInteger TWO = BigInteger.valueOf(2); + + private DHKeyGeneratorHelper() + { + } + + BigInteger calculatePrivate(DHParameters dhParams, SecureRandom random) + { + int limit = dhParams.getL(); + + if (limit != 0) + { + int minWeight = limit >>> 2; + for (;;) + { + BigInteger x = new BigInteger(limit, random).setBit(limit - 1); + if (WNafUtil.getNafWeight(x) >= minWeight) + { + return x; + } + } + } + + BigInteger min = TWO; + int m = dhParams.getM(); + if (m != 0) + { + min = ONE.shiftLeft(m - 1); + } + + BigInteger q = dhParams.getQ(); + if (q == null) + { + q = dhParams.getP(); + } + BigInteger max = q.subtract(TWO); + + int minWeight = max.bitLength() >>> 2; + for (;;) + { + BigInteger x = BigIntegers.createRandomInRange(min, max, random); + if (WNafUtil.getNafWeight(x) >= minWeight) + { + return x; + } + } + } + + BigInteger calculatePublic(DHParameters dhParams, BigInteger x) + { + return dhParams.getG().modPow(x, dhParams.getP()); + } +} |