SslError.java revision 1abd5b3e6f11ef9d7076685c56ef942fa0dd77e4
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.net.http;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.security.cert.X509Certificate;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * One or more individual SSL errors and the associated SSL certificate
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class SslError {
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Individual SSL errors (in the order from the least to the most severe):
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The certificate is not yet valid
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
331abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen    public static final int SSL_NOTYETVALID = 0;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The certificate has expired
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SSL_EXPIRED = 1;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Hostname mismatch
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SSL_IDMISMATCH = 2;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The certificate authority is not trusted
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SSL_UNTRUSTED = 3;
461abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen    /**
471abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen     * The date of the certificate is invalid
481abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen     */
491abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen    public static final int SSL_DATE_INVALID = 4;
501abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen    /**
511abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen     * The certificate is invalid
521abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen     */
531abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen    public static final int SSL_INVALID = 5;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The number of different SSL errors (update if you add a new SSL error!!!)
581abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen     * @deprecated This constant is not necessary for using the SslError API and
591abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen     *             can change from release to release.
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
611abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen    @Deprecated
621abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen    public static final int SSL_MAX_ERROR = 6;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The SSL error set bitfield (each individual error is an bit index;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * multiple individual errors can be OR-ed)
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mErrors;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The SSL certificate associated with the error set
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
735bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu    final SslCertificate mCertificate;
745bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu
755bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu    /**
765bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu     * The URL associated with the error set.
775bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu     */
785bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu    final String mUrl;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Creates a new SSL error set object
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param error The SSL error
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param certificate The associated SSL certificate
845bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu     * @deprecated Use {@link #SslError(int, SslCertificate, String)}
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
865bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu    @Deprecated
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public SslError(int error, SslCertificate certificate) {
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        addError(error);
895bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu        if (certificate == null) {
905bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu            throw new NullPointerException("certificate is null.");
915bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu        }
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCertificate = certificate;
935bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu        mUrl = "";
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Creates a new SSL error set object
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param error The SSL error
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param certificate The associated SSL certificate
1005bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu     * @deprecated Use {@link #SslError(int, X509Certificate, String)}
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1025bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu    @Deprecated
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public SslError(int error, X509Certificate certificate) {
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        addError(error);
1055bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu        if (certificate == null) {
1065bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu            throw new NullPointerException("certificate is null.");
1075bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu        }
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCertificate = new SslCertificate(certificate);
1095bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu        mUrl = "";
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1135bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu     * Creates a new SSL error set object
1145bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu     * @param error The SSL error
1155bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu     * @param certificate The associated SSL certificate
1165bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu     * @param url The associated URL.
1175bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu     */
1185bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu    public SslError(int error, SslCertificate certificate, String url) {
1195bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu        addError(error);
1205bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu        if (certificate == null) {
1215bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu            throw new NullPointerException("certificate is null.");
1225bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu        }
1235bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu        mCertificate = certificate;
1245bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu        if (url == null) {
1255bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu            throw new NullPointerException("url is null.");
1265bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu        }
1275bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu        mUrl = url;
1285bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu    }
1295bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu
1305bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu    /**
1311abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen     * Creates an SslError object from a chromium error code.
1321abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen     * @param error The chromium error code
1331abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen     * @param certificate The associated SSL certificate
1341abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen     * @param url The associated URL.
1351abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen     * @hide  chromium error codes only available inside the framework
1361abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen     */
1371abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen    public static SslError SslErrorFromChromiumErrorCode(
1381abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen            int error, SslCertificate cert, String url) {
1391abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen        // The chromium error codes are in:
1401abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen        // external/chromium/net/base/net_error_list.h
1411abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen        if (error > -200 || error < -299) {
1421abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen            throw new NullPointerException("Not a valid chromium SSL error code.");
1431abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen        }
1441abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen        if (error == -200)
1451abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen            return new SslError(SSL_IDMISMATCH, cert, url);
1461abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen        if (error == -201)
1471abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen            return new SslError(SSL_DATE_INVALID, cert, url);
1481abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen        if (error == -202)
1491abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen            return new SslError(SSL_UNTRUSTED, cert, url);
1501abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen        // Map all other errors to SSL_INVALID
1511abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen        return new SslError(SSL_INVALID, cert, url);
1521abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen    }
1531abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen
1541abd5b3e6f11ef9d7076685c56ef942fa0dd77e4Kristian Monsen    /**
1555bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu     * Creates a new SSL error set object
1565bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu     * @param error The SSL error
1575bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu     * @param certificate The associated SSL certificate
1585bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu     * @param url The associated URL.
1595bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu     */
1605bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu    public SslError(int error, X509Certificate certificate, String url) {
1615bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu        addError(error);
1625bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu        if (certificate == null) {
1635bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu            throw new NullPointerException("certificate is null.");
1645bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu        }
1655bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu        mCertificate = new SslCertificate(certificate);
1665bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu        if (url == null) {
1675bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu            throw new NullPointerException("url is null.");
1685bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu        }
1695bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu        mUrl = url;
1705bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu    }
1715bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu
1725bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu    /**
1735bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu     * @return The SSL certificate associated with the error set, non-null.
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public SslCertificate getCertificate() {
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCertificate;
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1805bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu     * @return The URL associated with the error set, non-null.
1815bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu     * "" if one of the deprecated constructors is used.
1825bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu     */
1835bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu    public String getUrl() {
1845bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu        return mUrl;
1855bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu    }
1865bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu
1875bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu    /**
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Adds the SSL error to the error set
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param error The SSL error to add
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True iff the error being added is a known SSL error
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean addError(int error) {
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean rval = (0 <= error && error < SslError.SSL_MAX_ERROR);
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (rval) {
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mErrors |= (0x1 << error);
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return rval;
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param error The SSL error to check
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True iff the set includes the error
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean hasError(int error) {
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean rval = (0 <= error && error < SslError.SSL_MAX_ERROR);
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (rval) {
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            rval = ((mErrors & (0x1 << error)) != 0);
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return rval;
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The primary, most severe, SSL error in the set
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getPrimaryError() {
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mErrors != 0) {
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // go from the most to the least severe errors
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int error = SslError.SSL_MAX_ERROR - 1; error >= 0; --error) {
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((mErrors & (0x1 << error)) != 0) {
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return error;
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return A String representation of this SSL error object
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * (used mostly for debugging).
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String toString() {
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return "primary error: " + getPrimaryError() +
2365bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu            " certificate: " + getCertificate() +
2375bb9b19c5a3f3cf292f812ff5b9f9b8bcc88e5afHuahui Wu            "  on URL: " + getUrl();
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
240