From 600c8f626d8cc802c372d2ad6d435bdd10d11f6a Mon Sep 17 00:00:00 2001 From: Wentao Shang Date: Fri, 25 Mar 2016 11:06:04 -0700 Subject: [PATCH] hashes/sha256: support unaligned memory access in be32enc_vect --- sys/hashes/sha256.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/sys/hashes/sha256.c b/sys/hashes/sha256.c index 5317dfe06c..9f3b77d8df 100644 --- a/sys/hashes/sha256.c +++ b/sys/hashes/sha256.c @@ -64,11 +64,23 @@ */ static void be32enc_vect(void *dst_, const void *src_, size_t len) { - uint32_t *dst = dst_; - const uint32_t *src = src_; - - for (size_t i = 0; i < len / 4; i++) { - dst[i] = __builtin_bswap32(src[i]); + if ((uintptr_t)dst_ % sizeof(uint32_t) == 0 && + (uintptr_t)src_ % sizeof(uint32_t) == 0) { + uint32_t *dst = dst_; + const uint32_t *src = src_; + for (size_t i = 0; i < len / 4; i++) { + dst[i] = __builtin_bswap32(src[i]); + } + } + else { + uint8_t *dst = dst_; + const uint8_t *src = src_; + for (size_t i = 0; i < len; i += 4) { + dst[i] = src[i + 3]; + dst[i + 1] = src[i + 2]; + dst[i + 2] = src[i + 1]; + dst[i + 3] = src[i]; + } } }