X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/fc0257c9fd26fd6efb1ac166b505f05794c155b0..fc1ae6582fa5e199cc9c50dc2297297c1893955c:/lib/mdfour.c diff --git a/lib/mdfour.c b/lib/mdfour.c index c7bc7abf..d8e86322 100644 --- a/lib/mdfour.c +++ b/lib/mdfour.c @@ -109,29 +109,53 @@ void mdfour_begin(struct mdfour *md) md->C = 0x98badcfe; md->D = 0x10325476; md->totalN = 0; + md->totalN2 = 0; } -static void mdfour_tail(unsigned char *in, int n) +static void mdfour_tail(unsigned char *in, uint32 n) { unsigned char buf[128]; uint32 M[16]; - uint32 b; - - m->totalN += n; - - b = m->totalN * 8; + extern int remote_version; + + /* + * Count total number of bits, modulo 2^64 + */ + m->totalN += n << 3; + if (m->totalN < (n << 3)) { + m->totalN2++; + } + m->totalN2 += n >> 29; memset(buf, 0, 128); if (n) memcpy(buf, in, n); buf[n] = 0x80; if (n <= 55) { - copy4(buf+56, b); + copy4(buf+56, m->totalN); + /* + * Prior to protocol version 27 only the number of bits + * modulo 2^32 was included. MD4 requires the number + * of bits modulo 2^64, which was fixed starting with + * protocol version 27. + */ + if (remote_version >= 27) { + copy4(buf+60, m->totalN2); + } copy64(M, buf); mdfour64(M); } else { - copy4(buf+120, b); + copy4(buf+120, m->totalN); + /* + * Prior to protocol version 27 only the number of bits + * modulo 2^32 was included. MD4 requires the number + * of bits modulo 2^64, which was fixed starting with + * protocol version 27. + */ + if (remote_version >= 27) { + copy4(buf+124, m->totalN2); + } copy64(M, buf); mdfour64(M); copy64(M, buf+64); @@ -139,20 +163,23 @@ static void mdfour_tail(unsigned char *in, int n) } } -void mdfour_update(struct mdfour *md, unsigned char *in, int n) +void mdfour_update(struct mdfour *md, unsigned char *in, uint32 n) { uint32 M[16]; - if (n == 0) mdfour_tail(in, n); - m = md; + if (n == 0) mdfour_tail(in, n); + while (n >= 64) { copy64(M, in); mdfour64(M); in += 64; n -= 64; - m->totalN += 64; + m->totalN += 64 << 3; + if (m->totalN < 64 << 3) { + m->totalN2++; + } } if (n) mdfour_tail(in, n);