vipnet-extract-data/VipNetExtract2/VipNetKeyInfo.cs

111 lines
3.9 KiB
C#

using System;
using Org.BouncyCastle.Asn1;
using Org.BouncyCastle.Asn1.Crmf;
using Org.BouncyCastle.Asn1.X509;
namespace VipNetExtract
{
class VipNetKeyInfo : Asn1Encodable
{
public VipNetKeyInfo(Asn1Sequence seq)
{
RawData = seq.GetEncoded();
KeyClass = (DerInteger)seq[0];
KeyType = (DerInteger)seq[1];
for (int i = 2; i < seq.Count; ++i) {
if (seq[i] is Asn1TaggedObject tag) {
switch (tag.TagNo) {
case 0:
Algorithm = AlgorithmIdentifier.GetInstance(tag.GetObject());
break;
case 1:
SerialNumber = Asn1OctetString.GetInstance(tag.GetObject());
break;
case 2:
AddSerialNumber = Asn1OctetString.GetInstance(tag.GetObject());
break;
case 3:
CertSerialNumber = Asn1OctetString.GetInstance(tag.GetObject());
break;
case 4:
SubjectUID = Asn1OctetString.GetInstance(tag.GetObject());
break;
case 5:
RecipientUID = Asn1OctetString.GetInstance(tag.GetObject());
break;
case 6:
Validity = KeyValidity.GetInstance(tag.GetObject());
break;
case 7:
KeyUID = DerBitString.GetInstance(tag.GetObject());
break;
case 10:
Flags = DerInteger.GetInstance(tag.GetObject());
break;
}
}
}
}
internal byte[] RawData { get; }
public DerInteger KeyClass { get; }
public DerInteger KeyType { get; }
public AlgorithmIdentifier Algorithm { get; }
public Asn1OctetString SerialNumber { get; }
public Asn1OctetString AddSerialNumber { get; }
public Asn1OctetString CertSerialNumber { get; }
public Asn1OctetString SubjectUID { get; }
public Asn1OctetString RecipientUID { get; }
public KeyValidity Validity { get; }
public DerBitString KeyUID { get; }
public DerInteger Flags { get; }
public override Asn1Object ToAsn1Object()
{
var vec = new Asn1EncodableVector(KeyClass, KeyType);
if (Algorithm != null)
vec.Add(new DerTaggedObject(0, Algorithm));
if (SerialNumber != null)
vec.Add(new DerTaggedObject(1, SerialNumber));
if (AddSerialNumber != null)
vec.Add(new DerTaggedObject(2, AddSerialNumber));
if (CertSerialNumber != null)
vec.Add(new DerTaggedObject(3, CertSerialNumber));
if (SubjectUID != null)
vec.Add(new DerTaggedObject(4, SubjectUID));
if (RecipientUID != null)
vec.Add(new DerTaggedObject(5, RecipientUID));
if (Validity != null)
vec.Add(new DerTaggedObject(6, Validity));
if (KeyUID != null)
vec.Add(new DerTaggedObject(7, KeyUID));
if (Flags != null)
vec.Add(new DerTaggedObject(10, Flags));
return new DerSequence(vec);
}
public static VipNetKeyInfo GetInstance(object obj)
{
if (obj is VipNetKeyInfo keyInfo)
return keyInfo;
return new VipNetKeyInfo(Asn1Sequence.GetInstance(obj));
}
public static VipNetKeyInfo GetInstance(Asn1TaggedObject obj, bool explicitly)
=> GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
}
}