Test streaming the AAD into EVP_CIPHER_CTX.

This API supports that too, so we should test it.

Bug: 494
Change-Id: If978705b3120697cc18fc91c06ca950e0e93bcf3
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/55390
Reviewed-by: Adam Langley <agl@google.com>
Commit-Queue: David Benjamin <davidben@google.com>
diff --git a/crypto/cipher_extra/cipher_test.cc b/crypto/cipher_extra/cipher_test.cc
index 0f53dd6..8f99b5e 100644
--- a/crypto/cipher_extra/cipher_test.cc
+++ b/crypto/cipher_extra/cipher_test.cc
@@ -224,10 +224,16 @@
   // Note: the deprecated |EVP_CIPHER|-based AEAD API is sensitive to whether
   // parameters are NULL, so it is important to skip the |in| and |aad|
   // |EVP_CipherUpdate| calls when empty.
-  if (!aad.empty()) {
-    int unused;
+  while (!aad.empty()) {
+    size_t todo =
+        chunk_size == 0 ? aad.size() : std::min(aad.size(), chunk_size);
+    int len;
     ASSERT_TRUE(
-        EVP_CipherUpdate(ctx.get(), nullptr, &unused, aad.data(), aad.size()));
+        EVP_CipherUpdate(ctx.get(), nullptr, &len, aad.data(), todo));
+    // Although it doesn't output anything, |EVP_CipherUpdate| should claim to
+    // output the input length.
+    EXPECT_EQ(len, static_cast<int>(todo));
+    aad = aad.subspan(todo);
   }
 
   // Set up the output buffer.
@@ -386,7 +392,8 @@
                                          17, 31, 32, 33, 63, 64, 65, 512};
     for (size_t chunk_size : kChunkSizes) {
       SCOPED_TRACE(chunk_size);
-      if (chunk_size > std::max(plaintext.size(), ciphertext.size())) {
+      if (chunk_size > plaintext.size() && chunk_size > ciphertext.size() &&
+          chunk_size > aad.size()) {
         continue;
       }
       for (bool in_place : {false, true}) {