13#include "openssl/crypto.h"
15#include <fmt/format.h>
22 static constexpr size_t LIMBS = 10;
23 static constexpr const char* key_label =
"CCF Wrapping Key v1";
29 uint32_t
y[LIMBS] = {};
31 sizeof(uint32_t) +
sizeof(uint32_t) * LIMBS;
38 OPENSSL_cleanse(
y,
sizeof(
y));
45 throw std::invalid_argument(
"Cannot derive a key from a partial share");
47 const std::span<const uint8_t> ikm(
48 reinterpret_cast<const uint8_t*
>(
y),
sizeof(
y));
49 const std::span<const uint8_t> label(
50 reinterpret_cast<const uint8_t*
>(
y),
sizeof(
y));
56 void serialise(std::vector<uint8_t>& serialised)
const
59 if (serialised.size() != size)
61 throw std::invalid_argument(
"Invalid serialised share size");
64 auto* data = serialised.data();
67 for (
size_t i = 0; i < LIMBS; ++i)
73 Share(
const std::span<uint8_t const>& serialised)
77 throw std::invalid_argument(
"Invalid serialised share size");
79 const auto* data = serialised.data();
80 auto size = serialised.size();
81 x = serialized::read<uint32_t>(data, size);
83 for (
size_t i = 0; i < LIMBS; ++i)
85 y[i] = serialized::read<uint32_t>(data, size);
89 [[nodiscard]] std::string
to_str()
const
91 return fmt::format(
"x: {} y: {}",
x, fmt::join(
y,
", "));
112 Share& raw_secret,
const std::span<Share>& shares,
size_t threshold);
127 Share& raw_secret,
const std::span<Share const>& shares,
size_t threshold);
Definition sharing.cpp:10
uint64_t element
Definition sharing.cpp:20
element ct_reduce(element x)
Definition sharing.cpp:37
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::vector< uint8_t > hkdf(MDType md_type, size_t length, const std::span< const uint8_t > &ikm, const std::span< const uint8_t > &salt={}, const std::span< const uint8_t > &info={})
Definition hash.cpp:51
std::vector< uint8_t > HashBytes
Definition hash_bytes.h:10
void write(uint8_t *&data, size_t &size, const T &v)
Definition serialized.h:105
bool operator==(const Share &other) const =default
static constexpr size_t serialised_size
Definition sharing.h:30
HashBytes key(size_t key_size) const
Definition sharing.h:41
Share(const std::span< uint8_t const > &serialised)
Definition sharing.h:73
uint32_t y[LIMBS]
Definition sharing.h:29
void serialise(std::vector< uint8_t > &serialised) const
Definition sharing.h:56
~Share()
Definition sharing.h:36
std::string to_str() const
Definition sharing.h:89
uint32_t x
Definition sharing.h:28