PkiHeader
using Org.BouncyCastle.Asn1.X509;
using System;
namespace Org.BouncyCastle.Asn1.Cmp
{
public class PkiHeader : Asn1Encodable
{
public static readonly GeneralName NULL_NAME = new GeneralName(X509Name.GetInstance(DerSequence.Empty));
public static readonly int CMP_1999 = 1;
public static readonly int CMP_2000 = 2;
private readonly DerInteger m_pvno;
private readonly GeneralName m_sender;
private readonly GeneralName m_recipient;
private readonly Asn1GeneralizedTime m_messageTime;
private readonly AlgorithmIdentifier m_protectionAlg;
private readonly Asn1OctetString m_senderKID;
private readonly Asn1OctetString m_recipKID;
private readonly Asn1OctetString m_transactionID;
private readonly Asn1OctetString m_senderNonce;
private readonly Asn1OctetString m_recipNonce;
private readonly PkiFreeText m_freeText;
private readonly Asn1Sequence m_generalInfo;
public virtual DerInteger Pvno => m_pvno;
public virtual GeneralName Sender => m_sender;
public virtual GeneralName Recipient => m_recipient;
public virtual Asn1GeneralizedTime MessageTime => m_messageTime;
public virtual AlgorithmIdentifier ProtectionAlg => m_protectionAlg;
public virtual Asn1OctetString SenderKID => m_senderKID;
public virtual Asn1OctetString RecipKID => m_recipKID;
public virtual Asn1OctetString TransactionID => m_transactionID;
public virtual Asn1OctetString SenderNonce => m_senderNonce;
public virtual Asn1OctetString RecipNonce => m_recipNonce;
public virtual PkiFreeText FreeText => m_freeText;
public static PkiHeader GetInstance(object obj)
{
if (obj == null)
return null;
PkiHeader pkiHeader = obj as PkiHeader;
if (pkiHeader != null)
return pkiHeader;
return new PkiHeader(Asn1Sequence.GetInstance(obj));
}
public static PkiHeader GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit)
{
return new PkiHeader(Asn1Sequence.GetInstance(taggedObject, declaredExplicit));
}
public static PkiHeader GetTagged(Asn1TaggedObject taggedObject, bool declaredExplicit)
{
return new PkiHeader(Asn1Sequence.GetTagged(taggedObject, declaredExplicit));
}
private PkiHeader(Asn1Sequence seq)
{
int count = seq.Count;
int sequencePosition = 0;
if (count < 3 || count > 12)
throw new ArgumentException("Bad sequence size: " + count.ToString(), "seq");
m_pvno = DerInteger.GetInstance(seq[sequencePosition++]);
m_sender = GeneralName.GetInstance(seq[sequencePosition++]);
m_recipient = GeneralName.GetInstance(seq[sequencePosition++]);
m_messageTime = Asn1Utilities.ReadOptionalContextTagged(seq, ref sequencePosition, 0, true, Asn1GeneralizedTime.GetTagged);
m_protectionAlg = Asn1Utilities.ReadOptionalContextTagged(seq, ref sequencePosition, 1, true, AlgorithmIdentifier.GetTagged);
m_senderKID = Asn1Utilities.ReadOptionalContextTagged(seq, ref sequencePosition, 2, true, Asn1OctetString.GetTagged);
m_recipKID = Asn1Utilities.ReadOptionalContextTagged(seq, ref sequencePosition, 3, true, Asn1OctetString.GetTagged);
m_transactionID = Asn1Utilities.ReadOptionalContextTagged(seq, ref sequencePosition, 4, true, Asn1OctetString.GetTagged);
m_senderNonce = Asn1Utilities.ReadOptionalContextTagged(seq, ref sequencePosition, 5, true, Asn1OctetString.GetTagged);
m_recipNonce = Asn1Utilities.ReadOptionalContextTagged(seq, ref sequencePosition, 6, true, Asn1OctetString.GetTagged);
m_freeText = Asn1Utilities.ReadOptionalContextTagged(seq, ref sequencePosition, 7, true, PkiFreeText.GetTagged);
m_generalInfo = Asn1Utilities.ReadOptionalContextTagged(seq, ref sequencePosition, 8, true, Asn1Sequence.GetTagged);
if (sequencePosition != count)
throw new ArgumentException("Unexpected elements in sequence", "seq");
}
public PkiHeader(int pvno, GeneralName sender, GeneralName recipient)
: this(new DerInteger(pvno), sender, recipient)
{
}
private PkiHeader(DerInteger pvno, GeneralName sender, GeneralName recipient)
{
if (pvno == null)
throw new ArgumentNullException("pvno");
m_pvno = pvno;
if (sender == null)
throw new ArgumentNullException("sender");
m_sender = sender;
if (recipient == null)
throw new ArgumentNullException("recipient");
m_recipient = recipient;
}
public virtual InfoTypeAndValue[] GetGeneralInfo()
{
return m_generalInfo?.MapElements(InfoTypeAndValue.GetInstance);
}
public override Asn1Object ToAsn1Object()
{
Asn1EncodableVector asn1EncodableVector = new Asn1EncodableVector(12);
asn1EncodableVector.Add(m_pvno, m_sender, m_recipient);
asn1EncodableVector.AddOptionalTagged(true, 0, m_messageTime);
asn1EncodableVector.AddOptionalTagged(true, 1, m_protectionAlg);
asn1EncodableVector.AddOptionalTagged(true, 2, m_senderKID);
asn1EncodableVector.AddOptionalTagged(true, 3, m_recipKID);
asn1EncodableVector.AddOptionalTagged(true, 4, m_transactionID);
asn1EncodableVector.AddOptionalTagged(true, 5, m_senderNonce);
asn1EncodableVector.AddOptionalTagged(true, 6, m_recipNonce);
asn1EncodableVector.AddOptionalTagged(true, 7, m_freeText);
asn1EncodableVector.AddOptionalTagged(true, 8, m_generalInfo);
return new DerSequence(asn1EncodableVector);
}
}
}