// 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
