<PackageReference Include="BouncyCastle.Cryptography" Version="2.4.0" />

AuthorityKeyIdentifier

using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Digests; using Org.BouncyCastle.Math; using Org.BouncyCastle.Utilities.Encoders; using System; namespace Org.BouncyCastle.Asn1.X509 { public class AuthorityKeyIdentifier : Asn1Encodable { private readonly Asn1OctetString keyidentifier; private readonly GeneralNames certissuer; private readonly DerInteger certserno; public GeneralNames AuthorityCertIssuer => certissuer; public BigInteger AuthorityCertSerialNumber { get { if (certserno != null) return certserno.Value; return null; } } public static AuthorityKeyIdentifier GetInstance(Asn1TaggedObject obj, bool explicitly) { return GetInstance(Asn1Sequence.GetInstance(obj, explicitly)); } public static AuthorityKeyIdentifier GetInstance(object obj) { if (obj is AuthorityKeyIdentifier) return (AuthorityKeyIdentifier)obj; if (obj is X509Extension) return GetInstance(X509Extension.ConvertValueToObject((X509Extension)obj)); if (obj == null) return null; return new AuthorityKeyIdentifier(Asn1Sequence.GetInstance(obj)); } public static AuthorityKeyIdentifier FromExtensions(X509Extensions extensions) { return GetInstance(X509Extensions.GetExtensionParsedValue(extensions, X509Extensions.AuthorityKeyIdentifier)); } protected internal AuthorityKeyIdentifier(Asn1Sequence seq) { foreach (Asn1Encodable item in seq) { Asn1TaggedObject instance = Asn1TaggedObject.GetInstance(item); switch (instance.TagNo) { case 0: keyidentifier = Asn1OctetString.GetInstance(instance, false); break; case 1: certissuer = GeneralNames.GetInstance(instance, false); break; case 2: certserno = DerInteger.GetInstance(instance, false); break; default: throw new ArgumentException("illegal tag"); } } } public AuthorityKeyIdentifier(SubjectPublicKeyInfo spki) : this(spki, null, null) { } public AuthorityKeyIdentifier(SubjectPublicKeyInfo spki, GeneralNames name, BigInteger serialNumber) { Sha1Digest sha1Digest = new Sha1Digest(); byte[] array = new byte[((IDigest)sha1Digest).GetDigestSize()]; byte[] bytes = spki.PublicKey.GetBytes(); ((IDigest)sha1Digest).BlockUpdate(bytes, 0, bytes.Length); ((IDigest)sha1Digest).DoFinal(array, 0); keyidentifier = new DerOctetString(array); certissuer = name; certserno = ((serialNumber == null) ? null : new DerInteger(serialNumber)); } public AuthorityKeyIdentifier(GeneralNames name, BigInteger serialNumber) : this((byte[])null, name, serialNumber) { } public AuthorityKeyIdentifier(byte[] keyIdentifier) : this(keyIdentifier, null, null) { } public AuthorityKeyIdentifier(byte[] keyIdentifier, GeneralNames name, BigInteger serialNumber) { keyidentifier = ((keyIdentifier == null) ? null : new DerOctetString(keyIdentifier)); certissuer = name; certserno = ((serialNumber == null) ? null : new DerInteger(serialNumber)); } public byte[] GetKeyIdentifier() { if (keyidentifier != null) return keyidentifier.GetOctets(); return null; } public override Asn1Object ToAsn1Object() { Asn1EncodableVector asn1EncodableVector = new Asn1EncodableVector(3); asn1EncodableVector.AddOptionalTagged(false, 0, keyidentifier); asn1EncodableVector.AddOptionalTagged(false, 1, certissuer); asn1EncodableVector.AddOptionalTagged(false, 2, certserno); return new DerSequence(asn1EncodableVector); } public override string ToString() { string str = (keyidentifier != null) ? Hex.ToHexString(keyidentifier.GetOctets()) : "null"; return "AuthorityKeyIdentifier: KeyID(" + str + ")"; } } }