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

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