We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
There was an error while loading. Please reload this page.
Welcome to the ctr wiki! #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdint.h>
unsigned int calculate_master_key(unsigned char* generator) { uint32_t table[0x100]; uint32_t data; uint32_t i, j; uint32_t y; uint8_t x; uint64_t yll; uint32_t yhi;
for(i=0; i<0x100; i++) { data = i; for(j=0; j<4; j++) { if (data & 1) data = 0xEDBA6320 ^ (data>>1); else data = data>>1; if (data & 1) data = 0xEDBA6320 ^ (data>>1); else data = data>>1; } table[i] = data; } y = 0xFFFFFFFF; x = generator[0]; for(i=0; i<4; i++) { x ^= y; y = table[x] ^ (y>>8); x = generator[1+i*2] ^ y; y = table[x] ^ (y>>8); x = generator[2+i*2]; } y ^= 0xAAAA; y += 0x1657; yll = y; yll = (yll+1) * 0xA7C5AC47ULL; yhi = (yll>>48); yhi *= 0xFFFFF3CB; y += (yhi<<5); return y;
}
int main(int argc, const char* argv[]) { unsigned char generator[9] = {0}; unsigned int servicecode, month, day, masterkey;
if (argc != 4) { printf("usage: <servicecode> <month> <day>\n"); exit(1); } servicecode = strtoul(argv[1], 0, 10); month = strtoul(argv[2], 0, 10); day = strtoul(argv[3], 0, 10); servicecode %= 10000; month %= 100; day %= 100; sprintf((char*)generator, "%02d%02d%04d", month, day, servicecode); masterkey = calculate_master_key(generator); printf("Master key is %05d\n", masterkey); return 0;