From 4ad308fca3010379cb4a47023635fb2fcabb63a3 Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Sun, 17 May 2026 19:52:13 +0200 Subject: Fix undefined behaviour MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- libblake_blake2b_init.c | 4 ++-- libblake_blake2s_init.c | 4 ++-- libblake_internal_blake2xb_init0.c | 1 + libblake_internal_blake2xs_init0.c | 16 ++++++++-------- 4 files changed, 13 insertions(+), 12 deletions(-) diff --git a/libblake_blake2b_init.c b/libblake_blake2b_init.c index 9670bc3..9f22b12 100644 --- a/libblake_blake2b_init.c +++ b/libblake_blake2b_init.c @@ -42,8 +42,8 @@ libblake_blake2b_init(struct libblake_blake2b_state *state, const struct libblak # pragma clang diagnostic push # pragma clang diagnostic ignored "-Wcast-align" #endif - state->h[0] ^= le64(((const uint_least64_t *)params)[0]); - state->h[1] ^= le64(((const uint_least64_t *)params)[1]); + state->h[0] ^= le64(((const uint_least64_t *)(const unsigned char *)params)[0]); + state->h[1] ^= le64(((const uint_least64_t *)(const unsigned char *)params)[1]); state->h[2] ^= le64(((uint_least64_t)params->node_depth << 0) | ((uint_least64_t)params->inner_len << 8)); state->h[4] ^= le64(*(const uint_least64_t *)¶ms->salt[0]); diff --git a/libblake_blake2s_init.c b/libblake_blake2s_init.c index 6c04332..197715f 100644 --- a/libblake_blake2s_init.c +++ b/libblake_blake2s_init.c @@ -38,8 +38,8 @@ libblake_blake2s_init(struct libblake_blake2s_state *state, const struct libblak # pragma clang diagnostic push # pragma clang diagnostic ignored "-Wcast-align" #endif - state->h[0] ^= le32(((const uint_least32_t *)params)[0]); - state->h[1] ^= le32(((const uint_least32_t *)params)[1]); + state->h[0] ^= le32(((const uint_least32_t *)(const unsigned char *)params)[0]); + state->h[1] ^= le32(((const uint_least32_t *)(const unsigned char *)params)[1]); state->h[2] ^= le32((uint_least32_t)(params->node_offset >> 0)); state->h[3] ^= le32(((uint_least32_t)(params->node_offset >> 32) & UINT_LEAST32_C(0xFFFF)) | ((uint_least32_t)params->node_depth << 16) | diff --git a/libblake_internal_blake2xb_init0.c b/libblake_internal_blake2xb_init0.c index de1980f..66b80dc 100644 --- a/libblake_internal_blake2xb_init0.c +++ b/libblake_internal_blake2xb_init0.c @@ -59,6 +59,7 @@ libblake_internal_blake2xb_init0(struct libblake_blake2xb_state *state, const st state->b2b.h[1] ^= le64(ALIGNED_U64(params, 1)); state->b2b.h[2] ^= le64(((uint_least64_t)params->node_depth << 0) | ((uint_least64_t)params->inner_len << 8)); + /* unlike BLAKE2b, BLAKE2Xb does not align .salt and .pepper to 64-bits, but 32-bits */ state->b2b.h[4] ^= le64(UNALIGNED_U64(params->salt, 0)); state->b2b.h[5] ^= le64(UNALIGNED_U64(params->salt, 1)); state->b2b.h[6] ^= le64(UNALIGNED_U64(params->pepper, 0)); diff --git a/libblake_internal_blake2xs_init0.c b/libblake_internal_blake2xs_init0.c index bde760f..ed4b3e0 100644 --- a/libblake_internal_blake2xs_init0.c +++ b/libblake_internal_blake2xs_init0.c @@ -38,14 +38,14 @@ libblake_internal_blake2xs_init0(struct libblake_blake2xs_state *state, const st # pragma clang diagnostic push # pragma clang diagnostic ignored "-Wcast-align" #endif - state->b2s.h[0] ^= le32(((const uint_least32_t *)params)[0]); - state->b2s.h[1] ^= le32(((const uint_least32_t *)params)[1]); - state->b2s.h[2] ^= le32(((const uint_least32_t *)params)[2]); - state->b2s.h[3] ^= le32(((const uint_least32_t *)params)[3]); - state->b2s.h[4] ^= le32(((const uint_least32_t *)params)[4]); - state->b2s.h[5] ^= le32(((const uint_least32_t *)params)[5]); - state->b2s.h[6] ^= le32(((const uint_least32_t *)params)[6]); - state->b2s.h[7] ^= le32(((const uint_least32_t *)params)[7]); + state->b2s.h[0] ^= le32(((const uint_least32_t *)(const unsigned char *)params)[0]); + state->b2s.h[1] ^= le32(((const uint_least32_t *)(const unsigned char *)params)[1]); + state->b2s.h[2] ^= le32(((const uint_least32_t *)(const unsigned char *)params)[2]); + state->b2s.h[3] ^= le32(((const uint_least32_t *)(const unsigned char *)params)[3]); + state->b2s.h[4] ^= le32(((const uint_least32_t *)(const unsigned char *)params)[4]); + state->b2s.h[5] ^= le32(((const uint_least32_t *)(const unsigned char *)params)[5]); + state->b2s.h[6] ^= le32(((const uint_least32_t *)(const unsigned char *)params)[6]); + state->b2s.h[7] ^= le32(((const uint_least32_t *)(const unsigned char *)params)[7]); #if defined(__clang__) # pragma clang diagnostic pop #endif -- cgit v1.3.1