ECDomainParameters
using Org.BouncyCastle.Asn1;
using Org.BouncyCastle.Asn1.X9;
using Org.BouncyCastle.Crypto.EC;
using Org.BouncyCastle.Math;
using Org.BouncyCastle.Math.EC;
using Org.BouncyCastle.Utilities;
using System;
namespace Org.BouncyCastle.Crypto.Parameters
{
public class ECDomainParameters
{
private readonly ECCurve m_curve;
private readonly ECPoint m_g;
private readonly BigInteger m_n;
private readonly BigInteger m_h;
private readonly byte[] m_seed;
private BigInteger m_hInv;
public ECCurve Curve => m_curve;
public ECPoint G => m_g;
public BigInteger N => m_n;
public BigInteger H => m_h;
public BigInteger HInv => Objects.EnsureSingletonInitialized(ref m_hInv, this, (ECDomainParameters self) => BigIntegers.ModOddInverseVar(self.N, self.H));
internal byte[] Seed => m_seed;
public static ECDomainParameters FromX962Parameters(X962Parameters x962Parameters)
{
if (x962Parameters.IsImplicitlyCA)
throw new NotImplementedException("implicitlyCA");
DerObjectIdentifier namedCurve = x962Parameters.NamedCurve;
if (namedCurve != null)
return ECNamedDomainParameters.LookupOid(namedCurve);
return FromX9ECParameters(X9ECParameters.GetInstance(x962Parameters.Parameters));
}
public static ECDomainParameters FromX9ECParameters(X9ECParameters x9ECParameters)
{
return new ECDomainParameters(x9ECParameters);
}
public static ECDomainParameters LookupName(string name)
{
if (name == null)
throw new ArgumentNullException("name");
DerObjectIdentifier derObjectIdentifier = ECUtilities.FindECCurveOid(name);
if (derObjectIdentifier != null)
return ECNamedDomainParameters.LookupOid(derObjectIdentifier);
X9ECParameters x9ECParameters = ECUtilities.FindECCurveByName(name);
if (x9ECParameters == null)
throw new ArgumentException("Name is not a valid public key parameter set", "name");
return FromX9ECParameters(x9ECParameters);
}
public ECDomainParameters(ECDomainParameters other)
{
m_curve = other.Curve;
m_g = other.G;
m_n = other.N;
m_h = other.H;
m_seed = other.Seed;
m_hInv = other.m_hInv;
}
public ECDomainParameters(X9ECParameters x9)
: this(x9.Curve, x9.G, x9.N, x9.H, x9.GetSeed())
{
}
public ECDomainParameters(ECCurve curve, ECPoint g, BigInteger n)
: this(curve, g, n, BigInteger.One, null)
{
}
public ECDomainParameters(ECCurve curve, ECPoint g, BigInteger n, BigInteger h)
: this(curve, g, n, h, null)
{
}
public ECDomainParameters(ECCurve curve, ECPoint g, BigInteger n, BigInteger h, byte[] seed)
{
if (curve == null)
throw new ArgumentNullException("curve");
if (g == null)
throw new ArgumentNullException("g");
if (n == null)
throw new ArgumentNullException("n");
m_curve = curve;
m_g = ValidatePublicPoint(curve, g);
m_n = n;
m_h = h;
m_seed = Arrays.Clone(seed);
}
public byte[] GetSeed()
{
return Arrays.Clone(m_seed);
}
public override bool Equals(object obj)
{
ECDomainParameters eCDomainParameters = obj as ECDomainParameters;
if (eCDomainParameters != null)
return Equals(eCDomainParameters);
return false;
}
protected virtual bool Equals(ECDomainParameters other)
{
if (m_curve.Equals(other.m_curve) && m_g.Equals(other.m_g))
return m_n.Equals(other.m_n);
return false;
}
public override int GetHashCode()
{
return (((((4 * 257) ^ m_curve.GetHashCode()) * 257) ^ m_g.GetHashCode()) * 257) ^ m_n.GetHashCode();
}
public virtual X962Parameters ToX962Parameters()
{
return new X962Parameters(ToX9ECParameters());
}
public virtual X9ECParameters ToX9ECParameters()
{
X9ECPoint g = new X9ECPoint(G, false);
return new X9ECParameters(Curve, g, N, H, Seed);
}
public BigInteger ValidatePrivateScalar(BigInteger d)
{
if (d == null)
throw new ArgumentNullException("d", "Scalar cannot be null");
if (d.CompareTo(BigInteger.One) < 0 || d.CompareTo(N) >= 0)
throw new ArgumentException("Scalar is not in the interval [1, n - 1]", "d");
return d;
}
public ECPoint ValidatePublicPoint(ECPoint q)
{
return ValidatePublicPoint(Curve, q);
}
internal static ECPoint ValidatePublicPoint(ECCurve c, ECPoint q)
{
if (q == null)
throw new ArgumentNullException("q", "Point cannot be null");
q = ECAlgorithms.ImportPoint(c, q).Normalize();
if (q.IsInfinity)
throw new ArgumentException("Point at infinity", "q");
if (!q.IsValid())
throw new ArgumentException("Point not on curve", "q");
return q;
}
}
}