#include "md5.h" #include #include unsigned int lsrf(); /* Get a random number */ static void checksum_hash(const unsigned char* input, unsigned char hashstring[33]) { md5_state_t state; md5_byte_t result[16]; unsigned int checksum = 0; const unsigned char *temp; for(temp = input; *temp != '\0'; temp++) checksum += *temp; checksum %= 9; checksum++; md5_init(&state); md5_append(&state, input, strlen(input)); do { md5_finish(&state, result); sprintf(hashstring, "%.2X%.2X%.2X%.2X%.2X%.2X%.2X%.2X%.2X%.2X%.2X%.2X%.2X%.2X%.2X%.2X", result[0], result[1], result[2], result[3], result[4], result[5], result[6], result[7], result[8], result[9], result[10], result[11], result[12], result[13], result[14], result[15]); md5_init(&state); md5_append(&state, hashstring, 32); checksum--; }while(checksum != 0); } /* int main(int argc, char* argv[]) { char string[33]; checksum_hash("1234", string); printf(string); return 0; } */ void generate(const unsigned char* name, unsigned char* code) { static const char product_hash[4] = "A190"; static const char available_chars[32] = "ABCDEFGHJKLMNPQRSTUVWXY123456789"; static const unsigned int divisors[] = {9, 2, 6}; unsigned char name_hash[33]; unsigned int i, j, sum; for(i = 0; i < 3; i++) { for(sum = j = 0; j < 4; j++) { *code = available_chars[lsrf() % 32]; sum += *code; code++; } do { *code = available_chars[lsrf() % 32]; } while(((sum + *code) % 256) % divisors[i] != 0); code++; *code = '-'; code++; } checksum_hash(name, name_hash); for(i = 0; i < 4; i++) { *code = available_chars[(name_hash[i] + product_hash[i]) % 32]; code++; } }