+static int do_mac(int iter, EVP_MAC *mac, const char *plaintext,
+ const struct hash_testvec *t)
+{
+ if (!iter)
+ printf("[MAC %zu] ", t->outsize);
+
+ size_t acpkm = (size_t)t->acpkm;
+ size_t acpkm_t = (size_t)t->acpkm_t;
+ OSSL_PARAM params[] = { OSSL_PARAM_END, OSSL_PARAM_END, OSSL_PARAM_END, OSSL_PARAM_END };
+ OSSL_PARAM *p = params;
+ if (acpkm) {
+ *p++ = OSSL_PARAM_construct_size_t("key-mesh", &acpkm);
+ if (acpkm_t)
+ *p++ = OSSL_PARAM_construct_size_t("cipher-key-mesh", &acpkm_t);
+ }
+
+ EVP_MAC_CTX *ctx;
+ T(ctx = EVP_MAC_CTX_new(mac));
+ if (t->outsize)
+ T(EVP_MAC_CTX_get_mac_size(ctx) == t->outsize);
+ size_t outsize;
+ if (t->truncate) {
+ outsize = t->truncate;
+ *p++ = OSSL_PARAM_construct_size_t("size", &outsize);
+ }
+ else
+ outsize = EVP_MAC_CTX_get_mac_size(ctx);
+
+ T(EVP_MAC_init(ctx, (const unsigned char *)t->key, t->key_size, NULL));
+ T(EVP_MAC_CTX_set_params(ctx, params));
+ T(EVP_MAC_update(ctx, (unsigned char *)plaintext, t->psize));
+
+ size_t len = 0;
+ unsigned char out[256];
+ if (t->truncate) {
+ T(outsize <= sizeof(out));
+ T(EVP_MAC_finalXOF(ctx, out, outsize));
+ len = outsize;
+ } else {
+ T(EVP_MAC_CTX_get_mac_size(ctx) == outsize);
+ T(EVP_MAC_final(ctx, out, &len, sizeof(out)));
+ }
+
+ EVP_MAC_CTX_free(ctx);
+ T(len == outsize);
+ if (memcmp(out, t->digest, outsize) != 0) {
+ printf(cRED "mac mismatch (iter %d, outsize %d)" cNORM "\n",
+ iter, (int)outsize);
+ hexdump(t->digest, outsize);
+ hexdump(out, outsize);
+ return 1;
+ }
+
+ return 0;
+}
+