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

SubjectKeyIdentifier

using Org.BouncyCastle.Asn1.Oiw; using Org.BouncyCastle.Security; using Org.BouncyCastle.Utilities; using System; namespace Org.BouncyCastle.Asn1.X509 { public class SubjectKeyIdentifier : Asn1Encodable { private readonly byte[] m_keyIdentifier; public static SubjectKeyIdentifier GetInstance(object obj) { if (obj == null) return null; SubjectKeyIdentifier subjectKeyIdentifier = obj as SubjectKeyIdentifier; if (subjectKeyIdentifier != null) return subjectKeyIdentifier; SubjectPublicKeyInfo subjectPublicKeyInfo = obj as SubjectPublicKeyInfo; if (subjectPublicKeyInfo != null) return new SubjectKeyIdentifier(subjectPublicKeyInfo); X509Extension x509Extension = obj as X509Extension; if (x509Extension != null) return GetInstance(X509Extension.ConvertValueToObject(x509Extension)); return new SubjectKeyIdentifier(Asn1OctetString.GetInstance(obj)); } public static SubjectKeyIdentifier GetInstance(Asn1TaggedObject obj, bool explicitly) { return new SubjectKeyIdentifier(Asn1OctetString.GetInstance(obj, explicitly)); } public static SubjectKeyIdentifier GetTagged(Asn1TaggedObject taggedObject, bool declaredExplicit) { return new SubjectKeyIdentifier(Asn1OctetString.GetTagged(taggedObject, declaredExplicit)); } public static SubjectKeyIdentifier FromExtensions(X509Extensions extensions) { return GetInstance(X509Extensions.GetExtensionParsedValue(extensions, X509Extensions.SubjectKeyIdentifier)); } public SubjectKeyIdentifier(byte[] keyID) { if (keyID == null) throw new ArgumentNullException("keyID"); m_keyIdentifier = Arrays.Clone(keyID); } public SubjectKeyIdentifier(Asn1OctetString keyID) : this(keyID.GetOctets()) { } [Obsolete("Use 'X509ExtensionUtilities' methods instead")] public SubjectKeyIdentifier(SubjectPublicKeyInfo spki) { m_keyIdentifier = GetDigest(spki); } public byte[] GetKeyIdentifier() { return Arrays.Clone(m_keyIdentifier); } public override Asn1Object ToAsn1Object() { return DerOctetString.FromContents(m_keyIdentifier); } [Obsolete("Use 'X509ExtensionUtilities' methods instead")] public static SubjectKeyIdentifier CreateSha1KeyIdentifier(SubjectPublicKeyInfo keyInfo) { return new SubjectKeyIdentifier(keyInfo); } [Obsolete("Use 'X509ExtensionUtilities' methods instead")] public static SubjectKeyIdentifier CreateTruncatedSha1KeyIdentifier(SubjectPublicKeyInfo keyInfo) { byte[] digest = GetDigest(keyInfo); byte[] array = new byte[8]; Array.Copy(digest, digest.Length - 8, array, 0, array.Length); array[0] &= 15; array[0] |= 64; return new SubjectKeyIdentifier(array); } private static byte[] GetDigest(SubjectPublicKeyInfo spki) { return DigestUtilities.CalculateDigest(OiwObjectIdentifiers.IdSha1, spki.PublicKey.GetBytes()); } } }