blob: a445232ff881df2ea8fe15d9aacbaf7da34b3377 [file] [log] [blame] [edit]
/* Copyright 2024 The ChromiumOS Authors
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*
* Private header file for mount-encrypted helper tool.
*/
#ifndef INIT_TPM_ENCRYPTION_TPM_SETUP_H_
#define INIT_TPM_ENCRYPTION_TPM_SETUP_H_
#include <memory>
#include <optional>
#include <sys/types.h>
#include <unistd.h>
#include <base/files/file_path.h>
#include <brillo/brillo_export.h>
#include <libstorage/platform/platform.h>
#include "init/metrics/metrics.h"
#include "init/tpm_encryption/tpm.h"
namespace encryption {
// Interface to communicate with outside world
class BRILLO_EXPORT TpmSystemKey {
public:
TpmSystemKey(libstorage::Platform* platform,
hwsec_foundation::TlclWrapper* tlcl,
init_metrics::InitMetrics* metrics,
base::FilePath rootdir,
base::FilePath stateful_mount);
// Reads key material from the file |key_material_file|, creates a system key
// using the material, and persists the system key in NVRAM.
//
// This function only supports TPM 2.0 and should be called ONLY for testing
// purposes.
//
// Doesn't take ownership of |platform|.
// Return code indicates if every thing is successful.
bool Set(const base::FilePath key_material_file);
// Load key from TPM, spread to susbsystem that need it.
// If |safe_mount| is set, fails if the TPM is not avaible when needed.
// If |backup| is not empty and a new key has been created, save the seeding
// material for testing purposes.
std::optional<encryption::EncryptionKey> Load(bool safe_mount,
base::FilePath backup);
// Print encrypted data information.
void ReportInfo();
// Exports NVRAM contents to tmpfs for use by install attributes.
bool Export();
private:
libstorage::Platform* platform_;
hwsec_foundation::TlclWrapper* tlcl_;
init_metrics::InitMetrics* metrics_;
base::FilePath rootdir_;
base::FilePath stateful_mount_;
Tpm tpm_;
std::unique_ptr<SystemKeyLoader> loader_;
std::optional<bool> has_chromefw_;
// To check if the device is a chromebook.
bool HasChromeFw();
// Return true when a TPM is required to store the system key.
bool ShallUseTpmForSystemKey();
// Originally .tpm_owned file is located in /mnt/stateful_partition. Since the
// directory can only be written by root, .tpm_owned won't be able to get
// touched by tpm_managerd if we run it in minijail. Therefore, we need to
// migrate the files from /mnt/stateful_partition to the files into
// /mnt/stateful_partition/unencrypted/tpm_manager. The migration is written
// here since mount-encrypted is started before tpm_managerd.
bool MigrateTpmOwnerShipStateFile();
};
} // namespace encryption
#endif // INIT_TPM_ENCRYPTION_TPM_SETUP_H_