51 using Field =
typename Logic::Field;
53 using EltW =
typename Logic::EltW;
54 using Nat =
typename Field::N;
55 using v8 =
typename Logic::v8;
56 using v128 =
typename Logic::v128;
57 using v256 =
typename Logic::v256;
58 using packed_v128 =
typename BitPlucker::packed_v128;
59 using packed_v256 =
typename BitPlucker::packed_v256;
71 for (
size_t i = 0; i < r.size(); ++i) {
78 aa_[0] = packed_input<packed_v128>(Q);
79 aa_[1] = packed_input<packed_v128>(Q);
80 xx_ = packed_input<packed_v256>(Q);
84 explicit MAC(
const Logic& lc) : bp_(lc), lc_(lc) {}
91 void verify_mac(EltW msg,
const v128 mac[],
const v128& av,
92 const Witness& vw,
Nat order)
const {
93 check(Field::kBits >= 256,
"Field::kBits < 256");
95 unpack_msg(msg2, msg, order, vw);
96 assert_mac(mac, av, msg2, vw);
101 void assert_mac(
const v128 mac[],
const v128& av,
const v128 xi[],
102 const Witness& vw)
const {
104 for (
size_t i = 0; i < 2; ++i) {
105 v128 ap = bp_.template unpack<v128, packed_v128>(vw.aa_[i]);
106 v128 key = lc_.vxor(&av, ap);
107 lc_.gf2_128_mul(mv, key, xi[i]);
108 lc_.vassert_eq(&mac[i], mv);
112 void unpack_msg(v128 msg[], EltW msgw, Nat order,
114 v256 x = bp_.template unpack<v256, packed_v256>(vw.xx_);
115 std::copy(x.begin(), x.begin() + 128, msg[0].begin());
116 std::copy(x.begin() + 128, x.end(), msg[1].begin());
120 for (
size_t i = 0; i < 256; ++i) {
121 bits_n[i] = lc_.bit(order.bit(i));
123 lc_.assert1(lc_.vlt(&x, bits_n));
126 EltW te = lc_.konst(lc_.zero());
127 Elt twok = lc_.one();
128 for (
size_t i = 0; i < 256; ++i) {
129 te = lc_.axpy(&te, twok, lc_.eval(x[i]));
130 lc_.f_.add(twok, twok);
132 lc_.assert_eq(&te, msgw);
167 void verify_mac(
const EltW mac[],
const EltW& av,
const v256& msg,
170 for (
size_t i = 0; i < 2; ++i) {
171 EltW mm = pack(&msg[i * 128]);
172 EltW key = lc_.add(&av, vw.aa_[i]);
173 EltW got = lc_.mul(&key, mm);
174 lc_.assert_eq(&mac[i], got);
180 EltW pack(
const BitW msg[])
const {
181 Elt alpha = lc_.f_.x();
182 Elt xi = lc_.f_.one();
183 EltW m = lc_.konst(0);
184 for (
size_t i = 0; i < 128; ++i) {
185 m = lc_.axpy(&m, xi, lc_.eval(msg[i]));
186 xi = lc_.mulf(xi, alpha);
191 const Logic<GF2_128<>, Backend>& lc_;