{
MD5_Context *ctx = (MD5_Context *)h;
const char *buf = (const char *)vbuf;
+ uint32_t *aligned_ptr = NULL;
+ if (is_aligned(ctx->in, sizeof(uint32_t)))
+ aligned_ptr = (uint32_t *)((size_t)ctx->in);
+ else
+ ASSERT2(0, "Unaligned memory");
uint32_t t;
/* Update bitcount */
return;
}
memcpy(p, buf, t);
- byteReverse((uint32_t*)ctx->in, 16);
- MD5Transform(ctx->buf, (uint32_t*)ctx->in);
+ byteReverse(aligned_ptr, 16);
+ MD5Transform(ctx->buf, aligned_ptr);
buf += t;
len -= t;
}
while (len >= 64) {
memcpy(ctx->in, buf, 64);
- byteReverse((uint32_t*)ctx->in, 16);
- MD5Transform(ctx->buf, (uint32_t*)ctx->in);
+ byteReverse(aligned_ptr, 16);
+ MD5Transform(ctx->buf, aligned_ptr);
buf += 64;
len -= 64;
}
MD5_Context *ctx = (MD5_Context *)h;
unsigned count;
unsigned char *p;
+ uint32_t *aligned_ptr = NULL;
+ if (is_aligned(ctx->in, sizeof(uint32_t)))
+ aligned_ptr = (uint32_t *)((size_t)ctx->in);
+ else
+ ASSERT2(0, "Unaligned memory");
/* Compute number of bytes mod 64 */
count = (ctx->bits >> 3) & 0x3F;
if (count < 8) {
/* Two lots of padding: Pad the first block to 64 bytes */
memset(p, 0, count);
- byteReverse((uint32_t*)ctx->in, 16);
- MD5Transform(ctx->buf, (uint32_t *) ctx->in);
+ byteReverse(aligned_ptr, 16);
+ MD5Transform(ctx->buf, aligned_ptr);
/* Now fill the next block with 56 bytes */
memset(ctx->in, 0, 56);
/* Pad block to 56 bytes */
memset(p, 0, count - 8);
}
- byteReverse((uint32_t*)ctx->in, 14);
+ byteReverse(aligned_ptr, 14);
/* Append length in bits and transform */
- ((uint32_t*) ctx->in)[14] = (uint32_t)ctx->bits;
- ((uint32_t*) ctx->in)[15] = (uint32_t)(ctx->bits >> 32);
+ aligned_ptr[14] = (uint32_t)ctx->bits;
+ aligned_ptr[15] = (uint32_t)(ctx->bits >> 32);
- MD5Transform(ctx->buf, (uint32_t *) ctx->in);
+ MD5Transform(ctx->buf, aligned_ptr);
byteReverse((uint32_t*)ctx->buf, 4);
PURGE(ctx->in);