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

AuthenticatedData

using Org.BouncyCastle.Asn1.X509; using System; namespace Org.BouncyCastle.Asn1.Cms { public class AuthenticatedData : Asn1Encodable { private readonly DerInteger m_version; private readonly OriginatorInfo m_originatorInfo; private readonly Asn1Set m_recipientInfos; private readonly AlgorithmIdentifier m_macAlgorithm; private readonly AlgorithmIdentifier m_digestAlgorithm; private readonly ContentInfo m_encapsulatedContentInfo; private readonly Asn1Set m_authAttrs; private readonly Asn1OctetString m_mac; private readonly Asn1Set m_unauthAttrs; public DerInteger Version => m_version; public OriginatorInfo OriginatorInfo => m_originatorInfo; public Asn1Set RecipientInfos => m_recipientInfos; public AlgorithmIdentifier MacAlgorithm => m_macAlgorithm; public AlgorithmIdentifier DigestAlgorithm => m_digestAlgorithm; public ContentInfo EncapsulatedContentInfo => m_encapsulatedContentInfo; public Asn1Set AuthAttrs => m_authAttrs; public Asn1OctetString Mac => m_mac; public Asn1Set UnauthAttrs => m_unauthAttrs; public static AuthenticatedData GetInstance(object obj) { if (obj == null) return null; AuthenticatedData authenticatedData = obj as AuthenticatedData; if (authenticatedData != null) return authenticatedData; return new AuthenticatedData(Asn1Sequence.GetInstance(obj)); } public static AuthenticatedData GetInstance(Asn1TaggedObject obj, bool isExplicit) { return new AuthenticatedData(Asn1Sequence.GetInstance(obj, isExplicit)); } public static AuthenticatedData GetTagged(Asn1TaggedObject taggedObject, bool declaredExplicit) { return new AuthenticatedData(Asn1Sequence.GetTagged(taggedObject, declaredExplicit)); } public AuthenticatedData(OriginatorInfo originatorInfo, Asn1Set recipientInfos, AlgorithmIdentifier macAlgorithm, AlgorithmIdentifier digestAlgorithm, ContentInfo encapsulatedContent, Asn1Set authAttrs, Asn1OctetString mac, Asn1Set unauthAttrs) { if (digestAlgorithm == null != (authAttrs == null)) throw new ArgumentException("digestAlgorithm and authAttrs must be set together"); m_version = CalculateVersionField(originatorInfo); m_originatorInfo = originatorInfo; if (macAlgorithm == null) throw new ArgumentNullException("macAlgorithm"); m_macAlgorithm = macAlgorithm; m_digestAlgorithm = digestAlgorithm; if (recipientInfos == null) throw new ArgumentNullException("recipientInfos"); m_recipientInfos = recipientInfos; if (encapsulatedContent == null) throw new ArgumentNullException("encapsulatedContent"); m_encapsulatedContentInfo = encapsulatedContent; m_authAttrs = authAttrs; if (mac == null) throw new ArgumentNullException("mac"); m_mac = mac; m_unauthAttrs = unauthAttrs; } private AuthenticatedData(Asn1Sequence seq) { int count = seq.Count; int sequencePosition = 0; if (count < 5 || count > 9) throw new ArgumentException("Bad sequence size: " + count.ToString(), "seq"); m_version = DerInteger.GetInstance(seq[sequencePosition++]); m_originatorInfo = Asn1Utilities.ReadOptionalContextTagged(seq, ref sequencePosition, 0, false, OriginatorInfo.GetTagged); m_recipientInfos = Asn1Set.GetInstance(seq[sequencePosition++]); m_macAlgorithm = AlgorithmIdentifier.GetInstance(seq[sequencePosition++]); m_digestAlgorithm = Asn1Utilities.ReadOptionalContextTagged(seq, ref sequencePosition, 1, false, AlgorithmIdentifier.GetTagged); m_encapsulatedContentInfo = ContentInfo.GetInstance(seq[sequencePosition++]); m_authAttrs = Asn1Utilities.ReadOptionalContextTagged(seq, ref sequencePosition, 2, false, Asn1Set.GetTagged); m_mac = Asn1OctetString.GetInstance(seq[sequencePosition++]); m_unauthAttrs = Asn1Utilities.ReadOptionalContextTagged(seq, ref sequencePosition, 3, false, Asn1Set.GetTagged); if (sequencePosition != count) throw new ArgumentException("Unexpected elements in sequence", "seq"); } public override Asn1Object ToAsn1Object() { Asn1EncodableVector asn1EncodableVector = new Asn1EncodableVector(9); asn1EncodableVector.Add(m_version); asn1EncodableVector.AddOptionalTagged(false, 0, m_originatorInfo); asn1EncodableVector.Add(m_recipientInfos, m_macAlgorithm); asn1EncodableVector.AddOptionalTagged(false, 1, m_digestAlgorithm); asn1EncodableVector.Add(m_encapsulatedContentInfo); asn1EncodableVector.AddOptionalTagged(false, 2, m_authAttrs); asn1EncodableVector.Add(m_mac); asn1EncodableVector.AddOptionalTagged(false, 3, m_unauthAttrs); return new BerSequence(asn1EncodableVector); } public static int CalculateVersion(OriginatorInfo origInfo) { return CalculateVersionField(origInfo).IntValueExact; } private static DerInteger CalculateVersionField(OriginatorInfo originatorInfo) { if (originatorInfo != null) { Asn1Set crls = originatorInfo.Crls; if (crls != null) { foreach (Asn1Encodable item in crls) { Asn1TaggedObject optional = Asn1TaggedObject.GetOptional(item); if (optional != null && optional.HasContextTag(1)) return DerInteger.Three; } } Asn1Set certificates = originatorInfo.Certificates; if (certificates != null) { bool flag = false; foreach (Asn1Encodable item2 in certificates) { Asn1TaggedObject optional2 = Asn1TaggedObject.GetOptional(item2); if (optional2 != null) { if (optional2.HasContextTag(3)) return DerInteger.Three; flag = (flag || optional2.HasContextTag(2)); } } if (flag) return DerInteger.One; } } return DerInteger.Zero; } } }