| Index: chrome/browser/net/certificate_error_reporter.cc
|
| diff --git a/chrome/browser/net/certificate_error_reporter.cc b/chrome/browser/net/certificate_error_reporter.cc
|
| index edff489f4ca0762dac6eb03bf554a1bc7e0adef2..279209c6ba2499c781eec14d720e7b02d9f5e3a2 100644
|
| --- a/chrome/browser/net/certificate_error_reporter.cc
|
| +++ b/chrome/browser/net/certificate_error_reporter.cc
|
| @@ -10,14 +10,6 @@
|
| #include "base/stl_util.h"
|
| #include "base/time/time.h"
|
| #include "chrome/browser/net/cert_logger.pb.h"
|
| -
|
| -#if defined(USE_OPENSSL)
|
| -#include "crypto/aead_openssl.h"
|
| -#endif
|
| -
|
| -#include "crypto/curve25519.h"
|
| -#include "crypto/hkdf.h"
|
| -#include "crypto/random.h"
|
| #include "net/base/elements_upload_data_stream.h"
|
| #include "net/base/load_flags.h"
|
| #include "net/base/request_priority.h"
|
| @@ -26,87 +18,15 @@
|
| #include "net/ssl/ssl_info.h"
|
| #include "net/url_request/url_request_context.h"
|
|
|
| -namespace {
|
| -
|
| -// Constants used for crypto
|
| -static const uint8 kServerPublicKey[] = {
|
| - 0x51, 0xcc, 0x52, 0x67, 0x42, 0x47, 0x3b, 0x10, 0xe8, 0x63, 0x18,
|
| - 0x3c, 0x61, 0xa7, 0x96, 0x76, 0x86, 0x91, 0x40, 0x71, 0x39, 0x5f,
|
| - 0x31, 0x1a, 0x39, 0x5b, 0x76, 0xb1, 0x6b, 0x3d, 0x6a, 0x2b};
|
| -static const uint32 kServerPublicKeyVersion = 1;
|
| -
|
| -#if defined(USE_OPENSSL)
|
| -
|
| -static const char kHkdfLabel[] = "certificate report";
|
| -
|
| -bool EncryptSerializedReport(
|
| - const uint8* server_public_key,
|
| - uint32 server_public_key_version,
|
| - const std::string& report,
|
| - chrome_browser_net::EncryptedCertLoggerRequest* encrypted_report) {
|
| - // Generate an ephemeral key pair to generate a shared secret.
|
| - uint8 public_key[crypto::curve25519::kBytes];
|
| - uint8 private_key[crypto::curve25519::kScalarBytes];
|
| - uint8 shared_secret[crypto::curve25519::kBytes];
|
| -
|
| - crypto::RandBytes(private_key, sizeof(private_key));
|
| - crypto::curve25519::ScalarBaseMult(private_key, public_key);
|
| - crypto::curve25519::ScalarMult(private_key, server_public_key, shared_secret);
|
| -
|
| - crypto::Aead aead(crypto::Aead::AES_128_CTR_HMAC_SHA256);
|
| - crypto::HKDF hkdf(std::string((char*)shared_secret, sizeof(shared_secret)),
|
| - kHkdfLabel, std::string(), 0, 0, aead.KeyLength());
|
| -
|
| - const std::string key(hkdf.subkey_secret().data(),
|
| - hkdf.subkey_secret().size());
|
| - aead.Init(&key);
|
| -
|
| - // Use an all-zero nonce because the key is random per-message.
|
| - std::string nonce(aead.NonceLength(), 0);
|
| -
|
| - std::string ciphertext;
|
| - if (!aead.Seal(report, nonce, "", &ciphertext)) {
|
| - LOG(ERROR) << "Error sealing certificate report.";
|
| - return false;
|
| - }
|
| -
|
| - encrypted_report->set_encrypted_report(ciphertext);
|
| - encrypted_report->set_server_public_key_version(server_public_key_version);
|
| - encrypted_report->set_client_public_key(
|
| - std::string((char*)public_key, sizeof(public_key)));
|
| - encrypted_report->set_algorithm(
|
| - chrome_browser_net::EncryptedCertLoggerRequest::
|
| - AEAD_ECDH_AES_128_CTR_HMAC_SHA256);
|
| - return true;
|
| -}
|
| -#endif
|
| -
|
| -} // namespace
|
| -
|
| namespace chrome_browser_net {
|
|
|
| CertificateErrorReporter::CertificateErrorReporter(
|
| net::URLRequestContext* request_context,
|
| const GURL& upload_url,
|
| CookiesPreference cookies_preference)
|
| - : CertificateErrorReporter(request_context,
|
| - upload_url,
|
| - cookies_preference,
|
| - kServerPublicKey,
|
| - kServerPublicKeyVersion) {
|
| -}
|
| -
|
| -CertificateErrorReporter::CertificateErrorReporter(
|
| - net::URLRequestContext* request_context,
|
| - const GURL& upload_url,
|
| - CookiesPreference cookies_preference,
|
| - const uint8 server_public_key[32],
|
| - const uint32 server_public_key_version)
|
| : request_context_(request_context),
|
| upload_url_(upload_url),
|
| - cookies_preference_(cookies_preference),
|
| - server_public_key_(server_public_key),
|
| - server_public_key_version_(server_public_key_version) {
|
| + cookies_preference_(cookies_preference) {
|
| DCHECK(!upload_url.is_empty());
|
| }
|
|
|
| @@ -118,6 +38,8 @@
|
| const std::string& hostname,
|
| const net::SSLInfo& ssl_info) {
|
| CertLoggerRequest request;
|
| + std::string out;
|
| +
|
| BuildReport(hostname, ssl_info, &request);
|
|
|
| switch (type) {
|
| @@ -125,25 +47,9 @@
|
| SendCertLoggerRequest(request);
|
| break;
|
| case REPORT_TYPE_EXTENDED_REPORTING:
|
| - if (upload_url_.SchemeIsCryptographic()) {
|
| - SendCertLoggerRequest(request);
|
| - } else {
|
| - DCHECK(IsHttpUploadUrlSupported());
|
| -#if defined(USE_OPENSSL)
|
| - EncryptedCertLoggerRequest encrypted_report;
|
| - std::string serialized_report;
|
| - request.SerializeToString(&serialized_report);
|
| - if (!EncryptSerializedReport(server_public_key_,
|
| - server_public_key_version_,
|
| - serialized_report, &encrypted_report)) {
|
| - LOG(ERROR) << "Failed to encrypt serialized report.";
|
| - return;
|
| - }
|
| - std::string serialized_encrypted_report;
|
| - encrypted_report.SerializeToString(&serialized_encrypted_report);
|
| - SendSerializedRequest(serialized_encrypted_report);
|
| -#endif
|
| - }
|
| + // TODO(estark): Encrypt the report if not sending over HTTPS.
|
| + DCHECK(upload_url_.SchemeIsCryptographic());
|
| + SendCertLoggerRequest(request);
|
| break;
|
| default:
|
| NOTREACHED();
|
| @@ -178,55 +84,11 @@
|
| return request.Pass();
|
| }
|
|
|
| -bool CertificateErrorReporter::IsHttpUploadUrlSupported() {
|
| -#if defined(USE_OPENSSL)
|
| - return true;
|
| -#else
|
| - return false;
|
| -#endif
|
| -}
|
| -
|
| -// Used only by tests.
|
| -#if defined(USE_OPENSSL)
|
| -bool CertificateErrorReporter::DecryptCertificateErrorReport(
|
| - const uint8 server_private_key[32],
|
| - const EncryptedCertLoggerRequest& encrypted_report,
|
| - CertLoggerRequest* decrypted_report) {
|
| - uint8 shared_secret[crypto::curve25519::kBytes];
|
| - crypto::curve25519::ScalarMult(
|
| - server_private_key, (uint8*)encrypted_report.client_public_key().data(),
|
| - shared_secret);
|
| -
|
| - crypto::Aead aead(crypto::Aead::AES_128_CTR_HMAC_SHA256);
|
| - crypto::HKDF hkdf(std::string((char*)shared_secret, sizeof(shared_secret)),
|
| - kHkdfLabel, std::string(), 0, 0, aead.KeyLength());
|
| -
|
| - const std::string key(hkdf.subkey_secret().data(),
|
| - hkdf.subkey_secret().size());
|
| - aead.Init(&key);
|
| -
|
| - // Use an all-zero nonce because the key is random per-message.
|
| - std::string nonce(aead.NonceLength(), 0);
|
| -
|
| - std::string plaintext;
|
| - if (!aead.Open(encrypted_report.encrypted_report(), nonce, "", &plaintext)) {
|
| - LOG(ERROR) << "Error opening certificate report";
|
| - return false;
|
| - }
|
| -
|
| - return decrypted_report->ParseFromString(plaintext);
|
| -}
|
| -#endif
|
| -
|
| void CertificateErrorReporter::SendCertLoggerRequest(
|
| const CertLoggerRequest& request) {
|
| std::string serialized_request;
|
| request.SerializeToString(&serialized_request);
|
| - SendSerializedRequest(serialized_request);
|
| -}
|
|
|
| -void CertificateErrorReporter::SendSerializedRequest(
|
| - const std::string& serialized_request) {
|
| scoped_ptr<net::URLRequest> url_request = CreateURLRequest(request_context_);
|
| url_request->set_method("POST");
|
|
|
|
|