struct aes128_ctx
{
- uint32_t keys[4 * (_AES128_ROUNDS + 1)];
+ uint32_t _NETTLE_ALIGN16 keys[4 * (_AES128_ROUNDS + 1)];
};
void
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;
/* 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
/* 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)]; \