1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
|
using System;
using System.Collections;
using Org.BouncyCastle.Asn1;
using Org.BouncyCastle.Asn1.X509;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Math;
using Org.BouncyCastle.Security.Certificates;
using Org.BouncyCastle.Utilities;
namespace Org.BouncyCastle.X509
{
/// <remarks>Class to produce an X.509 Version 2 AttributeCertificate.</remarks>
public class X509V2AttributeCertificateGenerator
{
private readonly X509ExtensionsGenerator extGenerator = new X509ExtensionsGenerator();
private V2AttributeCertificateInfoGenerator acInfoGen;
public X509V2AttributeCertificateGenerator()
{
acInfoGen = new V2AttributeCertificateInfoGenerator();
}
/// <summary>Reset the generator</summary>
public void Reset()
{
acInfoGen = new V2AttributeCertificateInfoGenerator();
extGenerator.Reset();
}
/// <summary>Set the Holder of this Attribute Certificate.</summary>
public void SetHolder(
AttributeCertificateHolder holder)
{
acInfoGen.SetHolder(holder.holder);
}
/// <summary>Set the issuer.</summary>
public void SetIssuer(
AttributeCertificateIssuer issuer)
{
acInfoGen.SetIssuer(AttCertIssuer.GetInstance(issuer.form));
}
/// <summary>Set the serial number for the certificate.</summary>
public void SetSerialNumber(
BigInteger serialNumber)
{
acInfoGen.SetSerialNumber(new DerInteger(serialNumber));
}
public void SetNotBefore(
DateTime date)
{
acInfoGen.SetStartDate(new DerGeneralizedTime(date));
}
public void SetNotAfter(
DateTime date)
{
acInfoGen.SetEndDate(new DerGeneralizedTime(date));
}
/// <summary>Add an attribute.</summary>
public void AddAttribute(
X509Attribute attribute)
{
acInfoGen.AddAttribute(AttributeX509.GetInstance(attribute.ToAsn1Object()));
}
public void SetIssuerUniqueId(
bool[] iui)
{
// TODO convert bool array to bit string
//acInfoGen.SetIssuerUniqueID(iui);
throw Platform.CreateNotImplementedException("SetIssuerUniqueId()");
}
/// <summary>Add a given extension field for the standard extensions tag.</summary>
public void AddExtension(
string oid,
bool critical,
Asn1Encodable extensionValue)
{
extGenerator.AddExtension(new DerObjectIdentifier(oid), critical, extensionValue);
}
/// <summary>
/// Add a given extension field for the standard extensions tag.
/// The value parameter becomes the contents of the octet string associated
/// with the extension.
/// </summary>
public void AddExtension(
string oid,
bool critical,
byte[] extensionValue)
{
extGenerator.AddExtension(new DerObjectIdentifier(oid), critical, extensionValue);
}
/// <summary>
/// Generate a new X.509 Attribute Certificate using the passed in SignatureCalculator.
/// </summary>
/// <param name="signatureCalculatorFactory">A signature calculator factory with the necessary algorithm details.</param>
/// <returns>An IX509AttributeCertificate.</returns>
public X509V2AttributeCertificate Generate(ISignatureFactory signatureCalculatorFactory)
{
if (!extGenerator.IsEmpty)
{
acInfoGen.SetExtensions(extGenerator.Generate());
}
AlgorithmIdentifier sigAlgID = (AlgorithmIdentifier)signatureCalculatorFactory.AlgorithmDetails;
acInfoGen.SetSignature(sigAlgID);
AttributeCertificateInfo acInfo = acInfoGen.GenerateAttributeCertificateInfo();
byte[] encoded = acInfo.GetDerEncoded();
IStreamCalculator streamCalculator = signatureCalculatorFactory.CreateCalculator();
streamCalculator.Stream.Write(encoded, 0, encoded.Length);
Platform.Dispose(streamCalculator.Stream);
try
{
DerBitString signatureValue = new DerBitString(((IBlockResult)streamCalculator.GetResult()).Collect());
return new X509V2AttributeCertificate(new AttributeCertificate(acInfo, sigAlgID, signatureValue));
}
catch (Exception e)
{
// TODO
// throw new ExtCertificateEncodingException("constructed invalid certificate", e);
throw new CertificateEncodingException("constructed invalid certificate", e);
}
}
/// <summary>
/// Allows enumeration of the signature names supported by the generator.
/// </summary>
public IEnumerable SignatureAlgNames
{
get { return X509Utilities.GetAlgNames(); }
}
}
}
|