]> git.ipfire.org Git - thirdparty/nettle.git/commitdiff
Test AEAD encrypt/decrypt with message split into pieces.
authorNiels Möller <nisse@lysator.liu.se>
Tue, 14 Sep 2021 11:51:17 +0000 (13:51 +0200)
committerNiels Möller <nisse@lysator.liu.se>
Tue, 14 Sep 2021 11:51:17 +0000 (13:51 +0200)
ChangeLog
testsuite/testutils.c

index 8321d731c17d51dbb6bc6ac951d4fb5ed8212e2d..fbe076ad3c02324cde6c06829449f01dab07a72f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2021-09-14  Niels Möller  <nisse@lysator.liu.se>
+
+       * testsuite/testutils.c (test_aead): Test encrypt/decrypt with
+       message split into pieces.
+
 2021-09-12  Niels Möller  <nisse@lysator.liu.se>
 
        * Merged CBC-AES changes into master branch.
index 781907a92c7586aa7d0218a1ab6a489ea2cab837..64dbcd0d9b667d819e9ba35e52176558967a4679 100644 (file)
@@ -798,50 +798,20 @@ test_aead(const struct nettle_aead *aead,
   void *ctx = xalloc(aead->context_size);
   uint8_t *data;
   uint8_t *buffer = xalloc(aead->digest_size);
-  size_t length;
+  size_t offset;
 
   ASSERT (cleartext->length == ciphertext->length);
-  length = cleartext->length;
 
   ASSERT (key->length == aead->key_size);
 
-  data = xalloc(length);
-  
-  /* encryption */
-  memset(buffer, 0, aead->digest_size);
-  aead->set_encrypt_key(ctx, key->data);
-
-  if (nonce->length != aead->nonce_size)
-    {
-      ASSERT (set_nonce);
-      set_nonce (ctx, nonce->length, nonce->data);
-    }
-  else
-    aead->set_nonce(ctx, nonce->data);
-
-  if (aead->update && authtext->length)
-    aead->update(ctx, authtext->length, authtext->data);
-
-  if (length)
-    aead->encrypt(ctx, length, data, cleartext->data);
-
-  if (digest)
-    {
-      ASSERT (digest->length <= aead->digest_size);
-      aead->digest(ctx, digest->length, buffer);
-      ASSERT(MEMEQ(digest->length, buffer, digest->data));
-    }
-  else
-    ASSERT(!aead->digest);
+  data = xalloc(cleartext->length);
 
-  ASSERT(MEMEQ(length, data, ciphertext->data));
+  ASSERT(aead->block_size > 0);
 
-  /* decryption */
-  if (aead->set_decrypt_key)
+  for (offset = 0; offset <= cleartext->length; offset += aead->block_size)
     {
-      memset(buffer, 0, aead->digest_size);
-
-      aead->set_decrypt_key(ctx, key->data);
+      /* encryption */
+      aead->set_encrypt_key(ctx, key->data);
 
       if (nonce->length != aead->nonce_size)
        {
@@ -853,16 +823,57 @@ test_aead(const struct nettle_aead *aead,
 
       if (aead->update && authtext->length)
        aead->update(ctx, authtext->length, authtext->data);
-    
-      if (length)
-       aead->decrypt(ctx, length, data, data);
+
+      if (offset > 0)
+       aead->encrypt(ctx, offset, data, cleartext->data);
+
+      if (offset < cleartext->length)
+       aead->encrypt(ctx, cleartext->length - offset,
+                     data + offset, cleartext->data + offset);
 
       if (digest)
        {
+         ASSERT (digest->length <= aead->digest_size);
+         memset(buffer, 0, aead->digest_size);
          aead->digest(ctx, digest->length, buffer);
          ASSERT(MEMEQ(digest->length, buffer, digest->data));
        }
-      ASSERT(MEMEQ(length, data, cleartext->data));
+      else
+       ASSERT(!aead->digest);
+
+      ASSERT(MEMEQ(cleartext->length, data, ciphertext->data));
+
+      /* decryption */
+      if (aead->set_decrypt_key)
+       {
+         aead->set_decrypt_key(ctx, key->data);
+
+         if (nonce->length != aead->nonce_size)
+           {
+             ASSERT (set_nonce);
+             set_nonce (ctx, nonce->length, nonce->data);
+           }
+         else
+           aead->set_nonce(ctx, nonce->data);
+
+         if (aead->update && authtext->length)
+           aead->update(ctx, authtext->length, authtext->data);
+
+         if (offset > 0)
+           aead->decrypt (ctx, offset, data, data);
+
+         if (offset < cleartext->length)
+           aead->decrypt(ctx, cleartext->length - offset,
+                         data + offset, data + offset);
+
+         if (digest)
+           {
+             memset(buffer, 0, aead->digest_size);
+             aead->digest(ctx, digest->length, buffer);
+             ASSERT(MEMEQ(digest->length, buffer, digest->data));
+           }
+         ASSERT(MEMEQ(cleartext->length, data, cleartext->data));
+       }
     }
   free(ctx);
   free(data);