RequestedCertificate
using Org.BouncyCastle.Asn1.X509;
using System;
using System.IO;
namespace Org.BouncyCastle.Asn1.IsisMtt.Ocsp
{
public class RequestedCertificate : Asn1Encodable, IAsn1Choice
{
public enum Choice
{
Certificate = -1,
PublicKeyCertificate,
AttributeCertificate
}
private readonly X509CertificateStructure m_cert;
private readonly Asn1OctetString m_publicKeyCert;
private readonly Asn1OctetString m_attributeCert;
public Choice Type {
get {
if (m_cert != null)
return Choice.Certificate;
if (m_publicKeyCert != null)
return Choice.PublicKeyCertificate;
return Choice.AttributeCertificate;
}
}
public static RequestedCertificate GetInstance(object obj)
{
return Asn1Utilities.GetInstanceChoice(obj, GetOptional);
}
public static RequestedCertificate GetInstance(Asn1TaggedObject obj, bool isExplicit)
{
return Asn1Utilities.GetInstanceChoice(obj, isExplicit, GetInstance);
}
public static RequestedCertificate GetOptional(Asn1Encodable element)
{
if (element == null)
throw new ArgumentNullException("element");
RequestedCertificate requestedCertificate = element as RequestedCertificate;
if (requestedCertificate != null)
return requestedCertificate;
X509CertificateStructure optional = X509CertificateStructure.GetOptional(element);
if (optional != null)
return new RequestedCertificate(optional);
Asn1TaggedObject optional2 = Asn1TaggedObject.GetOptional(element, 128);
if (optional2 != null && (optional2.TagNo == 0 || optional2.TagNo == 1))
return new RequestedCertificate(optional2);
return null;
}
public static RequestedCertificate GetTagged(Asn1TaggedObject taggedObject, bool declaredExplicit)
{
return Asn1Utilities.GetTaggedChoice(taggedObject, declaredExplicit, GetInstance);
}
private RequestedCertificate(Asn1TaggedObject tagged)
{
switch (tagged.TagNo) {
case 1:
m_attributeCert = Asn1OctetString.GetTagged(tagged, true);
break;
case 0:
m_publicKeyCert = Asn1OctetString.GetTagged(tagged, true);
break;
default:
throw new ArgumentException("unknown tag number: " + tagged.TagNo.ToString());
}
}
public RequestedCertificate(X509CertificateStructure certificate)
{
m_cert = certificate;
}
public RequestedCertificate(Choice type, byte[] certificateOctets)
: this(new DerTaggedObject((int)type, DerOctetString.FromContents(certificateOctets)))
{
}
public byte[] GetCertificateBytes()
{
if (m_cert != null)
try {
return m_cert.GetEncoded();
} catch (IOException ex) {
throw new InvalidOperationException("can't decode certificate: " + ex?.ToString());
}
if (m_publicKeyCert != null)
return m_publicKeyCert.GetOctets();
return m_attributeCert.GetOctets();
}
public override Asn1Object ToAsn1Object()
{
if (m_publicKeyCert != null)
return new DerTaggedObject(0, m_publicKeyCert);
if (m_attributeCert != null)
return new DerTaggedObject(1, m_attributeCert);
return m_cert.ToAsn1Object();
}
}
}