blob: 372691d238d72d04a843a4a5005509875b39551d [file] [log] [blame] [edit]
// Copyright 2023 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef LIBARC_ATTESTATION_LIB_INTERFACE_H_
#define LIBARC_ATTESTATION_LIB_INTERFACE_H_
#include <string>
#include <vector>
#include <libarc-attestation/lib/export.h>
namespace arc_attestation {
class ARC_ATTESTATION_EXPORT AndroidStatus final {
public:
// These are error code specific to keymint, and they're to be kept in sync
// with
// hardware/interfaces/security/keymint/aidl/android/hardware/security/
// keymint/ErrorCode.aidl
// The codes that are used in this library is defined here, we duplicated the
// code used from the Android codebase so as to prevent dependency from
// Android code base which can complicate the build process for this library.
enum class KeymintSpecificErrorCode { SECURE_HW_COMMUNICATION_FAILED = -49 };
// These are error code used by Android's binder::Status class, and they're to
// be kept in sync with frameworks/native/libs/binder/include/binder/Status.h
// The codes that are used in this library is defined here, we duplicated the
// code used from the Android codebase so as to prevent dependency from
// Android code base which can complicate the build process for this library.
enum class StatusCode { EX_SERVICE_SPECIFIC = -8, EX_NONE = 0 };
AndroidStatus() = default;
AndroidStatus(int32_t exception,
int32_t error_code,
const std::string& message)
: exception_(exception), error_code_(error_code), message_(message) {}
~AndroidStatus() = default;
int32_t get_exception() const { return exception_; }
int32_t get_error_code() const { return error_code_; }
std::string get_message() const { return message_; }
// Returns true iff successful.
bool is_ok() {
return exception_ == static_cast<int32_t>(StatusCode::EX_NONE);
}
// Create an OK (successful) status.
static AndroidStatus ok() { return AndroidStatus(); }
// Create a status from a Keymint-specific error code.
static AndroidStatus from_keymint_code(KeymintSpecificErrorCode code,
const std::string& message = "") {
return AndroidStatus(static_cast<int32_t>(StatusCode::EX_SERVICE_SPECIFIC),
static_cast<int32_t>(code), message);
}
private:
int32_t exception_ = 0;
int32_t error_code_ = 0;
std::string message_;
};
// The following C-style APIs are not thread safe.
// ProvisionDkCert() will provision the Android Device Key.
AndroidStatus ARC_ATTESTATION_EXPORT ProvisionDkCert(bool blocking);
// GetDkCertChain() will retrieve the DK's certificate and its certificate
// chain.
AndroidStatus ARC_ATTESTATION_EXPORT
GetDkCertChain(std::vector<std::vector<uint8_t>>& cert_out);
// SignWithP256Dk will sign the specified data with the DK. The DK is an ECC
// with P256 curve.
AndroidStatus ARC_ATTESTATION_EXPORT SignWithP256Dk(
const std::vector<uint8_t>& input, std::vector<uint8_t>& signature);
// QuoteCrOSBlob will provide the ChromeOS related blob so as to allow the
// server side to verify the client's version.
AndroidStatus ARC_ATTESTATION_EXPORT QuoteCrOSBlob(
const std::vector<uint8_t>& challenge, std::vector<uint8_t>& output);
} // namespace arc_attestation
#endif // LIBARC_ATTESTATION_LIB_INTERFACE_H_