| package org.bouncycastle.crypto.generators; |
| |
| import java.math.BigInteger; |
| import java.security.SecureRandom; |
| |
| import org.bouncycastle.crypto.params.DHParameters; |
| import 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) |
| { |
| BigInteger p = dhParams.getP(); |
| int limit = dhParams.getL(); |
| |
| if (limit != 0) |
| { |
| return new BigInteger(limit, random).setBit(limit - 1); |
| } |
| |
| BigInteger min = TWO; |
| int m = dhParams.getM(); |
| if (m != 0) |
| { |
| min = ONE.shiftLeft(m - 1); |
| } |
| |
| BigInteger max = p.subtract(TWO); |
| BigInteger q = dhParams.getQ(); |
| if (q != null) |
| { |
| max = q.subtract(TWO); |
| } |
| |
| return BigIntegers.createRandomInRange(min, max, random); |
| } |
| |
| BigInteger calculatePublic(DHParameters dhParams, BigInteger x) |
| { |
| return dhParams.getG().modPow(x, dhParams.getP()); |
| } |
| } |