/****************************************************************************** * Program: getpvvkey 2.00 * * * * by * * * * L. Padilla (e-mail: padilla at domain "gae ucm es") * * * * Madrid, May 2003 * * * * Compile with make -f Makegetpvvkey * * Latest version at http://www.gae.ucm.es/~padilla/extrawork/getpvvkey.c * ******************************************************************************/ #include #include #define N 5 /* Define a 64 bit integer for Pentium(Linux), Alpha(Tru64), Mips(Irix) and Sparc(Solaris), others I don't know */ typedef unsigned long long long64; FILE * file_p; unsigned int ks[16][2]; unsigned int ptsp[N][2]; int main (void) { long64 getkey (int); void nextkey (void); void init_encrypt (unsigned char [8], unsigned int [2]); int getpvv (int); /* Data to be introduced by hand, little privacy measure, note that TSPs are chopped in eight 8-bit chars */ int i, pvv[N] = {9876, 5432, 1098, 7654, 3210}; unsigned char tsp[N][8] = { {0x12, 0x34, 0x56, 0x78, 0x90, 0x91, 0x00, 0x00}, {0x12, 0x34, 0x56, 0x78, 0x90, 0x91, 0x00, 0x01}, {0x12, 0x34, 0x56, 0x78, 0x90, 0x91, 0x00, 0x02}, {0x12, 0x34, 0x56, 0x78, 0x90, 0x91, 0x00, 0x03}, {0x12, 0x34, 0x56, 0x78, 0x90, 0x91, 0x00, 0x04}}; /* for (i = 0; i < N; i++) printf ("TSP%i: %.2X%.2X%.2X%.2X%.2X%.2X%.2X%.2X, PVV%i: %.4i\n", i + 1, tsp[i][0], tsp[i][1], tsp[i][2], tsp[i][3], tsp[i][4], tsp[i][5], tsp[i][6], tsp[i][7], i + 1, pvv[i]); /* For debugging purposes */ /* Doing DES initial permutation of TSPs to save time */ for (i = 0; i < N; i++) init_encrypt (& tsp[i][0], & ptsp[i][0]); /* Checking for a previously checkpointed value */ if ((file_p = fopen ("getpvvkey.dat", "r")) == NULL) { printf ("No checkpoint, starting from loop 0 of %llu\n", 0x00FFFFFFFFFFFFFFLL); } else if (fread (ks, 8, 16, file_p) == 16) { printf ("Using checkpoint, starting from loop %llu of %llu\n", getkey (1), 0x00FFFFFFFFFFFFFFLL); fclose (file_p); } else { printf ("No valid checkpoint, starting from loop 0 of %llu\n", 0x00FFFFFFFFFFFFFFLL); fclose (file_p); } /* The big loop begins, it should be already optimized */ while (1) { /* printf ("Loop: %llu (%.14llX)\n", getkey (1), getkey (1)); printf ("PVV key: %.16llX\n", getkey (0)); /* For debugging purposes */ /* Trying each PVV to match the key */ if (getpvv (0) == pvv[0]) { /* printf ("Matched PVV1\n"); /* For debugging purposes */ if (getpvv (1) == pvv[1]) { /* printf ("Matched PVV2\n"); /* For debugging purposes */ if (getpvv (2) == pvv[2]) { /* printf ("Matched PVV3\n"); /* For debugging purposes */ if (getpvv (3) == pvv[3]) { /* printf ("Matched PVV4\n"); /* For debugging purposes */ if (getpvv (4) == pvv[4]) { /* printf ("Matched PVV5\n"); /* For debugging purposes */ /* No checks, will core dump if read only file, etc. */ file_p = fopen ("getpvvkey.key", "a"); fprintf (file_p, "Congratulations!!! You got the key! "); fprintf (file_p, "(%.16llX)\n", getkey (0)); fprintf (file_p, "But still trying rest of key space...\n"); fclose (file_p); } } } } } /* Changing the key */ nextkey (); } return 0; } int getpvv (int t) { void encrypt (unsigned int [2], unsigned int [2], unsigned int [16][2]); register unsigned int i, j = 1000, k, pvv = 0; unsigned int output[2]; encrypt (& ptsp[t][0], output, ks); /* DES encrypt TSP */ /* printf ("DES'ed TSP%i: %.2X%.2X%.2X%.2X%.2X%.2X%.2X%.2X\n", t + 1, output[0] & 0xFF, output[0]>> 8 & 0xFF, output[0]>>16 & 0xFF, output[0]>>24 & 0xFF, output[1] & 0xFF, output[1]>> 8 & 0xFF, output[1]>>16 & 0xFF, output[1]>>24 & 0xFF); /* For debugging purposes */ /* Getting PVV (first four non-hex digits of DES output), it should be already optimized */ while (1) { k = output[0]; i = k>>4 & 0x0F; if (i < 10) { pvv += i * j; j /= 10; } i = k & 0x0F; if (i < 10) { pvv += i * j; j /= 10; } i = k>>12 & 0x0F; if (i < 10) { pvv += i * j; j /= 10; } i = k>>8 & 0x0F; if (i < 10) { pvv += i * j; j /= 10; } if (j < 1) break; i = k>>20 & 0x0F; if (i < 10) { pvv += i * j; j /= 10; } if (j < 1) break; i = k>>16 & 0x0F; if (i < 10) { pvv += i * j; j /= 10; } if (j < 1) break; i = k>>28 & 0x0F; if (i < 10) { pvv += i * j; j /= 10; } if (j < 1) break; i = k>>24 & 0x0F; if (i < 10) { pvv += i * j; j /= 10; } if (j < 1) break; k = output[1]; i = k>>4 & 0x0F; if (i < 10) { pvv += i * j; j /= 10; } if (j < 1) break; i = k & 0x0F; if (i < 10) { pvv += i * j; j /= 10; } if (j < 1) break; i = k>>12 & 0x0F; if (i < 10) { pvv += i * j; j /= 10; } if (j < 1) break; i = k>>8 & 0x0F; if (i < 10) { pvv += i * j; j /= 10; } if (j < 1) break; i = k>>20 & 0x0F; if (i < 10) { pvv += i * j; j /= 10; } if (j < 1) break; i = k>>16 & 0x0F; if (i < 10) { pvv += i * j; j /= 10; } if (j < 1) break; i = k>>28 & 0x0F; if (i < 10) { pvv += i * j; j /= 10; } if (j < 1) break; i = k>>24 & 0x0F; if (i < 10) { pvv += i * j; j /= 10; } if (j < 1) break; /* If not four non-hex digits where found then decimalize from the beginning to complete four PVV digits */ k = output[0]; i = k>>4 & 0x0F; if (i > 9) { pvv += (i - 10) * j; j /= 10; } if (j < 1) break; i = k & 0x0F; if (i > 9) { pvv += (i - 10) * j; j /= 10; } if (j < 1) break; i = k>>12 & 0x0F; if (i > 9) { pvv += (i - 10) * j; j /= 10; } if (j < 1) break; i = k>>8 & 0x0F; if (i > 9) { pvv += (i - 10) * j; j /= 10; } } /* printf ("Trial PVV%i: %.4i\n", t + 1, pvv); /* For debugging purposes */ return pvv; } long64 getkey (int i) { long64 key = 0; /* Obtaining the key, note that it is not optimized because it is not necessary, it is only used a couple of times */ key |= (long64) ks[11][1] & 0x0000000000000002LL; key |= (long64) ks[ 4][1] & 0x0000000000000004LL; key |= ((long64) ks[12][1] & 0x0000000000000001LL)<<3; key |= (long64) ks[ 7][0] & 0x0000000000000010LL; key |= (long64) ks[11][0] & 0x0000000000000020LL; key |= (long64) ks[ 3][1] & 0x0000000000000040LL; key |= (long64) ks[ 0][1] & 0x0000000000000080LL; key |= ((long64) ks[ 0][1] & 0x0000000000000004LL)<<7; key |= ((long64) ks[ 3][1] & 0x0000000000000008LL)<<7; key |= ((long64) ks[ 7][1] & 0x0000000000000008LL)<<8; key |= (long64) ks[ 7][0] & 0x0000000000001000LL; key |= (long64) ks[ 7][0] & 0x0000000000002000LL; key |= (long64) ks[ 6][0] & 0x0000000000004000LL; key |= (long64) ks[12][1] & 0x0000000000008000LL; key |= ((long64) ks[15][0] & 0x0000000000100000LL)>>3; key |= ((long64) ks[ 8][0] & 0x0000000000080000LL)>>1; key |= (long64) ks[12][0] & 0x0000000000080000LL; key |= ((long64) ks[13][1] & 0x0000000000080000LL)<<1; key |= ((long64) ks[ 9][1] & 0x0000000000080000LL)<<2; key |= ((long64) ks[10][1] & 0x0000000000020000LL)<<5; key |= ((long64) ks[ 0][1] & 0x0000000000080000LL)<<4; key |= (long64) ks[ 8][1] & 0x0000000002000000LL; key |= ((long64) ks[12][1] & 0x0000000002000000LL)<<1; key |= (long64) ks[14][0] & 0x0000000008000000LL; key |= ((long64) ks[ 8][1] & 0x0000000000040000LL)<<10; key |= ((long64) ks[15][1] & 0x0000000000020000LL)<<12; key |= ((long64) ks[ 5][1] & 0x0000000000080000LL)<<11; key |= ((long64) ks[ 1][1] & 0x0000000000080000LL)<<12; key |= ((long64) ks[13][1] & 0x0000000000000002LL)<<32; key |= ((long64) ks[ 6][1] & 0x0000000000000004LL)<<32; key |= ((long64) ks[ 9][1] & 0x0000000000000008LL)<<32; key |= ((long64) ks[11][1] & 0x0000000000000008LL)<<33; key |= ((long64) ks[13][0] & 0x0000000000000020LL)<<32; key |= ((long64) ks[ 5][1] & 0x0000000000000040LL)<<32; key |= ((long64) ks[15][0] & 0x0000000000000080LL)<<32; key |= ((long64) ks[ 6][1] & 0x0000000000000001LL)<<41; key |= ((long64) ks[ 0][0] & 0x0000000000040000LL)<<24; key |= ((long64) ks[11][1] & 0x0000000000000004LL)<<41; key |= ((long64) ks[ 1][0] & 0x0000000000080000LL)<<25; key |= ((long64) ks[ 5][0] & 0x0000000000001000LL)<<33; key |= ((long64) ks[ 5][0] & 0x0000000000002000LL)<<33; key |= ((long64) ks[14][1] & 0x0000000000008000LL)<<32; key |= ((long64) ks[ 2][0] & 0x0000000000100000LL)<<29; key |= ((long64) ks[ 1][0] & 0x0000000000040000LL)<<32; key |= ((long64) ks[14][0] & 0x0000000000080000LL)<<32; key |= ((long64) ks[ 4][0] & 0x0000000000400000LL)<<30; key |= ((long64) ks[11][1] & 0x0000000000080000LL)<<34; key |= ((long64) ks[ 1][1] & 0x0000000000040000LL)<<36; key |= ((long64) ks[ 8][1] & 0x0000000000020000LL)<<38; key |= ((long64) ks[10][1] & 0x0000000002000000LL)<<32; key |= ((long64) ks[15][0] & 0x0000000004000000LL)<<32; key |= ((long64) ks[ 2][1] & 0x0000000008000000LL)<<32; key |= ((long64) ks[ 9][0] & 0x0000000010000000LL)<<32; key |= ((long64) ks[ 2][1] & 0x0000000000020000LL)<<44; key |= ((long64) ks[ 7][1] & 0x0000000000080000LL)<<43; key |= ((long64) ks[ 3][1] & 0x0000000000080000LL)<<44; if (i) { key >>= 1; key = key>>1 & 0xFFFFFFFFFFFFFF80LL | key & 0x000000000000007FLL; key = key>>1 & 0xFFFFFFFFFFFFC000LL | key & 0x0000000000003FFFLL; key = key>>1 & 0xFFFFFFFFFFE00000LL | key & 0x00000000001FFFFFLL; key = key>>1 & 0xFFFFFFFFF0000000LL | key & 0x000000000FFFFFFFLL; key = key>>1 & 0xFFFFFFF800000000LL | key & 0x00000007FFFFFFFFLL; key = key>>1 & 0xFFFFFC0000000000LL | key & 0x000003FFFFFFFFFFLL; key = key>>1 & 0xFFFE000000000000LL | key & 0x0001FFFFFFFFFFFFLL; } return key; } void nextkey (void) { /* Changing the key schedule (only bits changing in the running key), it should be already optimized */ ks[ 0][0] ^= 0x20000000; ks[ 1][0] ^= 0x00800000; ks[ 2][0] ^= 0x80000000; ks[ 3][1] ^= 0x01000000; ks[ 4][0] ^= 0x08000000; ks[ 5][0] ^= 0x00400000; ks[ 6][1] ^= 0x02000000; /* ks[ 7][ ] ^= 0x00000000; */ ks[ 8][1] ^= 0x80000000; ks[ 9][1] ^= 0x00800000; /* ks[10][ ] ^= 0x00000000; */ ks[11][1] ^= 0x00000002; ks[12][0] ^= 0x40000000; ks[13][1] ^= 0x00000008; ks[14][1] ^= 0x00400000; ks[15][1] ^= 0x00000004; if (ks[15][1] & 0x00000004) return; ks[ 0][1] ^= 0x00000002; /* ks[ 1][ ] ^= 0x00000000; */ ks[ 2][1] ^= 0x04000000; ks[ 3][0] ^= 0x00100000; ks[ 4][1] ^= 0x00000004; ks[ 5][0] ^= 0x00800000; ks[ 6][0] ^= 0x80000000; ks[ 7][1] ^= 0x01000000; ks[ 8][1] ^= 0x00000001; ks[ 9][1] ^= 0x08000000; ks[10][1] ^= 0x40000000; ks[11][0] ^= 0x04000000; ks[12][1] ^= 0x80000000; ks[13][1] ^= 0x00800000; /* ks[14][ ] ^= 0x00000000; */ ks[15][0] ^= 0x00200000; if (ks[15][0] & 0x00200000) return; /* exit (0); /* For debugging purposes */ ks[ 0][0] ^= 0x04000000; /* ks[ 1][ ] ^= 0x00000000; */ ks[ 2][0] ^= 0x00040000; ks[ 3][0] ^= 0x10000000; ks[ 4][0] ^= 0x00200000; /* ks[ 5][ ] ^= 0x00000000; */ ks[ 6][1] ^= 0x04000000; ks[ 7][0] ^= 0x00100000; ks[ 8][1] ^= 0x00400000; ks[ 9][0] ^= 0x20000000; /* ks[10][ ] ^= 0x00000000; */ ks[11][0] ^= 0x00080000; ks[12][1] ^= 0x00000001; ks[13][1] ^= 0x08000000; ks[14][1] ^= 0x40000000; ks[15][1] ^= 0x02000000; if (ks[15][1] & 0x02000000) return; ks[ 0][0] ^= 0x00000020; ks[ 1][0] ^= 0x00000400; ks[ 2][1] ^= 0x00000400; ks[ 3][0] ^= 0x00000800; ks[ 4][0] ^= 0x00000008; ks[ 5][1] ^= 0x00000100; ks[ 6][1] ^= 0x00040000; ks[ 7][0] ^= 0x00000010; ks[ 8][1] ^= 0x00000800; ks[ 9][0] ^= 0x00008000; ks[10][1] ^= 0x00000200; ks[11][0] ^= 0x00002000; ks[12][1] ^= 0x00080000; ks[13][1] ^= 0x00000080; ks[14][0] ^= 0x00004000; /* ks[15][ ] ^= 0x00000000; */ if (ks[14][0] & 0x00004000) return; ks[ 0][1] ^= 0x00004000; ks[ 1][1] ^= 0x00000100; ks[ 2][1] ^= 0x00040000; ks[ 3][0] ^= 0x00000010; /* ks[ 4][ ] ^= 0x00000000; */ ks[ 5][1] ^= 0x00008000; ks[ 6][0] ^= 0x00000080; ks[ 7][1] ^= 0x00000040; ks[ 8][1] ^= 0x00080000; ks[ 9][1] ^= 0x00000080; ks[10][0] ^= 0x00004000; ks[11][0] ^= 0x00000020; /* ks[12][ ] ^= 0x00000000; */ ks[13][1] ^= 0x00020000; /* ks[14][ ] ^= 0x00000000; */ ks[15][0] ^= 0x00000008; if (ks[15][0] & 0x00000008) return; ks[ 0][0] ^= 0x00008000; ks[ 1][1] ^= 0x00008000; ks[ 2][0] ^= 0x00000080; ks[ 3][1] ^= 0x00000040; ks[ 4][0] ^= 0x00000040; ks[ 5][1] ^= 0x00010000; /* ks[ 6][ ] ^= 0x00000000; */ ks[ 7][0] ^= 0x00000400; /* ks[ 8][ ] ^= 0x00000000; */ ks[ 9][1] ^= 0x00020000; /* ks[10][ ] ^= 0x00000000; */ ks[11][1] ^= 0x00004000; ks[12][0] ^= 0x00000004; ks[13][0] ^= 0x00001000; ks[14][1] ^= 0x00000800; /* ks[15][ ] ^= 0x00000000; */ if (ks[14][1] & 0x00000800) return; ks[ 0][1] ^= 0x00000080; ks[ 1][1] ^= 0x00010000; /* ks[ 2][ ] ^= 0x00000000; */ ks[ 3][0] ^= 0x00000400; ks[ 4][1] ^= 0x00000400; ks[ 5][0] ^= 0x00000800; ks[ 6][0] ^= 0x00000008; ks[ 7][1] ^= 0x00000100; ks[ 8][0] ^= 0x00000004; ks[ 9][0] ^= 0x00001000; ks[10][1] ^= 0x00000800; ks[11][0] ^= 0x00008000; ks[12][1] ^= 0x00000200; ks[13][0] ^= 0x00002000; ks[14][1] ^= 0x00080000; ks[15][0] ^= 0x00000040; if (ks[15][0] & 0x00000040) return; ks[ 0][1] ^= 0x00000004; ks[ 1][0] ^= 0x20000000; /* ks[ 2][ ] ^= 0x00000000; */ ks[ 3][0] ^= 0x00080000; ks[ 4][1] ^= 0x00000001; ks[ 5][1] ^= 0x08000000; ks[ 6][1] ^= 0x40000000; ks[ 7][0] ^= 0x04000000; /* ks[ 8][ ] ^= 0x00000000; */ ks[ 9][0] ^= 0x00040000; ks[10][0] ^= 0x10000000; ks[11][0] ^= 0x00200000; /* ks[12][ ] ^= 0x00000000; */ ks[13][1] ^= 0x04000000; ks[14][0] ^= 0x00100000; ks[15][1] ^= 0x00400000; if (ks[15][1] & 0x00400000) return; ks[ 0][0] ^= 0x00200000; ks[ 1][1] ^= 0x00000002; ks[ 2][0] ^= 0x40000000; ks[ 3][1] ^= 0x00000008; ks[ 4][1] ^= 0x00400000; ks[ 5][0] ^= 0x20000000; /* ks[ 6][ ] ^= 0x00000000; */ ks[ 7][0] ^= 0x00080000; ks[ 8][1] ^= 0x01000000; ks[ 9][0] ^= 0x08000000; ks[10][0] ^= 0x00400000; ks[11][1] ^= 0x02000000; /* ks[12][ ] ^= 0x00000000; */ ks[13][0] ^= 0x00040000; ks[14][0] ^= 0x10000000; /* ks[15][ ] ^= 0x00000000; */ if (ks[14][0] & 0x10000000) return; ks[ 0][1] ^= 0x02000000; ks[ 1][0] ^= 0x04000000; ks[ 2][1] ^= 0x80000000; ks[ 3][1] ^= 0x00800000; /* ks[ 4][ ] ^= 0x00000000; */ ks[ 5][1] ^= 0x00000002; ks[ 6][0] ^= 0x40000000; ks[ 7][1] ^= 0x00000008; ks[ 8][0] ^= 0x00100000; ks[ 9][1] ^= 0x00000004; ks[10][0] ^= 0x00800000; ks[11][0] ^= 0x80000000; ks[12][1] ^= 0x01000000; ks[13][0] ^= 0x08000000; ks[14][0] ^= 0x00400000; ks[15][1] ^= 0x40000000; if (ks[15][1] & 0x40000000) return; /* ks[ 0][ ] ^= 0x00000000; */ ks[ 1][0] ^= 0x00000020; /* ks[ 2][ ] ^= 0x00000000; */ ks[ 3][1] ^= 0x00020000; /* ks[ 4][ ] ^= 0x00000000; */ ks[ 5][1] ^= 0x00004000; ks[ 6][0] ^= 0x00000004; ks[ 7][0] ^= 0x00001000; ks[ 8][0] ^= 0x00000010; /* ks[ 9][ ] ^= 0x00000000; */ ks[10][1] ^= 0x00008000; ks[11][0] ^= 0x00000080; ks[12][1] ^= 0x00000040; ks[13][0] ^= 0x00000040; ks[14][1] ^= 0x00010000; ks[15][0] ^= 0x00004000; if (ks[15][0] & 0x00004000) return; ks[ 0][0] ^= 0x00000008; ks[ 1][1] ^= 0x00004000; ks[ 2][0] ^= 0x00000004; ks[ 3][0] ^= 0x00001000; ks[ 4][1] ^= 0x00000800; ks[ 5][0] ^= 0x00008000; ks[ 6][1] ^= 0x00000200; ks[ 7][0] ^= 0x00002000; ks[ 8][1] ^= 0x00000040; ks[ 9][0] ^= 0x00000040; ks[10][1] ^= 0x00010000; /* ks[11][ ] ^= 0x00000000; */ ks[12][0] ^= 0x00000400; ks[13][1] ^= 0x00000400; ks[14][0] ^= 0x00000800; /* ks[15][ ] ^= 0x00000000; */ if (ks[14][0] & 0x00000800) return; /* ks[ 0][ ] ^= 0x00000000; */ ks[ 1][0] ^= 0x00008000; ks[ 2][1] ^= 0x00000200; ks[ 3][0] ^= 0x00002000; ks[ 4][1] ^= 0x00080000; ks[ 5][1] ^= 0x00000080; ks[ 6][0] ^= 0x00004000; ks[ 7][0] ^= 0x00000020; ks[ 8][0] ^= 0x00000400; ks[ 9][1] ^= 0x00000400; ks[10][0] ^= 0x00000800; ks[11][0] ^= 0x00000008; ks[12][1] ^= 0x00000100; ks[13][1] ^= 0x00040000; ks[14][0] ^= 0x00000010; ks[15][1] ^= 0x00000800; if (ks[15][1] & 0x00000800) return; ks[ 0][0] ^= 0x00000040; ks[ 1][1] ^= 0x00000080; ks[ 2][0] ^= 0x00004000; ks[ 3][0] ^= 0x00000020; /* ks[ 4][ ] ^= 0x00000000; */ ks[ 5][1] ^= 0x00020000; /* ks[ 6][ ] ^= 0x00000000; */ ks[ 7][1] ^= 0x00004000; ks[ 8][1] ^= 0x00000100; ks[ 9][1] ^= 0x00040000; ks[10][0] ^= 0x00000010; /* ks[11][ ] ^= 0x00000000; */ ks[12][1] ^= 0x00008000; ks[13][0] ^= 0x00000080; ks[14][1] ^= 0x00000040; ks[15][1] ^= 0x00080000; if (ks[15][1] & 0x00080000) return; ks[ 0][1] ^= 0x00400000; ks[ 1][1] ^= 0x00000004; ks[ 2][0] ^= 0x00800000; ks[ 3][0] ^= 0x80000000; ks[ 4][1] ^= 0x01000000; ks[ 5][0] ^= 0x08000000; ks[ 6][0] ^= 0x00400000; ks[ 7][1] ^= 0x02000000; ks[ 8][0] ^= 0x04000000; ks[ 9][1] ^= 0x80000000; ks[10][1] ^= 0x00800000; /* ks[11][ ] ^= 0x00000000; */ ks[12][1] ^= 0x00000002; ks[13][0] ^= 0x40000000; ks[14][1] ^= 0x00000008; ks[15][0] ^= 0x00100000; if (ks[15][0] & 0x00100000) return; /* ks[ 0][ ] ^= 0x00000000; */ ks[ 1][0] ^= 0x00200000; /* ks[ 2][ ] ^= 0x00000000; */ ks[ 3][1] ^= 0x04000000; ks[ 4][0] ^= 0x00100000; ks[ 5][1] ^= 0x00000004; ks[ 6][0] ^= 0x00800000; ks[ 7][0] ^= 0x80000000; ks[ 8][0] ^= 0x00080000; ks[ 9][1] ^= 0x00000001; ks[10][1] ^= 0x08000000; ks[11][1] ^= 0x40000000; ks[12][0] ^= 0x04000000; ks[13][1] ^= 0x80000000; ks[14][1] ^= 0x00800000; ks[15][0] ^= 0x10000000; if (ks[15][0] & 0x10000000) return; ks[ 0][1] ^= 0x40000000; ks[ 1][1] ^= 0x02000000; /* ks[ 2][ ] ^= 0x00000000; */ ks[ 3][0] ^= 0x00040000; ks[ 4][0] ^= 0x10000000; ks[ 5][0] ^= 0x00200000; /* ks[ 6][ ] ^= 0x00000000; */ ks[ 7][1] ^= 0x04000000; ks[ 8][1] ^= 0x00000008; ks[ 9][1] ^= 0x00400000; ks[10][0] ^= 0x20000000; /* ks[11][ ] ^= 0x00000000; */ ks[12][0] ^= 0x00080000; ks[13][1] ^= 0x00000001; ks[14][1] ^= 0x08000000; ks[15][0] ^= 0x00400000; if (ks[15][0] & 0x00400000) return; ks[ 0][0] ^= 0x00004000; /* ks[ 1][ ] ^= 0x00000000; */ ks[ 2][0] ^= 0x00000400; ks[ 3][1] ^= 0x00000400; ks[ 4][0] ^= 0x00000800; ks[ 5][0] ^= 0x00000008; ks[ 6][1] ^= 0x00000100; ks[ 7][1] ^= 0x00040000; ks[ 8][0] ^= 0x00001000; ks[ 9][1] ^= 0x00000800; ks[10][0] ^= 0x00008000; ks[11][1] ^= 0x00000200; ks[12][0] ^= 0x00002000; ks[13][1] ^= 0x00080000; ks[14][1] ^= 0x00000080; ks[15][1] ^= 0x00010000; if (ks[15][1] & 0x00010000) return; /* ks[ 0][ ] ^= 0x00000000; */ ks[ 1][0] ^= 0x00000008; ks[ 2][1] ^= 0x00000100; ks[ 3][1] ^= 0x00040000; ks[ 4][0] ^= 0x00000010; /* ks[ 5][ ] ^= 0x00000000; */ ks[ 6][1] ^= 0x00008000; ks[ 7][0] ^= 0x00000080; ks[ 8][0] ^= 0x00002000; ks[ 9][1] ^= 0x00080000; ks[10][1] ^= 0x00000080; ks[11][0] ^= 0x00004000; ks[12][0] ^= 0x00000020; /* ks[13][ ] ^= 0x00000000; */ ks[14][1] ^= 0x00020000; ks[15][0] ^= 0x00000800; if (ks[15][0] & 0x00000800) return; ks[ 0][1] ^= 0x00000800; /* ks[ 1][ ] ^= 0x00000000; */ ks[ 2][1] ^= 0x00008000; ks[ 3][0] ^= 0x00000080; ks[ 4][1] ^= 0x00000040; ks[ 5][0] ^= 0x00000040; ks[ 6][1] ^= 0x00010000; /* ks[ 7][ ] ^= 0x00000000; */ ks[ 8][0] ^= 0x00000020; /* ks[ 9][ ] ^= 0x00000000; */ ks[10][1] ^= 0x00020000; /* ks[11][ ] ^= 0x00000000; */ ks[12][1] ^= 0x00004000; ks[13][0] ^= 0x00000004; ks[14][0] ^= 0x00001000; ks[15][0] ^= 0x00000010; if (ks[15][0] & 0x00000010) return; ks[ 0][1] ^= 0x00080000; ks[ 1][0] ^= 0x00000040; ks[ 2][1] ^= 0x00010000; /* ks[ 3][ ] ^= 0x00000000; */ ks[ 4][0] ^= 0x00000400; ks[ 5][1] ^= 0x00000400; ks[ 6][0] ^= 0x00000800; ks[ 7][0] ^= 0x00000008; ks[ 8][1] ^= 0x00004000; ks[ 9][0] ^= 0x00000004; ks[10][0] ^= 0x00001000; ks[11][1] ^= 0x00000800; ks[12][0] ^= 0x00008000; ks[13][1] ^= 0x00000200; ks[14][0] ^= 0x00002000; ks[15][1] ^= 0x00000040; if (ks[15][1] & 0x00000040) return; ks[ 0][0] ^= 0x00100000; ks[ 1][1] ^= 0x00400000; ks[ 2][0] ^= 0x20000000; /* ks[ 3][ ] ^= 0x00000000; */ ks[ 4][0] ^= 0x00080000; ks[ 5][1] ^= 0x00000001; ks[ 6][1] ^= 0x08000000; ks[ 7][1] ^= 0x40000000; ks[ 8][1] ^= 0x02000000; /* ks[ 9][ ] ^= 0x00000000; */ ks[10][0] ^= 0x00040000; ks[11][0] ^= 0x10000000; ks[12][0] ^= 0x00200000; /* ks[13][ ] ^= 0x00000000; */ ks[14][1] ^= 0x04000000; ks[15][1] ^= 0x00000008; if (ks[15][1] & 0x00000008) return; ks[ 0][0] ^= 0x10000000; /* ks[ 1][ ] ^= 0x00000000; */ ks[ 2][1] ^= 0x00000002; ks[ 3][0] ^= 0x40000000; ks[ 4][1] ^= 0x00000008; ks[ 5][1] ^= 0x00400000; ks[ 6][0] ^= 0x20000000; /* ks[ 7][ ] ^= 0x00000000; */ ks[ 8][0] ^= 0x80000000; ks[ 9][1] ^= 0x01000000; ks[10][0] ^= 0x08000000; ks[11][0] ^= 0x00400000; ks[12][1] ^= 0x02000000; /* ks[13][ ] ^= 0x00000000; */ ks[14][0] ^= 0x00040000; ks[15][1] ^= 0x00800000; if (ks[15][1] & 0x00800000) return; ks[ 0][0] ^= 0x00400000; ks[ 1][1] ^= 0x40000000; ks[ 2][0] ^= 0x04000000; ks[ 3][1] ^= 0x80000000; ks[ 4][1] ^= 0x00800000; /* ks[ 5][ ] ^= 0x00000000; */ ks[ 6][1] ^= 0x00000002; ks[ 7][0] ^= 0x40000000; ks[ 8][1] ^= 0x04000000; ks[ 9][0] ^= 0x00100000; ks[10][1] ^= 0x00000004; ks[11][0] ^= 0x00800000; ks[12][0] ^= 0x80000000; ks[13][1] ^= 0x01000000; ks[14][0] ^= 0x08000000; ks[15][1] ^= 0x08000000; if (ks[15][1] & 0x08000000) return; /* exit (0); /* For benchmarking purposes */ ks[ 0][1] ^= 0x00010000; ks[ 1][0] ^= 0x00004000; ks[ 2][0] ^= 0x00000020; /* ks[ 3][ ] ^= 0x00000000; */ ks[ 4][1] ^= 0x00020000; /* ks[ 5][ ] ^= 0x00000000; */ ks[ 6][1] ^= 0x00004000; ks[ 7][0] ^= 0x00000004; ks[ 8][1] ^= 0x00040000; ks[ 9][0] ^= 0x00000010; /* ks[10][ ] ^= 0x00000000; */ ks[11][1] ^= 0x00008000; ks[12][0] ^= 0x00000080; ks[13][1] ^= 0x00000040; ks[14][0] ^= 0x00000040; ks[15][1] ^= 0x00000080; if (ks[15][1] & 0x00000080) return; ks[ 0][0] ^= 0x00000800; /* ks[ 1][ ] ^= 0x00000000; */ ks[ 2][1] ^= 0x00004000; ks[ 3][0] ^= 0x00000004; ks[ 4][0] ^= 0x00001000; ks[ 5][1] ^= 0x00000800; ks[ 6][0] ^= 0x00008000; ks[ 7][1] ^= 0x00000200; ks[ 8][0] ^= 0x00000080; ks[ 9][1] ^= 0x00000040; ks[10][0] ^= 0x00000040; ks[11][1] ^= 0x00010000; /* ks[12][ ] ^= 0x00000000; */ ks[13][0] ^= 0x00000400; ks[14][1] ^= 0x00000400; ks[15][1] ^= 0x00020000; if (ks[15][1] & 0x00020000) return; ks[ 0][0] ^= 0x00000010; ks[ 1][1] ^= 0x00000800; ks[ 2][0] ^= 0x00008000; ks[ 3][1] ^= 0x00000200; ks[ 4][0] ^= 0x00002000; ks[ 5][1] ^= 0x00080000; ks[ 6][1] ^= 0x00000080; ks[ 7][0] ^= 0x00004000; /* ks[ 8][ ] ^= 0x00000000; */ ks[ 9][0] ^= 0x00000400; ks[10][1] ^= 0x00000400; ks[11][0] ^= 0x00000800; ks[12][0] ^= 0x00000008; ks[13][1] ^= 0x00000100; ks[14][1] ^= 0x00040000; ks[15][0] ^= 0x00001000; if (ks[15][0] & 0x00001000) return; ks[ 0][1] ^= 0x00000040; ks[ 1][1] ^= 0x00080000; ks[ 2][1] ^= 0x00000080; ks[ 3][0] ^= 0x00004000; ks[ 4][0] ^= 0x00000020; /* ks[ 5][ ] ^= 0x00000000; */ ks[ 6][1] ^= 0x00020000; /* ks[ 7][ ] ^= 0x00000000; */ ks[ 8][0] ^= 0x00000008; ks[ 9][1] ^= 0x00000100; ks[10][1] ^= 0x00040000; ks[11][0] ^= 0x00000010; /* ks[12][ ] ^= 0x00000000; */ ks[13][1] ^= 0x00008000; ks[14][0] ^= 0x00000080; ks[15][0] ^= 0x00002000; if (ks[15][0] & 0x00002000) return; ks[ 0][1] ^= 0x00000008; ks[ 1][0] ^= 0x00100000; ks[ 2][1] ^= 0x00000004; ks[ 3][0] ^= 0x00800000; ks[ 4][0] ^= 0x80000000; ks[ 5][1] ^= 0x01000000; ks[ 6][0] ^= 0x08000000; ks[ 7][0] ^= 0x00400000; ks[ 8][1] ^= 0x40000000; ks[ 9][0] ^= 0x04000000; ks[10][1] ^= 0x80000000; ks[11][1] ^= 0x00800000; /* ks[12][ ] ^= 0x00000000; */ ks[13][1] ^= 0x00000002; ks[14][0] ^= 0x40000000; ks[15][1] ^= 0x04000000; if (ks[15][1] & 0x04000000) return; ks[ 0][1] ^= 0x00800000; ks[ 1][0] ^= 0x10000000; ks[ 2][0] ^= 0x00200000; /* ks[ 3][ ] ^= 0x00000000; */ ks[ 4][1] ^= 0x04000000; ks[ 5][0] ^= 0x00100000; ks[ 6][1] ^= 0x00000004; ks[ 7][0] ^= 0x00800000; /* ks[ 8][ ] ^= 0x00000000; */ ks[ 9][0] ^= 0x00080000; ks[10][1] ^= 0x00000001; ks[11][1] ^= 0x08000000; ks[12][1] ^= 0x40000000; ks[13][0] ^= 0x04000000; ks[14][1] ^= 0x80000000; ks[15][0] ^= 0x00040000; if (ks[15][0] & 0x00040000) return; ks[ 0][1] ^= 0x08000000; ks[ 1][0] ^= 0x00400000; ks[ 2][1] ^= 0x02000000; /* ks[ 3][ ] ^= 0x00000000; */ ks[ 4][0] ^= 0x00040000; ks[ 5][0] ^= 0x10000000; ks[ 6][0] ^= 0x00200000; /* ks[ 7][ ] ^= 0x00000000; */ ks[ 8][0] ^= 0x40000000; ks[ 9][1] ^= 0x00000008; ks[10][1] ^= 0x00400000; ks[11][0] ^= 0x20000000; /* ks[12][ ] ^= 0x00000000; */ ks[13][0] ^= 0x00080000; ks[14][1] ^= 0x00000001; ks[15][0] ^= 0x08000000; if (ks[15][0] & 0x08000000) return; ks[ 0][0] ^= 0x00080000; ks[ 1][1] ^= 0x01000000; ks[ 2][0] ^= 0x08000000; ks[ 3][0] ^= 0x00400000; ks[ 4][1] ^= 0x02000000; /* ks[ 5][ ] ^= 0x00000000; */ ks[ 6][0] ^= 0x00040000; ks[ 7][0] ^= 0x10000000; /* ks[ 8][ ] ^= 0x00000000; */ ks[ 9][1] ^= 0x00000002; ks[10][0] ^= 0x40000000; ks[11][1] ^= 0x00000008; ks[12][1] ^= 0x00400000; ks[13][0] ^= 0x20000000; /* ks[14][ ] ^= 0x00000000; */ ks[15][0] ^= 0x80000000; if (ks[15][0] & 0x80000000) return; ks[ 0][1] ^= 0x00020000; ks[ 1][0] ^= 0x00000800; ks[ 2][0] ^= 0x00000008; ks[ 3][1] ^= 0x00000100; ks[ 4][1] ^= 0x00040000; ks[ 5][0] ^= 0x00000010; /* ks[ 6][ ] ^= 0x00000000; */ ks[ 7][1] ^= 0x00008000; ks[ 8][1] ^= 0x00000200; ks[ 9][0] ^= 0x00002000; ks[10][1] ^= 0x00080000; ks[11][1] ^= 0x00000080; ks[12][0] ^= 0x00004000; ks[13][0] ^= 0x00000020; /* ks[14][ ] ^= 0x00000000; */ ks[15][1] ^= 0x00000400; if (ks[15][1] & 0x00000400) return; ks[ 0][0] ^= 0x00001000; ks[ 1][0] ^= 0x00000010; /* ks[ 2][ ] ^= 0x00000000; */ ks[ 3][1] ^= 0x00008000; ks[ 4][0] ^= 0x00000080; ks[ 5][1] ^= 0x00000040; ks[ 6][0] ^= 0x00000040; ks[ 7][1] ^= 0x00010000; ks[ 8][0] ^= 0x00004000; ks[ 9][0] ^= 0x00000020; /* ks[10][ ] ^= 0x00000000; */ ks[11][1] ^= 0x00020000; /* ks[12][ ] ^= 0x00000000; */ ks[13][1] ^= 0x00004000; ks[14][0] ^= 0x00000004; ks[15][1] ^= 0x00040000; /* Checkpointing approx. every hour (P4 1.8GHz) just in case of power cuts... No checks, will core dump if read only file, etc. */ file_p = fopen ("getpvvkey.dat", "w"); fwrite (ks, 8, 16, file_p); fclose (file_p); if (ks[15][1] & 0x00040000) return; ks[ 0][0] ^= 0x00002000; ks[ 1][1] ^= 0x00000040; ks[ 2][0] ^= 0x00000040; ks[ 3][1] ^= 0x00010000; /* ks[ 4][ ] ^= 0x00000000; */ ks[ 5][0] ^= 0x00000400; ks[ 6][1] ^= 0x00000400; ks[ 7][0] ^= 0x00000800; /* ks[ 8][ ] ^= 0x00000000; */ ks[ 9][1] ^= 0x00004000; ks[10][0] ^= 0x00000004; ks[11][0] ^= 0x00001000; ks[12][1] ^= 0x00000800; ks[13][0] ^= 0x00008000; ks[14][1] ^= 0x00000200; ks[15][0] ^= 0x00000080; if (ks[15][0] & 0x00000080) return; ks[ 0][1] ^= 0x04000000; ks[ 1][1] ^= 0x00000008; ks[ 2][1] ^= 0x00400000; ks[ 3][0] ^= 0x20000000; /* ks[ 4][ ] ^= 0x00000000; */ ks[ 5][0] ^= 0x00080000; ks[ 6][1] ^= 0x00000001; ks[ 7][1] ^= 0x08000000; ks[ 8][0] ^= 0x00400000; ks[ 9][1] ^= 0x02000000; /* ks[10][ ] ^= 0x00000000; */ ks[11][0] ^= 0x00040000; ks[12][0] ^= 0x10000000; ks[13][0] ^= 0x00200000; /* ks[14][ ] ^= 0x00000000; */ ks[15][0] ^= 0x40000000; if (ks[15][0] & 0x40000000) return; ks[ 0][0] ^= 0x00040000; ks[ 1][1] ^= 0x00800000; /* ks[ 2][ ] ^= 0x00000000; */ ks[ 3][1] ^= 0x00000002; ks[ 4][0] ^= 0x40000000; ks[ 5][1] ^= 0x00000008; ks[ 6][1] ^= 0x00400000; ks[ 7][0] ^= 0x20000000; ks[ 8][0] ^= 0x00800000; ks[ 9][0] ^= 0x80000000; ks[10][1] ^= 0x01000000; ks[11][0] ^= 0x08000000; ks[12][0] ^= 0x00400000; ks[13][1] ^= 0x02000000; /* ks[14][ ] ^= 0x00000000; */ ks[15][1] ^= 0x80000000; if (ks[15][1] & 0x80000000) return; ks[ 0][0] ^= 0x08000000; ks[ 1][1] ^= 0x08000000; ks[ 2][1] ^= 0x40000000; ks[ 3][0] ^= 0x04000000; ks[ 4][1] ^= 0x80000000; ks[ 5][1] ^= 0x00800000; /* ks[ 6][ ] ^= 0x00000000; */ ks[ 7][1] ^= 0x00000002; /* ks[ 8][ ] ^= 0x00000000; */ ks[ 9][1] ^= 0x04000000; ks[10][0] ^= 0x00100000; ks[11][1] ^= 0x00000004; ks[12][0] ^= 0x00800000; ks[13][0] ^= 0x80000000; ks[14][1] ^= 0x01000000; ks[15][1] ^= 0x00000001; if (ks[15][1] & 0x00000001) return; ks[ 0][0] ^= 0x80000000; ks[ 1][0] ^= 0x00080000; ks[ 2][1] ^= 0x00000001; ks[ 3][1] ^= 0x08000000; ks[ 4][1] ^= 0x40000000; ks[ 5][0] ^= 0x04000000; ks[ 6][1] ^= 0x80000000; ks[ 7][1] ^= 0x00800000; ks[ 8][0] ^= 0x10000000; ks[ 9][0] ^= 0x00200000; /* ks[10][ ] ^= 0x00000000; */ ks[11][1] ^= 0x04000000; ks[12][0] ^= 0x00100000; ks[13][1] ^= 0x00000004; ks[14][0] ^= 0x00800000; /* ks[15][ ] ^= 0x00000000; */ if (ks[14][0] & 0x00800000) return; ks[ 0][1] ^= 0x00000400; ks[ 1][1] ^= 0x00020000; /* ks[ 2][ ] ^= 0x00000000; */ ks[ 3][1] ^= 0x00004000; ks[ 4][0] ^= 0x00000004; ks[ 5][0] ^= 0x00001000; ks[ 6][1] ^= 0x00000800; ks[ 7][0] ^= 0x00008000; ks[ 8][1] ^= 0x00008000; ks[ 9][0] ^= 0x00000080; ks[10][1] ^= 0x00000040; ks[11][0] ^= 0x00000040; ks[12][1] ^= 0x00010000; /* ks[13][ ] ^= 0x00000000; */ ks[14][0] ^= 0x00000400; /* ks[15][ ] ^= 0x00000000; */ if (ks[14][0] & 0x00000400) return; ks[ 0][1] ^= 0x00040000; ks[ 1][0] ^= 0x00001000; ks[ 2][1] ^= 0x00000800; ks[ 3][0] ^= 0x00008000; ks[ 4][1] ^= 0x00000200; ks[ 5][0] ^= 0x00002000; ks[ 6][1] ^= 0x00080000; ks[ 7][1] ^= 0x00000080; ks[ 8][1] ^= 0x00010000; /* ks[ 9][ ] ^= 0x00000000; */ ks[10][0] ^= 0x00000400; ks[11][1] ^= 0x00000400; ks[12][0] ^= 0x00000800; ks[13][0] ^= 0x00000008; ks[14][1] ^= 0x00000100; ks[15][0] ^= 0x00000004; if (ks[15][0] & 0x00000004) return; ks[ 0][0] ^= 0x00000080; ks[ 1][0] ^= 0x00002000; ks[ 2][1] ^= 0x00080000; ks[ 3][1] ^= 0x00000080; ks[ 4][0] ^= 0x00004000; ks[ 5][0] ^= 0x00000020; /* ks[ 6][ ] ^= 0x00000000; */ ks[ 7][1] ^= 0x00020000; ks[ 8][0] ^= 0x00000800; ks[ 9][0] ^= 0x00000008; ks[10][1] ^= 0x00000100; ks[11][1] ^= 0x00040000; ks[12][0] ^= 0x00000010; /* ks[13][ ] ^= 0x00000000; */ ks[14][1] ^= 0x00008000; ks[15][1] ^= 0x00000200; if (ks[15][1] & 0x00000200) return; ks[ 0][0] ^= 0x40000000; ks[ 1][1] ^= 0x04000000; ks[ 2][0] ^= 0x00100000; ks[ 3][1] ^= 0x00000004; ks[ 4][0] ^= 0x00800000; ks[ 5][0] ^= 0x80000000; ks[ 6][1] ^= 0x01000000; ks[ 7][0] ^= 0x08000000; ks[ 8][1] ^= 0x08000000; ks[ 9][1] ^= 0x40000000; ks[10][0] ^= 0x04000000; ks[11][1] ^= 0x80000000; ks[12][1] ^= 0x00800000; /* ks[13][ ] ^= 0x00000000; */ ks[14][1] ^= 0x00000002; /* ks[15][ ] ^= 0x00000000; */ if (ks[14][1] & 0x00000002) return; ks[ 0][1] ^= 0x80000000; ks[ 1][0] ^= 0x00040000; ks[ 2][0] ^= 0x10000000; ks[ 3][0] ^= 0x00200000; /* ks[ 4][ ] ^= 0x00000000; */ ks[ 5][1] ^= 0x04000000; ks[ 6][0] ^= 0x00100000; ks[ 7][1] ^= 0x00000004; ks[ 8][0] ^= 0x20000000; /* ks[ 9][ ] ^= 0x00000000; */ ks[10][0] ^= 0x00080000; ks[11][1] ^= 0x00000001; ks[12][1] ^= 0x08000000; ks[13][1] ^= 0x40000000; ks[14][0] ^= 0x04000000; /* ks[15][ ] ^= 0x00000000; */ if (ks[14][0] & 0x04000000) return; ks[ 0][1] ^= 0x00000001; ks[ 1][0] ^= 0x08000000; ks[ 2][0] ^= 0x00400000; ks[ 3][1] ^= 0x02000000; /* ks[ 4][ ] ^= 0x00000000; */ ks[ 5][0] ^= 0x00040000; ks[ 6][0] ^= 0x10000000; ks[ 7][0] ^= 0x00200000; ks[ 8][1] ^= 0x00000002; ks[ 9][0] ^= 0x40000000; ks[10][1] ^= 0x00000008; ks[11][1] ^= 0x00400000; ks[12][0] ^= 0x20000000; /* ks[13][ ] ^= 0x00000000; */ ks[14][0] ^= 0x00080000; ks[15][1] ^= 0x01000000; if (ks[15][1] & 0x01000000) return; /* ks[ 0][ ] ^= 0x00000000; */ ks[ 1][0] ^= 0x80000000; ks[ 2][1] ^= 0x01000000; ks[ 3][0] ^= 0x08000000; ks[ 4][0] ^= 0x00400000; ks[ 5][1] ^= 0x02000000; /* ks[ 6][ ] ^= 0x00000000; */ ks[ 7][0] ^= 0x00040000; ks[ 8][1] ^= 0x00800000; /* ks[ 9][ ] ^= 0x00000000; */ ks[10][1] ^= 0x00000002; ks[11][0] ^= 0x40000000; ks[12][1] ^= 0x00000008; ks[13][1] ^= 0x00400000; ks[14][0] ^= 0x20000000; ks[15][0] ^= 0x00800000; if (ks[15][0] & 0x00800000) return; /* ks[ 0][ ] ^= 0x00000000; */ ks[ 1][1] ^= 0x00000400; ks[ 2][0] ^= 0x00000800; ks[ 3][0] ^= 0x00000008; ks[ 4][1] ^= 0x00000100; ks[ 5][1] ^= 0x00040000; ks[ 6][0] ^= 0x00000010; /* ks[ 7][ ] ^= 0x00000000; */ ks[ 8][0] ^= 0x00008000; ks[ 9][1] ^= 0x00000200; ks[10][0] ^= 0x00002000; ks[11][1] ^= 0x00080000; ks[12][1] ^= 0x00000080; ks[13][0] ^= 0x00004000; ks[14][0] ^= 0x00000020; ks[15][0] ^= 0x00000400; if (ks[15][0] & 0x00000400) return; ks[ 0][0] ^= 0x00000004; ks[ 1][1] ^= 0x00040000; ks[ 2][0] ^= 0x00000010; /* ks[ 3][ ] ^= 0x00000000; */ ks[ 4][1] ^= 0x00008000; ks[ 5][0] ^= 0x00000080; ks[ 6][1] ^= 0x00000040; ks[ 7][0] ^= 0x00000040; ks[ 8][1] ^= 0x00000080; ks[ 9][0] ^= 0x00004000; ks[10][0] ^= 0x00000020; /* ks[11][ ] ^= 0x00000000; */ ks[12][1] ^= 0x00020000; /* ks[13][ ] ^= 0x00000000; */ ks[14][1] ^= 0x00004000; ks[15][1] ^= 0x00000100; if (ks[15][1] & 0x00000100) return; ks[ 0][1] ^= 0x00000200; ks[ 1][0] ^= 0x00000080; ks[ 2][1] ^= 0x00000040; ks[ 3][0] ^= 0x00000040; ks[ 4][1] ^= 0x00010000; /* ks[ 5][ ] ^= 0x00000000; */ ks[ 6][0] ^= 0x00000400; ks[ 7][1] ^= 0x00000400; ks[ 8][1] ^= 0x00020000; /* ks[ 9][ ] ^= 0x00000000; */ ks[10][1] ^= 0x00004000; ks[11][0] ^= 0x00000004; ks[12][0] ^= 0x00001000; ks[13][1] ^= 0x00000800; ks[14][0] ^= 0x00008000; ks[15][1] ^= 0x00008000; if (ks[15][1] & 0x00008000) return; /* ks[ 0][ ] ^= 0x00000000; */ ks[ 1][0] ^= 0x40000000; ks[ 2][1] ^= 0x00000008; ks[ 3][1] ^= 0x00400000; ks[ 4][0] ^= 0x20000000; /* ks[ 5][ ] ^= 0x00000000; */ ks[ 6][0] ^= 0x00080000; ks[ 7][1] ^= 0x00000001; ks[ 8][0] ^= 0x08000000; ks[ 9][0] ^= 0x00400000; ks[10][1] ^= 0x02000000; /* ks[11][ ] ^= 0x00000000; */ ks[12][0] ^= 0x00040000; ks[13][0] ^= 0x10000000; ks[14][0] ^= 0x00200000; ks[15][1] ^= 0x00000002; if (ks[15][1] & 0x00000002) return; /* ks[ 0][ ] ^= 0x00000000; */ ks[ 1][1] ^= 0x80000000; ks[ 2][1] ^= 0x00800000; /* ks[ 3][ ] ^= 0x00000000; */ ks[ 4][1] ^= 0x00000002; ks[ 5][0] ^= 0x40000000; ks[ 6][1] ^= 0x00000008; ks[ 7][1] ^= 0x00400000; ks[ 8][1] ^= 0x00000004; ks[ 9][0] ^= 0x00800000; ks[10][0] ^= 0x80000000; ks[11][1] ^= 0x01000000; ks[12][0] ^= 0x08000000; ks[13][0] ^= 0x00400000; ks[14][1] ^= 0x02000000; ks[15][0] ^= 0x04000000; if (ks[15][0] & 0x04000000) return; ks[ 0][1] ^= 0x01000000; ks[ 1][1] ^= 0x00000001; ks[ 2][1] ^= 0x08000000; ks[ 3][1] ^= 0x40000000; ks[ 4][0] ^= 0x04000000; ks[ 5][1] ^= 0x80000000; ks[ 6][1] ^= 0x00800000; /* ks[ 7][ ] ^= 0x00000000; */ ks[ 8][0] ^= 0x00200000; /* ks[ 9][ ] ^= 0x00000000; */ ks[10][1] ^= 0x04000000; ks[11][0] ^= 0x00100000; ks[12][1] ^= 0x00000004; ks[13][0] ^= 0x00800000; ks[14][0] ^= 0x80000000; ks[15][0] ^= 0x00080000; if (ks[15][0] & 0x00080000) return; ks[ 0][0] ^= 0x00800000; /* ks[ 1][ ] ^= 0x00000000; */ ks[ 2][0] ^= 0x00080000; ks[ 3][1] ^= 0x00000001; ks[ 4][1] ^= 0x08000000; ks[ 5][1] ^= 0x40000000; ks[ 6][0] ^= 0x04000000; ks[ 7][1] ^= 0x80000000; ks[ 8][0] ^= 0x00040000; ks[ 9][0] ^= 0x10000000; ks[10][0] ^= 0x00200000; /* ks[11][ ] ^= 0x00000000; */ ks[12][1] ^= 0x04000000; ks[13][0] ^= 0x00100000; ks[14][1] ^= 0x00000004; ks[15][0] ^= 0x20000000; if (ks[15][0] & 0x20000000) return; ks[ 0][0] ^= 0x00000400; /* ks[ 1][ ] ^= 0x00000000; */ ks[ 2][1] ^= 0x00020000; /* ks[ 3][ ] ^= 0x00000000; */ ks[ 4][1] ^= 0x00004000; ks[ 5][0] ^= 0x00000004; ks[ 6][0] ^= 0x00001000; ks[ 7][1] ^= 0x00000800; /* ks[ 8][ ] ^= 0x00000000; */ ks[ 9][1] ^= 0x00008000; ks[10][0] ^= 0x00000080; ks[11][1] ^= 0x00000040; ks[12][0] ^= 0x00000040; ks[13][1] ^= 0x00010000; /* ks[14][ ] ^= 0x00000000; */ ks[15][0] ^= 0x00000020; if (ks[15][0] & 0x00000020) return; ks[ 0][1] ^= 0x00000100; ks[ 1][0] ^= 0x00000004; ks[ 2][0] ^= 0x00001000; ks[ 3][1] ^= 0x00000800; ks[ 4][0] ^= 0x00008000; ks[ 5][1] ^= 0x00000200; ks[ 6][0] ^= 0x00002000; ks[ 7][1] ^= 0x00080000; ks[ 8][0] ^= 0x00000040; ks[ 9][1] ^= 0x00010000; /* ks[10][ ] ^= 0x00000000; */ ks[11][0] ^= 0x00000400; ks[12][1] ^= 0x00000400; ks[13][0] ^= 0x00000800; ks[14][0] ^= 0x00000008; ks[15][1] ^= 0x00004000; if (ks[15][1] & 0x00004000) return; ks[ 0][1] ^= 0x00008000; ks[ 1][1] ^= 0x00000200; ks[ 2][0] ^= 0x00002000; ks[ 3][1] ^= 0x00080000; ks[ 4][1] ^= 0x00000080; ks[ 5][0] ^= 0x00004000; ks[ 6][0] ^= 0x00000020; /* ks[ 7][ ] ^= 0x00000000; */ ks[ 8][1] ^= 0x00000400; ks[ 9][0] ^= 0x00000800; ks[10][0] ^= 0x00000008; ks[11][1] ^= 0x00000100; ks[12][1] ^= 0x00040000; ks[13][0] ^= 0x00000010; /* ks[14][ ] ^= 0x00000000; */ ks[15][0] ^= 0x00008000; if (ks[15][0] & 0x00008000) return; /* Program ends, all keys tried */ exit (0); }