| Index: chrome/browser/extensions/api/platform_keys/platform_keys_api.cc
|
| diff --git a/chrome/browser/extensions/api/platform_keys/platform_keys_api.cc b/chrome/browser/extensions/api/platform_keys/platform_keys_api.cc
|
| index f3ad6512ad43ee63c580ecb2339f387a0db9effe..9a4e2d29a5b39b1a1640573e98e742d965f4d367 100644
|
| --- a/chrome/browser/extensions/api/platform_keys/platform_keys_api.cc
|
| +++ b/chrome/browser/extensions/api/platform_keys/platform_keys_api.cc
|
| @@ -8,7 +8,6 @@
|
|
|
| #include "base/bind.h"
|
| #include "base/logging.h"
|
| -#include "base/values.h"
|
| #include "chrome/browser/chromeos/platform_keys/platform_keys.h"
|
| #include "chrome/browser/chromeos/platform_keys/platform_keys_service.h"
|
| #include "chrome/browser/chromeos/platform_keys/platform_keys_service_factory.h"
|
| @@ -21,49 +20,10 @@ namespace extensions {
|
| namespace api_pk = api::platform_keys;
|
| namespace api_pki = api::platform_keys_internal;
|
|
|
| -namespace {
|
| -
|
| -const char kErrorAlgorithmNotSupported[] = "Algorithm not supported.";
|
| -const char kErrorInvalidX509Cert[] =
|
| - "Certificate is not a valid X.509 certificate.";
|
| -
|
| -struct PublicKeyInfo {
|
| - // The X.509 Subject Public Key Info of the key in DER encoding.
|
| - std::string public_key_spki_der;
|
| -
|
| - // The type of the key.
|
| - net::X509Certificate::PublicKeyType key_type =
|
| - net::X509Certificate::kPublicKeyTypeUnknown;
|
| -
|
| - // The size of the key in bits.
|
| - size_t key_size_bits = 0;
|
| -};
|
| -
|
| -// Builds a partial WebCrypto Algorithm object from the parameters available in
|
| -// |key_info|, which must the info of an RSA key. This doesn't include sign/hash
|
| -// parameters and thus isn't complete.
|
| -// platform_keys::GetPublicKey() enforced the public exponent 65537.
|
| -void BuildWebCryptoRSAAlgorithmDictionary(const PublicKeyInfo& key_info,
|
| - base::DictionaryValue* algorithm) {
|
| - CHECK_EQ(net::X509Certificate::kPublicKeyTypeRSA, key_info.key_type);
|
| - algorithm->SetStringWithoutPathExpansion("name", "RSASSA-PKCS1-v1_5");
|
| - algorithm->SetIntegerWithoutPathExpansion("modulusLength",
|
| - key_info.key_size_bits);
|
| -
|
| - // Equals 65537.
|
| - const unsigned char defaultPublicExponent[] = {0x01, 0x00, 0x01};
|
| - algorithm->SetWithoutPathExpansion(
|
| - "publicExponent",
|
| - base::BinaryValue::CreateWithCopiedBuffer(
|
| - reinterpret_cast<const char*>(defaultPublicExponent),
|
| - arraysize(defaultPublicExponent)));
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| namespace platform_keys {
|
|
|
| const char kErrorInvalidToken[] = "The token is not valid.";
|
| +const char kErrorAlgorithmNotSupported[] = "Algorithm not supported.";
|
| const char kTokenIdUser[] = "user";
|
| const char kTokenIdSystem[] = "system";
|
|
|
| @@ -94,43 +54,6 @@ std::string PlatformKeysTokenIdToApiId(
|
|
|
| } // namespace platform_keys
|
|
|
| -PlatformKeysInternalGetPublicKeyFunction::
|
| - ~PlatformKeysInternalGetPublicKeyFunction() {
|
| -}
|
| -
|
| -ExtensionFunction::ResponseAction
|
| -PlatformKeysInternalGetPublicKeyFunction::Run() {
|
| - scoped_ptr<api_pki::GetPublicKey::Params> params(
|
| - api_pki::GetPublicKey::Params::Create(*args_));
|
| - EXTENSION_FUNCTION_VALIDATE(params);
|
| -
|
| - const std::vector<char>& cert_der = params->certificate;
|
| - if (cert_der.empty())
|
| - return RespondNow(Error(kErrorInvalidX509Cert));
|
| - scoped_refptr<net::X509Certificate> cert_x509 =
|
| - net::X509Certificate::CreateFromBytes(vector_as_array(&cert_der),
|
| - cert_der.size());
|
| - if (!cert_x509)
|
| - return RespondNow(Error(kErrorInvalidX509Cert));
|
| -
|
| - PublicKeyInfo key_info;
|
| - if (!chromeos::platform_keys::GetPublicKey(
|
| - cert_x509, &key_info.public_key_spki_der, &key_info.key_type,
|
| - &key_info.key_size_bits) ||
|
| - key_info.key_type != net::X509Certificate::kPublicKeyTypeRSA) {
|
| - return RespondNow(Error(kErrorAlgorithmNotSupported));
|
| - }
|
| -
|
| - api_pki::GetPublicKey::Results::Algorithm algorithm;
|
| - BuildWebCryptoRSAAlgorithmDictionary(key_info,
|
| - &algorithm.additional_properties);
|
| -
|
| - return RespondNow(ArgumentList(api_pki::GetPublicKey::Results::Create(
|
| - std::vector<char>(key_info.public_key_spki_der.begin(),
|
| - key_info.public_key_spki_der.end()),
|
| - algorithm)));
|
| -}
|
| -
|
| PlatformKeysInternalSelectClientCertificatesFunction::
|
| ~PlatformKeysInternalSelectClientCertificatesFunction() {
|
| }
|
| @@ -172,27 +95,12 @@ void PlatformKeysInternalSelectClientCertificatesFunction::
|
| DCHECK(matches);
|
| std::vector<linked_ptr<api_pk::Match>> result_matches;
|
| for (const scoped_refptr<net::X509Certificate>& match : *matches) {
|
| - PublicKeyInfo key_info;
|
| - if (!chromeos::platform_keys::GetPublicKey(
|
| - match, &key_info.public_key_spki_der, &key_info.key_type,
|
| - &key_info.key_size_bits)) {
|
| - LOG(ERROR) << "Could not retrieve public key info.";
|
| - continue;
|
| - }
|
| - if (key_info.key_type != net::X509Certificate::kPublicKeyTypeRSA) {
|
| - LOG(ERROR) << "Skipping unsupported certificate with non-RSA key.";
|
| - continue;
|
| - }
|
| -
|
| linked_ptr<api_pk::Match> result_match(new api_pk::Match);
|
| std::string der_encoded_cert;
|
| net::X509Certificate::GetDEREncoded(match->os_cert_handle(),
|
| &der_encoded_cert);
|
| result_match->certificate.assign(der_encoded_cert.begin(),
|
| der_encoded_cert.end());
|
| -
|
| - BuildWebCryptoRSAAlgorithmDictionary(
|
| - key_info, &result_match->key_algorithm.additional_properties);
|
| result_matches.push_back(result_match);
|
| }
|
| Respond(ArgumentList(
|
| @@ -207,45 +115,32 @@ ExtensionFunction::ResponseAction PlatformKeysInternalSignFunction::Run() {
|
| api_pki::Sign::Params::Create(*args_));
|
| EXTENSION_FUNCTION_VALIDATE(params);
|
| std::string platform_keys_token_id;
|
| - if (!params->token_id.empty() &&
|
| - !platform_keys::ValidateToken(params->token_id,
|
| - &platform_keys_token_id)) {
|
| + if (!platform_keys::ValidateToken(params->token_id, &platform_keys_token_id))
|
| return RespondNow(Error(platform_keys::kErrorInvalidToken));
|
| - }
|
| +
|
| + chromeos::platform_keys::HashAlgorithm hash_algorithm;
|
| + if (params->hash_algorithm_name == "SHA-1")
|
| + hash_algorithm = chromeos::platform_keys::HASH_ALGORITHM_SHA1;
|
| + else if (params->hash_algorithm_name == "SHA-256")
|
| + hash_algorithm = chromeos::platform_keys::HASH_ALGORITHM_SHA256;
|
| + else if (params->hash_algorithm_name == "SHA-384")
|
| + hash_algorithm = chromeos::platform_keys::HASH_ALGORITHM_SHA384;
|
| + else if (params->hash_algorithm_name == "SHA-512")
|
| + hash_algorithm = chromeos::platform_keys::HASH_ALGORITHM_SHA512;
|
| + else
|
| + return RespondNow(Error(platform_keys::kErrorAlgorithmNotSupported));
|
|
|
| chromeos::PlatformKeysService* service =
|
| chromeos::PlatformKeysServiceFactory::GetForBrowserContext(
|
| browser_context());
|
| DCHECK(service);
|
|
|
| - if (params->hash_algorithm_name == "none") {
|
| - service->SignRSAPKCS1Raw(
|
| - platform_keys_token_id,
|
| - std::string(params->data.begin(), params->data.end()),
|
| - std::string(params->public_key.begin(), params->public_key.end()),
|
| - extension_id(),
|
| - base::Bind(&PlatformKeysInternalSignFunction::OnSigned, this));
|
| - } else {
|
| - chromeos::platform_keys::HashAlgorithm hash_algorithm;
|
| - if (params->hash_algorithm_name == "SHA-1") {
|
| - hash_algorithm = chromeos::platform_keys::HASH_ALGORITHM_SHA1;
|
| - } else if (params->hash_algorithm_name == "SHA-256") {
|
| - hash_algorithm = chromeos::platform_keys::HASH_ALGORITHM_SHA256;
|
| - } else if (params->hash_algorithm_name == "SHA-384") {
|
| - hash_algorithm = chromeos::platform_keys::HASH_ALGORITHM_SHA384;
|
| - } else if (params->hash_algorithm_name == "SHA-512") {
|
| - hash_algorithm = chromeos::platform_keys::HASH_ALGORITHM_SHA512;
|
| - } else {
|
| - return RespondNow(Error(kErrorAlgorithmNotSupported));
|
| - }
|
| - service->SignRSAPKCS1Digest(
|
| - platform_keys_token_id,
|
| - std::string(params->data.begin(), params->data.end()),
|
| - std::string(params->public_key.begin(), params->public_key.end()),
|
| - hash_algorithm, extension_id(),
|
| - base::Bind(&PlatformKeysInternalSignFunction::OnSigned, this));
|
| - }
|
| -
|
| + service->Sign(
|
| + platform_keys_token_id,
|
| + std::string(params->public_key.begin(), params->public_key.end()),
|
| + hash_algorithm, std::string(params->data.begin(), params->data.end()),
|
| + extension_id(),
|
| + base::Bind(&PlatformKeysInternalSignFunction::OnSigned, this));
|
| return RespondLater();
|
| }
|
|
|
|
|