aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGreg Hudson <ghudson@mit.edu>2009-11-30 16:12:36 +0000
committerGreg Hudson <ghudson@mit.edu>2009-11-30 16:12:36 +0000
commita8927d0c4e159601aab0d68740dfe0b53ccf9328 (patch)
treeaf470cc2de44ed23885d91a76f312a0a68991db0 /src
parentbb7801ed460acdfde84de1310494e11ea62cd06a (diff)
downloadkrb5-a8927d0c4e159601aab0d68740dfe0b53ccf9328.zip
krb5-a8927d0c4e159601aab0d68740dfe0b53ccf9328.tar.gz
krb5-a8927d0c4e159601aab0d68740dfe0b53ccf9328.tar.bz2
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
Diffstat (limited to 'src')
-rw-r--r--src/lib/crypto/builtin/hash_provider/hash_crc32.c8
-rw-r--r--src/lib/crypto/crypto_tests/t_crc.c4
-rw-r--r--src/lib/crypto/krb/crc32/crc-32.h1
-rw-r--r--src/lib/crypto/krb/crc32/crc32.c4
-rw-r--r--src/lib/crypto/openssl/hash_provider/hash_crc32.c8
5 files changed, 13 insertions, 12 deletions
diff --git a/src/lib/crypto/builtin/hash_provider/hash_crc32.c b/src/lib/crypto/builtin/hash_provider/hash_crc32.c
index e748c98..58efffe 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; i<icount; i++) {
- mit_crc32(input[i].data, input[i].length, &cn);
- c ^= cn;
- }
+ for (i=0; i<icount; i++)
+ mit_crc32(input[i].data, input[i].length, &c);
store_32_le(c, output->data);
return(0);
diff --git a/src/lib/crypto/crypto_tests/t_crc.c b/src/lib/crypto/crypto_tests/t_crc.c
index 6d06334..69a6468 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 95001f5..5c28b8b 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 4909798..ef364f3 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 e748c98..58efffe 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; i<icount; i++) {
- mit_crc32(input[i].data, input[i].length, &cn);
- c ^= cn;
- }
+ for (i=0; i<icount; i++)
+ mit_crc32(input[i].data, input[i].length, &c);
store_32_le(c, output->data);
return(0);