29 std::shared_ptr<AbstractTxEncryptor> crypto_util;
38 void serialise_internal(
const T& t)
40 current_writer->append(t);
48 current_writer = &private_writer;
52 current_writer = &public_writer;
62 std::shared_ptr<AbstractTxEncryptor> e,
70 bool historical_hint_ =
false) :
72 entry_type(entry_type_),
73 header_flags(header_flags_),
75 historical_hint(historical_hint_)
78 serialise_internal(entry_type);
79 serialise_internal(tx_id.
version);
80 if (has_claims(entry_type))
82 serialise_internal(claims_digest_.
value());
84 if (has_commit_evidence(entry_type))
86 serialise_internal(commit_evidence_digest_);
89 serialise_internal((
Version)0u);
97 "Private map {} cannot be serialised without an encryptor", name));
100 if (domain != current_domain)
102 set_current_domain(domain);
105 serialise_internal(name);
110 serialise_internal(raw);
115 serialise_internal(view_history);
118 template <
class Version>
121 serialise_internal(version);
126 serialise_internal(ctr);
131 serialise_internal(k);
132 serialise_internal(version);
137 serialise_internal(k);
138 serialise_internal(v);
143 serialise_internal(k);
149 auto writer_guard_func = [](W* writer) { writer->clear(); };
150 std::unique_ptr<
decltype(private_writer),
decltype(writer_guard_func)>
151 writer_guard(&private_writer, writer_guard_func);
154 public_writer.get_raw_data(), private_writer.get_raw_data());
158 const std::vector<uint8_t>& serialised_public_domain,
159 const std::vector<uint8_t>& serialised_private_domain =
160 std::vector<uint8_t>())
162 size_t size_ = serialised_public_domain.size();
165 entry_header.
version = entry_format_v1;
166 entry_header.
flags = header_flags;
172 size_ += crypto_util->get_header_length() +
sizeof(size_t) +
173 serialised_private_domain.size();
179 std::vector<uint8_t> entry(size_);
180 auto data_ = entry.data();
187 serialised_private_domain.empty(),
188 "Serialised does not have a crypto util but some private data were "
193 serialised_public_domain.data(),
194 serialised_public_domain.size());
199 std::vector<uint8_t> serialised_hdr;
200 std::vector<uint8_t> encrypted_private_domain(
201 serialised_private_domain.size());
203 if (!crypto_util->encrypt(
204 serialised_private_domain,
205 serialised_public_domain,
207 encrypted_private_domain,
213 "Could not serialise transaction at seqno {}", tx_id.
version));
217 data_, size_, serialised_hdr.data(), serialised_hdr.size());
222 serialised_public_domain.data(),
223 serialised_public_domain.size());
224 if (encrypted_private_domain.size() > 0)
229 encrypted_private_domain.data(),
230 encrypted_private_domain.size());
237 template <
typename R>
244 std::vector<uint8_t> decrypted_buffer;
249 std::optional<ccf::crypto::Sha256Hash> commit_evidence_digest =
252 std::shared_ptr<AbstractTxEncryptor> crypto_util;
253 std::optional<SecurityDomain> domain_restriction;
257 void read_public_header()
259 entry_type = public_reader.template read_next<EntryType>();
260 version = public_reader.template read_next<Version>();
261 if (has_claims(entry_type))
265 .template read_next<ccf::ClaimsDigest::Digest::Representation>();
266 claims_digest.
set(std::move(digest_array));
268 if (has_commit_evidence(entry_type))
272 .template read_next<ccf::crypto::Sha256Hash::Representation>();
273 commit_evidence_digest =
278 const auto _ = public_reader.template read_next<Version>();
283 std::shared_ptr<AbstractTxEncryptor> e,
284 std::optional<SecurityDomain> domain_restriction = std::nullopt) :
286 domain_restriction(domain_restriction)
291 return std::move(claims_digest);
296 return std::move(commit_evidence_digest);
304 bool historical_hint =
false)
306 current_reader = &public_reader;
310 const auto tx_header =
311 serialized::read<SerialisedEntryHeader>(data_, size_);
313 flags =
static_cast<EntryFlags>(tx_header.flags);
315 if (tx_header.size != size_)
317 throw std::logic_error(fmt::format(
318 "Reported size in entry header {} does not match size of entry {}",
323 auto gcm_hdr_data = data_;
325 switch (tx_header.version)
327 case entry_format_v1:
334 throw std::logic_error(fmt::format(
335 "Cannot deserialise entry format {}", tx_header.version));
343 public_reader.init(data_, size_);
344 read_public_header();
349 auto public_domain_length = serialized::read<size_t>(data_, size_);
351 auto data_public = data_;
352 public_reader.init(data_public, public_domain_length);
353 read_public_header();
358 domain_restriction.has_value() &&
365 crypto_util->get_term(gcm_hdr_data, crypto_util->get_header_length());
371 decrypted_buffer.resize(size_);
373 if (!crypto_util->decrypt(
374 {data_, data_ + size_},
375 {data_public, data_public + public_domain_length},
376 {gcm_hdr_data, gcm_hdr_data + crypto_util->get_header_length()},
385 private_reader.init(decrypted_buffer.data(), decrypted_buffer.size());
391 if (current_reader->is_eos())
393 if (current_reader == &public_reader && !private_reader.is_eos())
395 current_reader = &private_reader;
403 return current_reader->template read_next<std::string>();
408 return current_reader->template read_next<Version>();
413 return current_reader->template read_next<uint64_t>();
419 current_reader->template read_next<SerialisedKey>(),
420 current_reader->template read_next<Version>()};
425 return current_reader->template read_next<uint64_t>();
431 current_reader->template read_next<SerialisedKey>(),
432 current_reader->template read_next<SerialisedValue>()};
437 return current_reader->template read_next<std::vector<uint8_t>>();
442 return current_reader->template read_next<std::vector<Version>>();
447 return current_reader->template read_next<uint64_t>();
452 return current_reader->template read_next<SerialisedKey>();
457 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:80
Definition generic_serialise_wrapper.h:239
std::tuple< SerialisedKey, Version > deserialise_read()
Definition generic_serialise_wrapper.h:416
std::vector< uint8_t > deserialise_raw()
Definition generic_serialise_wrapper.h:435
std::tuple< SerialisedKey, SerialisedValue > deserialise_write()
Definition generic_serialise_wrapper.h:428
GenericDeserialiseWrapper(std::shared_ptr< AbstractTxEncryptor > e, std::optional< SecurityDomain > domain_restriction=std::nullopt)
Definition generic_serialise_wrapper.h:282
uint64_t deserialise_write_header()
Definition generic_serialise_wrapper.h:423
ccf::ClaimsDigest && consume_claims_digest()
Definition generic_serialise_wrapper.h:289
uint64_t deserialise_remove_header()
Definition generic_serialise_wrapper.h:445
std::optional< std::string > start_map()
Definition generic_serialise_wrapper.h:389
std::vector< Version > deserialise_view_history()
Definition generic_serialise_wrapper.h:440
uint64_t deserialise_read_header()
Definition generic_serialise_wrapper.h:411
bool end()
Definition generic_serialise_wrapper.h:455
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:299
Version deserialise_entry_version()
Definition generic_serialise_wrapper.h:406
SerialisedKey deserialise_remove()
Definition generic_serialise_wrapper.h:450
std::optional< ccf::crypto::Sha256Hash > && consume_commit_evidence_digest()
Definition generic_serialise_wrapper.h:294
Definition generic_serialise_wrapper.h:20
std::vector< uint8_t > get_raw_data()
Definition generic_serialise_wrapper.h:146
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:157
void serialise_count_header(uint64_t ctr)
Definition generic_serialise_wrapper.h:124
void serialise_remove(const SerialisedKey &k)
Definition generic_serialise_wrapper.h:141
void serialise_view_history(const std::vector< Version > &view_history)
Definition generic_serialise_wrapper.h:113
void serialise_raw(const std::vector< uint8_t > &raw)
Definition generic_serialise_wrapper.h:108
void start_map(const std::string &name, SecurityDomain domain)
Definition generic_serialise_wrapper.h:92
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:61
void serialise_entry_version(const Version &version)
Definition generic_serialise_wrapper.h:119
void serialise_read(const SerialisedKey &k, const Version &version)
Definition generic_serialise_wrapper.h:129
void serialise_write(const SerialisedKey &k, const SerialisedValue &v)
Definition generic_serialise_wrapper.h:135
Definition kv_types.h:354
ccf::ByteVector SerialisedEntry
Definition serialised_entry.h:8
Definition app_interface.h:19
ccf::kv::serialisers::SerialisedEntry SerialisedKey
Definition generic_serialise_wrapper.h:15
ccf::kv::serialisers::SerialisedEntry SerialisedValue
Definition generic_serialise_wrapper.h:16
uint64_t Term
Definition kv_types.h:48
SecurityDomain
Definition kv_types.h:255
@ PRIVATE
Definition kv_types.h:257
@ PUBLIC
Definition kv_types.h:256
EntryType
Definition kv_types.h:269
uint64_t Version
Definition version.h:8
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:106
void skip(const uint8_t *&data, size_t &size, size_t skip)
Definition serialized.h:166
Version version
Definition kv_types.h:54