blob: deda6792de3bdf02dc7e8e9e8c28f91b8dea4424 [file] [log] [blame]
// Copyright 2014 The Chromium OS 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 "easy-unlock/fake_easy_unlock_service.h"
#include <string>
#include <base/files/file_util.h>
#include <base/strings/stringprintf.h>
namespace {
const char kSecureMessageTemplate[] =
"securemessage:{"
"payload:%s,"
"key:%s,"
"associated_data:%s,"
"public_metadata:%s,"
"verification_key_id:%s,"
"decryption_key_id:%s,"
"encryption:%s,"
"signature:%s"
"}";
const char kUnwrappedMessageTemplate[] =
"unwrappedmessage:{"
"original:%s,"
"key:%s,"
"associated_data:%s,"
"encryption:%s,"
"signature:%s"
"}";
std::string Uint8VectorAsString(const std::vector<uint8_t>& data) {
return std::string(reinterpret_cast<const char*>(data.data()), data.size());
}
std::vector<uint8_t> StringAsUint8Vector(const std::string& data) {
return std::vector<uint8_t>(data.c_str(), data.c_str() + data.length());
}
std::string EncryptionTypeAsString(
easy_unlock_crypto::ServiceImpl::EncryptionType type) {
switch (type) {
case easy_unlock_crypto::ServiceImpl::ENCRYPTION_TYPE_NONE:
return "NONE";
case easy_unlock_crypto::ServiceImpl::ENCRYPTION_TYPE_AES_256_CBC:
return "AES";
default:
return "";
}
}
std::string SignatureTypeAsString(
easy_unlock_crypto::ServiceImpl::SignatureType type) {
switch (type) {
case easy_unlock_crypto::ServiceImpl::SIGNATURE_TYPE_ECDSA_P256_SHA256:
return "ECDSA_P256";
case easy_unlock_crypto::ServiceImpl::SIGNATURE_TYPE_HMAC_SHA256:
return "HMAC";
default:
return "";
}
}
std::string KeyAlgorithmAsString(
easy_unlock_crypto::ServiceImpl::KeyAlgorithm type) {
switch (type) {
case easy_unlock_crypto::ServiceImpl::KEY_ALGORITHM_ECDSA:
return "ECDSA";
case easy_unlock_crypto::ServiceImpl::KEY_ALGORITHM_RSA:
return "RSA";
default:
return "";
}
}
} // namespace
namespace easy_unlock {
FakeService::FakeService() : private_key_count_(0), public_key_count_(0) {}
FakeService::~FakeService() {}
void FakeService::GenerateEcP256KeyPair(std::vector<uint8_t>* private_key,
std::vector<uint8_t>* public_key) {
*private_key = StringAsUint8Vector(
base::StringPrintf("private_key_%d", ++private_key_count_));
*public_key = StringAsUint8Vector(
base::StringPrintf("public_key_%d", ++public_key_count_));
}
std::vector<uint8_t> FakeService::WrapPublicKey(
easy_unlock_crypto::ServiceImpl::KeyAlgorithm algorithm,
const std::vector<uint8_t>& public_key) {
return StringAsUint8Vector(base::StringPrintf(
"public_key_%s_%s", KeyAlgorithmAsString(algorithm).c_str(),
Uint8VectorAsString(public_key).c_str()));
}
std::vector<uint8_t> FakeService::PerformECDHKeyAgreement(
const std::vector<uint8_t>& private_key,
const std::vector<uint8_t>& public_key) {
return StringAsUint8Vector(
base::StringPrintf("secret_key:{private_key:%s,public_key:%s}",
Uint8VectorAsString(private_key).c_str(),
Uint8VectorAsString(public_key).c_str()));
}
std::vector<uint8_t> FakeService::CreateSecureMessage(
const std::vector<uint8_t>& payload,
const std::vector<uint8_t>& key,
const std::vector<uint8_t>& associated_data,
const std::vector<uint8_t>& public_metadata,
const std::vector<uint8_t>& verification_key_id,
const std::vector<uint8_t>& decryption_key_id,
easy_unlock_crypto::ServiceImpl::EncryptionType encryption_type,
easy_unlock_crypto::ServiceImpl::SignatureType signature_type) {
return StringAsUint8Vector(base::StringPrintf(
kSecureMessageTemplate, Uint8VectorAsString(payload).c_str(),
Uint8VectorAsString(key).c_str(),
Uint8VectorAsString(associated_data).c_str(),
Uint8VectorAsString(public_metadata).c_str(),
Uint8VectorAsString(verification_key_id).c_str(),
Uint8VectorAsString(decryption_key_id).c_str(),
EncryptionTypeAsString(encryption_type).c_str(),
SignatureTypeAsString(signature_type).c_str()));
}
std::vector<uint8_t> FakeService::UnwrapSecureMessage(
const std::vector<uint8_t>& secure_message,
const std::vector<uint8_t>& key,
const std::vector<uint8_t>& associated_data,
easy_unlock_crypto::ServiceImpl::EncryptionType encryption_type,
easy_unlock_crypto::ServiceImpl::SignatureType signature_type) {
return StringAsUint8Vector(base::StringPrintf(
kUnwrappedMessageTemplate, Uint8VectorAsString(secure_message).c_str(),
Uint8VectorAsString(key).c_str(),
Uint8VectorAsString(associated_data).c_str(),
EncryptionTypeAsString(encryption_type).c_str(),
SignatureTypeAsString(signature_type).c_str()));
}
} // namespace easy_unlock