EnvelopedData
using System;
namespace Org.BouncyCastle.Asn1.Cms
{
public class EnvelopedData : Asn1Encodable
{
private readonly DerInteger m_version;
private readonly OriginatorInfo m_originatorInfo;
private readonly Asn1Set m_recipientInfos;
private readonly EncryptedContentInfo m_encryptedContentInfo;
private readonly Asn1Set m_unprotectedAttrs;
public DerInteger Version => m_version;
public OriginatorInfo OriginatorInfo => m_originatorInfo;
public Asn1Set RecipientInfos => m_recipientInfos;
public EncryptedContentInfo EncryptedContentInfo => m_encryptedContentInfo;
public Asn1Set UnprotectedAttrs => m_unprotectedAttrs;
public static EnvelopedData GetInstance(object obj)
{
if (obj == null)
return null;
EnvelopedData envelopedData = obj as EnvelopedData;
if (envelopedData != null)
return envelopedData;
return new EnvelopedData(Asn1Sequence.GetInstance(obj));
}
public static EnvelopedData GetInstance(Asn1TaggedObject obj, bool explicitly)
{
return new EnvelopedData(Asn1Sequence.GetInstance(obj, explicitly));
}
public static EnvelopedData GetTagged(Asn1TaggedObject taggedObject, bool declaredExplicit)
{
return new EnvelopedData(Asn1Sequence.GetTagged(taggedObject, declaredExplicit));
}
public EnvelopedData(OriginatorInfo originatorInfo, Asn1Set recipientInfos, EncryptedContentInfo encryptedContentInfo, Asn1Set unprotectedAttrs)
{
m_version = CalculateVersionField(originatorInfo, recipientInfos, unprotectedAttrs);
m_originatorInfo = originatorInfo;
if (recipientInfos == null)
throw new ArgumentNullException("recipientInfos");
m_recipientInfos = recipientInfos;
if (encryptedContentInfo == null)
throw new ArgumentNullException("encryptedContentInfo");
m_encryptedContentInfo = encryptedContentInfo;
m_unprotectedAttrs = unprotectedAttrs;
}
public EnvelopedData(OriginatorInfo originatorInfo, Asn1Set recipientInfos, EncryptedContentInfo encryptedContentInfo, Attributes unprotectedAttrs)
: this(originatorInfo, recipientInfos, encryptedContentInfo, Asn1Set.GetInstance(unprotectedAttrs))
{
}
private EnvelopedData(Asn1Sequence seq)
{
int count = seq.Count;
int sequencePosition = 0;
if (count < 3 || count > 5)
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_encryptedContentInfo = EncryptedContentInfo.GetInstance(seq[sequencePosition++]);
m_unprotectedAttrs = Asn1Utilities.ReadOptionalContextTagged(seq, ref sequencePosition, 1, false, Asn1Set.GetTagged);
if (sequencePosition != count)
throw new ArgumentException("Unexpected elements in sequence", "seq");
}
public override Asn1Object ToAsn1Object()
{
Asn1EncodableVector asn1EncodableVector = new Asn1EncodableVector(5);
asn1EncodableVector.Add(m_version);
asn1EncodableVector.AddOptionalTagged(false, 0, m_originatorInfo);
asn1EncodableVector.Add(m_recipientInfos, m_encryptedContentInfo);
asn1EncodableVector.AddOptionalTagged(false, 1, m_unprotectedAttrs);
return new BerSequence(asn1EncodableVector);
}
public static int CalculateVersion(OriginatorInfo originatorInfo, Asn1Set recipientInfos, Asn1Set unprotectedAttrs)
{
return CalculateVersionField(originatorInfo, recipientInfos, unprotectedAttrs).IntValueExact;
}
private static DerInteger CalculateVersionField(OriginatorInfo originatorInfo, Asn1Set recipientInfos, Asn1Set unprotectedAttrs)
{
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.Four;
}
}
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.Four;
flag = (flag || optional2.HasContextTag(2));
}
}
if (flag)
return DerInteger.Three;
}
}
bool flag2 = true;
foreach (Asn1Encodable recipientInfo in recipientInfos) {
RecipientInfo instance = RecipientInfo.GetInstance(recipientInfo);
if (instance.IsPasswordOrOther())
return DerInteger.Three;
flag2 = (flag2 && instance.IsKeyTransV0());
}
if ((originatorInfo == null && unprotectedAttrs == null) & flag2)
return DerInteger.Zero;
return DerInteger.Two;
}
}
}