44class MdocRevocationSpanWitness {
45 using Field =
typename EC::Field;
47 using Nat =
typename Field::N;
54 uint8_t preimage_[64 * 2];
55 uint8_t id_bits_[256];
59 explicit MdocRevocationSpanWitness(
const EC& ec,
const ScalarField& Fn)
60 : ec_(ec), sig_(Fn, ec) {}
66 sig_.fill_witness(filler);
69 for (
size_t i = 0; i < 64 * 2; ++i) {
70 for (
size_t j = 0; j < 8; ++j) {
71 filler.push_back((preimage_[i] >> j) & 0x1 ? ec_.f_.one()
76 for (
size_t i = 0; i < 256; ++i) {
77 filler.push_back(id_bits_[i] ? ec_.f_.one() : ec_.f_.zero());
79 for (
size_t i = 0; i < 256; ++i) {
80 filler.push_back(e_bits_[i] ? ec_.f_.one() : ec_.f_.zero());
83 for (
size_t j = 0; j < 2; j++) {
84 fill_sha(filler, sha_bw_[j]);
91 for (
size_t k = 0; k < 48; ++k) {
92 filler.push_back(BPENC.mkpacked_v32(bw.outw[k]));
94 for (
size_t k = 0; k < 64; ++k) {
95 filler.push_back(BPENC.mkpacked_v32(bw.oute[k]));
96 filler.push_back(BPENC.mkpacked_v32(bw.outa[k]));
98 for (
size_t k = 0; k < 8; ++k) {
99 filler.push_back(BPENC.mkpacked_v32(bw.h1[k]));
103 bool compute_witness(Elt pkX, Elt pkY, Nat ne, Nat nr, Nat ns, Nat
id, Nat ll,
104 Nat rr, uint64_t epoch) {
105 e_ = ec_.f_.to_montgomery(ne);
106 r_ = ec_.f_.to_montgomery(nr);
107 s_ = ec_.f_.to_montgomery(ns);
108 sig_.compute_witness(pkX, pkY, ne, nr, ns);
110 std::vector<uint8_t> buf;
111 for (
size_t i = 0; i < 8; ++i) {
112 buf.push_back(epoch & 0xff);
115 uint8_t tmp[Field::kBytes];
117 buf.insert(buf.end(), tmp, tmp + Field::kBytes);
119 buf.insert(buf.end(), tmp, tmp + Field::kBytes);
121 for (
size_t i = 0; i < 256; ++i) {
122 id_bits_[i] =
id.bit(i);
123 e_bits_[i] = ne.bit(i);
127 FlatSHA256Witness::transform_and_witness_message(buf.size(), buf.data(), 2,
128 numb, preimage_, sha_bw_);