1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  the License.  You may obtain a copy of the License at
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.security.cert;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ByteArrayInputStream;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.math.BigInteger;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.Principal;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Collection;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Date;
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.List;
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.security.auth.x500.X500Principal;
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Abstract base class for X.509 certificates.
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This represents a standard way for accessing the attributes of X.509
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * certificates.
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The basic X.509 v3 format described in ASN.1:
35f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre>
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Certificate  ::=  SEQUENCE  {
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     tbsCertificate       TBSCertificate,
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     signatureAlgorithm   AlgorithmIdentifier,
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     signature            BIT STRING  }
41f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * TBSCertificate  ::=  SEQUENCE  {
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *      version         [0]  EXPLICIT Version DEFAULT v1,
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *      serialNumber         CertificateSerialNumber,
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *      signature            AlgorithmIdentifier,
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *      issuer               Name,
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *      validity             Validity,
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *      subject              Name,
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *      subjectPublicKeyInfo SubjectPublicKeyInfo,
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *      issuerUniqueID  [1]  IMPLICIT UniqueIdentifier OPTIONAL,
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *                           -- If present, version must be v2 or v3
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *      subjectUniqueID [2]  IMPLICIT UniqueIdentifier OPTIONAL,
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *                           -- If present, version must be v2 or v3
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *      extensions      [3]  EXPLICIT Extensions OPTIONAL
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *                           -- If present, version must be v3
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *      }
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre>
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * For more information consult RFC 2459
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * "Internet X.509 Public Key Infrastructure Certificate and CRL Profile" at <a
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * href
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ="http://www.ietf.org/rfc/rfc2459.txt">http://www.ietf.org/rfc/rfc2459.txt
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </a> .
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic abstract class X509Certificate
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        extends Certificate implements X509Extension {
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final long serialVersionUID = -2491127588187038216L;
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a new {@code X509Certificate}.
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected X509Certificate() {
74f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        super("X.509");
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Checks whether the certificate is currently valid.
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The validity defined in ASN.1:
81f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <pre>
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * validity             Validity
84f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
85f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * Validity ::= SEQUENCE {
86f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *      notBefore       CertificateValidityDate,
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *      notAfter        CertificateValidityDate }
88f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
89f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * CertificateValidityDate ::= CHOICE {
90f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *      utcTime         UTCTime,
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *      generalTime     GeneralizedTime }
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * </pre>
93f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws CertificateExpiredException
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the certificate has expired.
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws CertificateNotYetValidException
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the certificate is not yet valid.
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract void checkValidity()
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws CertificateExpiredException, CertificateNotYetValidException;
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Checks whether the certificate is valid at the specified date.
104f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param date
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the date to check the validity against.
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws CertificateExpiredException
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the certificate has expired.
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws CertificateNotYetValidException
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the certificate is not yet valid.
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #checkValidity()
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract void checkValidity(Date date)
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws CertificateExpiredException, CertificateNotYetValidException;
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the certificates {@code version} (version number).
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The version defined is ASN.1:
120f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <pre>
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Version ::=  INTEGER  {  v1(0), v2(1), v3(2)  }
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * </pre>
124f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the version number.
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract int getVersion();
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the {@code serialNumber} of the certificate.
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The ASN.1 definition of {@code serialNumber}:
133f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <pre>
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * CertificateSerialNumber  ::=  INTEGER
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * </pre>
137f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the serial number.
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract BigInteger getSerialNumber();
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the {@code issuer} (issuer distinguished name) as an
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * implementation specific {@code Principal} object.
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The ASN.1 definition of {@code issuer}:
147f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <pre>
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *  issuer      Name
150f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *  Name ::= CHOICE {
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *      RDNSequence }
153f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *    RDNSequence ::= SEQUENCE OF RelativeDistinguishedName
155f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *    RelativeDistinguishedName ::= SET OF AttributeTypeAndValue
157f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *    AttributeTypeAndValue ::= SEQUENCE {
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *      type     AttributeType,
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *      value    AttributeValue }
161f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *    AttributeType ::= OBJECT IDENTIFIER
163f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *    AttributeValue ::= ANY DEFINED BY AttributeType
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * </pre>
166f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <b>replaced by:</b> {@link #getIssuerX500Principal()}.
168f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code issuer} as an implementation specific {@code
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         Principal}.
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract Principal getIssuerDN() ;
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the {@code issuer} (issuer distinguished name) as an {@code
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * X500Principal}.
177f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code issuer} (issuer distinguished name).
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public X500Principal getIssuerX500Principal() {
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // TODO if there is no X.509 certificate provider installed
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // should we try to access Harmony X509CertImpl via classForName?
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            CertificateFactory factory = CertificateFactory
186f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes                    .getInstance("X.509");
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            X509Certificate cert = (X509Certificate) factory
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    .generateCertificate(new ByteArrayInputStream(getEncoded()));
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return cert.getIssuerX500Principal();
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
194897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes            throw new RuntimeException("Failed to get X500Principal issuer", e);
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the {@code subject} (subject distinguished name) as an
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * implementation specific {@code Principal} object.
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The ASN.1 definition of {@code subject}:
203f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <pre>
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * subject      Name
206f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *  Name ::= CHOICE {
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *      RDNSequence }
209f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *    RDNSequence ::= SEQUENCE OF RelativeDistinguishedName
211f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *    RelativeDistinguishedName ::= SET OF AttributeTypeAndValue
213f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *    AttributeTypeAndValue ::= SEQUENCE {
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *      type     AttributeType,
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *      value    AttributeValue }
217f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *    AttributeType ::= OBJECT IDENTIFIER
219f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *    AttributeValue ::= ANY DEFINED BY AttributeType
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * </pre>
222f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <b>replaced by:</b> {@link #getSubjectX500Principal()}.
2252f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code subject} (subject distinguished name).
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract Principal getSubjectDN();
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the {@code subject} (subject distinguished name) as an {@code
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * X500Principal}.
233f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code subject} (subject distinguished name)
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public X500Principal getSubjectX500Principal() {
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // TODO if there is no X.509 certificate provider installed
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // should we try to access Harmony X509CertImpl via classForName?
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            CertificateFactory factory = CertificateFactory
242f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes                    .getInstance("X.509");
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            X509Certificate cert = (X509Certificate) factory
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    .generateCertificate(new ByteArrayInputStream(getEncoded()));
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return cert.getSubjectX500Principal();
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
249897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes            throw new RuntimeException("Failed to get X500Principal subject", e);
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the {@code notBefore} date from the validity period of the
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * certificate.
256f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the start of the validity period.
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract Date getNotBefore();
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the {@code notAfter} date of the validity period of the
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * certificate.
264f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the end of the validity period.
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract Date getNotAfter();
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the {@code tbsCertificate} information from this certificate in
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * DER-encoded format.
272f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the DER-encoded certificate information.
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws CertificateEncodingException
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs in encoding
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract byte[] getTBSCertificate()
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                    throws CertificateEncodingException;
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the raw signature bits from the certificate.
282f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the raw signature bits from the certificate.
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract byte[] getSignature();
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the name of the algorithm for the certificate signature.
289f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the signature algorithm name.
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract String getSigAlgName();
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the OID of the signature algorithm from the certificate.
296f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the OID of the signature algorithm.
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract String getSigAlgOID();
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the parameters of the signature algorithm in DER-encoded format.
303f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the parameters of the signature algorithm, or {@code null} if
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         none are used.
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract byte[] getSigAlgParams();
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the {@code issuerUniqueID} from the certificate.
311f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code issuerUniqueID} or {@code null} if there's none in the
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         certificate.
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract boolean[] getIssuerUniqueID();
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the {@code subjectUniqueID} from the certificate.
319f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code subjectUniqueID} or null if there's none in the
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         certificate.
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract boolean[] getSubjectUniqueID();
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the {@code KeyUsage} extension as a {@code boolean} array.
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The ASN.1 definition of {@code KeyUsage}:
329f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <pre>
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * KeyUsage ::= BIT STRING {
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *      digitalSignature        (0),
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *      nonRepudiation          (1),
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *      keyEncipherment         (2),
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *      dataEncipherment        (3),
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *      keyAgreement            (4),
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *      keyCertSign             (5),
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *      cRLSign                 (6),
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *      encipherOnly            (7),
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *      decipherOnly            (8) }
341f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * </pre>
343f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code KeyUsage} extension or {@code null} if there's none in
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         the certificate.
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract boolean[] getKeyUsage();
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a read-only list of OID strings representing the {@code
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * ExtKeyUsageSyntax} field of the extended key usage extension.
352f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the extended key usage extension, or {@code null} if there's none
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         in the certificate.
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws CertificateParsingException
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the extension decoding fails.
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public List<String> getExtendedKeyUsage()
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        throws CertificateParsingException {
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return null;
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the path length of the certificate constraints from the {@code
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * BasicContraints} extension.
366f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the path length of the certificate constraints if the extension
368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         is present or {@code -1} if the extension is not present. {@code
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         Integer.MAX_VALUE} if there's not limit.
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract int getBasicConstraints();
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a read-only list of the subject alternative names from the
375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code SubjectAltName} extension.
376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The ASN.1 definition of {@code SubjectAltName}:
378f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <pre>
380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * SubjectAltName ::= GeneralNames
381f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * GeneralNames ::= SEQUENCE SIZE (1..MAX) OF GeneralName
383f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * GeneralName ::= CHOICE {
385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *      otherName                       [0]     AnotherName,
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *      rfc822Name                      [1]     IA5String,
387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *      dNSName                         [2]     IA5String,
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *      x400Address                     [3]     ORAddress,
389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *      directoryName                   [4]     Name,
390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *      ediPartyName                    [5]     EDIPartyName,
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *      uniformResourceIdentifier       [6]     IA5String,
392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *      iPAddress                       [7]     OCTET STRING,
393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *      registeredID                    [8]     OBJECT IDENTIFIER }
394f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * </pre>
396f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the subject alternative names or {@code null} if there are none
398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         in the certificate.
399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws CertificateParsingException
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if decoding of the extension fails.
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Collection<List<?>> getSubjectAlternativeNames()
403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                    throws CertificateParsingException {
404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return null;
405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a read-only list of the issuer alternative names from the {@code
409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * IssuerAltName} extension.
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The ASN.1 definition of {@code IssuerAltName}:
412f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <pre>
414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * IssuerAltName ::= GeneralNames
415f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * GeneralNames ::= SEQUENCE SIZE (1..MAX) OF GeneralName
417f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * GeneralName ::= CHOICE {
419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *      otherName                       [0]     AnotherName,
420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *      rfc822Name                      [1]     IA5String,
421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *      dNSName                         [2]     IA5String,
422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *      x400Address                     [3]     ORAddress,
423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *      directoryName                   [4]     Name,
424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *      ediPartyName                    [5]     EDIPartyName,
425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *      uniformResourceIdentifier       [6]     IA5String,
426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *      iPAddress                       [7]     OCTET STRING,
427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *      registeredID                    [8]     OBJECT IDENTIFIER }
428f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * </pre>
430f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the issuer alternative names of {@code null} if there are none in
432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         the certificate.
433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws CertificateParsingException
434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if decoding of the extension fails.
435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Collection<List<?>> getIssuerAlternativeNames()
437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                    throws CertificateParsingException {
438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return null;
439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
441