Fix byte ordering: encode state words in little-endian; don't memcpy!
authorTaylor R Campbell <campbell@mumble.net>
Fri, 11 Jan 2019 09:36:00 +0000 (09:36 +0000)
committerTaylor R Campbell <campbell@mumble.net>
Fri, 11 Jan 2019 09:36:45 +0000 (09:36 +0000)
How did I miss this earlier!?

src/microcode/md5.c

index 2f797b4dbbbd3bda04d682b8dd68d0fbcfb58ac6..a9a0fe5becbfe9b80f97f5dd5ab73f7168e5de08 100644 (file)
@@ -57,6 +57,17 @@ le32dec(const void *buf)
        return v;
 }
 
+static inline void
+le32enc(void *buf, uint32_t v)
+{
+       uint8_t *p = buf;
+
+       p[0] = (v >>  0) & 0xff;
+       p[1] = (v >>  8) & 0xff;
+       p[2] = (v >> 16) & 0xff;
+       p[3] = (v >> 24) & 0xff;
+}
+
 static inline void
 le64enc(void *buf, uint64_t v)
 {
@@ -250,6 +261,7 @@ md5_update(struct md5 *M, const void *buf, size_t len)
 void
 md5_final(struct md5 *M, uint8_t h[16])
 {
+       unsigned n;
 
        assert(M->i < sizeof(M->block));
        assert(M->i == M->b % 64);
@@ -281,7 +293,8 @@ md5_final(struct md5 *M, uint8_t h[16])
        md5_compress(M->state, M->block);
 
        /* Reveal the complete state.  (Sorry, length-extension!)  */
-       (void)memcpy(h, M->state, sizeof(M->state));
+       for (n = 0; n < sizeof(M->state)/sizeof(M->state[0]); n++)
+               le32enc(&h[4*n], M->state[n]);
 
        /* Zero it all.  */
        (void)explicit_memset(M, 0, sizeof M);