Index: net/cert/cert_verify_proc_openssl.cc |
diff --git a/net/cert/cert_verify_proc_openssl.cc b/net/cert/cert_verify_proc_openssl.cc |
deleted file mode 100644 |
index 20c0ad5b1d006387a0431280f46149eac9cef376..0000000000000000000000000000000000000000 |
--- a/net/cert/cert_verify_proc_openssl.cc |
+++ /dev/null |
@@ -1,228 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "net/cert/cert_verify_proc_openssl.h" |
- |
-#include <string> |
-#include <vector> |
- |
-#include "base/logging.h" |
-#include "base/sha1.h" |
-#include "crypto/openssl_util.h" |
-#include "crypto/sha2.h" |
-#include "net/base/net_errors.h" |
-#include "net/cert/asn1_util.h" |
-#include "net/cert/cert_status_flags.h" |
-#include "net/cert/cert_verifier.h" |
-#include "net/cert/cert_verify_result.h" |
-#include "net/cert/test_root_certs.h" |
-#include "net/cert/x509_certificate.h" |
-#include "third_party/boringssl/src/include/openssl/x509v3.h" |
- |
-namespace net { |
- |
-namespace { |
- |
-// Maps X509_STORE_CTX_get_error() return values to our cert status flags. |
-CertStatus MapCertErrorToCertStatus(int err) { |
- switch (err) { |
- case X509_V_ERR_SUBJECT_ISSUER_MISMATCH: |
- return CERT_STATUS_COMMON_NAME_INVALID; |
- case X509_V_ERR_CERT_NOT_YET_VALID: |
- case X509_V_ERR_CERT_HAS_EXPIRED: |
- case X509_V_ERR_CRL_NOT_YET_VALID: |
- case X509_V_ERR_CRL_HAS_EXPIRED: |
- case X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD: |
- case X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD: |
- case X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD: |
- case X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD: |
- return CERT_STATUS_DATE_INVALID; |
- case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT: |
- case X509_V_ERR_UNABLE_TO_GET_CRL: |
- case X509_V_ERR_INVALID_CA: |
- case X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER: |
- case X509_V_ERR_INVALID_NON_CA: |
- case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT: |
- case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN: |
- case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY: |
- return CERT_STATUS_AUTHORITY_INVALID; |
-#if 0 |
-// TODO(bulach): what should we map to these status? |
- return CERT_STATUS_NO_REVOCATION_MECHANISM; |
- return CERT_STATUS_UNABLE_TO_CHECK_REVOCATION; |
-#endif |
- case X509_V_ERR_CERT_REVOKED: |
- return CERT_STATUS_REVOKED; |
- // All these status are mapped to CERT_STATUS_INVALID. |
- case X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE: |
- case X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE: |
- case X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY: |
- case X509_V_ERR_CERT_SIGNATURE_FAILURE: |
- case X509_V_ERR_CRL_SIGNATURE_FAILURE: |
- case X509_V_ERR_OUT_OF_MEM: |
- case X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE: |
- case X509_V_ERR_CERT_CHAIN_TOO_LONG: |
- case X509_V_ERR_PATH_LENGTH_EXCEEDED: |
- case X509_V_ERR_INVALID_PURPOSE: |
- case X509_V_ERR_CERT_UNTRUSTED: |
- case X509_V_ERR_CERT_REJECTED: |
- case X509_V_ERR_AKID_SKID_MISMATCH: |
- case X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH: |
- case X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION: |
- case X509_V_ERR_KEYUSAGE_NO_CERTSIGN: |
- case X509_V_ERR_KEYUSAGE_NO_CRL_SIGN: |
- case X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION: |
- case X509_V_ERR_PROXY_PATH_LENGTH_EXCEEDED: |
- case X509_V_ERR_KEYUSAGE_NO_DIGITAL_SIGNATURE: |
- case X509_V_ERR_PROXY_CERTIFICATES_NOT_ALLOWED: |
- case X509_V_ERR_INVALID_EXTENSION: |
- case X509_V_ERR_INVALID_POLICY_EXTENSION: |
- case X509_V_ERR_NO_EXPLICIT_POLICY: |
- case X509_V_ERR_UNNESTED_RESOURCE: |
- case X509_V_ERR_APPLICATION_VERIFICATION: |
- return CERT_STATUS_INVALID; |
- default: |
- NOTREACHED() << "Invalid X509 err " << err; |
- return CERT_STATUS_INVALID; |
- } |
-} |
- |
-struct ShallowX509StackDeleter { |
- void operator()(STACK_OF(X509) * st) const { sk_X509_free(st); } |
-}; |
- |
-void GetCertChainInfo(X509_STORE_CTX* store_ctx, |
- CertVerifyResult* verify_result) { |
- STACK_OF(X509)* chain = X509_STORE_CTX_get_chain(store_ctx); |
- X509* verified_cert = NULL; |
- std::vector<X509*> verified_chain; |
- for (size_t i = 0; i < sk_X509_num(chain); ++i) { |
- X509* cert = sk_X509_value(chain, i); |
- if (i == 0) { |
- verified_cert = cert; |
- } else { |
- verified_chain.push_back(cert); |
- } |
- } |
- |
- // Set verify_result->verified_cert and |
- // verify_result->is_issued_by_known_root. |
- if (verified_cert) { |
- scoped_refptr<X509Certificate> verified_cert_with_chain = |
- X509Certificate::CreateFromHandle(verified_cert, verified_chain); |
- if (verified_cert_with_chain) |
- verify_result->verified_cert = std::move(verified_cert_with_chain); |
- else |
- verify_result->cert_status |= CERT_STATUS_INVALID; |
- |
- // For OpenSSL builds, only certificates used for unit tests are treated |
- // as not issued by known roots. The only way to determine whether a |
- // certificate is issued by a known root using OpenSSL is to examine |
- // distro-and-release specific hardcoded lists. |
- verify_result->is_issued_by_known_root = true; |
- if (TestRootCerts::HasInstance()) { |
- X509* root = NULL; |
- if (verified_chain.empty()) { |
- root = verified_cert; |
- } else { |
- root = verified_chain.back(); |
- } |
- TestRootCerts* root_certs = TestRootCerts::GetInstance(); |
- if (root_certs->Contains(root)) |
- verify_result->is_issued_by_known_root = false; |
- } |
- } |
-} |
- |
-void AppendPublicKeyHashes(X509_STORE_CTX* store_ctx, |
- HashValueVector* hashes) { |
- STACK_OF(X509)* chain = X509_STORE_CTX_get_chain(store_ctx); |
- for (size_t i = 0; i < sk_X509_num(chain); ++i) { |
- X509* cert = sk_X509_value(chain, i); |
- |
- std::string der_data; |
- if (!X509Certificate::GetDEREncoded(cert, &der_data)) |
- continue; |
- |
- base::StringPiece der_bytes(der_data); |
- base::StringPiece spki_bytes; |
- if (!asn1::ExtractSPKIFromDERCert(der_bytes, &spki_bytes)) |
- continue; |
- |
- HashValue sha1(HASH_VALUE_SHA1); |
- base::SHA1HashBytes(reinterpret_cast<const uint8_t*>(spki_bytes.data()), |
- spki_bytes.size(), sha1.data()); |
- hashes->push_back(sha1); |
- |
- HashValue sha256(HASH_VALUE_SHA256); |
- crypto::SHA256HashString(spki_bytes, sha256.data(), crypto::kSHA256Length); |
- hashes->push_back(sha256); |
- } |
-} |
- |
-} // namespace |
- |
-CertVerifyProcOpenSSL::CertVerifyProcOpenSSL() {} |
- |
-CertVerifyProcOpenSSL::~CertVerifyProcOpenSSL() {} |
- |
-bool CertVerifyProcOpenSSL::SupportsAdditionalTrustAnchors() const { |
- return false; |
-} |
- |
-bool CertVerifyProcOpenSSL::SupportsOCSPStapling() const { |
- return false; |
-} |
- |
-int CertVerifyProcOpenSSL::VerifyInternal( |
- X509Certificate* cert, |
- const std::string& hostname, |
- const std::string& ocsp_response, |
- int flags, |
- CRLSet* crl_set, |
- const CertificateList& additional_trust_anchors, |
- CertVerifyResult* verify_result) { |
- crypto::EnsureOpenSSLInit(); |
- |
- bssl::UniquePtr<X509_STORE_CTX> ctx(X509_STORE_CTX_new()); |
- |
- std::unique_ptr<STACK_OF(X509), ShallowX509StackDeleter> intermediates( |
- sk_X509_new_null()); |
- if (!intermediates.get()) |
- return ERR_OUT_OF_MEMORY; |
- |
- const X509Certificate::OSCertHandles& os_intermediates = |
- cert->GetIntermediateCertificates(); |
- for (X509Certificate::OSCertHandles::const_iterator it = |
- os_intermediates.begin(); it != os_intermediates.end(); ++it) { |
- if (!sk_X509_push(intermediates.get(), *it)) |
- return ERR_OUT_OF_MEMORY; |
- } |
- if (X509_STORE_CTX_init(ctx.get(), X509Certificate::cert_store(), |
- cert->os_cert_handle(), intermediates.get()) != 1) { |
- NOTREACHED(); |
- return ERR_FAILED; |
- } |
- |
- if (X509_verify_cert(ctx.get()) != 1) { |
- int x509_error = X509_STORE_CTX_get_error(ctx.get()); |
- CertStatus cert_status = MapCertErrorToCertStatus(x509_error); |
- LOG(ERROR) << "X509 Verification error " |
- << X509_verify_cert_error_string(x509_error) |
- << " : " << x509_error |
- << " : " << X509_STORE_CTX_get_error_depth(ctx.get()) |
- << " : " << cert_status; |
- verify_result->cert_status |= cert_status; |
- } |
- |
- GetCertChainInfo(ctx.get(), verify_result); |
- AppendPublicKeyHashes(ctx.get(), &verify_result->public_key_hashes); |
- |
- if (IsCertStatusError(verify_result->cert_status)) |
- return MapCertStatusToNetError(verify_result->cert_status); |
- |
- return OK; |
-} |
- |
-} // namespace net |