| package org.bouncycastle.crypto.params; |
| |
| import java.math.BigInteger; |
| |
| import org.bouncycastle.crypto.CipherParameters; |
| |
| public class DHParameters |
| implements CipherParameters |
| { |
| private static final int DEFAULT_MINIMUM_LENGTH = 160; |
| |
| // not final due to compiler bug in "simpler" JDKs |
| private BigInteger g; |
| private BigInteger p; |
| private BigInteger q; |
| private BigInteger j; |
| private int m; |
| private int l; |
| private DHValidationParameters validation; |
| |
| private static int getDefaultMParam( |
| int lParam) |
| { |
| if (lParam == 0) |
| { |
| return DEFAULT_MINIMUM_LENGTH; |
| } |
| |
| return lParam < DEFAULT_MINIMUM_LENGTH ? lParam : DEFAULT_MINIMUM_LENGTH; |
| } |
| |
| public DHParameters( |
| BigInteger p, |
| BigInteger g) |
| { |
| this(p, g, null, 0); |
| } |
| |
| public DHParameters( |
| BigInteger p, |
| BigInteger g, |
| BigInteger q) |
| { |
| this(p, g, q, 0); |
| } |
| |
| public DHParameters( |
| BigInteger p, |
| BigInteger g, |
| BigInteger q, |
| int l) |
| { |
| this(p, g, q, getDefaultMParam(l), l, null, null); |
| } |
| |
| public DHParameters( |
| BigInteger p, |
| BigInteger g, |
| BigInteger q, |
| int m, |
| int l) |
| { |
| this(p, g, q, m, l, null, null); |
| } |
| |
| public DHParameters( |
| BigInteger p, |
| BigInteger g, |
| BigInteger q, |
| BigInteger j, |
| DHValidationParameters validation) |
| { |
| this(p, g, q, DEFAULT_MINIMUM_LENGTH, 0, j, validation); |
| } |
| |
| public DHParameters( |
| BigInteger p, |
| BigInteger g, |
| BigInteger q, |
| int m, |
| int l, |
| BigInteger j, |
| DHValidationParameters validation) |
| { |
| if (l != 0) |
| { |
| BigInteger bigL = BigInteger.valueOf(2L ^ (l - 1)); |
| if (bigL.compareTo(p) == 1) |
| { |
| throw new IllegalArgumentException("when l value specified, it must satisfy 2^(l-1) <= p"); |
| } |
| if (l < m) |
| { |
| throw new IllegalArgumentException("when l value specified, it may not be less than m value"); |
| } |
| } |
| |
| this.g = g; |
| this.p = p; |
| this.q = q; |
| this.m = m; |
| this.l = l; |
| this.j = j; |
| this.validation = validation; |
| } |
| |
| public BigInteger getP() |
| { |
| return p; |
| } |
| |
| public BigInteger getG() |
| { |
| return g; |
| } |
| |
| public BigInteger getQ() |
| { |
| return q; |
| } |
| |
| /** |
| * Return the subgroup factor J. |
| * |
| * @return subgroup factor |
| */ |
| public BigInteger getJ() |
| { |
| return j; |
| } |
| |
| /** |
| * Return the minimum length of the private value. |
| * |
| * @return the minimum length of the private value in bits. |
| */ |
| public int getM() |
| { |
| return m; |
| } |
| |
| /** |
| * Return the private value length in bits - if set, zero otherwise |
| * |
| * @return the private value length in bits, zero otherwise. |
| */ |
| public int getL() |
| { |
| return l; |
| } |
| |
| public DHValidationParameters getValidationParameters() |
| { |
| return validation; |
| } |
| |
| public boolean equals( |
| Object obj) |
| { |
| if (!(obj instanceof DHParameters)) |
| { |
| return false; |
| } |
| |
| DHParameters pm = (DHParameters)obj; |
| |
| if (this.getQ() != null) |
| { |
| if (!this.getQ().equals(pm.getQ())) |
| { |
| return false; |
| } |
| } |
| else |
| { |
| if (pm.getQ() != null) |
| { |
| return false; |
| } |
| } |
| |
| return pm.getP().equals(p) && pm.getG().equals(g); |
| } |
| |
| public int hashCode() |
| { |
| return getP().hashCode() ^ getG().hashCode() ^ (getQ() != null ? getQ().hashCode() : 0); |
| } |
| } |