the alignment of resbuf is not guaranteed, so use memcpy to move the bytes in/out. on arches which can do unaligned accesses, this will generate the same code. patch by Mike Frysinger --- a/md5.c +++ b/md5.c @@ -74,10 +74,13 @@ md5_read_ctx (ctx, resbuf) const struct md5_ctx *ctx; void *resbuf; { - ((md5_uint32 *) resbuf)[0] = SWAP (ctx->A); - ((md5_uint32 *) resbuf)[1] = SWAP (ctx->B); - ((md5_uint32 *) resbuf)[2] = SWAP (ctx->C); - ((md5_uint32 *) resbuf)[3] = SWAP (ctx->D); + md5_uint32 swap; +#define set(i, c) { swap = SWAP (ctx->c); memcpy (resbuf + (i * 4), &swap, 4); } + set (0, A); + set (1, B); + set (2, C); + set (3, D); +#undef set return resbuf; }