| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "chrome/browser/extensions/api/gcd_private/privet_v3_context_getter.h" | 5 #include "chrome/browser/extensions/api/gcd_private/privet_v3_context_getter.h" |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/macros.h" | 8 #include "base/macros.h" |
| 9 #include "base/memory/ptr_util.h" | 9 #include "base/memory/ptr_util.h" |
| 10 #include "chrome/common/chrome_content_client.h" | 10 #include "chrome/common/chrome_content_client.h" |
| 11 #include "net/base/net_errors.h" | 11 #include "net/base/net_errors.h" |
| 12 #include "net/cert/cert_verifier.h" | 12 #include "net/cert/cert_verifier.h" |
| 13 #include "net/cert/cert_verify_result.h" | 13 #include "net/cert/cert_verify_result.h" |
| 14 #include "net/cert/x509_certificate.h" | 14 #include "net/cert/x509_certificate.h" |
| 15 #include "net/url_request/url_request_context.h" | 15 #include "net/url_request/url_request_context.h" |
| 16 #include "net/url_request/url_request_context_builder.h" | 16 #include "net/url_request/url_request_context_builder.h" |
| 17 | 17 |
| 18 namespace extensions { | 18 namespace extensions { |
| 19 | 19 |
| 20 // Class verifies certificate by its fingerprint received using different | 20 // Class verifies certificate by its fingerprint received using different |
| 21 // channel. It's the only know information about device with self-signed | 21 // channel. It's the only know information about device with self-signed |
| 22 // certificate. | 22 // certificate. |
| 23 class PrivetV3ContextGetter::CertVerifier : public net::CertVerifier { | 23 class PrivetV3ContextGetter::CertVerifier : public net::CertVerifier { |
| 24 public: | 24 public: |
| 25 CertVerifier() {} | 25 CertVerifier() {} |
| 26 | 26 |
| 27 int Verify(net::X509Certificate* cert, | 27 int Verify(const RequestParams& params, |
| 28 const std::string& hostname, | |
| 29 const std::string& ocsp_response, | |
| 30 int flags, | |
| 31 net::CRLSet* crl_set, | 28 net::CRLSet* crl_set, |
| 32 net::CertVerifyResult* verify_result, | 29 net::CertVerifyResult* verify_result, |
| 33 const net::CompletionCallback& callback, | 30 const net::CompletionCallback& callback, |
| 34 std::unique_ptr<Request>* out_req, | 31 std::unique_ptr<Request>* out_req, |
| 35 const net::BoundNetLog& net_log) override { | 32 const net::BoundNetLog& net_log) override { |
| 36 verify_result->Reset(); | 33 verify_result->Reset(); |
| 37 verify_result->verified_cert = cert; | 34 verify_result->verified_cert = params.certificate(); |
| 38 | 35 |
| 39 // Because no trust anchor checking is being performed, don't indicate that | 36 // Because no trust anchor checking is being performed, don't indicate that |
| 40 // it came from an OS-trusted root. | 37 // it came from an OS-trusted root. |
| 41 verify_result->is_issued_by_known_root = false; | 38 verify_result->is_issued_by_known_root = false; |
| 42 // Because no trust anchor checking is being performed, don't indicate that | 39 // Because no trust anchor checking is being performed, don't indicate that |
| 43 // it came from a supplemental trust anchor. | 40 // it came from a supplemental trust anchor. |
| 44 verify_result->is_issued_by_additional_trust_anchor = false; | 41 verify_result->is_issued_by_additional_trust_anchor = false; |
| 45 // Because no name checking is being performed, don't indicate that it the | 42 // Because no name checking is being performed, don't indicate that it the |
| 46 // common name was used. | 43 // common name was used. |
| 47 verify_result->common_name_fallback_used = false; | 44 verify_result->common_name_fallback_used = false; |
| 48 // Because the signature is not checked, do not indicate any deprecated | 45 // Because the signature is not checked, do not indicate any deprecated |
| 49 // signature algorithms were used, even if they might be present. | 46 // signature algorithms were used, even if they might be present. |
| 50 verify_result->has_md2 = false; | 47 verify_result->has_md2 = false; |
| 51 verify_result->has_md4 = false; | 48 verify_result->has_md4 = false; |
| 52 verify_result->has_md5 = false; | 49 verify_result->has_md5 = false; |
| 53 verify_result->has_sha1 = false; | 50 verify_result->has_sha1 = false; |
| 54 verify_result->has_sha1_leaf = false; | 51 verify_result->has_sha1_leaf = false; |
| 55 // Because no chain hashes calculation is being performed, keep hashes | 52 // Because no chain hashes calculation is being performed, keep hashes |
| 56 // container clean. | 53 // container clean. |
| 57 verify_result->public_key_hashes.clear(); | 54 verify_result->public_key_hashes.clear(); |
| 58 | 55 |
| 59 verify_result->cert_status = CheckFingerprint(cert, hostname) | 56 verify_result->cert_status = |
| 60 ? 0 | 57 CheckFingerprint(params.certificate(), params.hostname()) |
| 61 : net::CERT_STATUS_AUTHORITY_INVALID; | 58 ? 0 |
| 59 : net::CERT_STATUS_AUTHORITY_INVALID; |
| 62 return net::IsCertStatusError(verify_result->cert_status) | 60 return net::IsCertStatusError(verify_result->cert_status) |
| 63 ? net::MapCertStatusToNetError(verify_result->cert_status) | 61 ? net::MapCertStatusToNetError(verify_result->cert_status) |
| 64 : net::OK; | 62 : net::OK; |
| 65 } | 63 } |
| 66 | 64 |
| 67 void AddPairedHost(const std::string& host, | 65 void AddPairedHost(const std::string& host, |
| 68 const net::SHA256HashValue& certificate_fingerprint) { | 66 const net::SHA256HashValue& certificate_fingerprint) { |
| 69 fingerprints_[host] = certificate_fingerprint; | 67 fingerprints_[host] = certificate_fingerprint; |
| 70 } | 68 } |
| 71 | 69 |
| 72 private: | 70 private: |
| 73 bool CheckFingerprint(net::X509Certificate* cert, | 71 bool CheckFingerprint(const scoped_refptr<net::X509Certificate>& cert, |
| 74 const std::string& hostname) const { | 72 const std::string& hostname) const { |
| 75 auto it = fingerprints_.find(hostname); | 73 auto it = fingerprints_.find(hostname); |
| 76 if (it == fingerprints_.end()) | 74 if (it == fingerprints_.end()) |
| 77 return false; | 75 return false; |
| 78 | 76 |
| 79 return it->second == net::X509Certificate::CalculateFingerprint256( | 77 return it->second == net::X509Certificate::CalculateFingerprint256( |
| 80 cert->os_cert_handle()); | 78 cert->os_cert_handle()); |
| 81 } | 79 } |
| 82 | 80 |
| 83 std::map<std::string, net::SHA256HashValue> fingerprints_; | 81 std::map<std::string, net::SHA256HashValue> fingerprints_; |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 131 const net::SHA256HashValue& certificate_fingerprint) { | 129 const net::SHA256HashValue& certificate_fingerprint) { |
| 132 InitOnNetThread(); | 130 InitOnNetThread(); |
| 133 cert_verifier_->AddPairedHost(host, certificate_fingerprint); | 131 cert_verifier_->AddPairedHost(host, certificate_fingerprint); |
| 134 } | 132 } |
| 135 | 133 |
| 136 PrivetV3ContextGetter::~PrivetV3ContextGetter() { | 134 PrivetV3ContextGetter::~PrivetV3ContextGetter() { |
| 137 DCHECK(net_task_runner_->BelongsToCurrentThread()); | 135 DCHECK(net_task_runner_->BelongsToCurrentThread()); |
| 138 } | 136 } |
| 139 | 137 |
| 140 } // namespace extensions | 138 } // namespace extensions |
| OLD | NEW |