blob: 10e12ac5dba204eb44dbd679aa97712ea41c8337 [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/pca_certify_v1.h"
#include <string>
#include <utility>
#include <base/logging.h>
#include <base/memory/free_deleter.h>
#include <crypto/scoped_openssl_types.h>
#include <trousers/trousers.h>
#include <trousers/tss.h>
#include "hwsec-test-utils/common/openssl_utility.h"
#include "hwsec-test-utils/fake_pca_agent/issue_certificate.h"
#include "hwsec-test-utils/fake_pca_agent/tpm1_struct_utils.h"
namespace hwsec_test_utils {
namespace fake_pca_agent {
bool PcaCertifyV1::Preprocess() {
const unsigned char* asn1_ptr = reinterpret_cast<const unsigned char*>(
request_.identity_credential().data());
crypto::ScopedX509 x509(
d2i_X509(nullptr, &asn1_ptr, request_.identity_credential().length()));
if (!x509) {
LOG(ERROR) << __func__
<< ": Failed to call d2i_X509: " << GetOpenSSLError();
return false;
}
identity_key_.reset(X509_get_pubkey(x509.get()));
if (!identity_key_) {
LOG(ERROR) << __func__
<< ": Failed to call X509_get_pubkey: " << GetOpenSSLError();
return false;
}
certified_key_ = TpmPublicKeyToEVP(request_.certified_public_key(),
&certified_key_digest_);
if (!certified_key_) {
LOG(ERROR) << __func__
<< ": Failed to parse certified key: " << GetOpenSSLError();
return false;
}
return true;
}
bool PcaCertifyV1::Verify() {
// Verify digest.
base::Optional<std::string> digest =
ParseDigestFromTpmCertifyInfo(request_.certified_key_info());
if (!digest) {
LOG(ERROR) << __func__ << ": Failed to parse digest from the key info.";
return false;
}
if (certified_key_digest_ != *digest) {
LOG(ERROR) << __func__ << ": Mismatched public key digest.";
return false;
}
// Verify signature.
if (!EVPDigestVerify(identity_key_, EVP_sha1(), request_.certified_key_info(),
request_.certified_key_proof())) {
LOG(ERROR) << __func__ << ": Failed to verify certified key proof.";
return false;
}
return true;
}
bool PcaCertifyV1::Generate() {
issued_certificate_der_ = IssueTestCertificateDer(certified_key_);
if (!issued_certificate_der_) {
LOG(ERROR) << __func__ << ": Failed to create certificate.";
return false;
}
return true;
}
bool PcaCertifyV1::Write(
attestation::AttestationCertificateResponse* response) {
if (!issued_certificate_der_) {
return false;
}
response->set_certified_key_credential(*issued_certificate_der_);
return true;
}
} // namespace fake_pca_agent
} // namespace hwsec_test_utils