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