Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(207)

Side by Side Diff: net/base/x509_certificate_openssl.cc

Issue 6874039: Return the constructed certificate chain in X509Certificate::Verify() (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Ensure the EE cert is marked as a TLS server cert, not a CA cert Created 9 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 427 matching lines...) Expand 10 before | Expand all | Expand 10 after
438 438
439 // static 439 // static
440 X509_STORE* X509Certificate::cert_store() { 440 X509_STORE* X509Certificate::cert_store() {
441 return X509InitSingleton::GetInstance()->store(); 441 return X509InitSingleton::GetInstance()->store();
442 } 442 }
443 443
444 int X509Certificate::Verify(const std::string& hostname, 444 int X509Certificate::Verify(const std::string& hostname,
445 int flags, 445 int flags,
446 CertVerifyResult* verify_result) const { 446 CertVerifyResult* verify_result) const {
447 verify_result->Reset(); 447 verify_result->Reset();
448 verify_result->verified_cert =
449 CreateFromHandle(cert_handle_, GetIntermediateCertificates());
448 450
449 if (IsBlacklisted()) { 451 if (IsBlacklisted()) {
450 verify_result->cert_status |= CERT_STATUS_REVOKED; 452 verify_result->cert_status |= CERT_STATUS_REVOKED;
451 return ERR_CERT_REVOKED; 453 return ERR_CERT_REVOKED;
452 } 454 }
453 455
454 // TODO(joth): We should fetch the subjectAltNames directly rather than via 456 // TODO(joth): We should fetch the subjectAltNames directly rather than via
455 // GetDNSNames, so we can apply special handling for IP addresses vs DNS 457 // GetDNSNames, so we can apply special handling for IP addresses vs DNS
456 // names, etc. See http://crbug.com/62973. 458 // names, etc. See http://crbug.com/62973.
457 std::vector<std::string> cert_names; 459 std::vector<std::string> cert_names;
(...skipping 26 matching lines...) Expand all
484 << " : " << x509_error 486 << " : " << x509_error
485 << " : " << X509_STORE_CTX_get_error_depth(ctx.get()) 487 << " : " << X509_STORE_CTX_get_error_depth(ctx.get())
486 << " : " << cert_status; 488 << " : " << cert_status;
487 verify_result->cert_status |= cert_status; 489 verify_result->cert_status |= cert_status;
488 } 490 }
489 491
490 if (IsCertStatusError(verify_result->cert_status)) 492 if (IsCertStatusError(verify_result->cert_status))
491 return MapCertStatusToNetError(verify_result->cert_status); 493 return MapCertStatusToNetError(verify_result->cert_status);
492 494
493 STACK_OF(X509)* chain = X509_STORE_CTX_get_chain(ctx.get()); 495 STACK_OF(X509)* chain = X509_STORE_CTX_get_chain(ctx.get());
496 X509* verified_cert = NULL;
497 std::vector<X509*> verified_chain;
494 for (int i = 0; i < sk_X509_num(chain); ++i) { 498 for (int i = 0; i < sk_X509_num(chain); ++i) {
495 X509* cert = sk_X509_value(chain, i); 499 X509* cert = sk_X509_value(chain, i);
500 if (i == 0) {
501 verified_cert = cert;
502 } else {
503 verified_chain.push_back(verified_cert);
504 }
505
496 DERCache der_cache; 506 DERCache der_cache;
497 if (!GetDERAndCacheIfNeeded(cert, &der_cache)) 507 if (!GetDERAndCacheIfNeeded(cert, &der_cache))
498 continue; 508 continue;
499 509
500 base::StringPiece der_bytes(reinterpret_cast<const char*>(der_cache.data), 510 base::StringPiece der_bytes(reinterpret_cast<const char*>(der_cache.data),
501 der_cache.data_length); 511 der_cache.data_length);
502 base::StringPiece spki_bytes; 512 base::StringPiece spki_bytes;
503 if (!asn1::ExtractSPKIFromDERCert(der_bytes, &spki_bytes)) 513 if (!asn1::ExtractSPKIFromDERCert(der_bytes, &spki_bytes))
504 continue; 514 continue;
505 515
506 SHA1Fingerprint hash; 516 SHA1Fingerprint hash;
507 base::SHA1HashBytes(reinterpret_cast<const uint8*>(spki_bytes.data()), 517 base::SHA1HashBytes(reinterpret_cast<const uint8*>(spki_bytes.data()),
508 spki_bytes.size(), hash.data); 518 spki_bytes.size(), hash.data);
509 verify_result->public_key_hashes.push_back(hash); 519 verify_result->public_key_hashes.push_back(hash);
510 } 520 }
511 521
522 if (verified_cert) {
523 verify_result->verified_cert = CreateFromHandle(verified_cert,
524 verified_chain);
525 }
526
512 // Currently we only ues OpenSSL's default root CA paths, so treat all 527 // Currently we only ues OpenSSL's default root CA paths, so treat all
513 // correctly verified certs as being from a known root. TODO(joth): if the 528 // correctly verified certs as being from a known root. TODO(joth): if the
514 // motivations described in http://src.chromium.org/viewvc/chrome?view=rev&rev ision=80778 529 // motivations described in http://src.chromium.org/viewvc/chrome?view=rev&rev ision=80778
515 // become an issue on OpenSSL builds, we will need to embed a hardcoded list 530 // become an issue on OpenSSL builds, we will need to embed a hardcoded list
516 // of well known root CAs, as per the _mac and _win versions. 531 // of well known root CAs, as per the _mac and _win versions.
517 verify_result->is_issued_by_known_root = true; 532 verify_result->is_issued_by_known_root = true;
518 533
519 return OK; 534 return OK;
520 } 535 }
521 536
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
564 DERCache der_cache; 579 DERCache der_cache;
565 if (!GetDERAndCacheIfNeeded(cert_handle, &der_cache)) 580 if (!GetDERAndCacheIfNeeded(cert_handle, &der_cache))
566 return false; 581 return false;
567 582
568 return pickle->WriteData( 583 return pickle->WriteData(
569 reinterpret_cast<const char*>(der_cache.data), 584 reinterpret_cast<const char*>(der_cache.data),
570 der_cache.data_length); 585 der_cache.data_length);
571 } 586 }
572 587
573 } // namespace net 588 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698