left = ( ctx->total[0] >>3 ) &0x3F; fill = 64 - left;
ctx->total[0] += length <<3; ctx->total[1] += length >>29;
ctx->total[0] &= 0xFFFFFFFF;
ctx->total[1] += ctx->total[0] < length <<3;
if( left && length >= fill ) {
memcpy( (void *) (ctx->buffer + left), (void *) input, fill ); md5_process( ctx, ctx->buffer ); length -= fill; input += fill; left = 0; }
while( length >= 64 ) {
md5_process( ctx, input ); length -= 64; input += 64; }
if( length ) {
memcpy( (void *) (ctx->buffer + left), (void *) input, length ); } }
static uint8 md5_padding[64] = {
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
void CMD5::md5_finish( struct md5_context *ctx, uint8 digest[16] ) {
uint32 last, padn; uint8 msglen[8];
PUT_UINT32( ctx->total[0], msglen, 0 ); PUT_UINT32( ctx->total[1], msglen, 4 );
last = ( ctx->total[0] >>3 ) &0x3F;
padn = ( last <56 ) ? ( 56 - last ) : ( 120 - last );
md5_update( ctx, md5_padding, padn ); md5_update( ctx, msglen, 8 );
PUT_UINT32( ctx->state[0], digest, 0 ); PUT_UINT32( ctx->state[1], digest, 4 ); PUT_UINT32( ctx->state[2], digest, 8 ); PUT_UINT32( ctx->state[3], digest, 12 ); }
void MD5::GenerateMD5(unsigned char* buffer,int bufferlen) {
struct md5_context context; md5_starts (&context);
md5_update (&context, buffer, bufferlen); md5_finish (&context,(unsigned char*)m_data); }
MD5::MD5() {
for(int i=0;i<4;i++) m_data[i]=0; }
MD5::MD5(unsigned long* md5src) {
memcpy(m_data,md5src,16); }int _httoi(constchar *value) {
struct CHexMap { char chr; int value; };
constint HexMapL = 16; CHexMap HexMap[HexMapL] = {
{'0', 0}, {'1', 1}, {'2', 2}, {'3', 3}, {'4', 4}, {'5', 5}, {'6', 6}, {'7', 7}, {'8', 8}, {'9', 9},
{'a', 10}, {'b', 11}, {'c', 12}, {'d', 13}, {'e', 14}, {'f', 15} };
//pthread_mutex_lock(&mutexMemory); char *mstr = strdup(value);
//pthread_mutex_unlock(&mutexMemory); char *s = mstr; int result = 0;
if (*s == '0'&& *(s + 1) == 'X') s += 2; bool firsttime = true; while (*s != '/0') {
bool found = false;
for (int i = 0; i < HexMapL; i++) {
if (*s == HexMap[i].chr) {
if (!firsttime) result <<= 4; result |= HexMap[i].value; found = true; break; } }
if (!found) break; s++;
firsttime = false; }
//pthread_mutex_lock(&mutexMemory); free(mstr); //pthread_mutex_unlock(&mutexMemory); return result; }
MD5::MD5(constchar* md5src) {
if (strcmp(md5src,\)==0) {
for(int i=0;i<4;i++) m_data[i]=0; return; }
for(int j = 0; j <16; j++ ) {
char buf[10];
strncpy(buf,md5src,2); md5src+=2;
((unsigned char*)m_data)[j] = _httoi(buf); } }
MD5 MD5::operator +(CMD5 adder) {
unsigned long m_newdata[4]; for(int i=0;i<4;i++)
m_newdata[i]=m_data[i]^(adder.m_data[i]); return MD5(m_newdata); }
bool MD5::operator ==(MD5 cmper) {
return (memcmp(cmper.m_data ,m_data,16)==0); }
//void MD5::operator =(MD5 equer)//{// memcpy(m_data,equer.m_data ,16);//} string MD5::ToString() {
char output[33];
for(int j = 0; j <16; j++ ) {
sprintf( output + j * 2, \, ((unsigned char*)m_data)[j]); }
returnstring(output); }