36 std::optional<LedgerSecretsMap::iterator> last_used_secret_it =
42 if (ledger_secrets.empty())
48 if (!historical_hint && last_used_secret_it.has_value())
54 auto& last_used_secret_it_ = last_used_secret_it.value();
56 std::next(last_used_secret_it_) != ledger_secrets.end() &&
57 version >= std::next(last_used_secret_it_)->first)
60 ++last_used_secret_it_;
63 return last_used_secret_it_->second;
72 auto search = std::upper_bound(
73 ledger_secrets.begin(),
76 [](
auto a,
const auto& b) { return b.first > a; });
78 if (search == ledger_secrets.begin())
80 LOG_FAIL_FMT(
"Could not find ledger secret for seqno {}", version);
89 last_used_secret_it = std::prev(search);
92 return std::prev(search)->second;
104 auto secrets = tx.
ro<
Secrets>(Tables::ENCRYPTED_LEDGER_SECRETS);
113 std::lock_guard<ccf::pal::Mutex> guard(lock);
116 initial_latest_ledger_secret_version = initial_version;
121 std::lock_guard<ccf::pal::Mutex> guard(lock);
124 ledger_secrets.empty(),
"Should only init an empty LedgerSecrets");
126 ledger_secrets = std::move(ledger_secrets_);
127 initial_latest_ledger_secret_version = ledger_secrets.rbegin()->first;
137 std::lock_guard<ccf::pal::Mutex> guard(lock);
139 if (ledger_secrets.empty())
141 throw std::logic_error(
142 "There should be at least one ledger secret to adjust");
145 ledger_secrets.rbegin()->second->previous_secret_stored_version = version;
150 std::lock_guard<ccf::pal::Mutex> guard(lock);
152 return ledger_secrets.empty();
159 std::lock_guard<ccf::pal::Mutex> guard(lock);
161 if (ledger_secrets.empty())
163 throw std::logic_error(
164 "Could not retrieve first ledger secret: no secret set");
167 return *ledger_secrets.begin();
172 std::lock_guard<ccf::pal::Mutex> guard(lock);
174 take_dependency_on_secrets(tx);
176 if (ledger_secrets.empty())
178 throw std::logic_error(
179 "Could not retrieve latest ledger secret: no secret set");
182 return *ledger_secrets.rbegin();
185 std::pair<VersionedLedgerSecret, std::optional<VersionedLedgerSecret>>
188 std::lock_guard<ccf::pal::Mutex> guard(lock);
190 take_dependency_on_secrets(tx);
192 if (ledger_secrets.empty())
194 throw std::logic_error(
195 "Could not retrieve latest ledger secret: no secret set");
198 const auto& latest_ledger_secret = ledger_secrets.rbegin();
199 if (ledger_secrets.size() < 2)
201 return std::make_pair(*latest_ledger_secret, std::nullopt);
203 return std::make_pair(
204 *latest_ledger_secret, *std::next(latest_ledger_secret));
209 std::optional<ccf::kv::Version> up_to = std::nullopt)
211 std::lock_guard<ccf::pal::Mutex> guard(lock);
213 take_dependency_on_secrets(tx);
215 if (!up_to.has_value())
217 return ledger_secrets;
220 auto search = ledger_secrets.find(up_to.value());
221 if (search == ledger_secrets.end())
223 throw std::logic_error(
224 fmt::format(
"No ledger secrets at {}", up_to.has_value()));
232 std::lock_guard<ccf::pal::Mutex> guard(lock);
235 !ledger_secrets.empty() && !restored_ledger_secrets.empty() &&
236 restored_ledger_secrets.rbegin()->first >=
237 ledger_secrets.begin()->first)
239 throw std::logic_error(fmt::format(
240 "Last restored version {} is greater than first existing version "
242 restored_ledger_secrets.rbegin()->first,
243 ledger_secrets.begin()->first));
246 ledger_secrets.merge(restored_ledger_secrets);
252 std::lock_guard<ccf::pal::Mutex> guard(lock);
253 auto ls = get_secret_for_version(version, historical_hint);
264 std::lock_guard<ccf::pal::Mutex> guard(lock);
265 return get_secret_for_version(version, historical_hint);
270 std::lock_guard<ccf::pal::Mutex> guard(lock);
273 ledger_secrets.find(version) == ledger_secrets.end(),
274 "Ledger secret at seqno {} already exists",
277 ledger_secrets.emplace(version, std::move(secret));
279 LOG_INFO_FMT(
"Added new ledger secret at seqno {}", version);
284 std::lock_guard<ccf::pal::Mutex> guard(lock);
285 if (ledger_secrets.empty())
290 if (version < ledger_secrets.begin()->first)
293 "Cannot rollback ledger secrets at {}: first secret is at {}",
295 ledger_secrets.begin()->first);
299 while (ledger_secrets.size() > 1)
301 auto k = ledger_secrets.rbegin();
303 k->first <= version ||
304 k->first <= initial_latest_ledger_secret_version)
309 LOG_TRACE_FMT(
"Rollback ledger secrets at seqno {}", k->first);
310 ledger_secrets.erase(k->first);
315 last_used_secret_it = std::nullopt;
#define CCF_ASSERT_FMT(expr,...)
Definition ccf_assert.h:10
Definition ledger_secrets.h:24
void init_from_map(LedgerSecretsMap &&ledger_secrets_)
Definition ledger_secrets.h:119
void set_secret(ccf::kv::Version version, LedgerSecretPtr &&secret)
Definition ledger_secrets.h:268
void rollback(ccf::kv::Version version)
Definition ledger_secrets.h:282
std::shared_ptr< ccf::crypto::KeyAesGcm > get_encryption_key_for(ccf::kv::Version version, bool historical_hint=false)
Definition ledger_secrets.h:249
std::pair< VersionedLedgerSecret, std::optional< VersionedLedgerSecret > > get_latest_and_penultimate(ccf::kv::ReadOnlyTx &tx)
Definition ledger_secrets.h:186
void adjust_previous_secret_stored_version(ccf::kv::Version version)
Definition ledger_secrets.h:130
bool is_empty()
Definition ledger_secrets.h:148
void init(ccf::kv::Version initial_version=1)
Definition ledger_secrets.h:111
VersionedLedgerSecret get_first()
Definition ledger_secrets.h:155
void restore_historical(LedgerSecretsMap &&restored_ledger_secrets)
Definition ledger_secrets.h:230
VersionedLedgerSecret get_latest(ccf::kv::ReadOnlyTx &tx)
Definition ledger_secrets.h:170
LedgerSecretsMap get(ccf::kv::ReadOnlyTx &tx, std::optional< ccf::kv::Version > up_to=std::nullopt)
Definition ledger_secrets.h:207
LedgerSecretPtr get_secret_for(ccf::kv::Version version, bool historical_hint=false)
Definition ledger_secrets.h:261
M::ReadOnlyHandle * ro(M &m)
Definition tx.h:169
#define LOG_INFO_FMT
Definition logger.h:362
#define LOG_TRACE_FMT
Definition logger.h:356
#define LOG_DEBUG_FMT
Definition logger.h:357
#define LOG_FAIL_FMT
Definition logger.h:363
uint64_t Version
Definition version.h:8
std::mutex Mutex
Definition locking.h:12
Definition app_interface.h:14
std::map< ccf::kv::Version, LedgerSecretPtr > LedgerSecretsMap
Definition ledger_secrets.h:20
LedgerSecretPtr make_ledger_secret()
Definition ledger_secret.h:77
LedgerSecretsMap::value_type VersionedLedgerSecret
Definition ledger_secrets.h:21
std::shared_ptr< LedgerSecret > LedgerSecretPtr
Definition ledger_secret.h:75