<PackageReference Include="BouncyCastle.Cryptography" Version="2.7.0-beta.98" />

X9ECParameters

public class X9ECParameters : Asn1Encodable
using Org.BouncyCastle.Math; using Org.BouncyCastle.Math.EC; using Org.BouncyCastle.Math.Field; using System; namespace Org.BouncyCastle.Asn1.X9 { public class X9ECParameters : Asn1Encodable { private readonly X9FieldID m_fieldID; private readonly X9Curve m_curve; private readonly X9ECPoint m_g; private readonly BigInteger m_n; private readonly BigInteger m_h; public ECCurve Curve => m_curve.Curve; public ECPoint G => m_g.Point; public BigInteger N => m_n; public BigInteger H => m_h; public DerBitString Seed => m_curve.Seed; public X9Curve CurveEntry => m_curve; public X9FieldID FieldIDEntry => m_fieldID; public X9ECPoint BaseEntry => m_g; public static X9ECParameters GetInstance(object obj) { if (obj == null) return null; X9ECParameters x9ECParameters = obj as X9ECParameters; if (x9ECParameters != null) return x9ECParameters; return new X9ECParameters(Asn1Sequence.GetInstance(obj)); } public static X9ECParameters GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit) { return new X9ECParameters(Asn1Sequence.GetInstance(taggedObject, declaredExplicit)); } public static X9ECParameters GetOptional(Asn1Encodable element) { if (element == null) throw new ArgumentNullException("element"); X9ECParameters x9ECParameters = element as X9ECParameters; if (x9ECParameters != null) return x9ECParameters; Asn1Sequence optional = Asn1Sequence.GetOptional(element); if (optional != null) return new X9ECParameters(optional); return null; } public static X9ECParameters GetTagged(Asn1TaggedObject taggedObject, bool declaredExplicit) { return new X9ECParameters(Asn1Sequence.GetTagged(taggedObject, declaredExplicit)); } [Obsolete("Use 'GetInstance' instead")] public X9ECParameters(Asn1Sequence seq) { int count = seq.Count; int sequencePosition = 0; if (count < 5 || count > 6) throw new ArgumentException("Bad sequence size: " + count.ToString(), "seq"); DerInteger instance = DerInteger.GetInstance(seq[sequencePosition++]); m_fieldID = X9FieldID.GetInstance(seq[sequencePosition++]); Asn1Sequence instance2 = Asn1Sequence.GetInstance(seq[sequencePosition++]); Asn1Encodable asn1Encodable = seq[sequencePosition++]; m_n = DerInteger.GetInstance(seq[sequencePosition++]).Value; m_h = Asn1Utilities.ReadOptional(seq, ref sequencePosition, DerInteger.GetOptional)?.Value; if (sequencePosition != count) throw new ArgumentException("Unexpected elements in sequence", "seq"); if (!instance.HasValue(1)) throw new ArgumentException("bad version in X9ECParameters"); m_curve = new X9Curve(m_fieldID, m_n, m_h, instance2); X9ECPoint x9ECPoint = asn1Encodable as X9ECPoint; if (x9ECPoint != null) m_g = x9ECPoint; else m_g = new X9ECPoint(m_curve.Curve, Asn1OctetString.GetInstance(asn1Encodable)); } public X9ECParameters(ECCurve curve, X9ECPoint g, BigInteger n) : this(curve, g, n, (BigInteger)null, (DerBitString)null) { } public X9ECParameters(ECCurve curve, X9ECPoint g, BigInteger n, BigInteger h) : this(curve, g, n, h, (DerBitString)null) { } public X9ECParameters(ECCurve curve, X9ECPoint g, BigInteger n, BigInteger h, byte[] seed) : this(curve, g, n, h, DerBitString.FromContentsOptional(seed)) { } public X9ECParameters(ECCurve curve, X9ECPoint g, BigInteger n, BigInteger h, DerBitString seed) { m_curve = new X9Curve(curve, seed); m_g = g; m_n = n; m_h = h; IFiniteField field = curve.Field; if (ECAlgorithms.IsFpField(field)) m_fieldID = new X9FieldID(field.Characteristic); else { if (!ECAlgorithms.IsF2mField(field)) throw new ArgumentException("'curve' is of an unsupported type"); int[] exponentsPresent = ((IPolynomialExtensionField)field).MinimalPolynomial.GetExponentsPresent(); if (exponentsPresent.Length == 3) m_fieldID = new X9FieldID(exponentsPresent[2], exponentsPresent[1]); else { if (exponentsPresent.Length != 5) throw new ArgumentException("Only trinomial and pentomial curves are supported"); m_fieldID = new X9FieldID(exponentsPresent[4], exponentsPresent[1], exponentsPresent[2], exponentsPresent[3]); } } } public byte[] GetSeed() { return m_curve.GetSeed(); } public override Asn1Object ToAsn1Object() { Asn1EncodableVector asn1EncodableVector = new Asn1EncodableVector(6); asn1EncodableVector.Add(DerInteger.One, m_fieldID, m_curve, m_g, new DerInteger(m_n)); if (m_h != null) asn1EncodableVector.Add(new DerInteger(m_h)); return new DerSequence(asn1EncodableVector); } } }