From: Greg Hudson Date: Mon, 30 Nov 2009 16:12:36 +0000 (+0000) Subject: Make the crc32 hash provider correctly chain multiple input buffers, X-Git-Tag: krb5-1.8-alpha1~123 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a8927d0c4e159601aab0d68740dfe0b53ccf9328;p=thirdparty%2Fkrb5.git Make the crc32 hash provider correctly chain multiple input buffers, so that it returns the same result if you pass it one big buffer or many small buffers containing the same data. To do this, change the contract of mit_crc32 so that the cksum parameter is in-out. git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@23386 dc483132-0cff-0310-8789-dd5450dbe970 --- diff --git a/src/lib/crypto/builtin/hash_provider/hash_crc32.c b/src/lib/crypto/builtin/hash_provider/hash_crc32.c index e748c98cfe..58efffe4f3 100644 --- a/src/lib/crypto/builtin/hash_provider/hash_crc32.c +++ b/src/lib/crypto/builtin/hash_provider/hash_crc32.c @@ -33,17 +33,15 @@ static krb5_error_code k5_crc32_hash(unsigned int icount, const krb5_data *input, krb5_data *output) { - unsigned long c, cn; + unsigned long c; unsigned int i; if (output->length != CRC32_CKSUM_LENGTH) return(KRB5_CRYPTO_INTERNAL); c = 0; - for (i=0; idata); return(0); diff --git a/src/lib/crypto/crypto_tests/t_crc.c b/src/lib/crypto/crypto_tests/t_crc.c index 6d06334dd7..69a6468053 100644 --- a/src/lib/crypto/crypto_tests/t_crc.c +++ b/src/lib/crypto/crypto_tests/t_crc.c @@ -121,6 +121,7 @@ timetest(unsigned int nblk, unsigned int blksiz) block[i] = i % 256; times(&before); for (i = 0; i < nblk; i++) { + cksum = 0; mit_crc32(block + i * blksiz, blksiz, &cksum); } @@ -136,6 +137,7 @@ timetest(unsigned int nblk, unsigned int blksiz) #ifdef CRC32_SHIFT4 times(&before); for (i = 0; i < nblk; i++) { + cksum = 0; mit_crc32_shift4(block + i * blksiz, blksiz, &cksum); } times(&after); @@ -185,11 +187,13 @@ verify(void) case STR: len = strlen(trial.data); typestr = "STR"; + cksum = 0; mit_crc32(trial.data, len, &cksum); break; case HEX: typestr = "HEX"; gethexstr(trial.data, &len, buf, 4); + cksum = 0; mit_crc32(buf, len, &cksum); break; default: diff --git a/src/lib/crypto/krb/crc32/crc-32.h b/src/lib/crypto/krb/crc32/crc-32.h index 95001f59d3..5c28b8b790 100644 --- a/src/lib/crypto/krb/crc32/crc-32.h +++ b/src/lib/crypto/krb/crc32/crc-32.h @@ -60,6 +60,7 @@ #define CRC32_CKSUM_LENGTH 4 +/* c is in-out to allow chaining; initialize to 0. */ void mit_crc32 (krb5_pointer in, size_t in_length, unsigned long *c); diff --git a/src/lib/crypto/krb/crc32/crc32.c b/src/lib/crypto/krb/crc32/crc32.c index 4909798031..ef364f3ed9 100644 --- a/src/lib/crypto/krb/crc32/crc32.c +++ b/src/lib/crypto/krb/crc32/crc32.c @@ -151,7 +151,7 @@ void mit_crc32(krb5_pointer in, size_t in_length, unsigned long *cksum) { register u_char *data; - register u_long c = 0; + register u_long c = *cksum; register int idx; size_t i; @@ -178,7 +178,7 @@ void mit_crc32_shift4(krb5_pointer in, size_t in_length, unsigned long *cksum) { register unsigned char *data, b; - register unsigned long c = 0; + register unsigned long c = *cksum; size_t i; data = (u_char *)in; diff --git a/src/lib/crypto/openssl/hash_provider/hash_crc32.c b/src/lib/crypto/openssl/hash_provider/hash_crc32.c index e748c98cfe..58efffe4f3 100644 --- a/src/lib/crypto/openssl/hash_provider/hash_crc32.c +++ b/src/lib/crypto/openssl/hash_provider/hash_crc32.c @@ -33,17 +33,15 @@ static krb5_error_code k5_crc32_hash(unsigned int icount, const krb5_data *input, krb5_data *output) { - unsigned long c, cn; + unsigned long c; unsigned int i; if (output->length != CRC32_CKSUM_LENGTH) return(KRB5_CRYPTO_INTERNAL); c = 0; - for (i=0; idata); return(0);