Example #1
0
        public static SignerInfo Decode(AsnReader reader)
        {
            /* SignerInfo ::= SEQUENCE {
             *  version CMSVersion,
             *  sid SignerIdentifier,
             *  digestAlgorithm DigestAlgorithmIdentifier,
             *  signedAttrs [0] IMPLICIT SignedAttributes OPTIONAL,
             *  signatureAlgorithm SignatureAlgorithmIdentifier,
             *  signature SignatureValue,
             *  unsignedAttrs [1] IMPLICIT UnsignedAttributes OPTIONAL }*/
            var sequence = reader.ReadSequence();

            // version CMSVersion,
            if (!sequence.TryReadInt32(out var version))
            {
                sequence.ThrowIfNotEmpty();
            }

            // sid SignerIdentifier,
            var sid = SignerIdentifier.Decode(sequence, validateEmpty: false);

            // digestAlgorithm DigestAlgorithmIdentifier,
            var digestAlgorithm = AlgorithmIdentifier.Decode(sequence);

            // signedAttrs [0] IMPLICIT SignedAttributes OPTIONAL,
            // SignedAttributes ::= SET SIZE (1..MAX) OF Attribute
            var signedAttrs = sequence.ReadOptionalSetOf(0, set => AttributeValue.Decode(set));

            // signatureAlgorithm SignatureAlgorithmIdentifier,
            var signatureAlgorithm = AlgorithmIdentifier.Decode(sequence);

            // signature SignatureValue,
            // SignatureValue ::= OCTET STRING
            var signature = sequence.ReadPrimitiveOrNotOctetString();

            // unsignedAttrs [1] IMPLICIT UnsignedAttributes OPTIONAL
            // UnsignedAttributes ::= SET SIZE (1..MAX) OF Attribute
            var unsignedAttrs = sequence.ReadOptionalSetOf(1, set => AttributeValue.Decode(set));

            sequence.ThrowIfNotEmpty();
            return(new()
            {
                Version = version,
                Sid = sid,
                DigestAlgorithm = digestAlgorithm,
                SignedAttrs = signedAttrs,
                SignatureAlgorithm = signatureAlgorithm,
                Signature = signature,
                UnsignedAttrs = unsignedAttrs,
            });
        }
Example #2
0
        public static SignerIdentifier Decode(AsnReader reader, bool validateEmpty = true)
        {
            /* SignerIdentifier ::= CHOICE {
             *  issuerAndSerialNumber IssuerAndSerialNumber,
             *  subjectKeyIdentifier [0] SubjectKeyIdentifier } */
            var tag = reader.PeekTag();

            if (tag.HasSameClassAndValue(Asn1Tag.Sequence))
            {
                var result = new SignerIdentifier()
                {
                    IssuerAndSerialNumber = IssuerAndSerialNumber.Decode(reader),
                };

                if (validateEmpty)
                {
                    reader.ThrowIfNotEmpty();
                }
                return(result);
            }

            if (tag.HasSameClassAndValue(new Asn1Tag(TagClass.ContextSpecific, 0)))
            {
                var result = new SignerIdentifier()
                {
                    SubjectKeyIdentifier = reader.ReadPrimitiveOrNotOctetString(tag),
                };

                if (validateEmpty)
                {
                    reader.ThrowIfNotEmpty();
                }
                return(result);
            }

            throw new CryptographicException();
        }