using System;
using System.Collections.Generic;
using System.IO;
using Org.BouncyCastle.Utilities;
namespace Org.BouncyCastle.Asn1.X509
{
/**
* Generator for Version 2 TbsCertList structures.
*
* 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
* }
*
*
* Note: This class may be subject to change
*/
public class V2TbsCertListGenerator
{
private DerInteger version = new DerInteger(1);
private AlgorithmIdentifier signature;
private X509Name issuer;
private Time thisUpdate, nextUpdate;
private X509Extensions extensions;
private List crlEntries;
public V2TbsCertListGenerator()
{
}
public void SetSignature(
AlgorithmIdentifier signature)
{
this.signature = signature;
}
public void SetIssuer(
X509Name issuer)
{
this.issuer = issuer;
}
public void SetThisUpdate(
DerUtcTime thisUpdate)
{
this.thisUpdate = new Time(thisUpdate);
}
public void SetNextUpdate(
DerUtcTime nextUpdate)
{
this.nextUpdate = (nextUpdate != null)
? new Time(nextUpdate)
: null;
}
public void SetThisUpdate(
Time thisUpdate)
{
this.thisUpdate = thisUpdate;
}
public void SetNextUpdate(
Time nextUpdate)
{
this.nextUpdate = nextUpdate;
}
public void AddCrlEntry(Asn1Sequence crlEntry)
{
if (crlEntries == null)
{
crlEntries = new List();
}
crlEntries.Add(crlEntry);
}
public void AddCrlEntry(DerInteger userCertificate, DerUtcTime revocationDate, int reason)
{
AddCrlEntry(userCertificate, new Time(revocationDate), reason);
}
public void AddCrlEntry(DerInteger userCertificate, Time revocationDate, int reason)
{
AddCrlEntry(userCertificate, revocationDate, reason, null);
}
public void AddCrlEntry(DerInteger userCertificate, Time revocationDate, int reason,
Asn1GeneralizedTime invalidityDate)
{
var extOids = new List();
var extValues = new List();
if (reason != 0)
{
CrlReason crlReason = new CrlReason(reason);
try
{
extOids.Add(X509Extensions.ReasonCode);
extValues.Add(new X509Extension(false, new DerOctetString(crlReason.GetEncoded())));
}
catch (IOException e)
{
throw new ArgumentException("error encoding reason: " + e);
}
}
if (invalidityDate != null)
{
try
{
extOids.Add(X509Extensions.InvalidityDate);
extValues.Add(new X509Extension(false, new DerOctetString(invalidityDate.GetEncoded())));
}
catch (IOException e)
{
throw new ArgumentException("error encoding invalidityDate: " + e);
}
}
if (extOids.Count != 0)
{
AddCrlEntry(userCertificate, revocationDate, new X509Extensions(extOids, extValues));
}
else
{
AddCrlEntry(userCertificate, revocationDate, null);
}
}
public void AddCrlEntry(DerInteger userCertificate, Time revocationDate, X509Extensions extensions)
{
Asn1EncodableVector v = new Asn1EncodableVector(userCertificate, revocationDate);
if (extensions != null)
{
v.Add(extensions);
}
AddCrlEntry(new DerSequence(v));
}
public void SetExtensions(
X509Extensions extensions)
{
this.extensions = extensions;
}
public TbsCertificateList GenerateTbsCertList()
{
if ((signature == null) || (issuer == null) || (thisUpdate == null))
{
throw new InvalidOperationException("Not all mandatory fields set in V2 TbsCertList generator.");
}
Asn1EncodableVector v = new Asn1EncodableVector(
version, signature, issuer, thisUpdate);
if (nextUpdate != null)
{
v.Add(nextUpdate);
}
// Add CRLEntries if they exist
if (crlEntries != null)
{
v.Add(new DerSequence(crlEntries.ToArray()));
}
if (extensions != null)
{
v.Add(new DerTaggedObject(0, extensions));
}
return new TbsCertificateList(new DerSequence(v));
}
}
}