01: package org.bouncycastle.crypto.tls;
02:
03: import org.bouncycastle.asn1.ASN1InputStream;
04: import org.bouncycastle.asn1.DERObject;
05: import org.bouncycastle.asn1.x509.X509CertificateStructure;
06:
07: import java.io.ByteArrayInputStream;
08: import java.io.IOException;
09: import java.io.InputStream;
10: import java.util.Vector;
11:
12: /**
13: * A representation for a certificate chain as used by an tls server.
14: */
15: public class Certificate {
16: /**
17: * The certificates.
18: */
19: protected X509CertificateStructure[] certs;
20:
21: /**
22: * Parse the ServerCertificate message.
23: *
24: * @param is The stream where to parse from.
25: * @return A Certificate object with the certs, the server has sended.
26: * @throws IOException If something goes wrong during parsing.
27: */
28: protected static Certificate parse(InputStream is)
29: throws IOException {
30: X509CertificateStructure[] certs;
31: int left = TlsUtils.readUint24(is);
32: Vector tmp = new Vector();
33: while (left > 0) {
34: int size = TlsUtils.readUint24(is);
35: left -= 3 + size;
36: byte[] buf = new byte[size];
37: TlsUtils.readFully(buf, is);
38: ByteArrayInputStream bis = new ByteArrayInputStream(buf);
39: ASN1InputStream ais = new ASN1InputStream(bis);
40: DERObject o = ais.readObject();
41: tmp.addElement(X509CertificateStructure.getInstance(o));
42: if (bis.available() > 0) {
43: throw new IllegalArgumentException(
44: "Sorry, there is garbage data left after the certificate");
45: }
46: }
47: certs = new X509CertificateStructure[tmp.size()];
48: for (int i = 0; i < tmp.size(); i++) {
49: certs[i] = (X509CertificateStructure) tmp.elementAt(i);
50: }
51: return new Certificate(certs);
52: }
53:
54: /**
55: * Private constructure from an cert array.
56: *
57: * @param certs The certs the chain should contain.
58: */
59: private Certificate(X509CertificateStructure[] certs) {
60: this .certs = certs;
61: }
62:
63: /**
64: * @return An array which contains the certs, this chain contains.
65: */
66: public X509CertificateStructure[] getCerts() {
67: X509CertificateStructure[] result = new X509CertificateStructure[certs.length];
68: System.arraycopy(certs, 0, result, 0, certs.length);
69: return result;
70: }
71:
72: }
|