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;
42 void bytes(uint8_t buf[],
size_t n) {
44 if (rdptr_ == kPRFOutputSize) {
47 *buf++ = saved_[rdptr_++];
53 uint8_t in[kPRFInputSize] = {};
54 u64_to_le(in, nblock_++);
55 prf_.Eval(saved_, in);
62 uint8_t saved_[kPRFOutputSize];
66 enum { TAG_BSTR = 0, TAG_FIELD_ELEM = 1, TAG_ARRAY = 1 };
71 Transcript(
const uint8_t init[],
size_t init_len) : sha_(), prf_() {
72 write(init, init_len);
76 Transcript(
const Transcript&) =
delete;
77 Transcript& operator=(
const Transcript&) =
delete;
80 Transcript clone() {
return Transcript(sha_); }
83 void bytes(uint8_t buf[],
size_t n)
override {
85 uint8_t key[kPRFKeySize];
87 prf_ = std::make_unique<FSPRF>(key);
93 void get(uint8_t key[]) {
94 check(kPRFKeySize == kSHA256DigestSize,
"prf key size != digest output");
97 tmp_hash.CopyState(sha_);
98 tmp_hash.DigestData(key);
109 void write(
const uint8_t data[],
size_t n) {
113 write_untyped(data, n);
117 void write0(
size_t n) {
121 uint8_t data[32] = {};
122 for (; n > 32; n -= 32) {
123 write_untyped(data, 32);
125 write_untyped(data, n);
129 template <
class Field>
130 void write(
const typename Field::Elt& e,
const Field& F) {
137 template <
class Field>
138 void write(
const typename Field::Elt e[],
size_t ince,
size_t n,
143 for (
size_t i = 0; i < n; ++i) {
144 write_untyped(e[i * ince], F);
149 explicit Transcript(
const SHA256& sha) : sha_() {
155 uint8_t d =
static_cast<uint8_t
>(t);
156 write_untyped(&d, 1);
161 void length(
size_t x) {
167 void write_untyped(
const uint8_t data[],
size_t n) {
170 sha_.Update(data, n);
173 template <
class Field>
174 void write_untyped(
const typename Field::Elt& e,
const Field& F) {
175 uint8_t buf[Field::kBytes];
176 F.to_bytes_field(buf, e);
177 write_untyped(buf,
sizeof(buf));
181 std::unique_ptr<FSPRF> prf_;