AuthEnvelopedData
using System;
namespace Org.BouncyCastle.Asn1.Cms
{
public class AuthEnvelopedData : Asn1Encodable
{
private readonly DerInteger m_version;
private readonly OriginatorInfo m_originatorInfo;
private readonly Asn1Set m_recipientInfos;
private readonly EncryptedContentInfo m_authEncryptedContentInfo;
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 EncryptedContentInfo AuthEncryptedContentInfo => m_authEncryptedContentInfo;
public Asn1Set AuthAttrs => m_authAttrs;
public Asn1OctetString Mac => m_mac;
public Asn1Set UnauthAttrs => m_unauthAttrs;
public static AuthEnvelopedData GetInstance(object obj)
{
if (obj == null)
return null;
AuthEnvelopedData authEnvelopedData = obj as AuthEnvelopedData;
if (authEnvelopedData != null)
return authEnvelopedData;
return new AuthEnvelopedData(Asn1Sequence.GetInstance(obj));
}
public static AuthEnvelopedData GetInstance(Asn1TaggedObject obj, bool isExplicit)
{
return new AuthEnvelopedData(Asn1Sequence.GetInstance(obj, isExplicit));
}
public static AuthEnvelopedData GetTagged(Asn1TaggedObject taggedObject, bool declaredExplicit)
{
return new AuthEnvelopedData(Asn1Sequence.GetTagged(taggedObject, declaredExplicit));
}
public AuthEnvelopedData(OriginatorInfo originatorInfo, Asn1Set recipientInfos, EncryptedContentInfo authEncryptedContentInfo, Asn1Set authAttrs, Asn1OctetString mac, Asn1Set unauthAttrs)
{
m_version = DerInteger.Zero;
m_originatorInfo = originatorInfo;
if (recipientInfos == null)
throw new ArgumentNullException("recipientInfos");
m_recipientInfos = recipientInfos;
if (authEncryptedContentInfo == null)
throw new ArgumentNullException("authEncryptedContentInfo");
m_authEncryptedContentInfo = authEncryptedContentInfo;
m_authAttrs = authAttrs;
if (mac == null)
throw new ArgumentNullException("mac");
m_mac = mac;
m_unauthAttrs = unauthAttrs;
Validate();
}
private AuthEnvelopedData(Asn1Sequence seq)
{
int count = seq.Count;
int sequencePosition = 0;
if (count < 4 || count > 7)
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_authEncryptedContentInfo = EncryptedContentInfo.GetInstance(seq[sequencePosition++]);
m_authAttrs = Asn1Utilities.ReadOptionalContextTagged(seq, ref sequencePosition, 1, false, Asn1Set.GetTagged);
m_mac = Asn1OctetString.GetInstance(seq[sequencePosition++]);
m_unauthAttrs = Asn1Utilities.ReadOptionalContextTagged(seq, ref sequencePosition, 2, false, Asn1Set.GetTagged);
if (sequencePosition != count)
throw new ArgumentException("Unexpected elements in sequence", "seq");
Validate();
}
private void Validate()
{
if (!m_version.HasValue(0))
throw new ArgumentException("AuthEnvelopedData version number must be 0");
if (m_recipientInfos.Count < 1)
throw new ArgumentException("AuthEnvelopedData requires at least 1 RecipientInfo");
if (!CmsObjectIdentifiers.Data.Equals(m_authEncryptedContentInfo.ContentType) && (m_authAttrs == null || m_authAttrs.Count < 1))
throw new ArgumentException("authAttrs must be present with non-data content");
}
public override Asn1Object ToAsn1Object()
{
Asn1EncodableVector asn1EncodableVector = new Asn1EncodableVector(7);
asn1EncodableVector.Add(m_version);
asn1EncodableVector.AddOptionalTagged(false, 0, m_originatorInfo);
asn1EncodableVector.Add(m_recipientInfos, m_authEncryptedContentInfo);
asn1EncodableVector.AddOptionalTagged(false, 1, m_authAttrs);
asn1EncodableVector.Add(m_mac);
asn1EncodableVector.AddOptionalTagged(false, 2, m_unauthAttrs);
return new BerSequence(asn1EncodableVector);
}
}
}