using System;
using System.Collections.Generic;
using Org.BouncyCastle.Utilities;
namespace Org.BouncyCastle.Asn1.X509
{
public class CrlEntry
: Asn1Encodable
{
internal Asn1Sequence seq;
internal DerInteger userCertificate;
internal Time revocationDate;
internal X509Extensions crlEntryExtensions;
public CrlEntry(Asn1Sequence seq)
{
if (seq.Count < 2 || seq.Count > 3)
throw new ArgumentException("Bad sequence size: " + seq.Count);
this.seq = seq;
userCertificate = DerInteger.GetInstance(seq[0]);
revocationDate = Time.GetInstance(seq[1]);
}
public DerInteger UserCertificate
{
get { return userCertificate; }
}
public Time RevocationDate
{
get { return revocationDate; }
}
public X509Extensions Extensions
{
get
{
if (crlEntryExtensions == null && seq.Count == 3)
{
crlEntryExtensions = X509Extensions.GetInstance(seq[2]);
}
return crlEntryExtensions;
}
}
public override Asn1Object ToAsn1Object()
{
return seq;
}
}
/**
* PKIX RFC-2459 - TbsCertList object.
*
* TbsCertList ::= Sequence {
* version Version OPTIONAL,
* -- if present, shall be v2
* signature AlgorithmIdentifier,
* issuer Name,
* thisUpdate Time,
* nextUpdate Time OPTIONAL,
* revokedCertificates Sequence OF Sequence {
* userCertificate CertificateSerialNumber,
* revocationDate Time,
* crlEntryExtensions Extensions OPTIONAL
* -- if present, shall be v2
* } OPTIONAL,
* crlExtensions [0] EXPLICIT Extensions OPTIONAL
* -- if present, shall be v2
* }
*
*/
public class TbsCertificateList
: Asn1Encodable
{
private class RevokedCertificatesEnumeration
: IEnumerable
{
private readonly IEnumerable en;
internal RevokedCertificatesEnumeration(IEnumerable en)
{
this.en = en;
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public IEnumerator GetEnumerator()
{
return new RevokedCertificatesEnumerator(en.GetEnumerator());
}
private sealed class RevokedCertificatesEnumerator
: IEnumerator
{
private readonly IEnumerator e;
internal RevokedCertificatesEnumerator(IEnumerator e)
{
this.e = e;
}
public void Dispose()
{
e.Dispose();
GC.SuppressFinalize(this);
}
public bool MoveNext()
{
return e.MoveNext();
}
public void Reset()
{
e.Reset();
}
object System.Collections.IEnumerator.Current
{
get { return Current; }
}
public CrlEntry Current
{
get { return new CrlEntry(Asn1Sequence.GetInstance(e.Current)); }
}
}
}
internal Asn1Sequence seq;
internal DerInteger version;
internal AlgorithmIdentifier signature;
internal X509Name issuer;
internal Time thisUpdate;
internal Time nextUpdate;
internal Asn1Sequence revokedCertificates;
internal X509Extensions crlExtensions;
public static TbsCertificateList GetInstance(object obj)
{
if (obj == null)
return null;
if (obj is TbsCertificateList tbsCertificateList)
return tbsCertificateList;
return new TbsCertificateList(Asn1Sequence.GetInstance(obj));
}
public static TbsCertificateList GetInstance(Asn1TaggedObject obj, bool explicitly)
{
return GetInstance(Asn1Sequence.GetInstance(obj, explicitly));
}
private TbsCertificateList(Asn1Sequence seq)
{
if (seq.Count < 3 || seq.Count > 7)
throw new ArgumentException("Bad sequence size: " + seq.Count);
int seqPos = 0;
this.seq = seq;
if (seq[seqPos] is DerInteger derInteger)
{
version = derInteger;
++seqPos;
}
else
{
version = new DerInteger(0);
}
signature = AlgorithmIdentifier.GetInstance(seq[seqPos++]);
issuer = X509Name.GetInstance(seq[seqPos++]);
thisUpdate = Time.GetInstance(seq[seqPos++]);
if (seqPos < seq.Count
&& (seq[seqPos] is Asn1UtcTime
|| seq[seqPos] is Asn1GeneralizedTime
|| seq[seqPos] is Time))
{
nextUpdate = Time.GetInstance(seq[seqPos++]);
}
if (seqPos < seq.Count
&& !(seq[seqPos] is Asn1TaggedObject))
{
revokedCertificates = Asn1Sequence.GetInstance(seq[seqPos++]);
}
if (seqPos < seq.Count
&& seq[seqPos] is Asn1TaggedObject)
{
crlExtensions = X509Extensions.GetInstance(seq[seqPos]);
}
}
public int Version
{
get { return version.IntValueExact + 1; }
}
public DerInteger VersionNumber
{
get { return version; }
}
public AlgorithmIdentifier Signature
{
get { return signature; }
}
public X509Name Issuer
{
get { return issuer; }
}
public Time ThisUpdate
{
get { return thisUpdate; }
}
public Time NextUpdate
{
get { return nextUpdate; }
}
public CrlEntry[] GetRevokedCertificates()
{
if (revokedCertificates == null)
{
return new CrlEntry[0];
}
CrlEntry[] entries = new CrlEntry[revokedCertificates.Count];
for (int i = 0; i < entries.Length; i++)
{
entries[i] = new CrlEntry(Asn1Sequence.GetInstance(revokedCertificates[i]));
}
return entries;
}
public IEnumerable GetRevokedCertificateEnumeration()
{
if (revokedCertificates == null)
return new List(0);
return new RevokedCertificatesEnumeration(revokedCertificates);
}
public X509Extensions Extensions
{
get { return crlExtensions; }
}
public override Asn1Object ToAsn1Object()
{
return seq;
}
}
}