Fix for Crays

git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@3089 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Johan Danielsson
1997-08-24 01:52:29 +00:00
parent dbfd889a1a
commit 9f2f51de52
6 changed files with 94 additions and 118 deletions

View File

@@ -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 <touch@isi.edu>
*/
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;

View File

@@ -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);

View File

@@ -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;

View File

@@ -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);

View File

@@ -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;

View File

@@ -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);