aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Andree <matthias.andree@gmx.de>2012-08-14 22:52:46 +0200
committerMatthias Andree <matthias.andree@gmx.de>2012-08-14 22:52:46 +0200
commit08c75fa2b17a2d81328abaa866e9b7534a5bcee6 (patch)
treef59fdf03c3926059883e4fe13575bf4969ffb733
parentb0cd8b7a095f7b3968f55cbf9efe2075c7ee9677 (diff)
downloadfetchmail-08c75fa2b17a2d81328abaa866e9b7534a5bcee6.tar.gz
fetchmail-08c75fa2b17a2d81328abaa866e9b7534a5bcee6.tar.bz2
fetchmail-08c75fa2b17a2d81328abaa866e9b7534a5bcee6.zip
Fix compiler aliasing warning.
-rw-r--r--fm_md5.h5
-rw-r--r--md5c.c30
2 files changed, 19 insertions, 16 deletions
diff --git a/fm_md5.h b/fm_md5.h
index 91ef93c1..f55909a4 100644
--- a/fm_md5.h
+++ b/fm_md5.h
@@ -16,7 +16,10 @@ typedef unsigned long int uint32;
struct MD5Context {
uint32 buf[4];
uint32 bits[2];
- unsigned char in[64];
+ union {
+ unsigned char in[64];
+ uint32 in32[16];
+ } u;
};
void MD5Init(struct MD5Context *context);
diff --git a/md5c.c b/md5c.c
index 49970bd0..11a61516 100644
--- a/md5c.c
+++ b/md5c.c
@@ -73,7 +73,7 @@ void MD5Update(struct MD5Context *ctx, const void *buf_, unsigned len)
/* Handle any leading odd-sized chunks */
if (t) {
- unsigned char *p = (unsigned char *) ctx->in + t;
+ unsigned char *p = (unsigned char *) ctx->u.in + t;
t = 64 - t;
if (len < t) {
@@ -81,24 +81,24 @@ void MD5Update(struct MD5Context *ctx, const void *buf_, unsigned len)
return;
}
memmove(p, buf, t);
- byteReverse(ctx->in, 16);
- MD5Transform(ctx->buf, (uint32_t *) ctx->in);
+ byteReverse(ctx->u.in, 16);
+ MD5Transform(ctx->buf, ctx->u.in32);
buf += t;
len -= t;
}
/* Process data in 64-byte chunks */
while (len >= 64) {
- memmove(ctx->in, buf, 64);
- byteReverse(ctx->in, 16);
- MD5Transform(ctx->buf, (uint32_t *) ctx->in);
+ memmove(ctx->u.in, buf, 64);
+ byteReverse(ctx->u.in, 16);
+ MD5Transform(ctx->buf, ctx->u.in32);
buf += 64;
len -= 64;
}
/* Handle any remaining bytes of data. */
- memmove(ctx->in, buf, len);
+ memmove(ctx->u.in, buf, len);
}
/*
@@ -115,7 +115,7 @@ void MD5Final(void *digest, struct MD5Context *ctx)
/* Set the first char of padding to 0x80. This is safe since there is
always at least one byte free */
- p = ctx->in + count;
+ p = ctx->u.in + count;
*p++ = 0x80;
/* Bytes of padding needed to make 64 bytes */
@@ -125,22 +125,22 @@ void MD5Final(void *digest, struct MD5Context *ctx)
if (count < 8) {
/* Two lots of padding: Pad the first block to 64 bytes */
memset(p, 0, count);
- byteReverse(ctx->in, 16);
- MD5Transform(ctx->buf, (uint32_t *) ctx->in);
+ byteReverse(ctx->u.in, 16);
+ MD5Transform(ctx->buf, ctx->u.in32);
/* Now fill the next block with 56 bytes */
- memset(ctx->in, 0, 56);
+ memset(ctx->u.in, 0, 56);
} else {
/* Pad block to 56 bytes */
memset(p, 0, count - 8);
}
- byteReverse(ctx->in, 14);
+ byteReverse(ctx->u.in, 14);
/* Append length in bits and transform */
- ((uint32_t *) ctx->in)[14] = ctx->bits[0];
- ((uint32_t *) ctx->in)[15] = ctx->bits[1];
+ ctx->u.in32[14] = ctx->bits[0];
+ ctx->u.in32[15] = ctx->bits[1];
- MD5Transform(ctx->buf, (uint32_t *) ctx->in);
+ MD5Transform(ctx->buf, ctx->u.in32);
byteReverse((unsigned char *) ctx->buf, 4);
memmove(digest, ctx->buf, 16);
memset(ctx, 0, sizeof(*ctx)); /* In case it's sensitive */