/******************************************************************************
* Program: getpvvkey 2.00 *
* *
* by L. Padilla (padilla@gae.ucm.es) *
* *
* Madrid, 2003/5/2 *
* *
* This program looks for PVV key. Compile with make -f Makegetpvvkey *
******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#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);
}