tool: make speed use EVP_AEAD_CTX_seal_scatter Change-Id: I41854e61d87d365b923349a5ec8e71d73a0141bb Reviewed-on: https://boringssl-review.googlesource.com/18844 Reviewed-by: Adam Langley <agl@google.com> Commit-Queue: Adam Langley <agl@google.com> CQ-Verified: CQ bot account: commit-bot@chromium.org <commit-bot@chromium.org>
diff --git a/tool/speed.cc b/tool/speed.cc index 6652298..cf7e70e 100644 --- a/tool/speed.cc +++ b/tool/speed.cc
@@ -215,15 +215,24 @@ std::unique_ptr<uint8_t[]> nonce(new uint8_t[nonce_len]); OPENSSL_memset(nonce.get(), 0, nonce_len); std::unique_ptr<uint8_t[]> in_storage(new uint8_t[chunk_len + kAlignment]); - std::unique_ptr<uint8_t[]> out_storage(new uint8_t[chunk_len + overhead_len + kAlignment]); + // N.B. for EVP_AEAD_CTX_seal_scatter the input and output buffers may be the + // same size. However, in the direction == evp_aead_open case we still use + // non-scattering seal, hence we add overhead_len to the size of this buffer. + std::unique_ptr<uint8_t[]> out_storage( + new uint8_t[chunk_len + overhead_len + kAlignment]); std::unique_ptr<uint8_t[]> in2_storage(new uint8_t[chunk_len + kAlignment]); std::unique_ptr<uint8_t[]> ad(new uint8_t[ad_len]); OPENSSL_memset(ad.get(), 0, ad_len); + std::unique_ptr<uint8_t[]> tag_storage( + new uint8_t[overhead_len + kAlignment]); + uint8_t *const in = align(in_storage.get(), kAlignment); OPENSSL_memset(in, 0, chunk_len); uint8_t *const out = align(out_storage.get(), kAlignment); OPENSSL_memset(out, 0, chunk_len + overhead_len); + uint8_t *const tag = align(tag_storage.get(), kAlignment); + OPENSSL_memset(tag, 0, overhead_len); uint8_t *const in2 = align(in2_storage.get(), kAlignment); if (!EVP_AEAD_CTX_init_with_direction(ctx.get(), aead, key.get(), key_len, @@ -236,13 +245,15 @@ TimeResults results; if (direction == evp_aead_seal) { - if (!TimeFunction(&results, [chunk_len, overhead_len, nonce_len, ad_len, in, - out, &ctx, &nonce, &ad]() -> bool { - size_t out_len; - return EVP_AEAD_CTX_seal(ctx.get(), out, &out_len, - chunk_len + overhead_len, nonce.get(), - nonce_len, in, chunk_len, ad.get(), ad_len); - })) { + if (!TimeFunction(&results, + [chunk_len, nonce_len, ad_len, overhead_len, in, out, tag, + &ctx, &nonce, &ad]() -> bool { + size_t tag_len; + return EVP_AEAD_CTX_seal_scatter( + ctx.get(), out, tag, &tag_len, overhead_len, + nonce.get(), nonce_len, in, chunk_len, nullptr, 0, + ad.get(), ad_len); + })) { fprintf(stderr, "EVP_AEAD_CTX_seal failed.\n"); ERR_print_errors_fp(stderr); return false; @@ -252,13 +263,16 @@ EVP_AEAD_CTX_seal(ctx.get(), out, &out_len, chunk_len + overhead_len, nonce.get(), nonce_len, in, chunk_len, ad.get(), ad_len); - if (!TimeFunction(&results, [chunk_len, nonce_len, ad_len, in2, out, &ctx, - &nonce, &ad, out_len]() -> bool { - size_t in2_len; - return EVP_AEAD_CTX_open(ctx.get(), in2, &in2_len, chunk_len, - nonce.get(), nonce_len, out, out_len, - ad.get(), ad_len); - })) { + if (!TimeFunction(&results, + [chunk_len, nonce_len, ad_len, in2, out, out_len, &ctx, + &nonce, &ad]() -> bool { + size_t in2_len; + // N.B. EVP_AEAD_CTX_open_gather is not implemented for + // all AEADs. + return EVP_AEAD_CTX_open( + ctx.get(), in2, &in2_len, chunk_len, nonce.get(), + nonce_len, out, out_len, ad.get(), ad_len); + })) { fprintf(stderr, "EVP_AEAD_CTX_open failed.\n"); ERR_print_errors_fp(stderr); return false;