#include #include #include "crc32.c" #include "md5.c" // Many thanks to ackbar for the tracing static unsigned long part4_table[16] = { 0x1AE, 0x002, 0xA6C, 0xF72, 0x000, 0x0BA, 0x004, 0x00C, 0x003, 0x0D9, 0x0FD, 0x005, 0x008, 0x039, 0xAEF, 0x0FA }; char *calcpart4(unsigned char *buf) { static char ret[60]; char *ptr = ret; unsigned long i, j, k; // part1 for (i=0 ; i<6 ; i++) { j = 9-i; k = (j+1 == 10) ? 5 : j+1; ptr += sprintf(ptr, "%03X", (buf[k] >> 5) | ((buf[j] << 3) & 0xff) | ((buf[j] & 1) << 8)); } // part2 ptr += sprintf(ptr, "%lX13", ~calc_crc(buf+10, 6, 0)); // part3 for (i=0 ; i<8 ; i++) { j = buf[16 + i/2]; if (!(i & 1)) j >>= 4; j &= 0xf; if (part4_table[j]) ptr += sprintf(ptr, "%lX", part4_table[j]); } return ret; } char *calcmd5(unsigned char *buf) { static char ret[33]; unsigned char md5[16]; // calc_md5(buf, 20, md5); calc_md5_20(buf, md5); int i; for (i=0 ; i<16 ; i++) sprintf(ret+2*i, "%.2X", md5[i]); return ret; } int main(int argc, char **argv) { char *md5; long sum, mult; char *part4; unsigned char *uarg = (unsigned char *)argv[1]; if (argc < 2 || strlen(argv[1]) != 20) { printf("Usage: %s X*20\n", argv[0]); return 0; } init_crc(); init_md5(); md5 = calcmd5(uarg); sum = uarg[0] + uarg[1] + uarg[2] + uarg[3]; mult = uarg[0] * uarg[1] * uarg[2] * uarg[3]; part4= calcpart4(uarg); printf("%s-%ld-%ld-%s\n", md5, sum, mult, part4); return 0; }