44 using ECField =
typename EC::Field;
45 using ECElt =
typename ECField::Elt;
46 using ECNat =
typename ECField::N;
48 using Nat =
typename Field::N;
50 static constexpr size_t kMaxSHABlocks = 7;
56 EcdsaWitness ew_, dkw_;
57 uint8_t now_[kDateLen];
60 uint8_t signed_bytes_[kMaxSHABlocks * 64];
63 explicit SmallWitness(
const EC& ec,
const ScalarField& Fn)
64 : ec_(ec), ew_(Fn, ec), dkw_(Fn, ec) {}
69 for (
size_t k = 0; k < 48; ++k) {
70 filler.push_back(BPENC.mkpacked_v32(bw.outw[k]));
72 for (
size_t k = 0; k < 64; ++k) {
73 filler.push_back(BPENC.mkpacked_v32(bw.oute[k]));
74 filler.push_back(BPENC.mkpacked_v32(bw.outa[k]));
76 for (
size_t k = 0; k < 8; ++k) {
77 filler.push_back(BPENC.mkpacked_v32(bw.h1[k]));
83 filler.push_back(dpkx_);
84 filler.push_back(dpky_);
86 ew_.fill_witness(filler);
87 dkw_.fill_witness(filler);
89 filler.push_back(numb_, 8, ec_.f_);
90 for (
size_t i = 0; i < kMaxSHABlocks * 64; ++i) {
91 filler.push_back(signed_bytes_[i], 8, ec_.f_);
93 for (
size_t j = 0; j < kMaxSHABlocks; j++) {
94 fill_sha(filler, bw_[j]);
98 bool compute_witness(Elt pkX, Elt pkY,
const uint8_t mdoc[],
99 size_t len,
const uint8_t transcript[],
100 size_t tlen,
const uint8_t tnow[],
103 Nat ne = nat_from_hash<Nat>(mdoc, len);
104 e_ = ec_.f_.to_montgomery(ne);
109 ew_.compute_witness(pkX, pkY, ne, nr, ns);
111 Nat ne2 = nat_from_hash<Nat>(transcript, tlen);
115 dpkx_ = ec_.f_.to_montgomery(nat_from_be<Nat>(&mdoc[100]));
116 dpky_ = ec_.f_.to_montgomery(nat_from_be<Nat>(&mdoc[132]));
117 e2_ = ec_.f_.to_montgomery(ne2);
118 dkw_.compute_witness(dpkx_, dpky_, ne2, nr2, ns2);
120 FlatSHA256Witness::transform_and_witness_message(len, mdoc, kMaxSHABlocks,
121 numb_, signed_bytes_, bw_);
123 memcpy(now_, tnow, kDateLen);