OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/quic/chromium/crypto/proof_verifier_chromium.h" | 5 #include "net/quic/chromium/crypto/proof_verifier_chromium.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
11 #include "base/callback_helpers.h" | 11 #include "base/callback_helpers.h" |
12 #include "base/logging.h" | 12 #include "base/logging.h" |
| 13 #include "base/memory/ptr_util.h" |
13 #include "base/metrics/histogram_macros.h" | 14 #include "base/metrics/histogram_macros.h" |
14 #include "base/stl_util.h" | |
15 #include "base/strings/stringprintf.h" | 15 #include "base/strings/stringprintf.h" |
16 #include "crypto/signature_verifier.h" | 16 #include "crypto/signature_verifier.h" |
17 #include "net/base/host_port_pair.h" | 17 #include "net/base/host_port_pair.h" |
18 #include "net/base/net_errors.h" | 18 #include "net/base/net_errors.h" |
19 #include "net/cert/asn1_util.h" | 19 #include "net/cert/asn1_util.h" |
20 #include "net/cert/cert_status_flags.h" | 20 #include "net/cert/cert_status_flags.h" |
21 #include "net/cert/cert_verifier.h" | 21 #include "net/cert/cert_verifier.h" |
22 #include "net/cert/ct_policy_enforcer.h" | 22 #include "net/cert/ct_policy_enforcer.h" |
23 #include "net/cert/ct_policy_status.h" | 23 #include "net/cert/ct_policy_status.h" |
24 #include "net/cert/ct_verifier.h" | 24 #include "net/cert/ct_verifier.h" |
(...skipping 518 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
543 ct_policy_enforcer_(ct_policy_enforcer), | 543 ct_policy_enforcer_(ct_policy_enforcer), |
544 transport_security_state_(transport_security_state), | 544 transport_security_state_(transport_security_state), |
545 cert_transparency_verifier_(cert_transparency_verifier) { | 545 cert_transparency_verifier_(cert_transparency_verifier) { |
546 DCHECK(cert_verifier_); | 546 DCHECK(cert_verifier_); |
547 DCHECK(ct_policy_enforcer_); | 547 DCHECK(ct_policy_enforcer_); |
548 DCHECK(transport_security_state_); | 548 DCHECK(transport_security_state_); |
549 DCHECK(cert_transparency_verifier_); | 549 DCHECK(cert_transparency_verifier_); |
550 } | 550 } |
551 | 551 |
552 ProofVerifierChromium::~ProofVerifierChromium() { | 552 ProofVerifierChromium::~ProofVerifierChromium() { |
553 base::STLDeleteElements(&active_jobs_); | |
554 } | 553 } |
555 | 554 |
556 QuicAsyncStatus ProofVerifierChromium::VerifyProof( | 555 QuicAsyncStatus ProofVerifierChromium::VerifyProof( |
557 const std::string& hostname, | 556 const std::string& hostname, |
558 const uint16_t port, | 557 const uint16_t port, |
559 const std::string& server_config, | 558 const std::string& server_config, |
560 QuicVersion quic_version, | 559 QuicVersion quic_version, |
561 base::StringPiece chlo_hash, | 560 base::StringPiece chlo_hash, |
562 const std::vector<std::string>& certs, | 561 const std::vector<std::string>& certs, |
563 const std::string& cert_sct, | 562 const std::string& cert_sct, |
564 const std::string& signature, | 563 const std::string& signature, |
565 const ProofVerifyContext* verify_context, | 564 const ProofVerifyContext* verify_context, |
566 std::string* error_details, | 565 std::string* error_details, |
567 std::unique_ptr<ProofVerifyDetails>* verify_details, | 566 std::unique_ptr<ProofVerifyDetails>* verify_details, |
568 std::unique_ptr<ProofVerifierCallback> callback) { | 567 std::unique_ptr<ProofVerifierCallback> callback) { |
569 if (!verify_context) { | 568 if (!verify_context) { |
570 *error_details = "Missing context"; | 569 *error_details = "Missing context"; |
571 return QUIC_FAILURE; | 570 return QUIC_FAILURE; |
572 } | 571 } |
573 const ProofVerifyContextChromium* chromium_context = | 572 const ProofVerifyContextChromium* chromium_context = |
574 reinterpret_cast<const ProofVerifyContextChromium*>(verify_context); | 573 reinterpret_cast<const ProofVerifyContextChromium*>(verify_context); |
575 std::unique_ptr<Job> job( | 574 std::unique_ptr<Job> job = base::MakeUnique<Job>( |
576 new Job(this, cert_verifier_, ct_policy_enforcer_, | 575 this, cert_verifier_, ct_policy_enforcer_, transport_security_state_, |
577 transport_security_state_, cert_transparency_verifier_, | 576 cert_transparency_verifier_, chromium_context->cert_verify_flags, |
578 chromium_context->cert_verify_flags, chromium_context->net_log)); | 577 chromium_context->net_log); |
579 QuicAsyncStatus status = job->VerifyProof( | 578 QuicAsyncStatus status = job->VerifyProof( |
580 hostname, port, server_config, quic_version, chlo_hash, certs, cert_sct, | 579 hostname, port, server_config, quic_version, chlo_hash, certs, cert_sct, |
581 signature, error_details, verify_details, std::move(callback)); | 580 signature, error_details, verify_details, std::move(callback)); |
582 if (status == QUIC_PENDING) | 581 if (status == QUIC_PENDING) { |
583 active_jobs_.insert(job.release()); | 582 Job* job_ptr = job.get(); |
| 583 active_jobs_[job_ptr] = std::move(job); |
| 584 } |
584 return status; | 585 return status; |
585 } | 586 } |
586 | 587 |
587 QuicAsyncStatus ProofVerifierChromium::VerifyCertChain( | 588 QuicAsyncStatus ProofVerifierChromium::VerifyCertChain( |
588 const std::string& hostname, | 589 const std::string& hostname, |
589 const std::vector<std::string>& certs, | 590 const std::vector<std::string>& certs, |
590 const ProofVerifyContext* verify_context, | 591 const ProofVerifyContext* verify_context, |
591 std::string* error_details, | 592 std::string* error_details, |
592 std::unique_ptr<ProofVerifyDetails>* verify_details, | 593 std::unique_ptr<ProofVerifyDetails>* verify_details, |
593 std::unique_ptr<ProofVerifierCallback> callback) { | 594 std::unique_ptr<ProofVerifierCallback> callback) { |
594 if (!verify_context) { | 595 if (!verify_context) { |
595 *error_details = "Missing context"; | 596 *error_details = "Missing context"; |
596 return QUIC_FAILURE; | 597 return QUIC_FAILURE; |
597 } | 598 } |
598 const ProofVerifyContextChromium* chromium_context = | 599 const ProofVerifyContextChromium* chromium_context = |
599 reinterpret_cast<const ProofVerifyContextChromium*>(verify_context); | 600 reinterpret_cast<const ProofVerifyContextChromium*>(verify_context); |
600 std::unique_ptr<Job> job( | 601 std::unique_ptr<Job> job = base::MakeUnique<Job>( |
601 new Job(this, cert_verifier_, ct_policy_enforcer_, | 602 this, cert_verifier_, ct_policy_enforcer_, transport_security_state_, |
602 transport_security_state_, cert_transparency_verifier_, | 603 cert_transparency_verifier_, chromium_context->cert_verify_flags, |
603 chromium_context->cert_verify_flags, chromium_context->net_log)); | 604 chromium_context->net_log); |
604 QuicAsyncStatus status = job->VerifyCertChain( | 605 QuicAsyncStatus status = job->VerifyCertChain( |
605 hostname, certs, error_details, verify_details, std::move(callback)); | 606 hostname, certs, error_details, verify_details, std::move(callback)); |
606 if (status == QUIC_PENDING) | 607 if (status == QUIC_PENDING) { |
607 active_jobs_.insert(job.release()); | 608 Job* job_ptr = job.get(); |
| 609 active_jobs_[job_ptr] = std::move(job); |
| 610 } |
608 return status; | 611 return status; |
609 } | 612 } |
610 | 613 |
611 void ProofVerifierChromium::OnJobComplete(Job* job) { | 614 void ProofVerifierChromium::OnJobComplete(Job* job) { |
612 active_jobs_.erase(job); | 615 active_jobs_.erase(job); |
613 delete job; | |
614 } | 616 } |
615 | 617 |
616 } // namespace net | 618 } // namespace net |
OLD | NEW |