Added API to share precomputations in EAX.

This commit is contained in:
Thomas Pornin 2018-02-08 15:50:10 +01:00
parent e51143dc16
commit 12db697bcc
3 changed files with 270 additions and 7 deletions

View file

@ -5526,6 +5526,7 @@ test_EAX_inner(const char *name, const br_block_ctrcbc_class *vt)
size_t plain_len, key_len, nonce_len, aad_len;
br_aes_gen_ctrcbc_keys bc;
br_eax_context ec;
br_eax_state st;
unsigned char tmp[100], out[16];
size_t v, tag_len;
@ -5649,6 +5650,63 @@ test_EAX_inner(const char *name, const br_block_ctrcbc_class *vt)
printf(".");
fflush(stdout);
/*
* For capture tests, we need the message to be non-empty.
*/
if (plain_len == 0) {
continue;
}
/*
* Captured state, pre-AAD. This requires the AAD and the
* message to be non-empty.
*/
br_eax_capture(&ec, &st);
if (aad_len > 0) {
br_eax_reset_pre_aad(&ec, &st, nonce, nonce_len);
br_eax_aad_inject(&ec, aad, aad_len);
br_eax_flip(&ec);
memcpy(tmp, plain, plain_len);
br_eax_run(&ec, 1, tmp, plain_len);
br_eax_get_tag(&ec, out);
check_equals("KAT EAX 9", tmp, cipher, plain_len);
check_equals("KAT EAX 10", out, tag, 16);
br_eax_reset_pre_aad(&ec, &st, nonce, nonce_len);
br_eax_aad_inject(&ec, aad, aad_len);
br_eax_flip(&ec);
br_eax_run(&ec, 0, tmp, plain_len);
br_eax_get_tag(&ec, out);
check_equals("KAT EAX 11", tmp, plain, plain_len);
check_equals("KAT EAX 12", out, tag, 16);
}
/*
* Captured state, post-AAD. This requires the message to
* be non-empty.
*/
br_eax_reset(&ec, nonce, nonce_len);
br_eax_aad_inject(&ec, aad, aad_len);
br_eax_flip(&ec);
br_eax_get_aad_mac(&ec, &st);
br_eax_reset_post_aad(&ec, &st, nonce, nonce_len);
memcpy(tmp, plain, plain_len);
br_eax_run(&ec, 1, tmp, plain_len);
br_eax_get_tag(&ec, out);
check_equals("KAT EAX 13", tmp, cipher, plain_len);
check_equals("KAT EAX 14", out, tag, 16);
br_eax_reset_post_aad(&ec, &st, nonce, nonce_len);
br_eax_run(&ec, 0, tmp, plain_len);
br_eax_get_tag(&ec, out);
check_equals("KAT EAX 15", tmp, plain, plain_len);
check_equals("KAT EAX 16", out, tag, 16);
printf(".");
fflush(stdout);
}
printf(" done.\n");