ECPrivateKeyStructure
using Org.BouncyCastle.Math;
using Org.BouncyCastle.Utilities;
using System;
namespace Org.BouncyCastle.Asn1.Sec
{
public class ECPrivateKeyStructure : Asn1Encodable
{
private readonly DerInteger m_version;
private readonly Asn1OctetString m_privateKey;
private readonly Asn1Encodable m_parameters;
private readonly DerBitString m_publicKey;
public DerInteger Version => m_version;
public Asn1OctetString PrivateKey => m_privateKey;
public Asn1Encodable Parameters => m_parameters;
public DerBitString PublicKey => m_publicKey;
public static ECPrivateKeyStructure GetInstance(object obj)
{
if (obj == null)
return null;
ECPrivateKeyStructure eCPrivateKeyStructure = obj as ECPrivateKeyStructure;
if (eCPrivateKeyStructure != null)
return eCPrivateKeyStructure;
return new ECPrivateKeyStructure(Asn1Sequence.GetInstance(obj));
}
public static ECPrivateKeyStructure GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit)
{
return new ECPrivateKeyStructure(Asn1Sequence.GetInstance(taggedObject, declaredExplicit));
}
public static ECPrivateKeyStructure GetTagged(Asn1TaggedObject taggedObject, bool declaredExplicit)
{
return new ECPrivateKeyStructure(Asn1Sequence.GetTagged(taggedObject, declaredExplicit));
}
private ECPrivateKeyStructure(Asn1Sequence seq)
{
int count = seq.Count;
int sequencePosition = 0;
if (count < 2 || count > 4)
throw new ArgumentException("Bad sequence size: " + count.ToString(), "seq");
m_version = DerInteger.GetInstance(seq[sequencePosition++]);
m_privateKey = Asn1OctetString.GetInstance(seq[sequencePosition++]);
m_parameters = Asn1Utilities.ReadOptionalContextTagged(seq, ref sequencePosition, 0, true, (Asn1TaggedObject t, bool e) => t.GetExplicitBaseObject());
m_publicKey = Asn1Utilities.ReadOptionalContextTagged(seq, ref sequencePosition, 1, true, DerBitString.GetTagged);
if (sequencePosition != count)
throw new ArgumentException("Unexpected elements in sequence", "seq");
}
public ECPrivateKeyStructure(int orderBitLength, BigInteger key)
: this(orderBitLength, key, null)
{
}
public ECPrivateKeyStructure(int orderBitLength, BigInteger key, Asn1Encodable parameters)
: this(orderBitLength, key, null, parameters)
{
}
public ECPrivateKeyStructure(int orderBitLength, BigInteger key, DerBitString publicKey, Asn1Encodable parameters)
{
if (key == null)
throw new ArgumentNullException("key");
if (orderBitLength < key.BitLength)
throw new ArgumentException("must be >= key bitlength", "orderBitLength");
byte[] contents = BigIntegers.AsUnsignedByteArray((orderBitLength + 7) / 8, key);
m_version = DerInteger.One;
m_privateKey = new DerOctetString(contents);
m_parameters = parameters;
m_publicKey = publicKey;
}
public virtual BigInteger GetKey()
{
return BigIntegers.FromUnsignedByteArray(m_privateKey.GetOctets());
}
[Obsolete("Use 'PublicKey' instead")]
public virtual DerBitString GetPublicKey()
{
return m_publicKey;
}
[Obsolete("Use 'Parameters' instead")]
public virtual Asn1Object GetParameters()
{
return m_parameters?.ToAsn1Object();
}
public override Asn1Object ToAsn1Object()
{
Asn1EncodableVector asn1EncodableVector = new Asn1EncodableVector(4);
asn1EncodableVector.Add(m_version, m_privateKey);
asn1EncodableVector.AddOptionalTagged(true, 0, m_parameters);
asn1EncodableVector.AddOptionalTagged(true, 1, m_publicKey);
return new DerSequence(asn1EncodableVector);
}
}
}