// Copyright 2020 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 "hwsec-test-utils/fake_pca_agent/service.h"

#include <attestation/proto_bindings/interface.pb.h>
#include <attestation/proto_bindings/pca_agent.pb.h>

#include "hwsec-test-utils/fake_pca_agent/pca_factory.h"

namespace hwsec_test_utils {
namespace fake_pca_agent {

namespace {

constexpr char kPreprocessError[] = "Preprocess error";
constexpr char kVerificationError[] = "Verification error";
constexpr char kGenerationError[] = "Generation error";
constexpr char kWriteError[] = "Write error";

}  // namespace

FakePcaAgentService::FakePcaAgentService() = default;

void FakePcaAgentService::Enroll(
    std::unique_ptr<brillo::dbus_utils::DBusMethodResponse<
        attestation::pca_agent::EnrollReply>> response,
    const attestation::pca_agent::EnrollRequest& in_request) {
  attestation::AttestationEnrollmentRequest request;
  attestation::pca_agent::EnrollReply reply;
  if (!request.ParseFromString(in_request.request())) {
    reply.set_status(attestation::AttestationStatus::STATUS_INVALID_PARAMETER);
    response->Return(reply);
    return;
  }
  attestation::AttestationEnrollmentResponse enroll_response;
  enroll_response.set_status(attestation::ResponseStatus::BAD_REQUEST);
  auto pca_enroll = CreatePcaEnroll(request);
  if (!pca_enroll->Preprocess()) {
    enroll_response.set_detail(kPreprocessError);
  } else if (!pca_enroll->Verify()) {
    enroll_response.set_detail(kVerificationError);
  } else if (!pca_enroll->Generate()) {
    enroll_response.set_detail(kGenerationError);
  } else if (!pca_enroll->Write(&enroll_response)) {
    enroll_response.set_detail(kWriteError);
  } else {
    enroll_response.set_status(attestation::ResponseStatus::OK);
  }
  if (!enroll_response.SerializeToString(reply.mutable_response())) {
    reply.set_status(
        attestation::AttestationStatus::STATUS_UNEXPECTED_DEVICE_ERROR);
  }
  response->Return(reply);
}

void FakePcaAgentService::GetCertificate(
    std::unique_ptr<brillo::dbus_utils::DBusMethodResponse<
        attestation::pca_agent::GetCertificateReply>> response,
    const attestation::pca_agent::GetCertificateRequest& in_request) {
  attestation::AttestationCertificateRequest request;
  attestation::pca_agent::GetCertificateReply reply;
  if (!request.ParseFromString(in_request.request())) {
    reply.set_status(attestation::AttestationStatus::STATUS_INVALID_PARAMETER);
    response->Return(reply);
    return;
  }
  attestation::AttestationCertificateResponse certify_response;
  certify_response.set_status(attestation::ResponseStatus::BAD_REQUEST);
  certify_response.set_message_id(request.message_id());
  auto pca_certify = CreatePcaCertify(request);
  if (!pca_certify->Preprocess()) {
    certify_response.set_detail(kPreprocessError);
  } else if (!pca_certify->Verify()) {
    certify_response.set_detail(kVerificationError);
  } else if (!pca_certify->Generate()) {
    certify_response.set_detail(kGenerationError);
  } else if (!pca_certify->Write(&certify_response)) {
    certify_response.set_detail(kWriteError);
  } else {
    certify_response.set_status(attestation::ResponseStatus::OK);
  }
  if (!certify_response.SerializeToString(reply.mutable_response())) {
    reply.set_status(
        attestation::AttestationStatus::STATUS_UNEXPECTED_DEVICE_ERROR);
  }
  response->Return(reply);
}

}  // namespace fake_pca_agent
}  // namespace hwsec_test_utils
