35 explicit FSPRF(
const uint8_t key[kPRFKeySize])
36 : prf_(key), nblock_(0), rdptr_(kPRFOutputSize) {}
39 explicit FSPRF(
const FSPRF&) =
delete;
40 FSPRF& operator=(
const FSPRF&) =
delete;
44 constexpr static uint64_t kMaxBlocks = 0x10000000000;
46 void bytes(uint8_t buf[],
size_t n) {
48 if (rdptr_ == kPRFOutputSize) {
51 *buf++ = saved_[rdptr_++];
57 check(nblock_ < kMaxBlocks,
"too many blocks");
58 uint8_t in[kPRFInputSize] = {};
59 u64_to_le(in, nblock_++);
60 prf_.Eval(saved_, in);
67 uint8_t saved_[kPRFOutputSize];
71 enum { TAG_BSTR = 0, TAG_FIELD_ELEM = 1, TAG_ARRAY = 2 };
76 Transcript(
const uint8_t init[],
size_t init_len,
size_t version = 3)
77 : sha_(), prf_(), version_(version) {
78 write(init, init_len);
82 Transcript(
const Transcript&) =
delete;
83 Transcript& operator=(
const Transcript&) =
delete;
86 Transcript clone() {
return Transcript(sha_, version_); }
89 void bytes(uint8_t buf[],
size_t n)
override {
91 uint8_t key[kPRFKeySize];
93 prf_ = std::make_unique<FSPRF>(key);
99 void get(uint8_t key[]) {
100 check(kPRFKeySize == kSHA256DigestSize,
"prf key size != digest output");
103 tmp_hash.CopyState(sha_);
104 tmp_hash.DigestData(key);
115 void write(
const uint8_t data[],
size_t n) {
119 write_untyped(data, n);
123 void write0(
size_t n) {
127 uint8_t data[32] = {};
128 for (; n > 32; n -= 32) {
129 write_untyped(data, 32);
131 write_untyped(data, n);
135 template <
class Field>
136 void write(
const typename Field::Elt& e,
const Field& F) {
143 template <
class Field>
144 void write(
const typename Field::Elt e[],
size_t ince,
size_t n,
153 for (
size_t i = 0; i < n; ++i) {
154 write_untyped(e[i * ince], F);
159 explicit Transcript(
const SHA256& sha,
size_t version)
160 : sha_(), version_(version) {
166 uint8_t d =
static_cast<uint8_t
>(t);
167 write_untyped(&d, 1);
172 void length(
size_t x) {
178 void write_untyped(
const uint8_t data[],
size_t n) {
181 sha_.Update(data, n);
184 template <
class Field>
185 void write_untyped(
const typename Field::Elt& e,
const Field& F) {
186 uint8_t buf[Field::kBytes];
187 F.to_bytes_field(buf, e);
188 write_untyped(buf,
sizeof(buf));
192 std::unique_ptr<FSPRF> prf_;
193 const size_t version_;