Index: chrome/common/extensions/api/networking_private/networking_private_crypto.cc |
diff --git a/chrome/common/extensions/api/networking_private/networking_private_crypto.cc b/chrome/common/extensions/api/networking_private/networking_private_crypto.cc |
deleted file mode 100644 |
index a1b94f0837dcb454e8cf7c090f14cbe4a4dd78be..0000000000000000000000000000000000000000 |
--- a/chrome/common/extensions/api/networking_private/networking_private_crypto.cc |
+++ /dev/null |
@@ -1,187 +0,0 @@ |
-// Copyright 2014 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "chrome/common/extensions/api/networking_private/networking_private_crypto.h" |
- |
-#include <stddef.h> |
- |
-#include <memory> |
- |
-#include "base/logging.h" |
-#include "base/strings/string_util.h" |
-#include "components/cast_certificate/cast_cert_validator.h" |
-#include "crypto/openssl_util.h" |
-#include "crypto/rsa_private_key.h" |
-#include "net/cert/pem_tokenizer.h" |
-#include "third_party/boringssl/src/include/openssl/digest.h" |
-#include "third_party/boringssl/src/include/openssl/evp.h" |
-#include "third_party/boringssl/src/include/openssl/rsa.h" |
-#include "third_party/boringssl/src/include/openssl/x509.h" |
- |
-namespace { |
- |
-namespace cast_crypto = ::cast_certificate; |
- |
-// Parses |pem_data| for a PEM block of |pem_type|. |
-// Returns true if a |pem_type| block is found, storing the decoded result in |
-// |der_output|. |
-bool GetDERFromPEM(const std::string& pem_data, |
- const std::string& pem_type, |
- std::vector<uint8_t>* der_output) { |
- std::vector<std::string> headers; |
- headers.push_back(pem_type); |
- net::PEMTokenizer pem_tokenizer(pem_data, headers); |
- if (!pem_tokenizer.GetNext()) { |
- return false; |
- } |
- |
- der_output->assign(pem_tokenizer.data().begin(), pem_tokenizer.data().end()); |
- return true; |
-} |
- |
-} // namespace |
- |
-namespace networking_private_crypto { |
- |
-bool VerifyCredentials( |
- const std::string& certificate, |
- const std::vector<std::string>& intermediate_certificates, |
- const std::string& signature, |
- const std::string& data, |
- const std::string& connected_mac) { |
- base::Time now = base::Time::Now(); |
- return VerifyCredentialsAtTime(certificate, intermediate_certificates, |
- signature, data, connected_mac, now); |
-} |
- |
-bool VerifyCredentialsAtTime( |
- const std::string& certificate, |
- const std::vector<std::string>& intermediate_certificates, |
- const std::string& signature, |
- const std::string& data, |
- const std::string& connected_mac, |
- const base::Time& time) { |
- static const char kErrorPrefix[] = "Device verification failed. "; |
- |
- std::vector<std::string> headers; |
- headers.push_back("CERTIFICATE"); |
- |
- // Convert certificate from PEM to raw DER |
- net::PEMTokenizer pem_tokenizer(certificate, headers); |
- if (!pem_tokenizer.GetNext()) { |
- LOG(ERROR) << kErrorPrefix << "Failed to parse device certificate."; |
- return false; |
- } |
- |
- // |certs| is a vector with the DER for all the certificates. |
- std::vector<std::string> certs; |
- certs.push_back(pem_tokenizer.data()); |
- |
- // Convert intermediate certificates from PEM to raw DER |
- for (size_t idx = 0; idx < intermediate_certificates.size(); ++idx) { |
- net::PEMTokenizer ica_pem_tokenizer(intermediate_certificates[idx], |
- headers); |
- if (ica_pem_tokenizer.GetNext()) { |
- certs.push_back(ica_pem_tokenizer.data()); |
- } else { |
- LOG(WARNING) << "Failed to parse intermediate certificates."; |
- } |
- } |
- |
- // Note that the device certificate's policy is not enforced here. The goal |
- // is simply to verify that the device belongs to the Cast ecosystem. |
- cast_crypto::CastDeviceCertPolicy unused_policy; |
- |
- std::unique_ptr<cast_crypto::CertVerificationContext> verification_context; |
- if (!cast_crypto::VerifyDeviceCert(certs, time, &verification_context, |
- &unused_policy, nullptr, |
- cast_crypto::CRLPolicy::CRL_OPTIONAL)) { |
- LOG(ERROR) << kErrorPrefix << "Failed verifying cast device cert"; |
- return false; |
- } |
- |
- // Check that the device listed in the certificate is correct. |
- // Something like evt_e161 001a11ffacdf |
- std::string common_name = verification_context->GetCommonName(); |
- std::string translated_mac; |
- base::RemoveChars(connected_mac, ":", &translated_mac); |
- if (!base::EndsWith(common_name, translated_mac, |
- base::CompareCase::INSENSITIVE_ASCII)) { |
- LOG(ERROR) << kErrorPrefix << "MAC addresses don't match."; |
- return false; |
- } |
- |
- // Use the public key from verified certificate to verify |signature| over |
- // |data|. |
- if (!verification_context->VerifySignatureOverData(signature, data)) { |
- LOG(ERROR) << kErrorPrefix |
- << "Failed verifying signature using cast device cert"; |
- return false; |
- } |
- return true; |
-} |
- |
-bool EncryptByteString(const std::vector<uint8_t>& pub_key_der, |
- const std::string& data, |
- std::vector<uint8_t>* encrypted_output) { |
- crypto::EnsureOpenSSLInit(); |
- crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); |
- |
- bssl::UniquePtr<RSA> rsa( |
- RSA_public_key_from_bytes(pub_key_der.data(), pub_key_der.size())); |
- if (!rsa || RSA_size(rsa.get()) == 0) { |
- LOG(ERROR) << "Failed to parse public key"; |
- return false; |
- } |
- |
- encrypted_output->resize(RSA_size(rsa.get())); |
- int encrypted_length = RSA_public_encrypt( |
- data.size(), reinterpret_cast<const uint8_t*>(data.data()), |
- encrypted_output->data(), rsa.get(), RSA_PKCS1_PADDING); |
- if (encrypted_length < 0) { |
- LOG(ERROR) << "Error during decryption"; |
- return false; |
- } |
- encrypted_output->resize(encrypted_length); |
- return true; |
-} |
- |
-bool DecryptByteString(const std::string& private_key_pem, |
- const std::vector<uint8_t>& encrypted_data, |
- std::string* decrypted_output) { |
- crypto::EnsureOpenSSLInit(); |
- crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); |
- |
- std::vector<uint8_t> private_key_data; |
- if (!GetDERFromPEM(private_key_pem, "PRIVATE KEY", &private_key_data)) { |
- LOG(ERROR) << "Failed to parse private key PEM."; |
- return false; |
- } |
- std::unique_ptr<crypto::RSAPrivateKey> private_key( |
- crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(private_key_data)); |
- if (!private_key || !private_key->key()) { |
- LOG(ERROR) << "Failed to parse private key DER."; |
- return false; |
- } |
- |
- RSA* rsa = EVP_PKEY_get0_RSA(private_key->key()); |
- if (!rsa || RSA_size(rsa) == 0) { |
- LOG(ERROR) << "Failed to get RSA key."; |
- return false; |
- } |
- |
- uint8_t* output = reinterpret_cast<uint8_t*>( |
- base::WriteInto(decrypted_output, RSA_size(rsa) + 1)); |
- int output_length = |
- RSA_private_decrypt(encrypted_data.size(), &encrypted_data[0], output, |
- rsa, RSA_PKCS1_PADDING); |
- if (output_length < 0) { |
- LOG(ERROR) << "Error during decryption."; |
- return false; |
- } |
- decrypted_output->resize(output_length); |
- return true; |
-} |
- |
-} // namespace networking_private_crypto |