166 lines
4.3 KiB
C#
166 lines
4.3 KiB
C#
using System;
|
|
using Org.BouncyCastle.Asn1.X509;
|
|
using Org.BouncyCastle.Utilities;
|
|
|
|
namespace Org.BouncyCastle.Asn1.Cmp;
|
|
|
|
public class PkiHeader : Asn1Encodable
|
|
{
|
|
public static readonly GeneralName NULL_NAME = new GeneralName(X509Name.GetInstance(new DerSequence()));
|
|
|
|
public static readonly int CMP_1999 = 1;
|
|
|
|
public static readonly int CMP_2000 = 2;
|
|
|
|
private readonly DerInteger pvno;
|
|
|
|
private readonly GeneralName sender;
|
|
|
|
private readonly GeneralName recipient;
|
|
|
|
private readonly DerGeneralizedTime messageTime;
|
|
|
|
private readonly AlgorithmIdentifier protectionAlg;
|
|
|
|
private readonly Asn1OctetString senderKID;
|
|
|
|
private readonly Asn1OctetString recipKID;
|
|
|
|
private readonly Asn1OctetString transactionID;
|
|
|
|
private readonly Asn1OctetString senderNonce;
|
|
|
|
private readonly Asn1OctetString recipNonce;
|
|
|
|
private readonly PkiFreeText freeText;
|
|
|
|
private readonly Asn1Sequence generalInfo;
|
|
|
|
public virtual DerInteger Pvno => pvno;
|
|
|
|
public virtual GeneralName Sender => sender;
|
|
|
|
public virtual GeneralName Recipient => recipient;
|
|
|
|
public virtual DerGeneralizedTime MessageTime => messageTime;
|
|
|
|
public virtual AlgorithmIdentifier ProtectionAlg => protectionAlg;
|
|
|
|
public virtual Asn1OctetString SenderKID => senderKID;
|
|
|
|
public virtual Asn1OctetString RecipKID => recipKID;
|
|
|
|
public virtual Asn1OctetString TransactionID => transactionID;
|
|
|
|
public virtual Asn1OctetString SenderNonce => senderNonce;
|
|
|
|
public virtual Asn1OctetString RecipNonce => recipNonce;
|
|
|
|
public virtual PkiFreeText FreeText => freeText;
|
|
|
|
private PkiHeader(Asn1Sequence seq)
|
|
{
|
|
pvno = DerInteger.GetInstance(seq[0]);
|
|
sender = GeneralName.GetInstance(seq[1]);
|
|
recipient = GeneralName.GetInstance(seq[2]);
|
|
for (int i = 3; i < seq.Count; i++)
|
|
{
|
|
Asn1TaggedObject asn1TaggedObject = (Asn1TaggedObject)seq[i];
|
|
switch (asn1TaggedObject.TagNo)
|
|
{
|
|
case 0:
|
|
messageTime = DerGeneralizedTime.GetInstance(asn1TaggedObject, isExplicit: true);
|
|
break;
|
|
case 1:
|
|
protectionAlg = AlgorithmIdentifier.GetInstance(asn1TaggedObject, explicitly: true);
|
|
break;
|
|
case 2:
|
|
senderKID = Asn1OctetString.GetInstance(asn1TaggedObject, isExplicit: true);
|
|
break;
|
|
case 3:
|
|
recipKID = Asn1OctetString.GetInstance(asn1TaggedObject, isExplicit: true);
|
|
break;
|
|
case 4:
|
|
transactionID = Asn1OctetString.GetInstance(asn1TaggedObject, isExplicit: true);
|
|
break;
|
|
case 5:
|
|
senderNonce = Asn1OctetString.GetInstance(asn1TaggedObject, isExplicit: true);
|
|
break;
|
|
case 6:
|
|
recipNonce = Asn1OctetString.GetInstance(asn1TaggedObject, isExplicit: true);
|
|
break;
|
|
case 7:
|
|
freeText = PkiFreeText.GetInstance(asn1TaggedObject, isExplicit: true);
|
|
break;
|
|
case 8:
|
|
generalInfo = Asn1Sequence.GetInstance(asn1TaggedObject, explicitly: true);
|
|
break;
|
|
default:
|
|
throw new ArgumentException("unknown tag number: " + asn1TaggedObject.TagNo, "seq");
|
|
}
|
|
}
|
|
}
|
|
|
|
public static PkiHeader GetInstance(object obj)
|
|
{
|
|
if (obj is PkiHeader)
|
|
{
|
|
return (PkiHeader)obj;
|
|
}
|
|
if (obj is Asn1Sequence)
|
|
{
|
|
return new PkiHeader((Asn1Sequence)obj);
|
|
}
|
|
throw new ArgumentException("Invalid object: " + Platform.GetTypeName(obj), "obj");
|
|
}
|
|
|
|
public PkiHeader(int pvno, GeneralName sender, GeneralName recipient)
|
|
: this(new DerInteger(pvno), sender, recipient)
|
|
{
|
|
}
|
|
|
|
private PkiHeader(DerInteger pvno, GeneralName sender, GeneralName recipient)
|
|
{
|
|
this.pvno = pvno;
|
|
this.sender = sender;
|
|
this.recipient = recipient;
|
|
}
|
|
|
|
public virtual InfoTypeAndValue[] GetGeneralInfo()
|
|
{
|
|
if (generalInfo == null)
|
|
{
|
|
return null;
|
|
}
|
|
InfoTypeAndValue[] array = new InfoTypeAndValue[generalInfo.Count];
|
|
for (int i = 0; i < array.Length; i++)
|
|
{
|
|
array[i] = InfoTypeAndValue.GetInstance(generalInfo[i]);
|
|
}
|
|
return array;
|
|
}
|
|
|
|
public override Asn1Object ToAsn1Object()
|
|
{
|
|
Asn1EncodableVector v = new Asn1EncodableVector(pvno, sender, recipient);
|
|
AddOptional(v, 0, messageTime);
|
|
AddOptional(v, 1, protectionAlg);
|
|
AddOptional(v, 2, senderKID);
|
|
AddOptional(v, 3, recipKID);
|
|
AddOptional(v, 4, transactionID);
|
|
AddOptional(v, 5, senderNonce);
|
|
AddOptional(v, 6, recipNonce);
|
|
AddOptional(v, 7, freeText);
|
|
AddOptional(v, 8, generalInfo);
|
|
return new DerSequence(v);
|
|
}
|
|
|
|
private static void AddOptional(Asn1EncodableVector v, int tagNo, Asn1Encodable obj)
|
|
{
|
|
if (obj != null)
|
|
{
|
|
v.Add(new DerTaggedObject(explicitly: true, tagNo, obj));
|
|
}
|
|
}
|
|
}
|