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, }); }
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(); }