X9FieldID
using Org.BouncyCastle.Math;
using System;
namespace Org.BouncyCastle.Asn1.X9
{
public class X9FieldID : Asn1Encodable
{
private readonly DerObjectIdentifier m_fieldType;
private readonly Asn1Object m_parameters;
public DerObjectIdentifier FieldType => m_fieldType;
[Obsolete("Use 'FieldType' instead")]
public DerObjectIdentifier Identifier {
get {
return m_fieldType;
}
}
public Asn1Object Parameters => m_parameters;
public static X9FieldID GetInstance(object obj)
{
if (obj == null)
return null;
X9FieldID x9FieldID = obj as X9FieldID;
if (x9FieldID != null)
return x9FieldID;
return new X9FieldID(Asn1Sequence.GetInstance(obj));
}
public static X9FieldID GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit)
{
return new X9FieldID(Asn1Sequence.GetInstance(taggedObject, declaredExplicit));
}
public static X9FieldID GetOptional(Asn1Encodable element)
{
if (element == null)
throw new ArgumentNullException("element");
X9FieldID x9FieldID = element as X9FieldID;
if (x9FieldID != null)
return x9FieldID;
Asn1Sequence optional = Asn1Sequence.GetOptional(element);
if (optional != null)
return new X9FieldID(optional);
return null;
}
public static X9FieldID GetTagged(Asn1TaggedObject taggedObject, bool declaredExplicit)
{
return new X9FieldID(Asn1Sequence.GetTagged(taggedObject, declaredExplicit));
}
private X9FieldID(Asn1Sequence seq)
{
int count = seq.Count;
if (count != 2)
throw new ArgumentException("Bad sequence size: " + count.ToString(), "seq");
m_fieldType = DerObjectIdentifier.GetInstance(seq[0]);
m_parameters = seq[1].ToAsn1Object();
}
public X9FieldID(BigInteger primeP)
{
m_fieldType = X9ObjectIdentifiers.PrimeField;
m_parameters = new DerInteger(primeP);
}
public X9FieldID(int m, int k1)
: this(m, k1, 0, 0)
{
}
public X9FieldID(int m, int k1, int k2, int k3)
{
m_fieldType = X9ObjectIdentifiers.CharacteristicTwoField;
Asn1EncodableVector asn1EncodableVector = new Asn1EncodableVector(3) {
new DerInteger(m)
};
if (k2 == 0) {
if (k3 != 0)
throw new ArgumentException("inconsistent k values");
asn1EncodableVector.Add(X9ObjectIdentifiers.TPBasis, new DerInteger(k1));
} else {
if (k2 <= k1 || k3 <= k2)
throw new ArgumentException("inconsistent k values");
asn1EncodableVector.Add(X9ObjectIdentifiers.PPBasis, new DerSequence(new DerInteger(k1), new DerInteger(k2), new DerInteger(k3)));
}
m_parameters = new DerSequence(asn1EncodableVector);
}
public override Asn1Object ToAsn1Object()
{
return new DerSequence(m_fieldType, m_parameters);
}
}
}