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

AuthenticatedData

using Org.BouncyCastle.Asn1.X509; using System; namespace Org.BouncyCastle.Asn1.Cms { public class AuthenticatedData : Asn1Encodable { private DerInteger version; private OriginatorInfo originatorInfo; private Asn1Set recipientInfos; private AlgorithmIdentifier macAlgorithm; private AlgorithmIdentifier digestAlgorithm; private ContentInfo encapsulatedContentInfo; private Asn1Set authAttrs; private Asn1OctetString mac; private Asn1Set unauthAttrs; public DerInteger Version => version; public OriginatorInfo OriginatorInfo => originatorInfo; public Asn1Set RecipientInfos => recipientInfos; public AlgorithmIdentifier MacAlgorithm => macAlgorithm; public AlgorithmIdentifier DigestAlgorithm => digestAlgorithm; public ContentInfo EncapsulatedContentInfo => encapsulatedContentInfo; public Asn1Set AuthAttrs => authAttrs; public Asn1OctetString Mac => mac; public Asn1Set UnauthAttrs => 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 AuthenticatedData(OriginatorInfo originatorInfo, Asn1Set recipientInfos, AlgorithmIdentifier macAlgorithm, AlgorithmIdentifier digestAlgorithm, ContentInfo encapsulatedContent, Asn1Set authAttrs, Asn1OctetString mac, Asn1Set unauthAttrs) { if ((digestAlgorithm != null || authAttrs != null) && (digestAlgorithm == null || authAttrs == null)) throw new ArgumentException("digestAlgorithm and authAttrs must be set together"); version = new DerInteger(CalculateVersion(originatorInfo)); this.originatorInfo = originatorInfo; this.macAlgorithm = macAlgorithm; this.digestAlgorithm = digestAlgorithm; this.recipientInfos = recipientInfos; encapsulatedContentInfo = encapsulatedContent; this.authAttrs = authAttrs; this.mac = mac; this.unauthAttrs = unauthAttrs; } private AuthenticatedData(Asn1Sequence seq) { int num = 0; version = (DerInteger)seq[num++]; Asn1Encodable asn1Encodable = seq[num++]; Asn1TaggedObject asn1TaggedObject = asn1Encodable as Asn1TaggedObject; if (asn1TaggedObject != null) { originatorInfo = OriginatorInfo.GetInstance(asn1TaggedObject, false); asn1Encodable = seq[num++]; } recipientInfos = Asn1Set.GetInstance(asn1Encodable); macAlgorithm = AlgorithmIdentifier.GetInstance(seq[num++]); asn1Encodable = seq[num++]; Asn1TaggedObject asn1TaggedObject2 = asn1Encodable as Asn1TaggedObject; if (asn1TaggedObject2 != null) { digestAlgorithm = AlgorithmIdentifier.GetInstance(asn1TaggedObject2, false); asn1Encodable = seq[num++]; } encapsulatedContentInfo = ContentInfo.GetInstance(asn1Encodable); asn1Encodable = seq[num++]; Asn1TaggedObject asn1TaggedObject3 = asn1Encodable as Asn1TaggedObject; if (asn1TaggedObject3 != null) { authAttrs = Asn1Set.GetInstance(asn1TaggedObject3, false); asn1Encodable = seq[num++]; } mac = Asn1OctetString.GetInstance(asn1Encodable); if (seq.Count > num) unauthAttrs = Asn1Set.GetInstance((Asn1TaggedObject)seq[num], false); } public override Asn1Object ToAsn1Object() { Asn1EncodableVector asn1EncodableVector = new Asn1EncodableVector(version); asn1EncodableVector.AddOptionalTagged(false, 0, originatorInfo); asn1EncodableVector.Add(recipientInfos, macAlgorithm); asn1EncodableVector.AddOptionalTagged(false, 1, digestAlgorithm); asn1EncodableVector.Add(encapsulatedContentInfo); asn1EncodableVector.AddOptionalTagged(false, 2, authAttrs); asn1EncodableVector.Add(mac); asn1EncodableVector.AddOptionalTagged(false, 3, unauthAttrs); return new BerSequence(asn1EncodableVector); } public static int CalculateVersion(OriginatorInfo origInfo) { if (origInfo == null) return 0; int result = 0; foreach (Asn1Encodable certificate in origInfo.Certificates) { Asn1TaggedObject asn1TaggedObject = certificate as Asn1TaggedObject; if (asn1TaggedObject != null) { if (asn1TaggedObject.TagNo == 2) result = 1; else if (asn1TaggedObject.TagNo == 3) { result = 3; break; } } } foreach (Asn1Encodable crl in origInfo.Crls) { Asn1TaggedObject asn1TaggedObject2 = crl as Asn1TaggedObject; if (asn1TaggedObject2 != null && asn1TaggedObject2.TagNo == 1) return 3; } return result; } } }