37 std::optional<LedgerSecretsMap::iterator> last_used_secret_it =
43 if (ledger_secrets.empty())
49 if (!historical_hint && last_used_secret_it.has_value())
55 auto& last_used_secret_it_ = last_used_secret_it.value();
57 std::next(last_used_secret_it_) != ledger_secrets.end() &&
58 version >= std::next(last_used_secret_it_)->first)
61 ++last_used_secret_it_;
64 return last_used_secret_it_->second;
73 auto search = std::upper_bound(
74 ledger_secrets.begin(),
77 [](
auto a,
const auto& b) { return b.first > a; });
79 if (search == ledger_secrets.begin())
81 LOG_FAIL_FMT(
"Could not find ledger secret for seqno {}", version);
90 last_used_secret_it = std::prev(search);
93 return std::prev(search)->second;
105 auto* secrets = tx.
ro<
Secrets>(Tables::ENCRYPTED_LEDGER_SECRETS);
114 std::lock_guard<ccf::pal::Mutex> guard(lock);
117 initial_latest_ledger_secret_version = initial_version;
122 std::lock_guard<ccf::pal::Mutex> guard(lock);
125 ledger_secrets.empty(),
"Should only init an empty LedgerSecrets");
127 ledger_secrets = std::move(ledger_secrets_);
128 initial_latest_ledger_secret_version = ledger_secrets.rbegin()->first;
138 std::lock_guard<ccf::pal::Mutex> guard(lock);
140 if (ledger_secrets.empty())
142 throw std::logic_error(
143 "There should be at least one ledger secret to adjust");
146 ledger_secrets.rbegin()->second->previous_secret_stored_version = version;
151 std::lock_guard<ccf::pal::Mutex> guard(lock);
153 return ledger_secrets.empty();
160 std::lock_guard<ccf::pal::Mutex> guard(lock);
162 if (ledger_secrets.empty())
164 throw std::logic_error(
165 "Could not retrieve first ledger secret: no secret set");
168 return *ledger_secrets.begin();
173 std::lock_guard<ccf::pal::Mutex> guard(lock);
175 take_dependency_on_secrets(tx);
177 if (ledger_secrets.empty())
179 throw std::logic_error(
180 "Could not retrieve latest ledger secret: no secret set");
183 return *ledger_secrets.rbegin();
186 std::pair<VersionedLedgerSecret, std::optional<VersionedLedgerSecret>>
189 std::lock_guard<ccf::pal::Mutex> guard(lock);
191 take_dependency_on_secrets(tx);
193 if (ledger_secrets.empty())
195 throw std::logic_error(
196 "Could not retrieve latest ledger secret: no secret set");
199 const auto& latest_ledger_secret = ledger_secrets.rbegin();
200 if (ledger_secrets.size() < 2)
202 return std::make_pair(*latest_ledger_secret, std::nullopt);
204 return std::make_pair(
205 *latest_ledger_secret, *std::next(latest_ledger_secret));
210 std::optional<ccf::kv::Version> up_to = std::nullopt)
212 std::lock_guard<ccf::pal::Mutex> guard(lock);
214 take_dependency_on_secrets(tx);
216 if (!up_to.has_value())
218 return ledger_secrets;
221 auto search = ledger_secrets.find(up_to.value());
222 if (search == ledger_secrets.end())
224 throw std::logic_error(
225 fmt::format(
"No ledger secrets at {}", up_to.has_value()));
228 return {ledger_secrets.begin(), ++search};
233 std::lock_guard<ccf::pal::Mutex> guard(lock);
236 !ledger_secrets.empty() && !restored_ledger_secrets.empty() &&
237 restored_ledger_secrets.rbegin()->first >=
238 ledger_secrets.begin()->first)
240 throw std::logic_error(fmt::format(
241 "Last restored version {} is greater than first existing version "
243 restored_ledger_secrets.rbegin()->first,
244 ledger_secrets.begin()->first));
247 ledger_secrets.merge(restored_ledger_secrets);
253 std::lock_guard<ccf::pal::Mutex> guard(lock);
254 auto ls = get_secret_for_version(version, historical_hint);
265 std::lock_guard<ccf::pal::Mutex> guard(lock);
266 return get_secret_for_version(version, historical_hint);
271 std::lock_guard<ccf::pal::Mutex> guard(lock);
274 ledger_secrets.find(version) == ledger_secrets.end(),
275 "Ledger secret at seqno {} already exists",
278 ledger_secrets.emplace(version, std::move(secret));
280 LOG_INFO_FMT(
"Added new ledger secret at seqno {}", version);
285 std::lock_guard<ccf::pal::Mutex> guard(lock);
286 if (ledger_secrets.empty())
291 if (version < ledger_secrets.begin()->first)
294 "Cannot rollback ledger secrets at {}: first secret is at {}",
296 ledger_secrets.begin()->first);
300 while (ledger_secrets.size() > 1)
302 auto k = ledger_secrets.rbegin();
304 k->first <= version ||
305 k->first <= initial_latest_ledger_secret_version)
310 LOG_TRACE_FMT(
"Rollback ledger secrets at seqno {}", k->first);
311 ledger_secrets.erase(k->first);
316 last_used_secret_it = std::nullopt;
#define CCF_ASSERT_FMT(expr,...)
Definition ccf_assert.h:10
Definition ledger_secrets.h:25
void init_from_map(LedgerSecretsMap &&ledger_secrets_)
Definition ledger_secrets.h:120
void set_secret(ccf::kv::Version version, LedgerSecretPtr &&secret)
Definition ledger_secrets.h:269
void rollback(ccf::kv::Version version)
Definition ledger_secrets.h:283
std::shared_ptr< ccf::crypto::KeyAesGcm > get_encryption_key_for(ccf::kv::Version version, bool historical_hint=false)
Definition ledger_secrets.h:250
std::pair< VersionedLedgerSecret, std::optional< VersionedLedgerSecret > > get_latest_and_penultimate(ccf::kv::ReadOnlyTx &tx)
Definition ledger_secrets.h:187
void adjust_previous_secret_stored_version(ccf::kv::Version version)
Definition ledger_secrets.h:131
bool is_empty()
Definition ledger_secrets.h:149
void init(ccf::kv::Version initial_version=1)
Definition ledger_secrets.h:112
VersionedLedgerSecret get_first()
Definition ledger_secrets.h:156
void restore_historical(LedgerSecretsMap &&restored_ledger_secrets)
Definition ledger_secrets.h:231
VersionedLedgerSecret get_latest(ccf::kv::ReadOnlyTx &tx)
Definition ledger_secrets.h:171
LedgerSecretsMap get(ccf::kv::ReadOnlyTx &tx, std::optional< ccf::kv::Version > up_to=std::nullopt)
Definition ledger_secrets.h:208
LedgerSecretPtr get_secret_for(ccf::kv::Version version, bool historical_hint=false)
Definition ledger_secrets.h:262
M::ReadOnlyHandle * ro(M &m)
Definition tx.h:168
#define LOG_INFO_FMT
Definition internal_logger.h:15
#define LOG_TRACE_FMT
Definition internal_logger.h:13
#define LOG_DEBUG_FMT
Definition internal_logger.h:14
#define LOG_FAIL_FMT
Definition internal_logger.h:16
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:21
LedgerSecretPtr make_ledger_secret()
Definition ledger_secret.h:81
LedgerSecretsMap::value_type VersionedLedgerSecret
Definition ledger_secrets.h:22
std::shared_ptr< LedgerSecret > LedgerSecretPtr
Definition ledger_secret.h:79