18#include <fmt/format.h>
28 return fmt::format(
"{}.sealed.json", version);
33 auto pos = path.find_first_of(
'.');
34 if (pos == std::string::npos)
36 throw std::logic_error(fmt::format(
37 "Sealed ledger secret file name {} does not contain a version", path));
42 return std::stol(path.substr(0, pos));
44 catch (
const std::invalid_argument& e)
47 "Unable to parse version from file name {}, {}", path, e.what());
53 std::span<const uint8_t> raw_key,
54 std::span<const uint8_t> plaintext,
55 const std::span<uint8_t>& aad)
68 std::span<const uint8_t> raw_key,
69 const std::vector<uint8_t>& sealed_text,
70 const std::span<uint8_t>& aad)
78 std::vector<uint8_t> plaintext;
82 throw std::logic_error(
"Failed to decrypt sealed data");
108 const std::string& sealed_secret_dir,
113 LOG_INFO_FMT(
"Sealing ledger secret to {}", sealed_secret_dir);
115 files::create_directory(sealed_secret_dir);
117 std::string plaintext = nlohmann::json(ledger_secret).dump();
118 std::vector<uint8_t> buf_plaintext(plaintext.begin(), plaintext.end());
120 std::string plainaad =
124 std::vector<uint8_t> buf_aad(plainaad.begin(), plainaad.end());
127 auto sealing_key = ccf::pal::snp::make_derived_key(tcb_version);
131 auto dir_path = files::fs::path(sealed_secret_dir);
136 files::dump(nlohmann::json(sealed_secret_for_store).dump(), sealing_path);
137 LOG_INFO_FMT(
"Sealing complete of ledger secret to {}", sealing_path);
142 const files::fs::path& ledger_secret_path)
147 files::exists(ledger_secret_path),
148 "Sealed previous ledger secret cannot be found");
151 "Reading sealed previous service secret from {}", ledger_secret_path);
152 std::vector<uint8_t> sealed_secret_raw = files::slurp(ledger_secret_path);
154 std::string(sealed_secret_raw.begin(), sealed_secret_raw.end()));
156 nlohmann::json::parse(sealed_ledger_secret.
aad_text);
159 aad.
version == expected_version,
160 "Sealed ledger secret version {} does not match expected version {}",
166 auto sealing_key = ccf::pal::snp::make_derived_key(aad.
tcb_version);
167 std::vector<uint8_t> buf_aad(
168 sealed_ledger_secret.
aad_text.begin(),
169 sealed_ledger_secret.
aad_text.end());
172 sealing_key->get_raw(), sealed_ledger_secret.
ciphertext, buf_aad);
174 LedgerSecret unsealed_ledger_secret = nlohmann::json::parse(
175 std::string(buf_plaintext.begin(), buf_plaintext.end()));
179 return std::make_shared<LedgerSecret>(std::move(unsealed_ledger_secret));
181 catch (
const std::logic_error& e)
184 "Failed to unseal previous ledger secret from {}: {}",
192 const std::string& sealed_secret_dir,
kv::Version max_version)
194 std::vector<std::pair<kv::Version, std::filesystem::path>>
files;
195 std::map<kv::Version, std::filesystem::path> files_map;
196 for (
auto f : files::fs::directory_iterator(sealed_secret_dir))
198 auto filename = f.path().filename();
199 std::optional<kv::Version> ledger_version =
201 if (ledger_version.has_value() && ledger_version.value() <= max_version)
203 files_map[ledger_version.value()] = f.path();
207 for (
auto& [version, sealed_path] : std::ranges::reverse_view(files_map))
210 if (unsealed.has_value())
213 "Successfully unsealed ledger secret from {}", sealed_path.string());
214 return unsealed.value();
219 throw std::logic_error(fmt::format(
220 "Failed to unseal any ledger secret from {}", sealed_secret_dir));
#define CCF_ASSERT_FMT(expr,...)
Definition ccf_assert.h:10
#define CCF_ASSERT(expr, msg)
Definition ccf_assert.h:14
#define DECLARE_JSON_REQUIRED_FIELDS(TYPE,...)
Definition json.h:714
#define DECLARE_JSON_TYPE(TYPE)
Definition json.h:663
#define DECLARE_JSON_TYPE_WITH_OPTIONAL_FIELDS(TYPE)
Definition json.h:690
#define DECLARE_JSON_OPTIONAL_FIELDS(TYPE,...)
Definition json.h:786
#define LOG_INFO_FMT
Definition logger.h:362
#define LOG_FAIL_FMT
Definition logger.h:363
void check_supported_aes_key_size(size_t num_bits)
Definition symmetric_key.h:100
std::unique_ptr< KeyAesGcm > make_key_aes_gcm(std::span< const uint8_t > rawKey)
Free function implementation.
Definition symmetric_key.cpp:102
uint64_t Version
Definition version.h:8
Definition app_interface.h:14
std::optional< LedgerSecretPtr > unseal_ledger_secret_from_disk(ccf::kv::Version expected_version, const files::fs::path &ledger_secret_path)
Definition local_sealing.h:140
LedgerSecretPtr find_and_unseal_ledger_secret_from_disk(const std::string &sealed_secret_dir, kv::Version max_version)
Definition local_sealing.h:191
std::string get_sealing_filename(const kv::Version &version)
Definition local_sealing.h:26
std::vector< uint8_t > aes_gcm_unsealing(std::span< const uint8_t > raw_key, const std::vector< uint8_t > &sealed_text, const std::span< uint8_t > &aad)
Definition local_sealing.h:67
std::shared_ptr< LedgerSecret > LedgerSecretPtr
Definition ledger_secret.h:75
crypto::GcmCipher aes_gcm_sealing(std::span< const uint8_t > raw_key, std::span< const uint8_t > plaintext, const std::span< uint8_t > &aad)
Definition local_sealing.h:52
void seal_ledger_secret_to_disk(const std::string &sealed_secret_dir, const ccf::pal::snp::TcbVersionRaw &tcb_version, const kv::Version &version, const LedgerSecretPtr &ledger_secret)
Definition local_sealing.h:107
std::optional< kv::Version > version_of_filename(const std::string &path)
Definition local_sealing.h:31
Definition ledger_secret.h:19
Definition local_sealing.h:89
ccf::pal::snp::TcbVersionRaw tcb_version
Definition local_sealing.h:91
ccf::kv::Version version
Definition local_sealing.h:90
Definition local_sealing.h:99
std::vector< uint8_t > ciphertext
Definition local_sealing.h:100
std::string aad_text
Definition local_sealing.h:101
Definition symmetric_key.h:57
void deserialise(const std::vector< uint8_t > &serial)
Definition symmetric_key.cpp:93
std::vector< uint8_t > serialise()
Definition symmetric_key.cpp:78
StandardGcmHeader hdr
Definition symmetric_key.h:58
std::vector< uint8_t > cipher
Definition symmetric_key.h:59
Definition attestation_sev_snp.h:199