/* an return a 16+1 Bytes. */
/* */
/********************************************************/
-PUBLIC MD5TYP *dig_hashmd5(unsigned char *seq)
+PUBLIC MD5TYP *dig_hashmd5(unsigned char *seq,unsigned int length)
{
#define OPEP "subdig.c:dig_hashmd5,"
while (proceed==true) {
switch (phase) {
case 0 : //do we hae a sequence?
- if ((seq==(unsigned char *)0)&&(strlen((const char *)seq)==0))
+ if ((seq==(unsigned char *)0)&&(length==0))
phase=999; //no need to go further
break;
case 1 : //getting md5 context
break;
case 2 : //doing hashing
(void) EVP_DigestInit_ex(mdctx,EVP_md5(),(ENGINE *)0);
- (void) EVP_DigestUpdate(mdctx,seq,strlen((const char *)seq));
- (void) rou_alert(0,"%s digestup de of <%s> '%d' long",OPEP,seq,strlen((const char *)seq));
+ (void) EVP_DigestUpdate(mdctx,seq,length);
+ (void) rou_alert(0,"%s digestup de of <%s> '%d' long",OPEP,seq,length);
break;
case 3 : { //assign memory
unsigned int s;
(void) snprintf(seq,sizeof(seq),"%s:%s:%s",resp->username,resp->realm,secret);
(void) rou_alert(0,"JMDPBG seq1=<%s>",seq);
- A1=dig_hashmd5((unsigned char *)seq);
+ A1=dig_hashmd5((unsigned char *)seq,strlen(seq));
//algorithm value is "MD5-sess"
(void) memset(seq,'\000',sizeof(seq));
(void) memmove(seq,(char *)A1,sizeof(MD5TYP));
(void) strcat(seq+sizeof(MD5TYP),second);
(void) rou_alert(0,"JMDPBG seq2=<%s>",seq);
(void) free(A1);
- A1=dig_hashmd5((unsigned char *)seq);
+ A1=dig_hashmd5((unsigned char *)seq,sizeof(MD5TYP)+strlen(second));
HA1=cnv_tohexa((char *)A1,sizeof(MD5TYP));
(void) free(A1);
}
MD5TYP *A2;
(void) snprintf(seq,sizeof(seq),"AUTHENTICATE:%s",resp->digesturi);
- A2=dig_hashmd5((unsigned char *)seq);
+ A2=dig_hashmd5((unsigned char *)seq,strlen(seq));
HA2=cnv_tohexa((char *)A2,sizeof(MD5TYP));
(void) free(A2);
}
(void) snprintf(seq,sizeof(seq),"%s:%s:%08lx:%s:%s:%s",
HA1,resp->nonce,resp->nc,
resp->cnonce,resp->qop,HA2);
- A3=dig_hashmd5((unsigned char *)seq);
+ A3=dig_hashmd5((unsigned char *)seq,strlen(seq));
HA3=cnv_tohexa((char *)A3,sizeof(MD5TYP));
(void) free(A3);
}