X9ECParameters
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);
}
}
}