X509ExtensionUtil.java revision 44021512997b337e6079e46fd4230ce979c20b6f
1package org.bouncycastle.x509.extension;
2
3import java.io.IOException;
4// BEGIN android-added
5import java.net.InetAddress;
6import java.net.UnknownHostException;
7// END android-added
8import java.security.cert.CertificateParsingException;
9import java.security.cert.X509Certificate;
10import java.util.ArrayList;
11import java.util.Collection;
12import java.util.Collections;
13import java.util.Enumeration;
14import java.util.List;
15
16import org.bouncycastle.asn1.ASN1ObjectIdentifier;
17import org.bouncycastle.asn1.ASN1OctetString;
18import org.bouncycastle.asn1.ASN1Primitive;
19import org.bouncycastle.asn1.ASN1String;
20import org.bouncycastle.asn1.DEROctetString;
21import org.bouncycastle.asn1.DERSequence;
22import org.bouncycastle.asn1.x500.X500Name;
23import org.bouncycastle.asn1.x509.GeneralName;
24import org.bouncycastle.asn1.x509.X509Extension;
25// BEGIN android-added
26import org.bouncycastle.asn1.x509.X509Name;
27// END android-added
28
29
30public class X509ExtensionUtil
31{
32    public static ASN1Primitive fromExtensionValue(
33        byte[]  encodedValue)
34        throws IOException
35    {
36        ASN1OctetString octs = (ASN1OctetString)ASN1Primitive.fromByteArray(encodedValue);
37
38        return ASN1Primitive.fromByteArray(octs.getOctets());
39    }
40
41    public static Collection getIssuerAlternativeNames(X509Certificate cert)
42            throws CertificateParsingException
43    {
44        byte[] extVal = cert.getExtensionValue(X509Extension.issuerAlternativeName.getId());
45
46        return getAlternativeNames(extVal);
47    }
48
49    public static Collection getSubjectAlternativeNames(X509Certificate cert)
50            throws CertificateParsingException
51    {
52        byte[] extVal = cert.getExtensionValue(X509Extension.subjectAlternativeName.getId());
53
54        return getAlternativeNames(extVal);
55    }
56
57    private static Collection getAlternativeNames(byte[] extVal)
58        throws CertificateParsingException
59    {
60        if (extVal == null)
61        {
62            // BEGIN android-changed
63            return null;
64            // END android-changed
65        }
66        try
67        {
68            Collection temp = new ArrayList();
69            Enumeration it = DERSequence.getInstance(fromExtensionValue(extVal)).getObjects();
70            while (it.hasMoreElements())
71            {
72                GeneralName genName = GeneralName.getInstance(it.nextElement());
73                List list = new ArrayList();
74                // BEGIN android-changed
75                list.add(Integer.valueOf(genName.getTagNo()));
76                // END android-changed
77                switch (genName.getTagNo())
78                {
79                case GeneralName.ediPartyName:
80                case GeneralName.x400Address:
81                case GeneralName.otherName:
82                    // BEGIN android-changed
83                    list.add(genName.getEncoded());
84                    // END android-changed
85                    break;
86                case GeneralName.directoryName:
87                    // BEGIN android-changed
88                    list.add(X509Name.getInstance(genName.getName()).toString(true,
89                            X509Name.DefaultSymbols));
90                    // END android-changed
91                    break;
92                case GeneralName.dNSName:
93                case GeneralName.rfc822Name:
94                case GeneralName.uniformResourceIdentifier:
95                    list.add(((ASN1String)genName.getName()).getString());
96                    break;
97                case GeneralName.registeredID:
98                    list.add(ASN1ObjectIdentifier.getInstance(genName.getName()).getId());
99                    break;
100                case GeneralName.iPAddress:
101                    // BEGIN android-changed
102                    byte[] addrBytes = DEROctetString.getInstance(genName.getName()).getOctets();
103                    final String addr;
104                    try {
105                        addr = InetAddress.getByAddress(addrBytes).getHostAddress();
106                    } catch (UnknownHostException e) {
107                        continue;
108                    }
109                    list.add(addr);
110                    // END android-changed
111                    break;
112                default:
113                    throw new IOException("Bad tag number: " + genName.getTagNo());
114                }
115
116                temp.add(list);
117            }
118            // BEGIN android-added
119            if (temp.size() == 0) {
120                return null;
121            }
122            // END android-added
123            return Collections.unmodifiableCollection(temp);
124        }
125        catch (Exception e)
126        {
127            throw new CertificateParsingException(e.getMessage());
128        }
129    }
130}
131