DHParametersHelper
class DHParametersHelper
using Org.BouncyCastle.Math;
using Org.BouncyCastle.Math.EC.Multiplier;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.Utilities;
using System;
namespace Org.BouncyCastle.Crypto.Generators
{
internal class DHParametersHelper
{
private static readonly int[][] primeLists = BigInteger.primeLists;
private static readonly int[] primeProducts = BigInteger.primeProducts;
private static readonly BigInteger[] BigPrimeProducts = Array.ConvertAll(primeProducts, BigInteger.ValueOf);
internal static BigInteger[] GenerateSafePrimes(int size, int certainty, SecureRandom random)
{
int num = size - 1;
int num2 = size >> 2;
BigInteger bigInteger;
BigInteger bigInteger2;
if (size > 32) {
while (true) {
bigInteger = new BigInteger(num, 0, random);
while (true) {
for (int i = 0; i < primeLists.Length; i++) {
int num3 = bigInteger.Remainder(BigPrimeProducts[i]).IntValue;
if (i == 0) {
int num4 = num3 % 3;
if (num4 != 2) {
int num5 = 2 * num4 + 2;
bigInteger = bigInteger.Add(BigInteger.ValueOf(num5));
num3 = (num3 + num5) % primeProducts[i];
}
}
int[] array = primeLists[i];
int num6 = 0;
while (num6 < array.Length) {
int num7 = array[num6];
int num8 = num3 % num7;
if (num8 != 0 && num8 != num7 >> 1) {
num6++;
continue;
}
goto IL_00cc;
}
}
break;
IL_00cc:
bigInteger = bigInteger.Add(BigInteger.Six);
}
if (bigInteger.BitLength == num && bigInteger.RabinMillerTest(2, random, true)) {
bigInteger2 = bigInteger.ShiftLeft(1).Add(BigInteger.One);
if (bigInteger2.RabinMillerTest(certainty, random, true) && (certainty <= 2 || bigInteger.RabinMillerTest(certainty - 2, random, true)) && WNafUtilities.GetNafWeight(bigInteger2) >= num2)
break;
}
}
} else {
do {
bigInteger = new BigInteger(num, 2, random);
bigInteger2 = bigInteger.ShiftLeft(1).Add(BigInteger.One);
} while (!bigInteger2.IsProbablePrime(certainty, true) || (certainty > 2 && !bigInteger.IsProbablePrime(certainty, true)));
}
return new BigInteger[2] {
bigInteger2,
bigInteger
};
}
internal static BigInteger SelectGenerator(BigInteger p, BigInteger q, SecureRandom random)
{
BigInteger max = p.Subtract(BigInteger.Two);
BigInteger bigInteger;
do {
bigInteger = BigIntegers.CreateRandomInRange(BigInteger.Two, max, random).Square().Mod(p);
} while (bigInteger.Equals(BigInteger.One));
return bigInteger;
}
}
}