TbsCertificateList
using System;
using System.Collections;
using System.Collections.Generic;
namespace Org.BouncyCastle.Asn1.X509
{
public class TbsCertificateList : Asn1Encodable
{
private class RevokedCertificatesEnumeration : IEnumerable<CrlEntry>, IEnumerable
{
private sealed class RevokedCertificatesEnumerator : IEnumerator<CrlEntry>, IDisposable, IEnumerator
{
private readonly IEnumerator<Asn1Encodable> m_e;
object IEnumerator.Current {
get {
return Current;
}
}
public CrlEntry Current => CrlEntry.GetInstance(m_e.Current);
internal RevokedCertificatesEnumerator(IEnumerator<Asn1Encodable> e)
{
m_e = e;
}
public void Dispose()
{
m_e.Dispose();
GC.SuppressFinalize(this);
}
public bool MoveNext()
{
return m_e.MoveNext();
}
public void Reset()
{
m_e.Reset();
}
}
private readonly IEnumerable<Asn1Encodable> m_en;
internal RevokedCertificatesEnumeration(IEnumerable<Asn1Encodable> en)
{
m_en = en;
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public IEnumerator<CrlEntry> GetEnumerator()
{
return new RevokedCertificatesEnumerator(m_en.GetEnumerator());
}
}
private readonly Asn1Sequence m_seq;
private readonly DerInteger m_version;
private readonly AlgorithmIdentifier m_signature;
private readonly X509Name m_issuer;
private readonly Time m_thisUpdate;
private readonly Time m_nextUpdate;
private readonly Asn1Sequence m_revokedCertificates;
private readonly X509Extensions m_crlExtensions;
public int Version => m_version.IntValueExact + 1;
public DerInteger VersionNumber => m_version;
public AlgorithmIdentifier Signature => m_signature;
public X509Name Issuer => m_issuer;
public Time ThisUpdate => m_thisUpdate;
public Time NextUpdate => m_nextUpdate;
public X509Extensions Extensions => m_crlExtensions;
public static TbsCertificateList GetInstance(object obj)
{
if (obj == null)
return null;
TbsCertificateList tbsCertificateList = obj as TbsCertificateList;
if (tbsCertificateList != null)
return tbsCertificateList;
return new TbsCertificateList(Asn1Sequence.GetInstance(obj));
}
public static TbsCertificateList GetInstance(Asn1TaggedObject obj, bool explicitly)
{
return new TbsCertificateList(Asn1Sequence.GetInstance(obj, explicitly));
}
public static TbsCertificateList GetTagged(Asn1TaggedObject taggedObject, bool declaredExplicit)
{
return new TbsCertificateList(Asn1Sequence.GetTagged(taggedObject, declaredExplicit));
}
private TbsCertificateList(Asn1Sequence seq)
{
int count = seq.Count;
int sequencePosition = 0;
if (count < 3 || count > 7)
throw new ArgumentException("Bad sequence size: " + count.ToString(), "seq");
m_version = (Asn1Utilities.ReadOptional(seq, ref sequencePosition, DerInteger.GetOptional) ?? DerInteger.Zero);
m_signature = AlgorithmIdentifier.GetInstance(seq[sequencePosition++]);
m_issuer = X509Name.GetInstance(seq[sequencePosition++]);
m_thisUpdate = Time.GetInstance(seq[sequencePosition++]);
m_nextUpdate = Asn1Utilities.ReadOptional(seq, ref sequencePosition, Time.GetOptional);
m_revokedCertificates = Asn1Utilities.ReadOptional(seq, ref sequencePosition, Asn1Sequence.GetOptional);
m_crlExtensions = Asn1Utilities.ReadOptionalContextTagged(seq, ref sequencePosition, 0, true, X509Extensions.GetTagged);
if (sequencePosition != count)
throw new ArgumentException("Unexpected elements in sequence", "seq");
m_seq = seq;
}
public CrlEntry[] GetRevokedCertificates()
{
return m_revokedCertificates?.MapElements(CrlEntry.GetInstance) ?? Array.Empty<CrlEntry>();
}
public IEnumerable<CrlEntry> GetRevokedCertificateEnumeration()
{
if (m_revokedCertificates == null)
return new List<CrlEntry>(0);
return new RevokedCertificatesEnumeration(m_revokedCertificates);
}
public override Asn1Object ToAsn1Object()
{
return m_seq;
}
}
}