/******************************************************************************
*                           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);
}