From 9f2f51de52204f88f8f1b2d6ddd112b951f683e5 Mon Sep 17 00:00:00 2001 From: Johan Danielsson Date: Sun, 24 Aug 1997 01:52:29 +0000 Subject: [PATCH] Fix for Crays git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@3089 ec53bebd-3082-4978-b11e-865c3cabbd6b --- lib/des/md4.c | 70 +++++++++++++++++++++++---------------------------- lib/des/md4.h | 6 ++--- lib/des/md5.c | 62 ++++++++++++++++++++------------------------- lib/des/md5.h | 2 +- lib/des/sha.c | 66 +++++++++++++++++++++--------------------------- lib/des/sha.h | 6 ++--- 6 files changed, 94 insertions(+), 118 deletions(-) diff --git a/lib/des/md4.c b/lib/des/md4.c index 15eab2395..155730eb3 100644 --- a/lib/des/md4.c +++ b/lib/des/md4.c @@ -68,7 +68,7 @@ md4_init (struct md4 *m) A = 0x67452301; } -static inline u_int32_t +static u_int32_t cshift (u_int32_t x, unsigned n) { return (x << n) | (x >> (32 - n)); @@ -85,7 +85,7 @@ a = cshift(a + OP(b,c,d) + X[k] + i, s) #define DO2(a,b,c,d,k,s,i) DOIT(a,b,c,d,k,s,i,G) #define DO3(a,b,c,d,k,s,i) DOIT(a,b,c,d,k,s,i,H) -static inline void +static void calc (struct md4 *m, u_int32_t *data) { u_int32_t AA, BB, CC, DD; @@ -171,7 +171,7 @@ calc (struct md4 *m, u_int32_t *data) * From `Performance analysis of MD5' by Joseph D. Touch */ -static inline u_int32_t +static u_int32_t swap_u_int32_t (u_int32_t t) { #if defined(WORDS_BIGENDIAN) @@ -189,48 +189,38 @@ swap_u_int32_t (u_int32_t t) #endif } +struct x32{ + unsigned int a:32; + unsigned int b:32; +}; + void -md4_update (struct md4 *m, void *v, size_t len) +md4_update (struct md4 *m, const void *v, size_t len) { - u_char *p = (u_char *)v; + const unsigned char *p = v; m->sz += len; - if (m->offset == 0 && len % 64 == 0) - while (len > 0) { + while(len > 0){ + size_t l = min(len, 64 - m->offset); + memcpy(m->save + m->offset, p, l); + m->offset += l; + p += l; + len -= l; + if(m->offset == 64){ #if defined(WORDS_BIGENDIAN) - { - int i; - u_int32_t *u = (u_int32_t *)p; - - for (i = 0; i < 16; ++i) - m->current[i] = swap_u_int32_t (u[i]); + int i; + u_int32_t current[16]; + struct x32 *u = (struct x32*)m->save; + for(i = 0; i < 8; i++){ + current[2*i+0] = swap_u_int32_t(u[i].a); + current[2*i+1] = swap_u_int32_t(u[i].b); } - calc (m, m->current); + calc(m, current); #else - calc (m, (u_int32_t *)p); + calc(m, (u_int32_t*)m->save); #endif - p += 64; - len -= 64; - } - else - while (len > 0) { - unsigned l; - - l = min(64 - m->offset, len); - memcpy ((char *)m->current + m->offset, p, l); - p += l; - len -= l; - m->offset += l; - if (m->offset == 64) { -#if defined(WORDS_BIGENDIAN) - int i; - - for (i = 0; i < 16; ++i) - m->current[i] = swap_u_int32_t (m->current[i]); -#endif - calc (m, m->current); - m->offset = 0; - } + m->offset = 0; } + } } void @@ -243,8 +233,10 @@ md4_finito (struct md4 *m, void *res) *zeros = 0x80; memset (zeros + 1, 0, sizeof(zeros) - 1); len = 8 * m->sz; - len = swap_u_int32_t (len); - memcpy (zeros + dstart, &len, sizeof(len)); + zeros[dstart+0] = (len >> 0) & 0xff; + zeros[dstart+1] = (len >> 8) & 0xff; + zeros[dstart+2] = (len >> 16) & 0xff; + zeros[dstart+3] = (len >> 24) & 0xff; md4_update (m, zeros, dstart + 8); { int i; diff --git a/lib/des/md4.h b/lib/des/md4.h index 4a40a7997..4b807b210 100644 --- a/lib/des/md4.h +++ b/lib/des/md4.h @@ -49,11 +49,11 @@ struct md4 { unsigned offset; - u_int32_t counter[4]; - u_int32_t current[16]; unsigned sz; + u_int32_t counter[4]; + unsigned char save[64]; }; void md4_init (struct md4 *m); -void md4_update (struct md4 *m, void *p, size_t len); +void md4_update (struct md4 *m, const void *p, size_t len); void md4_finito (struct md4 *m, void *res); diff --git a/lib/des/md5.c b/lib/des/md5.c index 91e44b212..af0d80723 100644 --- a/lib/des/md5.c +++ b/lib/des/md5.c @@ -213,48 +213,38 @@ swap_u_int32_t (u_int32_t t) #endif } +struct x32{ + unsigned int a:32; + unsigned int b:32; +}; + void md5_update (struct md5 *m, const void *v, size_t len) { - u_char *p = (u_char *)v; + const unsigned char *p = v; m->sz += len; - if (m->offset == 0 && len % 64 == 0) - while (len > 0) { + while(len > 0){ + size_t l = min(len, 64 - m->offset); + memcpy(m->save + m->offset, p, l); + m->offset += l; + p += l; + len -= l; + if(m->offset == 64){ #if defined(WORDS_BIGENDIAN) - { - int i; - u_int32_t *u = (u_int32_t *)p; - - for (i = 0; i < 16; ++i) - m->current[i] = swap_u_int32_t (u[i]); + int i; + u_int32_t current[16]; + struct x32 *u = (struct x32*)m->save; + for(i = 0; i < 8; i++){ + current[2*i+0] = swap_u_int32_t(u[i].a); + current[2*i+1] = swap_u_int32_t(u[i].b); } - calc (m, m->current); + calc(m, current); #else - calc (m, (u_int32_t *)p); + calc(m, (u_int32_t*)m->save); #endif - p += 64; - len -= 64; - } - else - while (len > 0) { - unsigned l; - - l = min(64 - m->offset, len); - memcpy ((char *)m->current + m->offset, p, l); - p += l; - len -= l; - m->offset += l; - if (m->offset == 64) { -#if defined(WORDS_BIGENDIAN) - int i; - - for (i = 0; i < 16; ++i) - m->current[i] = swap_u_int32_t (m->current[i]); -#endif - calc (m, m->current); - m->offset = 0; - } + m->offset = 0; } + } } void @@ -267,8 +257,10 @@ md5_finito (struct md5 *m, void *res) *zeros = 0x80; memset (zeros + 1, 0, sizeof(zeros) - 1); len = 8 * m->sz; - len = swap_u_int32_t (len); - memcpy (zeros + dstart, &len, sizeof(len)); + zeros[dstart+0] = (len >> 0) & 0xff; + zeros[dstart+1] = (len >> 8) & 0xff; + zeros[dstart+2] = (len >> 16) & 0xff; + zeros[dstart+3] = (len >> 24) & 0xff; md5_update (m, zeros, dstart + 8); { int i; diff --git a/lib/des/md5.h b/lib/des/md5.h index d54c58408..2a11f5dd1 100644 --- a/lib/des/md5.h +++ b/lib/des/md5.h @@ -51,7 +51,7 @@ struct md5 { unsigned offset; unsigned sz; u_int32_t counter[4]; - u_int32_t current[16]; + unsigned char save[64]; }; void md5_init (struct md5 *m); diff --git a/lib/des/sha.c b/lib/des/sha.c index 1c53e582a..3f0871dd2 100644 --- a/lib/des/sha.c +++ b/lib/des/sha.c @@ -237,48 +237,38 @@ swap_u_int32_t (u_int32_t t) #endif } +struct x32{ + unsigned int a:32; + unsigned int b:32; +}; + void -sha_update (struct sha *m, void *v, size_t len) +sha_update (struct sha *m, const void *v, size_t len) { - u_char *p = (u_char *)v; + const unsigned char *p = v; m->sz += len; - if (m->offset == 0 && len % 64 == 0) - while (len > 0) { -#if !defined(WORDS_BIGENDIAN) - { - int i; - u_int32_t *u = (u_int32_t *)p; - - for (i = 0; i < 16; ++i) - m->current[i] = swap_u_int32_t (u[i]); + while(len > 0){ + size_t l = min(len, 64 - m->offset); + memcpy(m->save + m->offset, p, l); + m->offset += l; + p += l; + len -= l; + if(m->offset == 64){ +#if !defined(WORDS_BIGENDIAN) || defined(_CRAY) + int i; + u_int32_t current[16]; + struct x32 *u = (struct x32*)m->save; + for(i = 0; i < 8; i++){ + current[2*i+0] = swap_u_int32_t(u[i].a); + current[2*i+1] = swap_u_int32_t(u[i].b); } - calc (m, m->current); + calc(m, current); #else - calc (m, (u_int32_t *)p); + calc(m, (u_int32_t*)m->save); #endif - p += 64; - len -= 64; - } - else - while (len > 0) { - unsigned l; - - l = min(64 - m->offset, len); - memcpy ((char *)m->current + m->offset, p, l); - p += l; - len -= l; - m->offset += l; - if (m->offset == 64) { -#if !defined(WORDS_BIGENDIAN) - int i; - - for (i = 0; i < 16; ++i) - m->current[i] = swap_u_int32_t (m->current[i]); -#endif - calc (m, m->current); - m->offset = 0; - } + m->offset = 0; } + } } void @@ -291,8 +281,10 @@ sha_finito (struct sha *m, void *res) *zeros = 0x80; memset (zeros + 1, 0, sizeof(zeros) - 1); len = 8 * m->sz; - len = swap_u_int32_t (len); - memcpy (zeros + dstart + 4, &len, sizeof(len)); + zeros[dstart+7] = (len >> 0) & 0xff; + zeros[dstart+6] = (len >> 8) & 0xff; + zeros[dstart+5] = (len >> 16) & 0xff; + zeros[dstart+4] = (len >> 24) & 0xff; sha_update (m, zeros, dstart + 8); { int i; diff --git a/lib/des/sha.h b/lib/des/sha.h index 45c9877df..3620669ee 100644 --- a/lib/des/sha.h +++ b/lib/des/sha.h @@ -49,11 +49,11 @@ struct sha { unsigned offset; - u_int32_t counter[5]; - u_int32_t current[20]; unsigned sz; + u_int32_t counter[5]; + unsigned char save[64]; }; void sha_init (struct sha *m); -void sha_update (struct sha *m, void *v, size_t len); +void sha_update (struct sha *m, const void *v, size_t len); void sha_finito (struct sha *m, void *res);