KemRecipientInfo
using Org.BouncyCastle.Asn1.X509;
using System;
namespace Org.BouncyCastle.Asn1.Cms
{
public sealed class KemRecipientInfo : Asn1Encodable
{
private static readonly DerInteger V1 = DerInteger.Zero;
private readonly DerInteger m_cmsVersion;
private readonly RecipientIdentifier m_rid;
private readonly AlgorithmIdentifier m_kem;
private readonly Asn1OctetString m_kemct;
private readonly AlgorithmIdentifier m_kdf;
private readonly DerInteger m_kekLength;
private readonly Asn1OctetString m_ukm;
private readonly AlgorithmIdentifier m_wrap;
private readonly Asn1OctetString m_encryptedKey;
public RecipientIdentifier RecipientIdentifier => m_rid;
public AlgorithmIdentifier Kem => m_kem;
public Asn1OctetString Kemct => m_kemct;
public AlgorithmIdentifier Kdf => m_kdf;
public AlgorithmIdentifier Wrap => m_wrap;
public Asn1OctetString Ukm => m_ukm;
public Asn1OctetString EncryptedKey => m_encryptedKey;
public static KemRecipientInfo GetInstance(object obj)
{
if (obj == null)
return null;
KemRecipientInfo kemRecipientInfo = obj as KemRecipientInfo;
if (kemRecipientInfo != null)
return kemRecipientInfo;
return new KemRecipientInfo(Asn1Sequence.GetInstance(obj));
}
public static KemRecipientInfo GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit)
{
return new KemRecipientInfo(Asn1Sequence.GetInstance(taggedObject, declaredExplicit));
}
public static KemRecipientInfo GetTagged(Asn1TaggedObject taggedObject, bool declaredExplicit)
{
return new KemRecipientInfo(Asn1Sequence.GetTagged(taggedObject, declaredExplicit));
}
public KemRecipientInfo(RecipientIdentifier rid, AlgorithmIdentifier kem, Asn1OctetString kemct, AlgorithmIdentifier kdf, DerInteger kekLength, Asn1OctetString ukm, AlgorithmIdentifier wrap, Asn1OctetString encryptedKey)
{
m_cmsVersion = V1;
if (rid == null)
throw new ArgumentNullException("rid");
m_rid = rid;
if (kem == null)
throw new ArgumentNullException("kem");
m_kem = kem;
if (kemct == null)
throw new ArgumentNullException("kemct");
m_kemct = kemct;
if (kdf == null)
throw new ArgumentNullException("kdf");
m_kdf = kdf;
if (kekLength == null)
throw new ArgumentNullException("kekLength");
m_kekLength = kekLength;
m_ukm = ukm;
if (wrap == null)
throw new ArgumentNullException("wrap");
m_wrap = wrap;
if (encryptedKey == null)
throw new ArgumentNullException("encryptedKey");
m_encryptedKey = encryptedKey;
}
private KemRecipientInfo(Asn1Sequence seq)
{
int count = seq.Count;
int sequencePosition = 0;
if (count < 8 || count > 9)
throw new ArgumentException("Bad sequence size: " + count.ToString(), "seq");
m_cmsVersion = DerInteger.GetInstance(seq[sequencePosition++]);
m_rid = RecipientIdentifier.GetInstance(seq[sequencePosition++]);
m_kem = AlgorithmIdentifier.GetInstance(seq[sequencePosition++]);
m_kemct = Asn1OctetString.GetInstance(seq[sequencePosition++]);
m_kdf = AlgorithmIdentifier.GetInstance(seq[sequencePosition++]);
m_kekLength = DerInteger.GetInstance(seq[sequencePosition++]);
m_ukm = Asn1Utilities.ReadOptionalContextTagged(seq, ref sequencePosition, 0, true, Asn1OctetString.GetTagged);
m_wrap = AlgorithmIdentifier.GetInstance(seq[sequencePosition++]);
m_encryptedKey = Asn1OctetString.GetInstance(seq[sequencePosition++]);
if (sequencePosition != count)
throw new ArgumentException("Unexpected elements in sequence", "seq");
if (!m_cmsVersion.HasValue(0))
throw new ArgumentException("Unsupported version (hex): " + m_cmsVersion.Value.ToString(16));
}
public override Asn1Object ToAsn1Object()
{
Asn1EncodableVector asn1EncodableVector = new Asn1EncodableVector(9);
asn1EncodableVector.Add(m_cmsVersion, m_rid, m_kem, m_kemct, m_kdf, m_kekLength);
asn1EncodableVector.AddOptionalTagged(true, 0, m_ukm);
asn1EncodableVector.Add(m_wrap, m_encryptedKey);
return new DerSequence(asn1EncodableVector);
}
}
}