163 lines
5.9 KiB
C++
163 lines
5.9 KiB
C++
//
|
|
// Copyright (C) 2020 The Android Open Source Project
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
#pragma once
|
|
|
|
#include <map>
|
|
#include <vector>
|
|
|
|
#include <keymaster/key.h>
|
|
#include <keymaster/keymaster_context.h>
|
|
#include <keymaster/km_openssl/attestation_record.h>
|
|
|
|
#include "tpm_attestation_record.h"
|
|
|
|
namespace cuttlefish {
|
|
|
|
class TpmAttestationRecordContext;
|
|
class TpmResourceManager;
|
|
class TpmKeyBlobMaker;
|
|
class TpmRandomSource;
|
|
class TpmRemoteProvisioningContext;
|
|
|
|
/**
|
|
* Implementation of KeymasterContext that proxies to another implementation.
|
|
*
|
|
* Because AndroidKeymaster wraps a KeymasterContext and puts it into a unique
|
|
* pointer, it doesn't let the implementor manage the lifetime of the
|
|
* KeymasterContext implementation. This proxy breaks that relationship, and
|
|
* allows the lifetimes to be distinct as long as the KeymasterContext instance
|
|
* outlives the AndroidKeymaster instance.
|
|
*/
|
|
class ProxyKeymasterContext : public keymaster::KeymasterContext {
|
|
public:
|
|
ProxyKeymasterContext(KeymasterContext& wrapped) : wrapped_(wrapped) {}
|
|
~ProxyKeymasterContext() = default;
|
|
|
|
keymaster::KmVersion GetKmVersion() const override {
|
|
return wrapped_.GetKmVersion();
|
|
}
|
|
|
|
keymaster_error_t SetSystemVersion(uint32_t os_version,
|
|
uint32_t os_patchlevel) override {
|
|
return wrapped_.SetSystemVersion(os_version, os_patchlevel);
|
|
}
|
|
void GetSystemVersion(uint32_t* os_version,
|
|
uint32_t* os_patchlevel) const override {
|
|
return wrapped_.GetSystemVersion(os_version, os_patchlevel);
|
|
}
|
|
|
|
const keymaster::KeyFactory* GetKeyFactory(
|
|
keymaster_algorithm_t algorithm) const override {
|
|
return wrapped_.GetKeyFactory(algorithm);
|
|
}
|
|
const keymaster::OperationFactory* GetOperationFactory(
|
|
keymaster_algorithm_t algorithm,
|
|
keymaster_purpose_t purpose) const override {
|
|
return wrapped_.GetOperationFactory(algorithm, purpose);
|
|
}
|
|
const keymaster_algorithm_t* GetSupportedAlgorithms(
|
|
size_t* algorithms_count) const override {
|
|
return wrapped_.GetSupportedAlgorithms(algorithms_count);
|
|
}
|
|
|
|
keymaster_error_t UpgradeKeyBlob(
|
|
const keymaster::KeymasterKeyBlob& key_to_upgrade,
|
|
const keymaster::AuthorizationSet& upgrade_params,
|
|
keymaster::KeymasterKeyBlob* upgraded_key) const override {
|
|
return wrapped_.UpgradeKeyBlob(key_to_upgrade, upgrade_params,
|
|
upgraded_key);
|
|
}
|
|
|
|
keymaster_error_t ParseKeyBlob(
|
|
const keymaster::KeymasterKeyBlob& blob,
|
|
const keymaster::AuthorizationSet& additional_params,
|
|
keymaster::UniquePtr<keymaster::Key>* key) const override {
|
|
return wrapped_.ParseKeyBlob(blob, additional_params, key);
|
|
}
|
|
|
|
keymaster_error_t AddRngEntropy(const uint8_t* buf,
|
|
size_t length) const override {
|
|
return wrapped_.AddRngEntropy(buf, length);
|
|
}
|
|
|
|
keymaster::KeymasterEnforcement* enforcement_policy() override {
|
|
return wrapped_.enforcement_policy();
|
|
}
|
|
|
|
keymaster::AttestationContext* attestation_context() override {
|
|
return wrapped_.attestation_context();
|
|
}
|
|
|
|
keymaster::CertificateChain GenerateAttestation(
|
|
const keymaster::Key& key,
|
|
const keymaster::AuthorizationSet& attest_params,
|
|
keymaster::UniquePtr<keymaster::Key> attest_key,
|
|
const keymaster::KeymasterBlob& issuer_subject,
|
|
keymaster_error_t* error) const override {
|
|
return wrapped_.GenerateAttestation(
|
|
key, attest_params, std::move(attest_key), issuer_subject, error);
|
|
}
|
|
|
|
keymaster::CertificateChain GenerateSelfSignedCertificate(
|
|
const keymaster::Key& key, const keymaster::AuthorizationSet& cert_params,
|
|
bool fake_signature, keymaster_error_t* error) const override {
|
|
return wrapped_.GenerateSelfSignedCertificate(key, cert_params,
|
|
fake_signature, error);
|
|
}
|
|
|
|
keymaster_error_t UnwrapKey(
|
|
const keymaster::KeymasterKeyBlob& wrapped_key_blob,
|
|
const keymaster::KeymasterKeyBlob& wrapping_key_blob,
|
|
const keymaster::AuthorizationSet& wrapping_key_params,
|
|
const keymaster::KeymasterKeyBlob& masking_key,
|
|
keymaster::AuthorizationSet* wrapped_key_params,
|
|
keymaster_key_format_t* wrapped_key_format,
|
|
keymaster::KeymasterKeyBlob* wrapped_key_material) const override {
|
|
return wrapped_.UnwrapKey(
|
|
wrapped_key_blob, wrapping_key_blob, wrapping_key_params, masking_key,
|
|
wrapped_key_params, wrapped_key_format, wrapped_key_material);
|
|
}
|
|
|
|
keymaster::RemoteProvisioningContext* GetRemoteProvisioningContext()
|
|
const override {
|
|
return wrapped_.GetRemoteProvisioningContext();
|
|
}
|
|
|
|
keymaster_error_t SetVendorPatchlevel(uint32_t vendor_patchlevel) override {
|
|
return wrapped_.SetVendorPatchlevel(vendor_patchlevel);
|
|
}
|
|
keymaster_error_t SetBootPatchlevel(uint32_t boot_patchlevel) override {
|
|
return wrapped_.SetBootPatchlevel(boot_patchlevel);
|
|
}
|
|
keymaster_error_t SetVerifiedBootInfo(
|
|
std::string_view verified_boot_state, std::string_view bootloader_state,
|
|
const std::vector<uint8_t>& vbmeta_digest) {
|
|
return wrapped_.SetVerifiedBootInfo(verified_boot_state, bootloader_state,
|
|
vbmeta_digest);
|
|
}
|
|
std::optional<uint32_t> GetVendorPatchlevel() const override {
|
|
return wrapped_.GetVendorPatchlevel();
|
|
}
|
|
std::optional<uint32_t> GetBootPatchlevel() const override {
|
|
return wrapped_.GetBootPatchlevel();
|
|
}
|
|
|
|
private:
|
|
KeymasterContext& wrapped_;
|
|
};
|
|
|
|
} // namespace cuttlefish
|