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.tremily.us/?a=commitdiff_plain;h=a8927d0c4e159601aab0d68740dfe0b53ccf9328;p=krb5.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 e748c98cf..58efffe4f 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 6d06334dd..69a646805 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 95001f59d..5c28b8b79 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 490979803..ef364f3ed 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 e748c98cf..58efffe4f 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);