blob: e4df041e2df073ef5aeb08bccf0d9561d2a2352d (
plain) (
blame)
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
|
using System;
using System.Collections;
using System.IO;
using Org.BouncyCastle.Asn1;
using Org.BouncyCastle.Asn1.X509;
using Org.BouncyCastle.Utilities;
namespace Org.BouncyCastle.Crypto.Tls
{
/**
* A representation for a certificate chain.
*/
public class Certificate
{
public static readonly Certificate EmptyChain = new Certificate(new X509CertificateStructure[0]);
/**
* The certificates.
*/
internal X509CertificateStructure[] certs;
/**
* Parse the ServerCertificate message.
*
* @param inStr The stream where to parse from.
* @return A Certificate object with the certs, the server has sended.
* @throws IOException If something goes wrong during parsing.
*/
internal static Certificate Parse(
Stream inStr)
{
int left = TlsUtilities.ReadUint24(inStr);
if (left == 0)
{
return EmptyChain;
}
IList tmp = Platform.CreateArrayList();
while (left > 0)
{
int size = TlsUtilities.ReadUint24(inStr);
left -= 3 + size;
byte[] buf = new byte[size];
TlsUtilities.ReadFully(buf, inStr);
MemoryStream bis = new MemoryStream(buf, false);
Asn1Object o = Asn1Object.FromStream(bis);
tmp.Add(X509CertificateStructure.GetInstance(o));
if (bis.Position < bis.Length)
{
throw new ArgumentException("Sorry, there is garbage data left after the certificate");
}
}
X509CertificateStructure[] certs = new X509CertificateStructure[tmp.Count];
for (int i = 0; i < tmp.Count; ++i)
{
certs[i] = (X509CertificateStructure)tmp[i];
}
return new Certificate(certs);
}
/**
* Encodes version of the ClientCertificate message
*
* @param outStr stream to write the message to
* @throws IOException If something goes wrong
*/
internal void Encode(
Stream outStr)
{
IList encCerts = Platform.CreateArrayList();
int totalSize = 0;
foreach (X509CertificateStructure cert in certs)
{
byte[] encCert = cert.GetEncoded(Asn1Encodable.Der);
encCerts.Add(encCert);
totalSize += encCert.Length + 3;
}
TlsUtilities.WriteUint24(totalSize, outStr);
foreach (byte[] encCert in encCerts)
{
TlsUtilities.WriteOpaque24(encCert, outStr);
}
}
/**
* Private constructor from a cert array.
*
* @param certs The certs the chain should contain.
*/
public Certificate(X509CertificateStructure[] certs)
{
if (certs == null)
throw new ArgumentNullException("certs");
this.certs = certs;
}
/// <returns>An array which contains the certs, this chain contains.</returns>
public X509CertificateStructure[] GetCerts()
{
return (X509CertificateStructure[]) certs.Clone();
}
public bool IsEmpty
{
get { return certs.Length == 0; }
}
}
}
|