Example #1
0
        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;
        }