diff options
author | J.W. Schultz <jw@samba.org> | 2003-04-10 01:50:12 +0000 |
---|---|---|
committer | J.W. Schultz <jw@samba.org> | 2003-04-10 01:50:12 +0000 |
commit | fc1ae6582fa5e199cc9c50dc2297297c1893955c (patch) | |
tree | 2f1fb17a715859c2f7716c7b2919e72f97208f2f /lib | |
parent | fc0257c9fd26fd6efb1ac166b505f05794c155b0 (diff) | |
download | rsync-fc1ae6582fa5e199cc9c50dc2297297c1893955c.tar.gz rsync-fc1ae6582fa5e199cc9c50dc2297297c1893955c.tar.bz2 rsync-fc1ae6582fa5e199cc9c50dc2297297c1893955c.zip |
- for protocol version >= 27, mdfour_tail() is called when the block size
(including checksum_seed) is a multiple of 64. Previously it was not
called, giving the wrong MD4 checksum.
- for protocol version >= 27, a 64 bit bit counter is used in mdfour.c as
required by the RFC. Previously only a 32 bit bit counter was used,
causing incorrect MD4 file checksums for file sizes >= 512MB - 4.
-- Craig Barratt
Diffstat (limited to 'lib')
-rw-r--r-- | lib/mdfour.c | 51 | ||||
-rw-r--r-- | lib/mdfour.h | 5 |
2 files changed, 42 insertions, 14 deletions
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); diff --git a/lib/mdfour.h b/lib/mdfour.h index 2dd5527f..b0f3176f 100644 --- a/lib/mdfour.h +++ b/lib/mdfour.h @@ -21,11 +21,12 @@ struct mdfour { uint32 A, B, C, D; - uint32 totalN; + uint32 totalN; /* bit count, lower 32 bits */ + uint32 totalN2; /* bit count, upper 32 bits */ }; void mdfour_begin(struct mdfour *md); -void mdfour_update(struct mdfour *md, unsigned char *in, int n); +void mdfour_update(struct mdfour *md, unsigned char *in, uint32 n); void mdfour_result(struct mdfour *md, unsigned char *out); void mdfour(unsigned char *out, unsigned char *in, int n); |