Holder
using System;
namespace Org.BouncyCastle.Asn1.X509
{
public class Holder : Asn1Encodable
{
private readonly IssuerSerial m_baseCertificateID;
private readonly GeneralNames m_entityName;
private readonly ObjectDigestInfo m_objectDigestInfo;
private readonly int m_version;
public int Version => m_version;
public IssuerSerial BaseCertificateID => m_baseCertificateID;
public GeneralNames EntityName => m_entityName;
public ObjectDigestInfo ObjectDigestInfo => m_objectDigestInfo;
public static Holder GetInstance(object obj)
{
if (obj == null)
return null;
Holder holder = obj as Holder;
if (holder != null)
return holder;
Asn1TaggedObject asn1TaggedObject = obj as Asn1TaggedObject;
if (asn1TaggedObject != null)
return new Holder(asn1TaggedObject);
return new Holder(Asn1Sequence.GetInstance(obj));
}
public static Holder GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit)
{
return new Holder(Asn1Sequence.GetInstance(taggedObject, declaredExplicit));
}
public static Holder GetTagged(Asn1TaggedObject taggedObject, bool declaredExplicit)
{
return new Holder(Asn1Sequence.GetTagged(taggedObject, declaredExplicit));
}
public Holder(Asn1TaggedObject tagObj)
{
switch (tagObj.TagNo) {
case 0:
m_baseCertificateID = IssuerSerial.GetInstance(tagObj, true);
break;
case 1:
m_entityName = GeneralNames.GetInstance(tagObj, true);
break;
default:
throw new ArgumentException("unknown tag in Holder");
}
m_version = 0;
}
private Holder(Asn1Sequence seq)
{
int count = seq.Count;
int sequencePosition = 0;
if (count < 0 || count > 3)
throw new ArgumentException("Bad sequence size: " + count.ToString(), "seq");
m_baseCertificateID = Asn1Utilities.ReadOptionalContextTagged(seq, ref sequencePosition, 0, false, IssuerSerial.GetTagged);
m_entityName = Asn1Utilities.ReadOptionalContextTagged(seq, ref sequencePosition, 1, false, GeneralNames.GetTagged);
m_objectDigestInfo = Asn1Utilities.ReadOptionalContextTagged(seq, ref sequencePosition, 2, false, ObjectDigestInfo.GetTagged);
if (sequencePosition != count)
throw new ArgumentException("Unexpected elements in sequence", "seq");
m_version = 1;
}
public Holder(IssuerSerial baseCertificateID)
: this(baseCertificateID, 1)
{
}
public Holder(IssuerSerial baseCertificateID, int version)
{
m_baseCertificateID = baseCertificateID;
m_version = version;
}
public Holder(GeneralNames entityName)
: this(entityName, 1)
{
}
public Holder(GeneralNames entityName, int version)
{
m_entityName = entityName;
m_version = version;
}
public Holder(ObjectDigestInfo objectDigestInfo)
{
m_objectDigestInfo = objectDigestInfo;
m_version = 1;
}
public override Asn1Object ToAsn1Object()
{
if (m_version == 1) {
Asn1EncodableVector asn1EncodableVector = new Asn1EncodableVector(3);
asn1EncodableVector.AddOptionalTagged(false, 0, m_baseCertificateID);
asn1EncodableVector.AddOptionalTagged(false, 1, m_entityName);
asn1EncodableVector.AddOptionalTagged(false, 2, m_objectDigestInfo);
return new DerSequence(asn1EncodableVector);
}
if (m_entityName != null)
return new DerTaggedObject(true, 1, m_entityName);
return new DerTaggedObject(true, 0, m_baseCertificateID);
}
}
}