30 using gf2k =
typename GF::Elt;
34 check(n > 0,
"n must be positive");
35 std::vector<uint8_t> buf(n * GF::kBytes);
36 rng->bytes(buf.data(), n * GF::kBytes);
37 for (
size_t i = 0; i < n; ++i) {
38 ap[i] = gf_.of_bytes_field(&buf[i * GF::kBytes]).value();
43 void compute(gf2k mac[],
const gf2k& av,
const gf2k ap[],
44 uint8_t msg[])
const {
45 uint8_t tmp[GF::kBytes] = {0};
46 for (
size_t i = 0; i < 2; ++i) {
47 memcpy(tmp, &msg[i * GF::kBytes], GF::kBytes);
48 gf2k m = gf_.of_bytes_field(tmp).value();
49 mac[i] = gf_.mulf(gf_.addf(av, ap[i]), m);
53 void to_bytes(gf2k mac[], uint8_t buf[]) {
54 gf_.to_bytes(mac[0], buf);
55 gf_.to_bytes(mac[1], buf + GF::kBytes);