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