[JDEV] Perl and c SHA problems
Tim Ferguson
tim.ferguson at cw.com
Wed Nov 14 09:52:48 CST 2001
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);
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://www.jabber.org/jdev/attachments/20011114/ebb1cb20/attachment-0002.htm>
More information about the JDev
mailing list