SslError.java revision 2e029c67a8e893e91600df989bbb42272d82af21
1/*
2 * Copyright (C) 2006 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.net.http;
18
19import java.security.cert.X509Certificate;
20
21/**
22 * One or more individual SSL errors and the associated SSL certificate
23 */
24public class SslError {
25
26    /**
27     * Individual SSL errors (in the order from the least to the most severe):
28     */
29
30    /**
31     * The certificate is not yet valid
32     */
33  public static final int SSL_NOTYETVALID = 0;
34    /**
35     * The certificate has expired
36     */
37    public static final int SSL_EXPIRED = 1;
38    /**
39     * Hostname mismatch
40     */
41    public static final int SSL_IDMISMATCH = 2;
42    /**
43     * The certificate authority is not trusted
44     */
45    public static final int SSL_UNTRUSTED = 3;
46
47
48    /**
49     * The number of different SSL errors (update if you add a new SSL error!!!)
50     */
51    public static final int SSL_MAX_ERROR = 4;
52
53    /**
54     * The SSL error set bitfield (each individual error is an bit index;
55     * multiple individual errors can be OR-ed)
56     */
57    int mErrors;
58
59    /**
60     * The SSL certificate associated with the error set
61     */
62    SslCertificate mCertificate;
63
64    /**
65     * Creates a new SSL error set object
66     * @param error The SSL error
67     * @param certificate The associated SSL certificate
68     */
69    public SslError(int error, SslCertificate certificate) {
70        addError(error);
71        mCertificate = certificate;
72    }
73
74    /**
75     * Creates a new SSL error set object
76     * @param error The SSL error
77     * @param certificate The associated SSL certificate
78     */
79    public SslError(int error, X509Certificate certificate) {
80        addError(error);
81        mCertificate = new SslCertificate(certificate);
82    }
83
84    /**
85     * @return The SSL certificate associated with the error set
86     */
87    public SslCertificate getCertificate() {
88        return mCertificate;
89    }
90
91    /**
92     * Adds the SSL error to the error set
93     * @param error The SSL error to add
94     * @return True iff the error being added is a known SSL error
95     */
96    public boolean addError(int error) {
97        boolean rval = (0 <= error && error < SslError.SSL_MAX_ERROR);
98        if (rval) {
99            mErrors |= (0x1 << error);
100        }
101
102        return rval;
103    }
104
105    /**
106     * @param error The SSL error to check
107     * @return True iff the set includes the error
108     */
109    public boolean hasError(int error) {
110        boolean rval = (0 <= error && error < SslError.SSL_MAX_ERROR);
111        if (rval) {
112            rval = ((mErrors & (0x1 << error)) != 0);
113        }
114
115        return rval;
116    }
117
118    /**
119     * @return The primary, most severe, SSL error in the set
120     */
121    public int getPrimaryError() {
122        if (mErrors != 0) {
123            // go from the most to the least severe errors
124            for (int error = SslError.SSL_MAX_ERROR - 1; error >= 0; --error) {
125                if ((mErrors & (0x1 << error)) != 0) {
126                    return error;
127                }
128            }
129        }
130
131        return 0;
132    }
133
134    /**
135     * @return A String representation of this SSL error object
136     * (used mostly for debugging).
137     */
138    public String toString() {
139        return "primary error: " + getPrimaryError() +
140            " certificate: " + getCertificate();
141    }
142}
143