--- mech_digest_md5.c 2 Dec 2004 +++ mech_digest_md5.c 2 Dec 2004 @@ -29,6 +29,7 @@ #define SP (32) #define DEL (127) +md5_byte_t * myhex2raw(char *hexs); static char *_opt_quote(char *in) { int nesc; char *r, *out, *w; @@ -539,6 +540,7 @@ md->cnonce = pstrdup(md->p, cnonce); md->nc = pstrdup(md->p, nc); + /************** COMMENTED OUT BY RYAN LOWE - MD5 HACK + *********************** md5_init(&md5); md5_append(&md5, username, strlen(username)); md5_append(&md5, ":", 1); @@ -546,6 +548,10 @@ md5_append(&md5, ":", 1); if(pass != NULL) md5_append(&md5, pass, strlen(pass)); md5_finish(&md5, hash); + + ********************************************************************** + ******/ + + md5_byte_t *hashtemp = myhex2raw(pass); + mempcpy(hash, hashtemp, 16); md5_init(&md5); md5_append(&md5, hash, 16); @@ -675,3 +681,72 @@ return 0; } + +md5_byte_t * myhex2raw(char *hexs) +{ + char bins[129]; + int i=0; + while (i<128){ + bins[i]='0'; + i++; + } + i=0; + while(i<32){ + if(hexs[i]=='0') { + bins[i*4+0] = '0'; bins[i*4+1] = '0'; bins[i*4+2] = '0'; bins[i*4+3] = '0'; } + if(hexs[i]=='1') { + bins[i*4+0] = '0'; bins[i*4+1] = '0'; bins[i*4+2] = '0'; bins[i*4+3] = '1'; } + if(hexs[i]=='2') { + bins[i*4+0] = '0'; bins[i*4+1] = '0'; bins[i*4+2] = '1'; bins[i*4+3] = '0'; } + if(hexs[i]=='3') { + bins[i*4+0] = '0'; bins[i*4+1] = '0'; bins[i*4+2] = '1'; bins[i*4+3] = '1'; } + if(hexs[i]=='4') { + bins[i*4+0] = '0'; bins[i*4+1] = '1'; bins[i*4+2] = '0'; bins[i*4+3] = '0'; } + if(hexs[i]=='5') { + bins[i*4+0] = '0'; bins[i*4+1] = '1'; bins[i*4+2] = '0'; bins[i*4+3] = '1'; } + if(hexs[i]=='6') { + bins[i*4+0] = '0'; bins[i*4+1] = '1'; bins[i*4+2] = '1'; bins[i*4+3] = '0'; } + if(hexs[i]=='7') { + bins[i*4+0] = '0'; bins[i*4+1] = '1'; bins[i*4+2] = '1'; bins[i*4+3] = '1'; } + if(hexs[i]=='8') { + bins[i*4+0] = '1'; bins[i*4+1] = '0'; bins[i*4+2] = '0'; bins[i*4+3] = '0'; } + if(hexs[i]=='9') { + bins[i*4+0] = '1'; bins[i*4+1] = '0'; bins[i*4+2] = '0'; bins[i*4+3] = '1'; } + if(hexs[i]=='a') { + bins[i*4+0] = '1'; bins[i*4+1] = '0'; bins[i*4+2] = '1'; bins[i*4+3] = '0'; } + if(hexs[i]=='b') { + bins[i*4+0] = '1'; bins[i*4+1] = '0'; bins[i*4+2] = '1'; bins[i*4+3] = '1'; } + if(hexs[i]=='c') { + bins[i*4+0] = '1'; bins[i*4+1] = '1'; bins[i*4+2] = '0'; bins[i*4+3] = '0'; } + if(hexs[i]=='d') { + bins[i*4+0] = '1'; bins[i*4+1] = '1'; bins[i*4+2] = '0'; bins[i*4+3] = '1'; } + if(hexs[i]=='e') { + bins[i*4+0] = '1'; bins[i*4+1] = '1'; bins[i*4+2] = '1'; bins[i*4+3] = '0'; } + if(hexs[i]=='f') { + bins[i*4+0] = '1'; bins[i*4+1] = '1'; bins[i*4+2] = '1'; bins[i*4+3] = '1'; } + i++; + } + bins[i*4]='\0'; + + md5_byte_t hash[16]; + i=0; + while (i<16){ + hash[i] = 0x0; + i++; + } + i=0; + while (i<16){ + + int j=0; + while(j<8){ + if(bins[i*8+j] == '1') + hash[i] = hash[i] | 0x01; + + if(j!=7) + hash[i] = hash[i] << 1; + j++; + } + i++; + } + return hash; +}