org.bouncycastle.tls.DefaultTlsDHConfigVerifier Maven / Gradle / Ivy
package org.bouncycastle.tls;
import java.math.BigInteger;
import java.util.Vector;
import org.bouncycastle.tls.crypto.DHGroup;
import org.bouncycastle.tls.crypto.DHStandardGroups;
import org.bouncycastle.tls.crypto.TlsDHConfig;
public class DefaultTlsDHConfigVerifier
implements TlsDHConfigVerifier
{
public static final int DEFAULT_MINIMUM_PRIME_BITS = 1024;
protected static final Vector DEFAULT_GROUPS = new Vector();
private static void addDefaultGroup(DHGroup dhParameters)
{
DEFAULT_GROUPS.addElement(TlsDHUtils.selectDHConfig(dhParameters));
}
static
{
addDefaultGroup(DHStandardGroups.rfc3526_1536);
addDefaultGroup(DHStandardGroups.rfc3526_2048);
addDefaultGroup(DHStandardGroups.rfc3526_3072);
addDefaultGroup(DHStandardGroups.rfc3526_4096);
addDefaultGroup(DHStandardGroups.rfc3526_6144);
addDefaultGroup(DHStandardGroups.rfc3526_8192);
addDefaultGroup(DHStandardGroups.rfc5996_768);
addDefaultGroup(DHStandardGroups.rfc5996_1024);
}
// Vector is (TlsDHConfig)
protected Vector groups;
protected int minimumPrimeBits;
/**
* Accept only various standard DH groups with 'P' at least {@link #DEFAULT_MINIMUM_PRIME_BITS} bits.
*/
public DefaultTlsDHConfigVerifier()
{
this(DEFAULT_MINIMUM_PRIME_BITS);
}
/**
* Accept only various standard DH groups with 'P' at least the specified number of bits.
*/
public DefaultTlsDHConfigVerifier(int minimumPrimeBits)
{
this(DEFAULT_GROUPS, minimumPrimeBits);
}
/**
* Specify a custom set of acceptable group parameters, and a minimum bitlength for 'P'
*
* @param groups a {@link Vector} of acceptable {@link TlsDHConfig}
*/
public DefaultTlsDHConfigVerifier(Vector groups, int minimumPrimeBits)
{
this.groups = groups;
this.minimumPrimeBits = minimumPrimeBits;
}
public boolean accept(TlsDHConfig dhConfig)
{
if (dhConfig.getExplicitPG()[0].bitLength() < getMinimumPrimeBits())
{
return false;
}
for (int i = 0; i < groups.size(); ++i)
{
if (areGroupsEqual(dhConfig, (TlsDHConfig)groups.elementAt(i)))
{
return true;
}
}
return false;
}
public int getMinimumPrimeBits()
{
return minimumPrimeBits;
}
protected boolean areGroupsEqual(TlsDHConfig a, TlsDHConfig b)
{
return a == b || (areParametersEqual(a.getExplicitPG(), b.getExplicitPG()));
}
protected boolean areParametersEqual(BigInteger[] pgA, BigInteger[] pgB)
{
return pgA == pgB || (areParametersEqual(pgA[0], pgB[0]) && areParametersEqual(pgA[1], pgB[1]));
}
protected boolean areParametersEqual(BigInteger a, BigInteger b)
{
return a == b || a.equals(b);
}
}