]> git.ipfire.org Git - thirdparty/nettle.git/commitdiff
Use alignas
authorNiels Möller <nisse@lysator.liu.se>
Tue, 27 May 2025 18:50:37 +0000 (20:50 +0200)
committerNiels Möller <nisse@lysator.liu.se>
Tue, 27 May 2025 18:50:37 +0000 (20:50 +0200)
aes.h
ctr16.c
nettle-types.h
umac.h

diff --git a/aes.h b/aes.h
index f3d60ea724fbb698031737326783c7b12941607e..3b6f9fb74332c5033c97813cd4a0f9a125de8fe8 100644 (file)
--- a/aes.h
+++ b/aes.h
@@ -68,7 +68,7 @@ extern "C" {
 
 struct aes128_ctx
 {
-  uint32_t keys[4 * (_AES128_ROUNDS + 1)];
+  uint32_t _NETTLE_ALIGN16 keys[4 * (_AES128_ROUNDS + 1)];
 };
 
 void
diff --git a/ctr16.c b/ctr16.c
index d744d2a97199455a59d4e4a8ea6130a05309341e..341fac99ddd4a11a815a460e2339fe7a00b5450b 100644 (file)
--- a/ctr16.c
+++ b/ctr16.c
@@ -52,7 +52,7 @@ _nettle_ctr_crypt16(const void *ctx, nettle_cipher_func *f,
                    size_t length, uint8_t *dst,
                    const uint8_t *src)
 {
-  if (dst != src && !((uintptr_t) dst % sizeof(uint64_t)))
+  if (dst != src && !((uintptr_t) dst % alignof(union nettle_block16)))
     {
       size_t blocks = length / 16u;
       size_t done;
index 04febc7c65bf58f0fd2a85d31f9642693719181a..da4195abe87898b3e4f388de0d4bfb5695fc01f2 100644 (file)
@@ -34,6 +34,7 @@
 
 /* For size_t */
 #include <stddef.h>
+#include <stdalign.h>
 #include <stdint.h>
 
 /* Attributes we want to use in installed header files, and hence
 extern "C" {
 #endif
 
+/* On 64-bit platforms where uint64_t requires 8 byte alignment, use
+   twice the alignment. */
+#define _NETTLE_ALIGN16 alignas(alignof(uint64_t) == 8 ? 16 : 0)
+
 /* An aligned 16-byte block. */
 union nettle_block16
 {
   uint8_t b[16];
-  uint64_t u64[2];
+  uint64_t _NETTLE_ALIGN16 u64[2];
 };
 
 union nettle_block8
diff --git a/umac.h b/umac.h
index 5efb4338dd005c4795035ceb931833c2f0703ad1..01579f365906c107fa86c4d34e3fc9083e60af0c 100644 (file)
--- a/umac.h
+++ b/umac.h
@@ -70,7 +70,7 @@ extern "C" {
 
 /* Subkeys and state for UMAC with tag size 32*n bits. */
 #define _UMAC_STATE(n)                                 \
-  uint32_t l1_key[UMAC_BLOCK_SIZE/4 + 4*((n)-1)];      \
+  uint32_t _NETTLE_ALIGN16 l1_key[UMAC_BLOCK_SIZE/4 + 4*((n)-1)];      \
   /* Keys in 32-bit pieces, high first */              \
   uint32_t l2_key[6*(n)];                              \
   uint64_t l3_key1[8*(n)];                             \