30 std::shared_ptr<AbstractTxEncryptor> crypto_util;
39 void serialise_internal(
const T& t)
41 current_writer->append(t);
49 current_writer = &private_writer;
53 current_writer = &public_writer;
58 throw std::logic_error(
"Invalid security domain");
65 std::shared_ptr<AbstractTxEncryptor> e,
73 bool historical_hint_ =
false) :
75 entry_type(entry_type_),
76 header_flags(header_flags_),
77 crypto_util(
std::move(e)),
78 historical_hint(historical_hint_)
81 serialise_internal(entry_type);
82 serialise_internal(tx_id.
seqno);
83 if (has_claims(entry_type))
85 serialise_internal(claims_digest_.
value());
87 if (has_commit_evidence(entry_type))
89 serialise_internal(commit_evidence_digest_);
92 serialise_internal((
Version)0u);
100 "Private map {} cannot be serialised without an encryptor", name));
103 if (domain != current_domain)
105 set_current_domain(domain);
108 serialise_internal(name);
113 serialise_internal(raw);
118 serialise_internal(view_history);
121 template <
class Version>
124 serialise_internal(version);
129 serialise_internal(ctr);
134 serialise_internal(k);
135 serialise_internal(version);
140 serialise_internal(k);
141 serialise_internal(v);
146 serialise_internal(k);
152 auto writer_guard_func = [](W* writer) { writer->clear(); };
153 std::unique_ptr<
decltype(private_writer),
decltype(writer_guard_func)>
154 writer_guard(&private_writer, writer_guard_func);
157 public_writer.get_raw_data(), private_writer.get_raw_data());
161 const std::vector<uint8_t>& serialised_public_domain,
162 const std::vector<uint8_t>& serialised_private_domain =
163 std::vector<uint8_t>())
165 size_t size_ = serialised_public_domain.size();
168 entry_header.
version = entry_format_v1;
169 entry_header.
flags = header_flags;
175 size_ += crypto_util->get_header_length() +
sizeof(size_t) +
176 serialised_private_domain.size();
182 std::vector<uint8_t> entry(size_);
183 auto* data_ = entry.data();
190 serialised_private_domain.empty(),
191 "Serialised does not have a crypto util but some private data were "
196 serialised_public_domain.data(),
197 serialised_public_domain.size());
202 std::vector<uint8_t> serialised_hdr;
203 std::vector<uint8_t> encrypted_private_domain(
204 serialised_private_domain.size());
206 if (!crypto_util->encrypt(
207 serialised_private_domain,
208 serialised_public_domain,
210 encrypted_private_domain,
216 "Could not serialise transaction at seqno {}", tx_id.
seqno));
220 data_, size_, serialised_hdr.data(), serialised_hdr.size());
225 serialised_public_domain.data(),
226 serialised_public_domain.size());
227 if (!encrypted_private_domain.empty())
232 encrypted_private_domain.data(),
233 encrypted_private_domain.size());
240 template <
typename R>
247 std::vector<uint8_t> decrypted_buffer;
252 std::optional<ccf::crypto::Sha256Hash> commit_evidence_digest =
255 std::shared_ptr<AbstractTxEncryptor> crypto_util;
256 std::optional<SecurityDomain> domain_restriction;
260 void read_public_header()
262 entry_type = public_reader.template read_next<EntryType>();
263 version = public_reader.template read_next<Version>();
264 if (has_claims(entry_type))
268 .template read_next<ccf::ClaimsDigest::Digest::Representation>();
269 claims_digest.
set(std::move(digest_array));
271 if (has_commit_evidence(entry_type))
275 .template read_next<ccf::crypto::Sha256Hash::Representation>();
276 commit_evidence_digest =
281 const auto _ = public_reader.template read_next<Version>();
286 std::shared_ptr<AbstractTxEncryptor> e,
287 std::optional<SecurityDomain> domain_restriction = std::nullopt) :
288 crypto_util(
std::move(e)),
289 domain_restriction(domain_restriction)
294 return std::move(claims_digest);
299 return std::move(commit_evidence_digest);
307 bool historical_hint =
false)
309 current_reader = &public_reader;
310 const auto* data_ = data;
313 const auto tx_header =
314 serialized::read<SerialisedEntryHeader>(data_, size_);
316 flags =
static_cast<EntryFlags>(tx_header.flags);
318 if (tx_header.size != size_)
320 throw std::logic_error(fmt::format(
321 "Reported size in entry header {} does not match size of entry {}",
326 const auto* gcm_hdr_data = data_;
328 switch (tx_header.version)
330 case entry_format_v1:
337 throw std::logic_error(fmt::format(
338 "Cannot deserialise entry format {}", tx_header.version));
346 public_reader.init(data_, size_);
347 read_public_header();
352 auto public_domain_length = serialized::read<size_t>(data_, size_);
354 const auto* data_public = data_;
355 public_reader.init(data_public, public_domain_length);
356 read_public_header();
361 domain_restriction.has_value() &&
368 crypto_util->get_term(gcm_hdr_data, crypto_util->get_header_length());
374 decrypted_buffer.resize(size_);
376 if (!crypto_util->decrypt(
377 {data_, data_ + size_},
378 {data_public, data_public + public_domain_length},
379 {gcm_hdr_data, gcm_hdr_data + crypto_util->get_header_length()},
388 private_reader.init(decrypted_buffer.data(), decrypted_buffer.size());
394 if (current_reader->is_eos())
396 if (current_reader == &public_reader && !private_reader.is_eos())
398 current_reader = &private_reader;
406 return current_reader->template read_next<std::string>();
411 return current_reader->template read_next<Version>();
416 return current_reader->template read_next<uint64_t>();
422 current_reader->template read_next<SerialisedKey>(),
423 current_reader->template read_next<Version>()};
428 return current_reader->template read_next<uint64_t>();
434 current_reader->template read_next<SerialisedKey>(),
435 current_reader->template read_next<SerialisedValue>()};
440 return current_reader->template read_next<std::vector<uint8_t>>();
445 return current_reader->template read_next<std::vector<Version>>();
450 return current_reader->template read_next<uint64_t>();
455 return current_reader->template read_next<SerialisedKey>();
460 return current_reader->is_eos() && public_reader.is_eos();
#define CCF_ASSERT_FMT(expr,...)
Definition ccf_assert.h:10
Definition claims_digest.h:10
void set(Digest &&digest_)
Definition claims_digest.h:21
const Digest & value() const
Definition claims_digest.h:38
Definition sha256_hash.h:16
static Sha256Hash from_representation(const Representation &r)
Definition sha256_hash.cpp:76
Definition generic_serialise_wrapper.h:242
std::tuple< SerialisedKey, Version > deserialise_read()
Definition generic_serialise_wrapper.h:419
std::vector< uint8_t > deserialise_raw()
Definition generic_serialise_wrapper.h:438
std::tuple< SerialisedKey, SerialisedValue > deserialise_write()
Definition generic_serialise_wrapper.h:431
GenericDeserialiseWrapper(std::shared_ptr< AbstractTxEncryptor > e, std::optional< SecurityDomain > domain_restriction=std::nullopt)
Definition generic_serialise_wrapper.h:285
uint64_t deserialise_write_header()
Definition generic_serialise_wrapper.h:426
ccf::ClaimsDigest && consume_claims_digest()
Definition generic_serialise_wrapper.h:292
uint64_t deserialise_remove_header()
Definition generic_serialise_wrapper.h:448
std::optional< std::string > start_map()
Definition generic_serialise_wrapper.h:392
std::vector< Version > deserialise_view_history()
Definition generic_serialise_wrapper.h:443
uint64_t deserialise_read_header()
Definition generic_serialise_wrapper.h:414
bool end()
Definition generic_serialise_wrapper.h:458
std::optional< Version > init(const uint8_t *data, size_t size, ccf::kv::Term &term, EntryFlags &flags, bool historical_hint=false)
Definition generic_serialise_wrapper.h:302
Version deserialise_entry_version()
Definition generic_serialise_wrapper.h:409
SerialisedKey deserialise_remove()
Definition generic_serialise_wrapper.h:453
std::optional< ccf::crypto::Sha256Hash > && consume_commit_evidence_digest()
Definition generic_serialise_wrapper.h:297
Definition generic_serialise_wrapper.h:21
std::vector< uint8_t > get_raw_data()
Definition generic_serialise_wrapper.h:149
std::vector< uint8_t > serialise_domains(const std::vector< uint8_t > &serialised_public_domain, const std::vector< uint8_t > &serialised_private_domain=std::vector< uint8_t >())
Definition generic_serialise_wrapper.h:160
void serialise_count_header(uint64_t ctr)
Definition generic_serialise_wrapper.h:127
void serialise_remove(const SerialisedKey &k)
Definition generic_serialise_wrapper.h:144
void serialise_view_history(const std::vector< Version > &view_history)
Definition generic_serialise_wrapper.h:116
void serialise_raw(const std::vector< uint8_t > &raw)
Definition generic_serialise_wrapper.h:111
void start_map(const std::string &name, SecurityDomain domain)
Definition generic_serialise_wrapper.h:95
GenericSerialiseWrapper(std::shared_ptr< AbstractTxEncryptor > e, const TxID &tx_id_, EntryType entry_type_, SerialisedEntryFlags header_flags_, const ccf::crypto::Sha256Hash &commit_evidence_digest_={}, const ccf::ClaimsDigest &claims_digest_=ccf::no_claims(), bool historical_hint_=false)
Definition generic_serialise_wrapper.h:64
void serialise_entry_version(const Version &version)
Definition generic_serialise_wrapper.h:122
void serialise_read(const SerialisedKey &k, const Version &version)
Definition generic_serialise_wrapper.h:132
void serialise_write(const SerialisedKey &k, const SerialisedValue &v)
Definition generic_serialise_wrapper.h:138
Definition kv_types.h:318
ccf::ByteVector SerialisedEntry
Definition serialised_entry.h:8
Definition app_interface.h:18
ccf::kv::serialisers::SerialisedEntry SerialisedKey
Definition generic_serialise_wrapper.h:16
ccf::kv::serialisers::SerialisedEntry SerialisedValue
Definition generic_serialise_wrapper.h:17
uint64_t Term
Definition kv_types.h:46
EntryType
Definition kv_types.h:233
SecurityDomain
Definition kv_types.h:219
@ SECURITY_DOMAIN_MAX
Definition kv_types.h:222
@ PRIVATE
Definition kv_types.h:221
@ PUBLIC
Definition kv_types.h:220
uint64_t Version
Definition version.h:10
uint8_t SerialisedEntryFlags
Definition serialised_entry_format.h:12
EntryFlags
Definition serialised_entry_format.h:15
void write(uint8_t *&data, size_t &size, const T &v)
Definition serialized.h:105
void skip(const uint8_t *&data, size_t &size, size_t skip)
Definition serialized.h:165
SeqNo seqno
Definition tx_id.h:46