123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 |
- #if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
- using System;
- using Org.BouncyCastle.Math;
- using Org.BouncyCastle.Utilities;
- namespace Org.BouncyCastle.Crypto.Parameters
- {
- public class DHParameters
- : ICipherParameters
- {
- private const int DefaultMinimumLength = 160;
- private readonly BigInteger p, g, q, j;
- private readonly int m, l;
- private readonly DHValidationParameters validation;
- private static int GetDefaultMParam(
- int lParam)
- {
- if (lParam == 0)
- return DefaultMinimumLength;
- return System.Math.Min(lParam, DefaultMinimumLength);
- }
- 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, DefaultMinimumLength, 0, j, validation)
- {
- }
- public DHParameters(
- BigInteger p,
- BigInteger g,
- BigInteger q,
- int m,
- int l,
- BigInteger j,
- DHValidationParameters validation)
- {
- if (p == null)
- throw new ArgumentNullException("p");
- if (g == null)
- throw new ArgumentNullException("g");
- if (!p.TestBit(0))
- throw new ArgumentException("field must be an odd prime", "p");
- if (g.CompareTo(BigInteger.Two) < 0
- || g.CompareTo(p.Subtract(BigInteger.Two)) > 0)
- throw new ArgumentException("generator must in the range [2, p - 2]", "g");
- if (q != null && q.BitLength >= p.BitLength)
- throw new ArgumentException("q too big to be a factor of (p-1)", "q");
- if (m >= p.BitLength)
- throw new ArgumentException("m value must be < bitlength of p", "m");
- if (l != 0)
- {
- // TODO Check this against the Java version, which has 'l > p.BitLength' here
- if (l >= p.BitLength)
- throw new ArgumentException("when l value specified, it must be less than bitlength(p)", "l");
- if (l < m)
- throw new ArgumentException("when l value specified, it may not be less than m value", "l");
- }
- if (j != null && j.CompareTo(BigInteger.Two) < 0)
- throw new ArgumentException("subgroup factor must be >= 2", "j");
- // TODO If q, j both provided, validate p = jq + 1 ?
- this.p = p;
- this.g = g;
- this.q = q;
- this.m = m;
- this.l = l;
- this.j = j;
- this.validation = validation;
- }
- public BigInteger P
- {
- get { return p; }
- }
- public BigInteger G
- {
- get { return g; }
- }
- public BigInteger Q
- {
- get { return q; }
- }
- public BigInteger J
- {
- get { return j; }
- }
- /// <summary>The minimum bitlength of the private value.</summary>
- public int M
- {
- get { return m; }
- }
- /// <summary>The bitlength of the private value.</summary>
- public int L
- {
- get { return l; }
- }
- public DHValidationParameters ValidationParameters
- {
- get { return validation; }
- }
- public override bool Equals(
- object obj)
- {
- if (obj == this)
- return true;
- DHParameters other = obj as DHParameters;
- if (other == null)
- return false;
- return Equals(other);
- }
- protected virtual bool Equals(
- DHParameters other)
- {
- return p.Equals(other.p)
- && g.Equals(other.g)
- && Org.BouncyCastle.Utilities.Platform.Equals(q, other.q);
- }
- public override int GetHashCode()
- {
- int hc = p.GetHashCode() ^ g.GetHashCode();
- if (q != null)
- {
- hc ^= q.GetHashCode();
- }
- return hc;
- }
- }
- }
- #endif
|