diff options
-rw-r--r-- | include/platform.h | 1 | ||||
-rw-r--r-- | libbb/hash_md5_sha.c | 6 |
2 files changed, 4 insertions, 3 deletions
diff --git a/include/platform.h b/include/platform.h index 917d87d..0fa9f61 100644 --- a/include/platform.h +++ b/include/platform.h @@ -208,6 +208,7 @@ typedef int bb__aliased_int FIX_ALIASING; typedef long bb__aliased_long FIX_ALIASING; typedef uint16_t bb__aliased_uint16_t FIX_ALIASING; typedef uint32_t bb__aliased_uint32_t FIX_ALIASING; +typedef uint64_t bb__aliased_uint64_t FIX_ALIASING; /* NB: unaligned parameter should be a pointer, aligned one - * a lvalue. This makes it more likely to not swap them by mistake diff --git a/libbb/hash_md5_sha.c b/libbb/hash_md5_sha.c index e10cb39..3f743ac 100644 --- a/libbb/hash_md5_sha.c +++ b/libbb/hash_md5_sha.c @@ -84,7 +84,7 @@ static void FAST_FUNC common64_end(md5_ctx_t *ctx, int swap_needed) if (swap_needed) t = bb_bswap_64(t); /* wbuffer is suitably aligned for this */ - memcpy(&ctx->wbuffer[64 - 8], &t, sizeof(t)); + *(bb__aliased_uint64_t *) (&ctx->wbuffer[64 - 8]) = t; } ctx->process_block(ctx); if (remaining >= 8) @@ -883,10 +883,10 @@ void FAST_FUNC sha512_end(sha512_ctx_t *ctx, void *resbuf) uint64_t t; t = ctx->total64[0] << 3; t = SWAP_BE64(t); - memcpy(&ctx->wbuffer[128 - 8], &t, sizeof(t)); + *(bb__aliased_uint64_t *) (&ctx->wbuffer[128 - 8]) = t; t = (ctx->total64[1] << 3) | (ctx->total64[0] >> 61); t = SWAP_BE64(t); - memcpy(&ctx->wbuffer[128 - 16], &t, sizeof(t)); + *(bb__aliased_uint64_t *) (&ctx->wbuffer[128 - 16]) = t; } sha512_process_block128(ctx); if (remaining >= 16) |