35 std::optional<LedgerSecretsMap::iterator> last_used_secret_it =
41 if (ledger_secrets.empty())
47 if (!historical_hint && last_used_secret_it.has_value())
53 auto& last_used_secret_it_ = last_used_secret_it.value();
55 std::next(last_used_secret_it_) != ledger_secrets.end() &&
56 version >= std::next(last_used_secret_it_)->first)
59 ++last_used_secret_it_;
62 return last_used_secret_it_->second;
71 auto search = std::upper_bound(
72 ledger_secrets.begin(),
75 [](
auto a,
const auto& b) { return b.first > a; });
77 if (search == ledger_secrets.begin())
79 LOG_FAIL_FMT(
"Could not find ledger secret for seqno {}", version);
88 last_used_secret_it = std::prev(search);
91 return std::prev(search)->second;
103 auto secrets = tx.
ro<
Secrets>(Tables::ENCRYPTED_LEDGER_SECRETS);
112 std::lock_guard<ccf::pal::Mutex> guard(lock);
115 initial_latest_ledger_secret_version = initial_version;
120 std::lock_guard<ccf::pal::Mutex> guard(lock);
123 ledger_secrets.empty(),
"Should only init an empty LedgerSecrets");
125 ledger_secrets = std::move(ledger_secrets_);
126 initial_latest_ledger_secret_version = ledger_secrets.rbegin()->first;
136 std::lock_guard<ccf::pal::Mutex> guard(lock);
138 if (ledger_secrets.empty())
140 throw std::logic_error(
141 "There should be at least one ledger secret to adjust");
144 ledger_secrets.rbegin()->second->previous_secret_stored_version = version;
149 std::lock_guard<ccf::pal::Mutex> guard(lock);
151 return ledger_secrets.empty();
158 std::lock_guard<ccf::pal::Mutex> guard(lock);
160 if (ledger_secrets.empty())
162 throw std::logic_error(
163 "Could not retrieve first ledger secret: no secret set");
166 return *ledger_secrets.begin();
171 std::lock_guard<ccf::pal::Mutex> guard(lock);
173 take_dependency_on_secrets(tx);
175 if (ledger_secrets.empty())
177 throw std::logic_error(
178 "Could not retrieve latest ledger secret: no secret set");
181 return *ledger_secrets.rbegin();
184 std::pair<VersionedLedgerSecret, std::optional<VersionedLedgerSecret>>
187 std::lock_guard<ccf::pal::Mutex> guard(lock);
189 take_dependency_on_secrets(tx);
191 if (ledger_secrets.empty())
193 throw std::logic_error(
194 "Could not retrieve latest ledger secret: no secret set");
197 const auto& latest_ledger_secret = ledger_secrets.rbegin();
198 if (ledger_secrets.size() < 2)
200 return std::make_pair(*latest_ledger_secret, std::nullopt);
202 return std::make_pair(
203 *latest_ledger_secret, *std::next(latest_ledger_secret));
208 std::optional<ccf::kv::Version> up_to = std::nullopt)
210 std::lock_guard<ccf::pal::Mutex> guard(lock);
212 take_dependency_on_secrets(tx);
214 if (!up_to.has_value())
216 return ledger_secrets;
219 auto search = ledger_secrets.find(up_to.value());
220 if (search == ledger_secrets.end())
222 throw std::logic_error(
223 fmt::format(
"No ledger secrets at {}", up_to.has_value()));
231 std::lock_guard<ccf::pal::Mutex> guard(lock);
234 !ledger_secrets.empty() && !restored_ledger_secrets.empty() &&
235 restored_ledger_secrets.rbegin()->first >=
236 ledger_secrets.begin()->first)
238 throw std::logic_error(fmt::format(
239 "Last restored version {} is greater than first existing version "
241 restored_ledger_secrets.rbegin()->first,
242 ledger_secrets.begin()->first));
245 ledger_secrets.merge(restored_ledger_secrets);
251 std::lock_guard<ccf::pal::Mutex> guard(lock);
252 auto ls = get_secret_for_version(version, historical_hint);
263 std::lock_guard<ccf::pal::Mutex> guard(lock);
264 return get_secret_for_version(version, historical_hint);
269 std::lock_guard<ccf::pal::Mutex> guard(lock);
272 ledger_secrets.find(version) == ledger_secrets.end(),
273 "Ledger secret at seqno {} already exists",
276 ledger_secrets.emplace(version, std::move(secret));
278 LOG_INFO_FMT(
"Added new ledger secret at seqno {}", version);
283 std::lock_guard<ccf::pal::Mutex> guard(lock);
284 if (ledger_secrets.empty())
289 if (version < ledger_secrets.begin()->first)
292 "Cannot rollback ledger secrets at {}: first secret is at {}",
294 ledger_secrets.begin()->first);
298 while (ledger_secrets.size() > 1)
300 auto k = ledger_secrets.rbegin();
302 k->first <= version ||
303 k->first <= initial_latest_ledger_secret_version)
308 LOG_TRACE_FMT(
"Rollback ledger secrets at seqno {}", k->first);
309 ledger_secrets.erase(k->first);
314 last_used_secret_it = std::nullopt;
#define CCF_ASSERT_FMT(expr,...)
Definition ccf_assert.h:10
Definition ledger_secrets.h:23
void init_from_map(LedgerSecretsMap &&ledger_secrets_)
Definition ledger_secrets.h:118
void set_secret(ccf::kv::Version version, LedgerSecretPtr &&secret)
Definition ledger_secrets.h:267
void rollback(ccf::kv::Version version)
Definition ledger_secrets.h:281
std::shared_ptr< ccf::crypto::KeyAesGcm > get_encryption_key_for(ccf::kv::Version version, bool historical_hint=false)
Definition ledger_secrets.h:248
std::pair< VersionedLedgerSecret, std::optional< VersionedLedgerSecret > > get_latest_and_penultimate(ccf::kv::ReadOnlyTx &tx)
Definition ledger_secrets.h:185
void adjust_previous_secret_stored_version(ccf::kv::Version version)
Definition ledger_secrets.h:129
bool is_empty()
Definition ledger_secrets.h:147
void init(ccf::kv::Version initial_version=1)
Definition ledger_secrets.h:110
VersionedLedgerSecret get_first()
Definition ledger_secrets.h:154
void restore_historical(LedgerSecretsMap &&restored_ledger_secrets)
Definition ledger_secrets.h:229
VersionedLedgerSecret get_latest(ccf::kv::ReadOnlyTx &tx)
Definition ledger_secrets.h:169
LedgerSecretsMap get(ccf::kv::ReadOnlyTx &tx, std::optional< ccf::kv::Version > up_to=std::nullopt)
Definition ledger_secrets.h:206
LedgerSecretPtr get_secret_for(ccf::kv::Version version, bool historical_hint=false)
Definition ledger_secrets.h:260
M::ReadOnlyHandle * ro(M &m)
Definition tx.h:170
#define LOG_INFO_FMT
Definition logger.h:395
#define LOG_TRACE_FMT
Definition logger.h:378
#define LOG_DEBUG_FMT
Definition logger.h:380
#define LOG_FAIL_FMT
Definition logger.h:396
uint64_t Version
Definition version.h:8
std::mutex Mutex
Definition locking.h:17
Definition app_interface.h:15
std::map< ccf::kv::Version, LedgerSecretPtr > LedgerSecretsMap
Definition ledger_secrets.h:19
LedgerSecretPtr make_ledger_secret()
Definition ledger_secret.h:77
LedgerSecretsMap::value_type VersionedLedgerSecret
Definition ledger_secrets.h:20
ServiceValue< LedgerSecretsForNodes > Secrets
Definition secrets.h:36
std::shared_ptr< LedgerSecret > LedgerSecretPtr
Definition ledger_secret.h:75