60 using Field =
typename Logic::Field;
62 using EltW =
typename Logic::EltW;
63 using Nat =
typename Field::N;
64 using v8 =
typename Logic::v8;
65 using v128 =
typename Logic::v128;
66 using v256 =
typename Logic::v256;
67 using packed_v128 =
typename BitPlucker::packed_v128;
68 using packed_v256 =
typename BitPlucker::packed_v256;
80 for (
size_t i = 0; i < r.size(); ++i) {
87 aa_[0] = packed_input<packed_v128>(Q);
88 aa_[1] = packed_input<packed_v128>(Q);
89 xx_ = packed_input<packed_v256>(Q);
93 explicit MAC(
const Logic& lc) : bp_(lc), lc_(lc) {}
100 void verify_mac(EltW msg,
const v128 mac[],
const v128& av,
101 const Witness& vw,
Nat order)
const {
102 check(Field::kBits >= 256,
"Field::kBits < 256");
104 unpack_msg(msg2, msg, order, vw);
105 assert_mac(mac, av, msg2, vw);
110 void assert_mac(
const v128 mac[],
const v128& av,
const v128 xi[],
111 const Witness& vw)
const {
113 for (
size_t i = 0; i < 2; ++i) {
114 v128 ap = bp_.template unpack<v128, packed_v128>(vw.aa_[i]);
115 v128 key = lc_.vxor(&av, ap);
116 lc_.gf2_128_mul(mv, key, xi[i]);
117 lc_.vassert_eq(&mac[i], mv);
121 void unpack_msg(v128 msg[], EltW msgw, Nat order,
123 v256 x = bp_.template unpack<v256, packed_v256>(vw.xx_);
124 std::copy(x.begin(), x.begin() + 128, msg[0].begin());
125 std::copy(x.begin() + 128, x.end(), msg[1].begin());
129 for (
size_t i = 0; i < 256; ++i) {
130 bits_n[i] = lc_.bit(order.bit(i));
132 lc_.assert1(lc_.vlt(&x, bits_n));
135 EltW te = lc_.konst(lc_.zero());
136 Elt twok = lc_.one();
137 for (
size_t i = 0; i < 256; ++i) {
138 te = lc_.axpy(&te, twok, lc_.eval(x[i]));
139 lc_.f_.add(twok, twok);
141 lc_.assert_eq(&te, msgw);
176 void verify_mac(
const EltW mac[],
const EltW& av,
const v256& msg,
179 for (
size_t i = 0; i < 2; ++i) {
180 EltW mm = pack(&msg[i * 128]);
181 EltW key = lc_.add(&av, vw.aa_[i]);
182 EltW got = lc_.mul(&key, mm);
183 lc_.assert_eq(&mac[i], got);
189 EltW pack(
const BitW msg[])
const {
190 Elt alpha = lc_.f_.x();
191 Elt xi = lc_.f_.one();
192 EltW m = lc_.konst(0);
193 for (
size_t i = 0; i < 128; ++i) {
194 m = lc_.axpy(&m, xi, lc_.eval(msg[i]));
195 xi = lc_.mulf(xi, alpha);
200 const Logic<GF2_128<>, Backend>& lc_;