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