blob: bcb0f9d49022b24be5603887e0817cebd1fe5c4b [file] [log] [blame]
// 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