|
Hello, I am running the 1.4.1 server on Tru64. I suspect a problem with sha.c due to the 64 bit OS, but I
do not know where to go from here. I actually already have a modified version of sha.c from someone
who claimed it fixed any 64 bit problems and I will include what is modified below.
The symptoms are: All agents or transports can not connect
due to an invalid handshake if they are written in perl, of course all agents
written in c can connect because they all use the same routine, and no one can
do anything but plain text authentication. I tried moving the perl agents to linux and connecting back
to the Tru64 server just to make sure that the perl was not the problem with
the 64 bit architecture, but of course I still had an invalid handshake
reported. Does anyone have ideas,
or have they already dealt with this? Thanks, Tim Ferguson Cable &
Wireless 719-590-4100 shahash and shahash_r are the only
functions changed in my modified sha.c: char *shahash(char *str) { char read_buffer[65]; //int read_buffer[64]; int c=1, i; long long length=0; int strsz; static char final[41]; int *hashval; if(str==NULL) return NULL; memset(read_buffer, 0, 65); hashval = (int *)malloc(20); sha_init(hashval); strsz = strlen(str); while (strsz>0) { strncpy((char
*)&read_buffer, str, 64); c = strlen((char
*)&read_buffer); length+=c; strsz-=c; if (strsz<=0) {
length<<=3;
read_buffer[c]=0x80;
for (i=c+1; i<64; i++)
read_buffer[i]=0;
if (c>55)
{
/* we need to do an entire new block */
sha_hash((int *)&read_buffer, hashval);
for (i=0; i<14; i++)
((int*)&read_buffer)[i]=0;
} #ifdef WORDS_BIGENDIAN memcpy(read_buffer+56,
&length, 8); #else
for(i=0; i<8; i++)
read_buffer[56+i]=(length>>(56-(i*8))) & 0xFF; #endif } sha_hash((int
*)&read_buffer, hashval); str+=64; } final[40] = '\0'; strprintsha((char *)&final, hashval); free(hashval); return (char *)&final; } void shahash_r(const char* str, char
hashbuf[41]) { char read_buffer[65]; //int read_buffer[64]; int c=1, i; long long length=0; int strsz; int *hashval; if(str==NULL) {
hashbuf[0] = '\0';
return; } memset(read_buffer, 0, 65); hashval = (int *)malloc(20); sha_init(hashval); strsz = strlen(str); while (strsz>0) { strncpy((char
*)&read_buffer, str, 64); c = strlen((char
*)&read_buffer); length+=c; strsz-=c; if (strsz<=0) {
length<<=3;
read_buffer[c]=0x80;
for (i=c+1; i<64; i++)
read_buffer[i]=0;
if (c>55)
{
/* we need to do an entire new block */
sha_hash((int *)&read_buffer, hashval);
for (i=0; i<14; i++)
((int*)&read_buffer)[i]=0;
} #ifdef WORDS_BIGENDIAN
memcpy(read_buffer+56, &length, 8); #else
for(i=0; i<8; i++)
{
read_buffer[56+i]=(length>>(56-(i*8))) & 0xFF;
/* we need to do an entire new block */
sha_hash((int *)&read_buffer, hashval);
for (i=0; i<14; i++)
((int*)&read_buffer)[i]=0;
} #endif } sha_hash((int
*)&read_buffer, hashval); str+=64; } hashbuf[40] = '\0'; strprintsha((char *)hashbuf, hashval); free(hashval); } |
- Re: [JDEV] Perl and c SHA problems Tim Ferguson
- Re: [JDEV] Perl and c SHA problems Thomas Muldowney
- RE: [JDEV] Perl and c SHA problems Tim Ferguson
