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;
}
}
}