Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/base/x509_certificate.h" | 5 #include "net/base/x509_certificate.h" |
| 6 | 6 |
| 7 #include <openssl/asn1.h> | 7 #include <openssl/asn1.h> |
| 8 #include <openssl/crypto.h> | 8 #include <openssl/crypto.h> |
| 9 #include <openssl/obj_mac.h> | 9 #include <openssl/obj_mac.h> |
| 10 #include <openssl/pem.h> | 10 #include <openssl/pem.h> |
| (...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 418 | 418 |
| 419 for (OSCertHandles::const_iterator it = intermediate_ca_certs_.begin(); | 419 for (OSCertHandles::const_iterator it = intermediate_ca_certs_.begin(); |
| 420 it != intermediate_ca_certs_.end(); ++it) { | 420 it != intermediate_ca_certs_.end(); ++it) { |
| 421 if (!sk_X509_push(intermediates.get(), *it)) | 421 if (!sk_X509_push(intermediates.get(), *it)) |
| 422 return ERR_OUT_OF_MEMORY; | 422 return ERR_OUT_OF_MEMORY; |
| 423 } | 423 } |
| 424 int rv = X509_STORE_CTX_init(ctx.get(), cert_store(), | 424 int rv = X509_STORE_CTX_init(ctx.get(), cert_store(), |
| 425 cert_handle_, intermediates.get()); | 425 cert_handle_, intermediates.get()); |
| 426 CHECK_EQ(1, rv); | 426 CHECK_EQ(1, rv); |
| 427 | 427 |
| 428 if (X509_verify_cert(ctx.get()) == 1) { | 428 if (X509_verify_cert(ctx.get()) != 1) { |
| 429 return OK; | 429 int x509_error = X509_STORE_CTX_get_error(ctx.get()); |
| 430 int cert_status = MapCertErrorToCertStatus(x509_error); | |
| 431 LOG(ERROR) << "X509 Verification error " | |
| 432 << X509_verify_cert_error_string(x509_error) | |
| 433 << " : " << x509_error | |
| 434 << " : " << X509_STORE_CTX_get_error_depth(ctx.get()) | |
| 435 << " : " << cert_status; | |
| 436 verify_result->cert_status |= cert_status; | |
| 437 return MapCertStatusToNetError(verify_result->cert_status); | |
|
wtc
2010/12/01 22:50:05
Nit: you can remove this return statement. If you
joth
2010/12/02 17:12:01
Done.
| |
| 430 } | 438 } |
| 431 | 439 |
| 432 int x509_error = X509_STORE_CTX_get_error(ctx.get()); | 440 if (IsCertStatusError(verify_result->cert_status)) |
| 433 int cert_status = MapCertErrorToCertStatus(x509_error); | 441 return MapCertStatusToNetError(verify_result->cert_status); |
| 434 LOG(ERROR) << "X509 Verification error " | 442 |
| 435 << X509_verify_cert_error_string(x509_error) | 443 return OK; |
| 436 << " : " << x509_error | |
| 437 << " : " << X509_STORE_CTX_get_error_depth(ctx.get()) | |
| 438 << " : " << cert_status; | |
| 439 verify_result->cert_status |= cert_status; | |
| 440 return MapCertStatusToNetError(verify_result->cert_status); | |
| 441 } | 444 } |
| 442 | 445 |
| 443 // static | 446 // static |
| 444 bool X509Certificate::IsSameOSCert(X509Certificate::OSCertHandle a, | 447 bool X509Certificate::IsSameOSCert(X509Certificate::OSCertHandle a, |
| 445 X509Certificate::OSCertHandle b) { | 448 X509Certificate::OSCertHandle b) { |
| 446 DCHECK(a && b); | 449 DCHECK(a && b); |
| 447 if (a == b) | 450 if (a == b) |
| 448 return true; | 451 return true; |
| 449 | 452 |
| 450 // X509_cmp only checks the fingerprint, but we want to compare the whole | 453 // X509_cmp only checks the fingerprint, but we want to compare the whole |
| 451 // DER data. Encoding it from OSCertHandle is an expensive operation, so we | 454 // DER data. Encoding it from OSCertHandle is an expensive operation, so we |
| 452 // cache the DER (if not already cached via X509_set_ex_data). | 455 // cache the DER (if not already cached via X509_set_ex_data). |
| 453 DERCache der_cache_a, der_cache_b; | 456 DERCache der_cache_a, der_cache_b; |
| 454 | 457 |
| 455 return GetDERAndCacheIfNeeded(a, &der_cache_a) && | 458 return GetDERAndCacheIfNeeded(a, &der_cache_a) && |
| 456 GetDERAndCacheIfNeeded(b, &der_cache_b) && | 459 GetDERAndCacheIfNeeded(b, &der_cache_b) && |
| 457 der_cache_a.data_length == der_cache_b.data_length && | 460 der_cache_a.data_length == der_cache_b.data_length && |
| 458 memcmp(der_cache_a.data, der_cache_b.data, der_cache_a.data_length) == 0; | 461 memcmp(der_cache_a.data, der_cache_b.data, der_cache_a.data_length) == 0; |
| 459 } | 462 } |
| 460 | 463 |
| 461 } // namespace net | 464 } // namespace net |
| OLD | NEW |