private void Decode() { if (_decoded) { return; } // AuthorityKeyIdentifier ::= SEQUENCE { // keyIdentifier [0] KeyIdentifier OPTIONAL, // authorityCertIssuer [1] GeneralNames OPTIONAL, // authorityCertSerialNumber [2] CertificateSerialNumber OPTIONAL } // // KeyIdentifier ::= OCTET STRING string keyId = null; X500DistinguishedName firstIssuerName = null; DerSequenceReader reader = new DerSequenceReader(RawData); byte[] serialNumber = null; // Primitive Context 0 const byte KeyIdTag = DerSequenceReader.ContextSpecificTagFlag | 0; // Constructed Context 1 const byte CertIssuerTag = DerSequenceReader.ContextSpecificConstructedTag1; // Primitive Context 2 const byte CertSerialTag = DerSequenceReader.ContextSpecificTagFlag | 2; if (reader.HasTag(KeyIdTag)) { keyId = reader.ReadOctetString().ToHexStringUpper(); } if (reader.HasTag(CertIssuerTag)) { DerSequenceReader generalNames = reader.ReadSequence(); while (generalNames.HasData) { const byte DirectoryNameTag = DerSequenceReader.ConstructedFlag | (byte)GeneralNameEncoder.GeneralNameTag.DirectoryName; if (firstIssuerName == null && generalNames.HasTag(DirectoryNameTag)) { firstIssuerName = new X500DistinguishedName(generalNames.ReadNextEncodedValue()); } reader.ValidateAndSkipDerValue(); } } if (reader.HasTag(CertSerialTag)) { serialNumber = reader.ReadOctetString(); } if (reader.HasData) { throw new CryptographicException(SR.Cryptography_Der_Invalid_Encoding); } _firstIssuerName = firstIssuerName; _serialNumber = serialNumber; _keyIdentifier = keyId; _decoded = true; }