CCF
Loading...
Searching...
No Matches
share_manager.h
Go to the documentation of this file.
1// Copyright (c) Microsoft Corporation. All rights reserved.
2// Licensed under the Apache 2.0 License.
3#pragma once
4
7#include "ccf/crypto/sha256.h"
9#include "crypto/sharing.h"
10#include "ds/internal_logger.h"
11#include "kv/encryptor.h"
12#include "ledger_secrets.h"
13#include "local_sealing.h"
14#include "network_state.h"
15#include "node/ledger_secret.h"
17
18#include <openssl/crypto.h>
19#include <ranges>
20#include <vector>
21
22namespace ccf
23{
25 {
26 private:
27 static constexpr auto KZ_KEY_SIZE = ccf::crypto::GCM_DEFAULT_KEY_SIZE;
28 bool has_wrapped = false;
29 size_t num_shares;
30 size_t recovery_threshold;
32 std::vector<ccf::crypto::sharing::Share> shares;
33
34 public:
36 size_t num_shares_, size_t recovery_threshold_) :
37 num_shares(num_shares_),
38 recovery_threshold(recovery_threshold_)
39 {
40 shares.resize(num_shares);
42 secret, shares, recovery_threshold);
43 }
44
45 [[nodiscard]] size_t get_num_shares() const
46 {
47 return num_shares;
48 }
49
50 [[nodiscard]] size_t get_recovery_threshold() const
51 {
52 return recovery_threshold;
53 }
54
55 [[nodiscard]] std::vector<std::vector<uint8_t>> get_shares() const
56 {
57 std::vector<std::vector<uint8_t>> shares_;
58 for (const ccf::crypto::sharing::Share& share : shares)
59 {
60 std::vector<uint8_t> share_serialised(
62 share.serialise(share_serialised);
63 shares_.emplace_back(share_serialised);
64 }
65 return shares_;
66 }
67
68 void get_full_share_serialised(std::vector<uint8_t>& serialised) const
69 {
70 secret.serialise(serialised);
71 }
72
73 std::vector<uint8_t> wrap(const LedgerSecretPtr& ledger_secret)
74 {
75 if (has_wrapped)
76 {
77 throw std::logic_error(
78 "Ledger secret wrapping key has already wrapped once");
79 }
80
81 ccf::crypto::GcmCipher encrypted_ls(ledger_secret->raw_key.size());
82
83 std::vector<uint8_t> data = secret.key(KZ_KEY_SIZE);
84 try
85 {
86 ccf::crypto::make_key_aes_gcm(data)->encrypt(
87 encrypted_ls.hdr
88 .get_iv(), // iv is always 0 here as the share wrapping
89 // key is never re-used for encryption
90 ledger_secret->raw_key,
91 {},
92 encrypted_ls.cipher,
93 encrypted_ls.hdr.tag);
94 }
95 catch (...)
96 {
97 OPENSSL_cleanse(data.data(), data.size());
98 throw;
99 }
100
101 has_wrapped = true;
102
103 return encrypted_ls.serialise();
104 }
105 };
106
108 {
109 private:
110 static constexpr auto KZ_KEY_SIZE = ccf::crypto::GCM_DEFAULT_KEY_SIZE;
112
113 public:
115 std::vector<ccf::crypto::sharing::Share>&& shares_,
116 size_t recovery_threshold_)
117 {
119 secret, shares_, recovery_threshold_);
120 }
121
123 const ccf::crypto::sharing::Share& secret_) :
124 secret(secret_)
125 {}
126
128 const std::vector<uint8_t>& wrapped_latest_ledger_secret)
129 {
130 ccf::crypto::GcmCipher encrypted_ls;
131 encrypted_ls.deserialise(wrapped_latest_ledger_secret);
132 std::vector<uint8_t> decrypted_ls;
133
134 std::vector<uint8_t> data = secret.key(KZ_KEY_SIZE);
135 try
136 {
137 if (!ccf::crypto::make_key_aes_gcm(data)->decrypt(
138 encrypted_ls.hdr.get_iv(),
139 encrypted_ls.hdr.tag,
140 encrypted_ls.cipher,
141 {},
142 decrypted_ls))
143 {
144 throw std::logic_error("Unwrapping latest ledger secret failed");
145 }
146 }
147 catch (...)
148 {
149 OPENSSL_cleanse(data.data(), data.size());
150 throw;
151 }
152
153 return std::make_shared<LedgerSecret>(std::move(decrypted_ls));
154 }
155 };
156
157 // During recovery, a list of EncryptedLedgerSecretInfo is constructed
158 // from the local hook on the encrypted ledger secrets table.
159 using RecoveredEncryptedLedgerSecrets = std::list<EncryptedLedgerSecretInfo>;
160
161 // The ShareManager class provides the interface between the ledger secrets
162 // object and the shares, ledger secrets and submitted shares KV tables. In
163 // particular, it is used to:
164 // - Issue new recovery shares whenever required (e.g. on startup, rekey and
165 // membership updates)
166 // - Re-assemble the ledger secrets on recovery, once a threshold of members
167 // have successfully submitted their shares
169 {
170 private:
171 std::shared_ptr<LedgerSecrets> ledger_secrets;
172
173 EncryptedSharesMap compute_encrypted_shares(
174 ccf::kv::Tx& tx, const SharedLedgerSecretWrappingKey& ls_wrapping_key)
175 {
176 EncryptedSharesMap encrypted_shares;
177 auto shares = ls_wrapping_key.get_shares();
178
179 auto active_recovery_participants_info =
181
182 size_t share_index = 0;
183 for (auto const& [member_id, enc_pub_key] :
184 active_recovery_participants_info)
185 {
186 auto member_enc_pubk = ccf::crypto::make_rsa_public_key(enc_pub_key);
187 auto raw_share = std::vector<uint8_t>(
188 shares[share_index].begin(), shares[share_index].end());
189 encrypted_shares[member_id] = member_enc_pubk->rsa_oaep_wrap(raw_share);
190 OPENSSL_cleanse(raw_share.data(), raw_share.size());
191 OPENSSL_cleanse(shares[share_index].data(), shares[share_index].size());
192 share_index++;
193 }
194
195 auto active_recovery_owners_info =
197 if (!active_recovery_owners_info.empty())
198 {
199 std::vector<uint8_t> full_share_serialised(
201 ls_wrapping_key.get_full_share_serialised(full_share_serialised);
202
203 for (auto const& [member_id, enc_pub_key] : active_recovery_owners_info)
204 {
205 auto member_enc_pubk = ccf::crypto::make_rsa_public_key(enc_pub_key);
206 encrypted_shares[member_id] =
207 member_enc_pubk->rsa_oaep_wrap(full_share_serialised);
208 }
209
210 OPENSSL_cleanse(
211 full_share_serialised.data(), full_share_serialised.size());
212 }
213
214 return encrypted_shares;
215 }
216
217 void shuffle_recovery_shares(
218 ccf::kv::Tx& tx, const LedgerSecretPtr& latest_ledger_secret)
219 {
220 auto active_recovery_participants_info =
222 auto active_recovery_owners_info =
224 size_t recovery_threshold =
226
227 if (
228 active_recovery_participants_info.empty() &&
229 active_recovery_owners_info.empty())
230 {
231 throw std::logic_error(
232 "There should be at least one active recovery member to issue "
233 "recovery shares");
234 }
235
236 if (recovery_threshold == 0)
237 {
238 throw std::logic_error(
239 "Recovery threshold should be set before recovery "
240 "shares are computed");
241 }
242
243 size_t num_shares = 0;
244 if (!active_recovery_participants_info.empty())
245 {
246 if (recovery_threshold > active_recovery_participants_info.size())
247 {
248 throw std::logic_error(fmt::format(
249 "Recovery threshold {} should be equal to or less than the number "
250 "of active recovery members {}",
251 recovery_threshold,
252 active_recovery_participants_info.size()));
253 }
254
255 num_shares = active_recovery_participants_info.size();
256 }
257 else
258 {
259 if (recovery_threshold > 1)
260 {
261 throw std::logic_error(fmt::format(
262 "Recovery threshold {} cannot be greater than 1 when the "
263 "consortium consists of only active recovery owner members ({})",
264 recovery_threshold,
265 active_recovery_owners_info.size()));
266 }
267
268 num_shares = 1;
269 }
270
271 auto ls_wrapping_key =
272 SharedLedgerSecretWrappingKey(num_shares, recovery_threshold);
273
274 auto wrapped_latest_ls = ls_wrapping_key.wrap(latest_ledger_secret);
275 auto* recovery_shares = tx.rw<ccf::RecoveryShares>(Tables::SHARES);
276 recovery_shares->put(
277 {wrapped_latest_ls,
278 compute_encrypted_shares(tx, ls_wrapping_key),
279 latest_ledger_secret->previous_secret_stored_version});
280 }
281
282 void set_recovery_shares_info(
283 ccf::kv::Tx& tx,
284 const LedgerSecretPtr& latest_ledger_secret,
285 const std::optional<VersionedLedgerSecret>& previous_ledger_secret =
286 std::nullopt,
287 std::optional<ccf::kv::Version> latest_ls_version = std::nullopt)
288 {
289 // First, generate a fresh ledger secrets wrapping key and wrap the
290 // latest ledger secret with it. Split the ledger secret wrapping key,
291 // allocating a new share for each active recovery member. Finally,
292 // encrypt each share with the public key of each member and record it in
293 // the shares table.
294 shuffle_recovery_shares(tx, latest_ledger_secret);
295
296 // Similarly issue full recovery shares for another fresh ledger secrets
297 // wrapping key to each trusted replica with a sealing recovery key.
298 sealing::shuffle_sealed_shares(tx, latest_ledger_secret);
299
300 // Then, encrypt the penultimate ledger secret with the latest ledger
301 // secret
302 auto* encrypted_ls = tx.rw<ccf::EncryptedLedgerSecretsInfo>(
303 Tables::ENCRYPTED_PAST_LEDGER_SECRET);
304
305 std::vector<uint8_t> encrypted_previous_secret = {};
306 ccf::kv::Version version_previous_secret = ccf::kv::NoVersion;
307 if (previous_ledger_secret.has_value())
308 {
309 version_previous_secret = previous_ledger_secret->first;
310
311 ccf::crypto::GcmCipher encrypted_previous_ls(
312 previous_ledger_secret->second->raw_key.size());
313 encrypted_previous_ls.hdr.set_random_iv();
314
315 latest_ledger_secret->key->encrypt(
316 encrypted_previous_ls.hdr.get_iv(),
317 previous_ledger_secret->second->raw_key,
318 {},
319 encrypted_previous_ls.cipher,
320 encrypted_previous_ls.hdr.tag);
321
322 encrypted_previous_secret = encrypted_previous_ls.serialise();
323 encrypted_ls->put(
325 std::move(encrypted_previous_secret),
326 version_previous_secret,
327 encrypted_ls->get_version_of_previous_write()),
328 latest_ls_version});
329 }
330 else
331 {
332 encrypted_ls->put({std::nullopt, latest_ls_version});
333 }
334 }
335
336 std::vector<uint8_t> encrypt_submitted_share(
337 const std::vector<uint8_t>& submitted_share,
338 const LedgerSecretPtr& current_ledger_secret)
339 {
340 // Submitted recovery shares are encrypted with the latest ledger secret.
341 ccf::crypto::GcmCipher encrypted_submitted_share(submitted_share.size());
342
343 encrypted_submitted_share.hdr.set_random_iv();
344
345 current_ledger_secret->key->encrypt(
346 encrypted_submitted_share.hdr.get_iv(),
347 submitted_share,
348 {},
349 encrypted_submitted_share.cipher,
350 encrypted_submitted_share.hdr.tag);
351
352 return encrypted_submitted_share.serialise();
353 }
354
355 std::vector<uint8_t> decrypt_submitted_share(
356 const std::vector<uint8_t>& encrypted_submitted_share,
357 LedgerSecretPtr&& current_ledger_secret)
358 {
359 ccf::crypto::GcmCipher encrypted_share;
360 encrypted_share.deserialise(encrypted_submitted_share);
361 std::vector<uint8_t> decrypted_share;
362
363 if (!current_ledger_secret->key->decrypt(
364 encrypted_share.hdr.get_iv(),
365 encrypted_share.hdr.tag,
366 encrypted_share.cipher,
367 {},
368 decrypted_share))
369 {
370 throw std::logic_error("Decrypting submitted shares failed");
371 }
372
373 return decrypted_share;
374 }
375
377 combine_from_encrypted_submitted_shares(ccf::kv::Tx& tx)
378 {
379 auto* encrypted_submitted_shares = tx.rw<ccf::EncryptedSubmittedShares>(
380 Tables::ENCRYPTED_SUBMITTED_SHARES);
381 auto* config = tx.rw<ccf::Configuration>(Tables::CONFIGURATION);
382
383 std::optional<ccf::crypto::sharing::Share> full_share;
384 std::vector<ccf::crypto::sharing::Share> new_shares = {};
385 encrypted_submitted_shares->foreach(
386 [&new_shares, &full_share, &tx, this](
387 const MemberId, const EncryptedSubmittedShare& encrypted_share) {
388 auto decrypted_share = decrypt_submitted_share(
389 encrypted_share, ledger_secrets->get_latest(tx).second);
390 switch (decrypted_share.size())
391 {
393 {
394 // For a new share, we can check the index and decide if it's
395 // a full share or just a partial share (compare to zero).
396 // If it is a full share, we can short-circuit and return a
397 // ReconstructedLedgerSecretWrappingKey directly, otherwise we
398 // follow the existing flow.
399 auto share = ccf::crypto::sharing::Share(decrypted_share);
400 if (share.x == 0)
401 {
402 full_share = share;
403 }
404 else
405 {
406 new_shares.emplace_back(decrypted_share);
407 }
408 break;
409 }
410 default:
411 {
412 OPENSSL_cleanse(decrypted_share.data(), decrypted_share.size());
413 throw std::logic_error(fmt::format(
414 "Error combining recovery shares: decrypted share of {} bytes "
415 "is not an {}-byte long new-style share.",
416 decrypted_share.size(),
418 }
419 }
420 OPENSSL_cleanse(decrypted_share.data(), decrypted_share.size());
421 return !full_share.has_value();
422 });
423
424 if (full_share.has_value())
425 {
426 return {full_share.value()};
427 }
428
429 auto num_shares = new_shares.size();
430
431 auto config_val = config->get();
432 if (!config_val.has_value())
433 {
434 throw std::logic_error("Configuration is not set");
435 }
436 auto recovery_threshold = config_val->recovery_threshold;
437 if (recovery_threshold > num_shares)
438 {
439 throw std::logic_error(fmt::format(
440 "Error combining recovery shares: only {} recovery shares were "
441 "submitted but recovery threshold is {}",
442 num_shares,
443 recovery_threshold));
444 }
445
446 return {std::move(new_shares), recovery_threshold};
447 }
448
449 public:
450 ShareManager(const std::shared_ptr<LedgerSecrets>& ledger_secrets_) :
451 ledger_secrets(ledger_secrets_)
452 {}
453
461 {
462 auto [latest, penultimate] =
463 ledger_secrets->get_latest_and_penultimate(tx);
464
465 set_recovery_shares_info(tx, latest.second, penultimate, latest.first);
466 }
467
480 ccf::kv::Tx& tx, LedgerSecretPtr new_ledger_secret)
481 {
482 set_recovery_shares_info(
483 tx, new_ledger_secret, ledger_secrets->get_latest(tx));
484 }
485
493 {
494 shuffle_recovery_shares(tx, ledger_secrets->get_latest(tx).second);
495 }
496
497 static std::optional<EncryptedShare> get_encrypted_share(
498 ccf::kv::ReadOnlyTx& tx, const MemberId& member_id)
499 {
500 auto recovery_shares_info =
501 tx.ro<ccf::RecoveryShares>(Tables::SHARES)->get();
502 if (!recovery_shares_info.has_value())
503 {
504 throw std::logic_error(
505 "Failed to retrieve current recovery shares info");
506 }
507
508 auto search = recovery_shares_info->encrypted_shares.find(member_id);
509 if (search == recovery_shares_info->encrypted_shares.end())
510 {
511 return std::nullopt;
512 }
513
514 return search->second;
515 }
516
518 ccf::kv::Tx& tx,
519 const RecoveredEncryptedLedgerSecrets& recovery_ledger_secrets)
520 {
521 // First, re-assemble the ledger secret wrapping key from the submitted
522 // encrypted shares. Then, unwrap the latest ledger secret and use it to
523 // decrypt the sequence of recovered ledger secrets, from the last one.
524
525 auto recovery_shares_info =
526 tx.ro<ccf::RecoveryShares>(Tables::SHARES)->get();
527 if (!recovery_shares_info.has_value())
528 {
529 throw std::logic_error(
530 "Failed to retrieve current recovery shares info");
531 }
532
533 LedgerSecretPtr restored_ls =
534 combine_from_encrypted_submitted_shares(tx).unwrap(
535 recovery_shares_info->wrapped_latest_ledger_secret);
537 tx, recovery_ledger_secrets, restored_ls);
538 }
539
541 ccf::kv::Tx& tx,
542 const RecoveredEncryptedLedgerSecrets& recovery_ledger_secrets,
543 const LedgerSecretPtr& restored_ls)
544 {
545 if (recovery_ledger_secrets.empty())
546 {
547 throw std::logic_error("No recovery ledger secrets");
548 }
549
551 "Recovering {} encrypted ledger secrets",
552 recovery_ledger_secrets.size());
553
554 const auto& current_ledger_secret_version =
555 recovery_ledger_secrets.back().next_version;
556 if (!current_ledger_secret_version.has_value())
557 {
558 // This should always be set by the recovery hook, which sets this to
559 // the version at which it is called if unset in the store
560 throw std::logic_error("Current ledger secret version should be set");
561 }
562
563 auto* encrypted_previous_ledger_secret =
565 Tables::ENCRYPTED_PAST_LEDGER_SECRET);
566
567 LedgerSecretsMap restored_ledger_secrets = {};
568 auto s = restored_ledger_secrets.emplace(
569 current_ledger_secret_version.value(),
570 std::make_shared<LedgerSecret>(
571 std::move(restored_ls->raw_key),
572 encrypted_previous_ledger_secret->get_version_of_previous_write()));
573 auto latest_ls = s.first->second;
574
575 for (const auto& recovery_ledger_secret :
576 std::ranges::reverse_view(recovery_ledger_secrets))
577 {
578 if (!recovery_ledger_secret.previous_ledger_secret.has_value())
579 {
580 // Very first entry does not encrypt any other ledger secret
581 break;
582 }
583
584 const auto& prev_secret =
585 recovery_ledger_secret.previous_ledger_secret.value();
586
588 "Recovering encrypted ledger secret valid at seqno {}",
589 prev_secret.version);
590
591 if (
592 restored_ledger_secrets.find(prev_secret.version) !=
593 restored_ledger_secrets.end())
594 {
595 // Already decrypted this ledger secret
597 "Skipping, already decrypted ledger secret with version {}",
598 prev_secret.version);
599 continue;
600 }
601
602 auto decrypted_ls_raw = decrypt_previous_ledger_secret_raw(
603 latest_ls, prev_secret.encrypted_data);
604
605 auto secret = restored_ledger_secrets.emplace(
606 prev_secret.version,
607 std::make_shared<LedgerSecret>(
608 std::move(decrypted_ls_raw),
609 prev_secret.previous_secret_stored_version));
610 latest_ls = secret.first->second;
611 }
612
613 return restored_ledger_secrets;
614 }
615
616 static bool is_full_key(
617 const std::vector<uint8_t>& submitted_recovery_share)
618 {
619 if (
620 submitted_recovery_share.size() ==
622 {
623 auto share = ccf::crypto::sharing::Share(submitted_recovery_share);
624 if (share.x == 0)
625 {
626 // Index value of 0 indicates a full key.
627 return true;
628 }
629 }
630
631 return false;
632 }
633
635 ccf::kv::Tx& tx,
636 MemberId member_id,
637 const std::vector<uint8_t>& submitted_recovery_share)
638 {
639 auto* service = tx.rw<ccf::Service>(Tables::SERVICE);
640 auto* encrypted_submitted_shares = tx.rw<ccf::EncryptedSubmittedShares>(
641 Tables::ENCRYPTED_SUBMITTED_SHARES);
642 auto active_service = service->get();
643 if (!active_service.has_value())
644 {
645 throw std::logic_error("Failed to get active service");
646 }
647
648 encrypted_submitted_shares->put(
649 member_id,
650 encrypt_submitted_share(
651 submitted_recovery_share, ledger_secrets->get_latest(tx).second));
652
653 return encrypted_submitted_shares->size();
654 }
655
657 {
658 auto* encrypted_submitted_shares = tx.rw<ccf::EncryptedSubmittedShares>(
659 Tables::ENCRYPTED_SUBMITTED_SHARES);
660 encrypted_submitted_shares->clear();
661 }
662 };
663}
static std::map< MemberId, ccf::crypto::Pem > get_active_recovery_participants(ccf::kv::ReadOnlyTx &tx)
Definition internal_tables_access.h:124
static std::map< MemberId, ccf::crypto::Pem > get_active_recovery_owners(ccf::kv::ReadOnlyTx &tx)
Definition internal_tables_access.h:155
static size_t get_recovery_threshold(ccf::kv::ReadOnlyTx &tx)
Definition internal_tables_access.h:1041
Definition share_manager.h:108
ReconstructedLedgerSecretWrappingKey(const ccf::crypto::sharing::Share &secret_)
Definition share_manager.h:122
LedgerSecretPtr unwrap(const std::vector< uint8_t > &wrapped_latest_ledger_secret)
Definition share_manager.h:127
ReconstructedLedgerSecretWrappingKey(std::vector< ccf::crypto::sharing::Share > &&shares_, size_t recovery_threshold_)
Definition share_manager.h:114
Definition share_manager.h:169
LedgerSecretsMap restore_ledger_secrets_map(ccf::kv::Tx &tx, const RecoveredEncryptedLedgerSecrets &recovery_ledger_secrets, const LedgerSecretPtr &restored_ls)
Definition share_manager.h:540
LedgerSecretsMap restore_recovery_shares_info(ccf::kv::Tx &tx, const RecoveredEncryptedLedgerSecrets &recovery_ledger_secrets)
Definition share_manager.h:517
void shuffle_recovery_shares(ccf::kv::Tx &tx)
Definition share_manager.h:492
static std::optional< EncryptedShare > get_encrypted_share(ccf::kv::ReadOnlyTx &tx, const MemberId &member_id)
Definition share_manager.h:497
void issue_recovery_shares(ccf::kv::Tx &tx, LedgerSecretPtr new_ledger_secret)
Definition share_manager.h:479
size_t submit_recovery_share(ccf::kv::Tx &tx, MemberId member_id, const std::vector< uint8_t > &submitted_recovery_share)
Definition share_manager.h:634
static bool is_full_key(const std::vector< uint8_t > &submitted_recovery_share)
Definition share_manager.h:616
static void clear_submitted_recovery_shares(ccf::kv::Tx &tx)
Definition share_manager.h:656
ShareManager(const std::shared_ptr< LedgerSecrets > &ledger_secrets_)
Definition share_manager.h:450
void issue_recovery_shares(ccf::kv::Tx &tx)
Definition share_manager.h:460
Definition share_manager.h:25
std::vector< std::vector< uint8_t > > get_shares() const
Definition share_manager.h:55
void get_full_share_serialised(std::vector< uint8_t > &serialised) const
Definition share_manager.h:68
size_t get_num_shares() const
Definition share_manager.h:45
std::vector< uint8_t > wrap(const LedgerSecretPtr &ledger_secret)
Definition share_manager.h:73
size_t get_recovery_threshold() const
Definition share_manager.h:50
SharedLedgerSecretWrappingKey(size_t num_shares_, size_t recovery_threshold_)
Definition share_manager.h:35
Definition tx.h:159
M::ReadOnlyHandle * ro(M &m)
Definition tx.h:168
Definition tx.h:200
M::Handle * rw(M &m)
Definition tx.h:211
Definition map.h:30
Definition value.h:32
#define LOG_INFO_FMT
Definition internal_logger.h:15
#define LOG_DEBUG_FMT
Definition internal_logger.h:14
void sample_secret_and_shares(Share &raw_secret, const std::span< Share > &shares, size_t threshold)
Definition sharing.cpp:136
void recover_unauthenticated_secret(Share &raw_secret, const std::span< Share const > &shares, size_t threshold)
Definition sharing.cpp:171
std::unique_ptr< KeyAesGcm > make_key_aes_gcm(std::span< const uint8_t > rawKey)
Free function implementation.
Definition symmetric_key.cpp:100
RSAPublicKeyPtr make_rsa_public_key(const uint8_t *data, size_t size)
Definition rsa_public_key.cpp:289
constexpr size_t GCM_DEFAULT_KEY_SIZE
Definition symmetric_key.h:12
uint64_t Version
Definition version.h:10
void shuffle_sealed_shares(ccf::kv::Tx &tx, const LedgerSecretPtr &latest_ledger_secret)
Definition local_sealing.cpp:146
Definition app_interface.h:13
std::list< EncryptedLedgerSecretInfo > RecoveredEncryptedLedgerSecrets
Definition share_manager.h:159
std::map< ccf::kv::Version, LedgerSecretPtr > LedgerSecretsMap
Definition ledger_secrets.h:21
std::map< MemberId, EncryptedShare > EncryptedSharesMap
Definition shares.h:14
std::shared_ptr< LedgerSecret > LedgerSecretPtr
Definition ledger_secret.h:84
std::vector< uint8_t > EncryptedSubmittedShare
Definition submitted_shares.h:17
std::vector< uint8_t > decrypt_previous_ledger_secret_raw(const LedgerSecretPtr &ledger_secret, const std::vector< uint8_t > &encrypted_previous_secret_raw)
Definition ledger_secret.h:92
Definition shares.h:37
void set_random_iv(EntropyPtr entropy=ccf::crypto::get_entropy())
Definition symmetric_key.h:47
Definition symmetric_key.h:58
void deserialise(const std::vector< uint8_t > &serial)
Definition symmetric_key.cpp:91
std::vector< uint8_t > serialise()
Definition symmetric_key.cpp:76
StandardGcmHeader hdr
Definition symmetric_key.h:59
std::vector< uint8_t > cipher
Definition symmetric_key.h:60
uint8_t tag[GCM_SIZE_TAG]
Definition symmetric_key.h:18
std::span< const uint8_t > get_iv() const
Definition symmetric_key.cpp:32
Definition sharing.h:26
static constexpr size_t serialised_size
Definition sharing.h:30
HashBytes key(size_t key_size) const
Definition sharing.h:41
void serialise(std::vector< uint8_t > &serialised) const
Definition sharing.h:56