+2024-03-10 Niels Möller <nisse@lysator.liu.se>
+
+ * poly1305-update.c (_nettle_poly1305_update): Explicitly check
+ for empty input and return.
+
+ * testsuite/testutils.c (test_aead): Test with associated split
+ data into two pieces in different ways, respecting block
+ boundaries. Also add a call to update(ctx, 0, NULL) in the
+ middle, and encrypt and decrypt calls with empty input.
+
2024-03-08 Niels Möller <nisse@lysator.liu.se>
Fix ubsan issues for empty hash updates.
assert (nonce->length == aead->nonce_size);
aead->set_nonce(ctx, nonce->data);
}
- if (aead->update && authtext->length)
- aead->update(ctx, authtext->length, authtext->data);
-
- if (offset > 0)
- aead->encrypt(ctx, offset, out + out_align, in + in_align);
-
- if (offset < cleartext->length)
- aead->encrypt(ctx, cleartext->length - offset,
- out + out_align + offset, in + in_align + offset);
+ if (aead->update)
+ {
+ size_t a_offset = (offset <= authtext->length) ? offset : 0;
+ aead->update(ctx, a_offset, authtext->data);
+ aead->update(ctx, 0, NULL);
+ aead->update(ctx, authtext->length - a_offset, authtext->data + a_offset);
+ }
+ aead->encrypt(ctx, offset, out + out_align, in + in_align);
+ aead->encrypt(ctx, 0, out + out_align, NULL);
+ aead->encrypt(ctx, cleartext->length - offset,
+ out + out_align + offset, in + in_align + offset);
if (!MEMEQ(cleartext->length, out + out_align, ciphertext->data))
{
if (aead->update && authtext->length)
aead->update(ctx, authtext->length, authtext->data);
- if (offset > 0)
- aead->decrypt (ctx, offset, out + out_align, out + out_align);
-
- if (offset < cleartext->length)
- aead->decrypt(ctx, cleartext->length - offset,
- out + out_align + offset, out + out_align + offset);
+ aead->decrypt(ctx, offset, out + out_align, out + out_align);
+ aead->decrypt(ctx, 0, out + out_align, NULL);
+ aead->decrypt(ctx, cleartext->length - offset,
+ out + out_align + offset, out + out_align + offset);
ASSERT(MEMEQ(cleartext->length, out + out_align, cleartext->data));