blob: 6d2a5b9469112f67ae3ede9198d8d8e2748040dc [file] [log] [blame]
// 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/browser/extensions/api/easy_unlock_private/easy_unlock_private_crypto_delegate.h"
#include "base/macros.h"
#include "chromeos/dbus/dbus_thread_manager.h"
#include "chromeos/dbus/easy_unlock_client.h"
#include "third_party/cros_system_api/dbus/service_constants.h"
namespace extensions {
namespace easy_unlock_private = api::easy_unlock_private;
namespace {
// Converts encryption type to a string representation used by EasyUnlock dbus
// client.
std::string EncryptionTypeToString(easy_unlock_private::EncryptionType type) {
switch (type) {
case easy_unlock_private::ENCRYPTION_TYPE_AES_256_CBC:
return easy_unlock::kEncryptionTypeAES256CBC;
default:
return easy_unlock::kEncryptionTypeNone;
}
}
// Converts signature type to a string representation used by EasyUnlock dbus
// client.
std::string SignatureTypeToString(easy_unlock_private::SignatureType type) {
switch (type) {
case easy_unlock_private::SIGNATURE_TYPE_ECDSA_P256_SHA256:
return easy_unlock::kSignatureTypeECDSAP256SHA256;
case easy_unlock_private::SIGNATURE_TYPE_HMAC_SHA256:
// Fall through to default.
default:
return easy_unlock::kSignatureTypeHMACSHA256;
}
}
// ChromeOS specific EasyUnlockPrivateCryptoDelegate implementation.
class EasyUnlockPrivateCryptoDelegateChromeOS
: public extensions::EasyUnlockPrivateCryptoDelegate {
public:
EasyUnlockPrivateCryptoDelegateChromeOS()
: dbus_client_(
chromeos::DBusThreadManager::Get()->GetEasyUnlockClient()) {
}
~EasyUnlockPrivateCryptoDelegateChromeOS() override {}
void GenerateEcP256KeyPair(const KeyPairCallback& callback) override {
dbus_client_->GenerateEcP256KeyPair(callback);
}
void PerformECDHKeyAgreement(
const easy_unlock_private::PerformECDHKeyAgreement::Params& params,
const DataCallback& callback) override {
dbus_client_->PerformECDHKeyAgreement(
std::string(params.private_key.begin(), params.private_key.end()),
std::string(params.public_key.begin(), params.public_key.end()),
callback);
}
void CreateSecureMessage(
const easy_unlock_private::CreateSecureMessage::Params& params,
const DataCallback& callback) override {
chromeos::EasyUnlockClient::CreateSecureMessageOptions options;
options.key.assign(params.key.begin(), params.key.end());
if (params.options.associated_data) {
options.associated_data.assign(params.options.associated_data->begin(),
params.options.associated_data->end());
}
if (params.options.public_metadata) {
options.public_metadata.assign(params.options.public_metadata->begin(),
params.options.public_metadata->end());
}
if (params.options.verification_key_id) {
options.verification_key_id.assign(
params.options.verification_key_id->begin(),
params.options.verification_key_id->end());
}
if (params.options.decryption_key_id) {
options.decryption_key_id.assign(
params.options.decryption_key_id->begin(),
params.options.decryption_key_id->end());
}
options.encryption_type =
EncryptionTypeToString(params.options.encrypt_type);
options.signature_type =
SignatureTypeToString(params.options.sign_type);
dbus_client_->CreateSecureMessage(
std::string(params.payload.begin(), params.payload.end()), options,
callback);
}
void UnwrapSecureMessage(
const easy_unlock_private::UnwrapSecureMessage::Params& params,
const DataCallback& callback) override {
chromeos::EasyUnlockClient::UnwrapSecureMessageOptions options;
options.key.assign(params.key.begin(), params.key.end());
if (params.options.associated_data) {
options.associated_data.assign(params.options.associated_data->begin(),
params.options.associated_data->end());
}
options.encryption_type =
EncryptionTypeToString(params.options.encrypt_type);
options.signature_type =
SignatureTypeToString(params.options.sign_type);
dbus_client_->UnwrapSecureMessage(
std::string(params.secure_message.begin(), params.secure_message.end()),
options, callback);
}
private:
chromeos::EasyUnlockClient* dbus_client_;
DISALLOW_COPY_AND_ASSIGN(EasyUnlockPrivateCryptoDelegateChromeOS);
};
} // namespace
// static
std::unique_ptr<EasyUnlockPrivateCryptoDelegate>
EasyUnlockPrivateCryptoDelegate::Create() {
return std::unique_ptr<EasyUnlockPrivateCryptoDelegate>(
new EasyUnlockPrivateCryptoDelegateChromeOS());
}
} // namespace extensions