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 "ccf/ds/logger.h"
10#include "crypto/sharing.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 <vector>
19
20namespace ccf
21{
23 {
24 private:
25 static constexpr auto KZ_KEY_SIZE = ccf::crypto::GCM_DEFAULT_KEY_SIZE;
26 bool has_wrapped = false;
27 size_t num_shares;
28 size_t recovery_threshold;
30 std::vector<ccf::crypto::sharing::Share> shares;
31
32 public:
34 size_t num_shares_, size_t recovery_threshold_) :
35 num_shares(num_shares_),
36 recovery_threshold(recovery_threshold_)
37 {
38 shares.resize(num_shares);
40 secret, shares, recovery_threshold);
41 }
42
43 size_t get_num_shares() const
44 {
45 return num_shares;
46 }
47
49 {
50 return recovery_threshold;
51 }
52
53 std::vector<std::vector<uint8_t>> get_shares() const
54 {
55 std::vector<std::vector<uint8_t>> shares_;
56 for (const ccf::crypto::sharing::Share& share : shares)
57 {
58 std::vector<uint8_t> share_serialised(share.serialised_size);
59 share.serialise(share_serialised);
60 shares_.emplace_back(share_serialised);
61 }
62 return shares_;
63 }
64
65 void get_full_share_serialised(std::vector<uint8_t>& serialised) const
66 {
67 secret.serialise(serialised);
68 }
69
70 std::vector<uint8_t> wrap(const LedgerSecretPtr& ledger_secret)
71 {
72 if (has_wrapped)
73 {
74 throw std::logic_error(
75 "Ledger secret wrapping key has already wrapped once");
76 }
77
78 ccf::crypto::GcmCipher encrypted_ls(ledger_secret->raw_key.size());
79
80 std::vector<uint8_t> data = secret.key(KZ_KEY_SIZE);
81 try
82 {
83 ccf::crypto::make_key_aes_gcm(data)->encrypt(
84 encrypted_ls.hdr
85 .get_iv(), // iv is always 0 here as the share wrapping
86 // key is never re-used for encryption
87 ledger_secret->raw_key,
88 {},
89 encrypted_ls.cipher,
90 encrypted_ls.hdr.tag);
91 }
92 catch (...)
93 {
94 OPENSSL_cleanse(data.data(), data.size());
95 throw;
96 }
97
98 has_wrapped = true;
99
100 return encrypted_ls.serialise();
101 }
102 };
103
105 {
106 private:
107 static constexpr auto KZ_KEY_SIZE = ccf::crypto::GCM_DEFAULT_KEY_SIZE;
109
110 public:
112 std::vector<ccf::crypto::sharing::Share>&& shares_,
113 size_t recovery_threshold_)
114 {
116 secret, shares_, recovery_threshold_);
117 }
118
120 const ccf::crypto::sharing::Share& secret_)
121 {
122 secret = secret_;
123 }
124
126 const std::vector<uint8_t>& wrapped_latest_ledger_secret)
127 {
128 ccf::crypto::GcmCipher encrypted_ls;
129 encrypted_ls.deserialise(wrapped_latest_ledger_secret);
130 std::vector<uint8_t> decrypted_ls;
131
132 std::vector<uint8_t> data = secret.key(KZ_KEY_SIZE);
133 try
134 {
135 if (!ccf::crypto::make_key_aes_gcm(data)->decrypt(
136 encrypted_ls.hdr.get_iv(),
137 encrypted_ls.hdr.tag,
138 encrypted_ls.cipher,
139 {},
140 decrypted_ls))
141 {
142 throw std::logic_error("Unwrapping latest ledger secret failed");
143 }
144 }
145 catch (...)
146 {
147 OPENSSL_cleanse(data.data(), data.size());
148 throw;
149 }
150
151 return std::make_shared<LedgerSecret>(std::move(decrypted_ls));
152 }
153 };
154
155 // During recovery, a list of EncryptedLedgerSecretInfo is constructed
156 // from the local hook on the encrypted ledger secrets table.
157 using RecoveredEncryptedLedgerSecrets = std::list<EncryptedLedgerSecretInfo>;
158
159 // The ShareManager class provides the interface between the ledger secrets
160 // object and the shares, ledger secrets and submitted shares KV tables. In
161 // particular, it is used to:
162 // - Issue new recovery shares whenever required (e.g. on startup, rekey and
163 // membership updates)
164 // - Re-assemble the ledger secrets on recovery, once a threshold of members
165 // have successfully submitted their shares
167 {
168 private:
169 std::shared_ptr<LedgerSecrets> ledger_secrets;
170
171 EncryptedSharesMap compute_encrypted_shares(
172 ccf::kv::Tx& tx, const SharedLedgerSecretWrappingKey& ls_wrapping_key)
173 {
174 EncryptedSharesMap encrypted_shares;
175 auto shares = ls_wrapping_key.get_shares();
176
177 auto active_recovery_participants_info =
179
180 size_t share_index = 0;
181 for (auto const& [member_id, enc_pub_key] :
182 active_recovery_participants_info)
183 {
184 auto member_enc_pubk = ccf::crypto::make_rsa_public_key(enc_pub_key);
185 auto raw_share = std::vector<uint8_t>(
186 shares[share_index].begin(), shares[share_index].end());
187 encrypted_shares[member_id] = member_enc_pubk->rsa_oaep_wrap(raw_share);
188 OPENSSL_cleanse(raw_share.data(), raw_share.size());
189 OPENSSL_cleanse(shares[share_index].data(), shares[share_index].size());
190 share_index++;
191 }
192
193 auto active_recovery_owners_info =
195 if (active_recovery_owners_info.size() > 0)
196 {
197 std::vector<uint8_t> full_share_serialised(
199 ls_wrapping_key.get_full_share_serialised(full_share_serialised);
200
201 for (auto const& [member_id, enc_pub_key] : active_recovery_owners_info)
202 {
203 auto member_enc_pubk = ccf::crypto::make_rsa_public_key(enc_pub_key);
204 encrypted_shares[member_id] =
205 member_enc_pubk->rsa_oaep_wrap(full_share_serialised);
206 }
207
208 OPENSSL_cleanse(
209 full_share_serialised.data(), full_share_serialised.size());
210 }
211
212 return encrypted_shares;
213 }
214
215 void shuffle_recovery_shares(
216 ccf::kv::Tx& tx, const LedgerSecretPtr& latest_ledger_secret)
217 {
218 auto active_recovery_participants_info =
220 auto active_recovery_owners_info =
222 size_t recovery_threshold =
224
225 if (
226 active_recovery_participants_info.empty() &&
227 active_recovery_owners_info.empty())
228 {
229 throw std::logic_error(
230 "There should be at least one active recovery member to issue "
231 "recovery shares");
232 }
233
234 if (recovery_threshold == 0)
235 {
236 throw std::logic_error(
237 "Recovery threshold should be set before recovery "
238 "shares are computed");
239 }
240
241 size_t num_shares;
242 if (!active_recovery_participants_info.empty())
243 {
244 if (recovery_threshold > active_recovery_participants_info.size())
245 {
246 throw std::logic_error(fmt::format(
247 "Recovery threshold {} should be equal to or less than the number "
248 "of active recovery members {}",
249 recovery_threshold,
250 active_recovery_participants_info.size()));
251 }
252
253 num_shares = active_recovery_participants_info.size();
254 }
255 else
256 {
257 if (recovery_threshold > 1)
258 {
259 throw std::logic_error(fmt::format(
260 "Recovery threshold {} cannot be greater than 1 when the "
261 "consortium consists of only active recovery owner members ({})",
262 recovery_threshold,
263 active_recovery_owners_info.size()));
264 }
265
266 num_shares = 1;
267 }
268
269 auto ls_wrapping_key =
270 SharedLedgerSecretWrappingKey(num_shares, recovery_threshold);
271
272 auto wrapped_latest_ls = ls_wrapping_key.wrap(latest_ledger_secret);
273 auto recovery_shares = tx.rw<ccf::RecoveryShares>(Tables::SHARES);
274 recovery_shares->put(
275 {wrapped_latest_ls,
276 compute_encrypted_shares(tx, ls_wrapping_key),
277 latest_ledger_secret->previous_secret_stored_version});
278 }
279
280 void set_recovery_shares_info(
281 ccf::kv::Tx& tx,
282 const LedgerSecretPtr& latest_ledger_secret,
283 const std::optional<VersionedLedgerSecret>& previous_ledger_secret =
284 std::nullopt,
285 std::optional<ccf::kv::Version> latest_ls_version = std::nullopt)
286 {
287 // First, generate a fresh ledger secrets wrapping key and wrap the
288 // latest ledger secret with it. Then, encrypt the penultimate ledger
289 // secret with the latest ledger secret and split the ledger secret
290 // wrapping key, allocating a new share for each active recovery member.
291 // Finally, encrypt each share with the public key of each member and
292 // record it in the shares table.
293
294 shuffle_recovery_shares(tx, latest_ledger_secret);
295
296 auto encrypted_ls = tx.rw<ccf::EncryptedLedgerSecretsInfo>(
297 Tables::ENCRYPTED_PAST_LEDGER_SECRET);
298
299 std::vector<uint8_t> encrypted_previous_secret = {};
300 ccf::kv::Version version_previous_secret = ccf::kv::NoVersion;
301 if (previous_ledger_secret.has_value())
302 {
303 version_previous_secret = previous_ledger_secret->first;
304
305 ccf::crypto::GcmCipher encrypted_previous_ls(
306 previous_ledger_secret->second->raw_key.size());
307 encrypted_previous_ls.hdr.set_random_iv();
308
309 latest_ledger_secret->key->encrypt(
310 encrypted_previous_ls.hdr.get_iv(),
311 previous_ledger_secret->second->raw_key,
312 {},
313 encrypted_previous_ls.cipher,
314 encrypted_previous_ls.hdr.tag);
315
316 encrypted_previous_secret = encrypted_previous_ls.serialise();
317 encrypted_ls->put(
319 std::move(encrypted_previous_secret),
320 version_previous_secret,
321 encrypted_ls->get_version_of_previous_write()),
322 latest_ls_version});
323 }
324 else
325 {
326 encrypted_ls->put({std::nullopt, latest_ls_version});
327 }
328 }
329
330 std::vector<uint8_t> encrypt_submitted_share(
331 const std::vector<uint8_t>& submitted_share,
332 const LedgerSecretPtr& current_ledger_secret)
333 {
334 // Submitted recovery shares are encrypted with the latest ledger secret.
335 ccf::crypto::GcmCipher encrypted_submitted_share(submitted_share.size());
336
337 encrypted_submitted_share.hdr.set_random_iv();
338
339 current_ledger_secret->key->encrypt(
340 encrypted_submitted_share.hdr.get_iv(),
341 submitted_share,
342 {},
343 encrypted_submitted_share.cipher,
344 encrypted_submitted_share.hdr.tag);
345
346 return encrypted_submitted_share.serialise();
347 }
348
349 std::vector<uint8_t> decrypt_submitted_share(
350 const std::vector<uint8_t>& encrypted_submitted_share,
351 LedgerSecretPtr&& current_ledger_secret)
352 {
353 ccf::crypto::GcmCipher encrypted_share;
354 encrypted_share.deserialise(encrypted_submitted_share);
355 std::vector<uint8_t> decrypted_share;
356
357 if (!current_ledger_secret->key->decrypt(
358 encrypted_share.hdr.get_iv(),
359 encrypted_share.hdr.tag,
360 encrypted_share.cipher,
361 {},
362 decrypted_share))
363 {
364 throw std::logic_error("Decrypting submitted shares failed");
365 }
366
367 return decrypted_share;
368 }
369
371 combine_from_encrypted_submitted_shares(ccf::kv::Tx& tx)
372 {
373 auto encrypted_submitted_shares = tx.rw<ccf::EncryptedSubmittedShares>(
374 Tables::ENCRYPTED_SUBMITTED_SHARES);
375 auto config = tx.rw<ccf::Configuration>(Tables::CONFIGURATION);
376
377 std::optional<ccf::crypto::sharing::Share> full_share;
378 std::vector<ccf::crypto::sharing::Share> new_shares = {};
379 encrypted_submitted_shares->foreach(
380 [&new_shares, &full_share, &tx, this](
381 const MemberId, const EncryptedSubmittedShare& encrypted_share) {
382 auto decrypted_share = decrypt_submitted_share(
383 encrypted_share, ledger_secrets->get_latest(tx).second);
384 switch (decrypted_share.size())
385 {
387 {
388 // For a new share, we can check the index and decide if it's
389 // a full share or just a partial share (compare to zero).
390 // If it is a full share, we can short-circuit and return a
391 // ReconstructedLedgerSecretWrappingKey directly, otherwise we
392 // follow the existing flow.
393 auto share = ccf::crypto::sharing::Share(decrypted_share);
394 if (share.x == 0)
395 {
396 full_share = share;
397 }
398 else
399 {
400 new_shares.emplace_back(decrypted_share);
401 }
402 break;
403 }
404 default:
405 {
406 OPENSSL_cleanse(decrypted_share.data(), decrypted_share.size());
407 throw std::logic_error(fmt::format(
408 "Error combining recovery shares: decrypted share of {} bytes "
409 "is not an {}-byte long new-style share.",
410 decrypted_share.size(),
412 }
413 }
414 OPENSSL_cleanse(decrypted_share.data(), decrypted_share.size());
415 if (full_share.has_value())
416 {
417 return false;
418 }
419
420 return true;
421 });
422
423 if (full_share.has_value())
424 {
425 return ReconstructedLedgerSecretWrappingKey(full_share.value());
426 }
427
428 auto num_shares = new_shares.size();
429
430 auto recovery_threshold = config->get()->recovery_threshold;
431 if (recovery_threshold > num_shares)
432 {
433 throw std::logic_error(fmt::format(
434 "Error combining recovery shares: only {} recovery shares were "
435 "submitted but recovery threshold is {}",
436 num_shares,
437 recovery_threshold));
438 }
439
441 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 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 (auto it = recovery_ledger_secrets.rbegin();
571 it != recovery_ledger_secrets.rend();
572 it++)
573 {
575 "Recovering encrypted ledger secret valid at seqno {}",
576 it->previous_ledger_secret->version);
577
578 if (!it->previous_ledger_secret.has_value())
579 {
580 // Very first entry does not encrypt any other ledger secret
581 break;
582 }
583
584 if (
585 restored_ledger_secrets.find(it->previous_ledger_secret->version) !=
586 restored_ledger_secrets.end())
587 {
588 // Already decrypted this ledger secret
590 "Skipping, already decrypted ledger secret with version {}",
591 it->previous_ledger_secret->version);
592 continue;
593 }
594
595 auto decrypted_ls_raw = decrypt_previous_ledger_secret_raw(
596 latest_ls, it->previous_ledger_secret->encrypted_data);
597
598 auto secret = restored_ledger_secrets.emplace(
599 it->previous_ledger_secret->version,
600 std::make_shared<LedgerSecret>(
601 std::move(decrypted_ls_raw),
602 it->previous_ledger_secret->previous_secret_stored_version));
603 latest_ls = secret.first->second;
604 }
605
606 return restored_ledger_secrets;
607 }
608
609 static bool is_full_key(
610 const std::vector<uint8_t>& submitted_recovery_share)
611 {
612 if (
613 submitted_recovery_share.size() ==
615 {
616 auto share = ccf::crypto::sharing::Share(submitted_recovery_share);
617 if (share.x == 0)
618 {
619 // Index value of 0 indicates a full key.
620 return true;
621 }
622 }
623
624 return false;
625 }
626
628 ccf::kv::Tx& tx,
629 MemberId member_id,
630 const std::vector<uint8_t>& submitted_recovery_share)
631 {
632 auto service = tx.rw<ccf::Service>(Tables::SERVICE);
633 auto encrypted_submitted_shares = tx.rw<ccf::EncryptedSubmittedShares>(
634 Tables::ENCRYPTED_SUBMITTED_SHARES);
635 auto active_service = service->get();
636 if (!active_service.has_value())
637 {
638 throw std::logic_error("Failed to get active service");
639 }
640
641 encrypted_submitted_shares->put(
642 member_id,
643 encrypt_submitted_share(
644 submitted_recovery_share, ledger_secrets->get_latest(tx).second));
645
646 return encrypted_submitted_shares->size();
647 }
648
650 {
651 auto encrypted_submitted_shares = tx.rw<ccf::EncryptedSubmittedShares>(
652 Tables::ENCRYPTED_SUBMITTED_SHARES);
653 encrypted_submitted_shares->clear();
654 }
655 };
656}
static std::map< MemberId, ccf::crypto::Pem > get_active_recovery_participants(ccf::kv::ReadOnlyTx &tx)
Definition internal_tables_access.h:120
static std::map< MemberId, ccf::crypto::Pem > get_active_recovery_owners(ccf::kv::ReadOnlyTx &tx)
Definition internal_tables_access.h:151
static size_t get_recovery_threshold(ccf::kv::ReadOnlyTx &tx)
Definition internal_tables_access.h:973
Definition share_manager.h:105
ReconstructedLedgerSecretWrappingKey(const ccf::crypto::sharing::Share &secret_)
Definition share_manager.h:119
LedgerSecretPtr unwrap(const std::vector< uint8_t > &wrapped_latest_ledger_secret)
Definition share_manager.h:125
ReconstructedLedgerSecretWrappingKey(std::vector< ccf::crypto::sharing::Share > &&shares_, size_t recovery_threshold_)
Definition share_manager.h:111
Definition share_manager.h:167
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:627
static bool is_full_key(const std::vector< uint8_t > &submitted_recovery_share)
Definition share_manager.h:609
static void clear_submitted_recovery_shares(ccf::kv::Tx &tx)
Definition share_manager.h:649
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:23
std::vector< std::vector< uint8_t > > get_shares() const
Definition share_manager.h:53
void get_full_share_serialised(std::vector< uint8_t > &serialised) const
Definition share_manager.h:65
size_t get_num_shares() const
Definition share_manager.h:43
std::vector< uint8_t > wrap(const LedgerSecretPtr &ledger_secret)
Definition share_manager.h:70
size_t get_recovery_threshold() const
Definition share_manager.h:48
SharedLedgerSecretWrappingKey(size_t num_shares_, size_t recovery_threshold_)
Definition share_manager.h:33
Definition tx.h:160
M::ReadOnlyHandle * ro(M &m)
Definition tx.h:169
Definition tx.h:201
M::Handle * rw(M &m)
Definition tx.h:212
Definition map.h:30
Definition value.h:32
#define LOG_INFO_FMT
Definition logger.h:362
#define LOG_DEBUG_FMT
Definition logger.h:357
void sample_secret_and_shares(Share &raw_secret, const std::span< Share > &shares, size_t threshold)
Definition sharing.cpp:133
void recover_unauthenticated_secret(Share &raw_secret, const std::span< Share const > &shares, size_t threshold)
Definition sharing.cpp:168
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 Pem &pem)
Definition rsa_key_pair.cpp:13
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:157
std::map< ccf::kv::Version, LedgerSecretPtr > LedgerSecretsMap
Definition ledger_secrets.h:20
std::map< MemberId, EncryptedShare > EncryptedSharesMap
Definition shares.h:14
std::shared_ptr< LedgerSecret > LedgerSecretPtr
Definition ledger_secret.h:75
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:83
Definition shares.h:37
void set_random_iv(EntropyPtr entropy=ccf::crypto::get_entropy())
Definition symmetric_key.h:47
Definition symmetric_key.h:57
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:58
std::vector< uint8_t > cipher
Definition symmetric_key.h:59
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:28
static constexpr size_t serialised_size
Definition sharing.h:32
HashBytes key(size_t key_size) const
Definition sharing.h:43
void serialise(std::vector< uint8_t > &serialised) const
Definition sharing.h:59