| Index: net/quic/crypto/proof_verifier_chromium.cc
|
| diff --git a/net/quic/crypto/proof_verifier_chromium.cc b/net/quic/crypto/proof_verifier_chromium.cc
|
| index 6f547882ebf8eba304801574bedd2bbd11814006..4d70e6cbe5079d93d887f1dfc1bf5b86b8158d7d 100644
|
| --- a/net/quic/crypto/proof_verifier_chromium.cc
|
| +++ b/net/quic/crypto/proof_verifier_chromium.cc
|
| @@ -33,8 +33,6 @@ namespace net {
|
| ProofVerifierChromium::ProofVerifierChromium(CertVerifier* cert_verifier,
|
| const BoundNetLog& net_log)
|
| : cert_verifier_(cert_verifier),
|
| - cert_verify_result_(NULL),
|
| - error_details_(NULL),
|
| next_state_(STATE_NONE),
|
| net_log_(net_log) {
|
| }
|
| @@ -43,29 +41,36 @@ ProofVerifierChromium::~ProofVerifierChromium() {
|
| verifier_.reset();
|
| }
|
|
|
| -int ProofVerifierChromium::VerifyProof(const string& hostname,
|
| - const string& server_config,
|
| - const vector<string>& certs,
|
| - const string& signature,
|
| - std::string* error_details,
|
| - CertVerifyResult* cert_verify_result,
|
| - const CompletionCallback& callback) {
|
| +ProofVerifierChromium::Status ProofVerifierChromium::VerifyProof(
|
| + const string& hostname,
|
| + const string& server_config,
|
| + const vector<string>& certs,
|
| + const string& signature,
|
| + std::string* error_details,
|
| + scoped_ptr<ProofVerifyDetails>* details,
|
| + ProofVerifierCallback* callback) {
|
| DCHECK(error_details);
|
| - DCHECK(cert_verify_result);
|
| + DCHECK(details);
|
| + DCHECK(callback);
|
| +
|
| + callback_.reset(callback);
|
| error_details->clear();
|
| - cert_verify_result->Reset();
|
|
|
| DCHECK_EQ(STATE_NONE, next_state_);
|
| if (STATE_NONE != next_state_) {
|
| *error_details = "Certificate is already set and VerifyProof has begun";
|
| DLOG(WARNING) << *error_details;
|
| - return ERR_FAILED;
|
| + return FAILURE;
|
| }
|
|
|
| + verify_details_.reset(new ProofVerifyDetailsChromium);
|
| +
|
| if (certs.empty()) {
|
| *error_details = "Failed to create certificate chain. Certs are empty.";
|
| DLOG(WARNING) << *error_details;
|
| - return ERR_FAILED;
|
| + verify_details_->cert_verify_result.cert_status = CERT_STATUS_INVALID;
|
| + details->reset(verify_details_.release());
|
| + return FAILURE;
|
| }
|
|
|
| // Convert certs to X509Certificate.
|
| @@ -77,8 +82,9 @@ int ProofVerifierChromium::VerifyProof(const string& hostname,
|
| if (!cert_.get()) {
|
| *error_details = "Failed to create certificate chain";
|
| DLOG(WARNING) << *error_details;
|
| - cert_verify_result->cert_status = CERT_STATUS_INVALID;
|
| - return ERR_FAILED;
|
| + verify_details_->cert_verify_result.cert_status = CERT_STATUS_INVALID;
|
| + details->reset(verify_details_.release());
|
| + return FAILURE;
|
| }
|
|
|
| // We call VerifySignature first to avoid copying of server_config and
|
| @@ -86,16 +92,23 @@ int ProofVerifierChromium::VerifyProof(const string& hostname,
|
| if (!VerifySignature(server_config, signature, certs[0])) {
|
| *error_details = "Failed to verify signature of server config";
|
| DLOG(WARNING) << *error_details;
|
| - return ERR_FAILED;
|
| + verify_details_->cert_verify_result.cert_status = CERT_STATUS_INVALID;
|
| + details->reset(verify_details_.release());
|
| + return FAILURE;
|
| }
|
|
|
| hostname_ = hostname;
|
| - callback_ = callback;
|
| - error_details_ = error_details;
|
| - cert_verify_result_ = cert_verify_result;
|
|
|
| next_state_ = STATE_VERIFY_CERT;
|
| - return DoLoop(OK);
|
| + switch (DoLoop(OK)) {
|
| + case OK:
|
| + return SUCCESS;
|
| + case ERR_IO_PENDING:
|
| + return PENDING;
|
| + default:
|
| + *error_details = error_details_;
|
| + return FAILURE;
|
| + }
|
| }
|
|
|
| int ProofVerifierChromium::DoLoop(int last_result) {
|
| @@ -124,7 +137,9 @@ int ProofVerifierChromium::DoLoop(int last_result) {
|
| void ProofVerifierChromium::OnIOComplete(int result) {
|
| int rv = DoLoop(result);
|
| if (rv != ERR_IO_PENDING) {
|
| - base::ResetAndReturn(&callback_).Run(rv);
|
| + scoped_ptr<ProofVerifyDetails> scoped_details(verify_details_.release());
|
| + callback_->Run(rv == OK, error_details_, &scoped_details);
|
| + callback_.reset();
|
| }
|
| }
|
|
|
| @@ -138,7 +153,7 @@ int ProofVerifierChromium::DoVerifyCert(int result) {
|
| hostname_,
|
| flags,
|
| SSLConfigService::GetCRLSet().get(),
|
| - cert_verify_result_,
|
| + &verify_details_->cert_verify_result,
|
| base::Bind(&ProofVerifierChromium::OnIOComplete,
|
| base::Unretained(this)),
|
| net_log_);
|
| @@ -148,9 +163,9 @@ int ProofVerifierChromium::DoVerifyCertComplete(int result) {
|
| verifier_.reset();
|
|
|
| if (result <= ERR_FAILED) {
|
| - *error_details_ = StringPrintf("Failed to verify certificate chain: %s",
|
| - ErrorToString(result));
|
| - DLOG(WARNING) << *error_details_;
|
| + error_details_ = StringPrintf("Failed to verify certificate chain: %s",
|
| + ErrorToString(result));
|
| + DLOG(WARNING) << error_details_;
|
| result = ERR_FAILED;
|
| }
|
|
|
|
|