<PackageReference Include="BouncyCastle.Cryptography" Version="2.6.2" />

ECDomainParameters

public class 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; } } }