struct	Keyfile
{
	UBYTE	Dummy;
	ULONG	Key0;
	char	MSN1[12];
	char	EMail[60];
	ULONG	Key2;
	char	MSN8[12];
	char	Ort[50];
	ULONG	Key4;
	char	MSN3[12];
	char	Land[50];
	ULONG	Key3;
	char	MSN9[12];
	ULONG	Key7;
	char	MSN0[12];
	ULONG	Key8;
	char	Vorname[50];
	ULONG	Key9;
	char	MSN6[12];
	char	Name[50];
	ULONG	Key6;
	char	MSN7[12];
	char	MSN4[12];
	char	Strasse[50];
	ULONG	Key1;
	char	MSN5[12];
	char	MSN2[12];
	ULONG	Key5;
};

struct Keyfile *GetKeyfile(void)
{
static	struct	Keyfile	k1;
struct	Keyfile	k2;
UBYTE					*k1ptr, *k2ptr;
ULONG					Keys[10];
int					n;
UBYTE					x1;

	k1ptr = (UBYTE *)&k1; k2ptr = (UBYTE *)&k2;
	for(n = 0 ; n < 10 ; n++)
		Keys[n] = NULL;

	/* Datei laden */
	{
	char	fname[256] = "";
	BPTR	fhand;

		if(GetVar("KEYPATH", fname, sizeof(fname)-2, NULL))
			AddPart(fname, "UFT_ISTEC.Key", sizeof(fname)-2);

		if((strlen(fname)) &&(fhand = Open(fname, MODE_OLDFILE)))
		{
			Read(fhand, &k1, sizeof(struct Keyfile));
			Read(fhand, &k2, sizeof(struct Keyfile));
			Close(fhand);
		}
		else
		if(fhand = Open("PROGDIR:UFT_ISTEC.Key", MODE_OLDFILE))
		{
			Read(fhand, &k1, sizeof(struct Keyfile));
			Read(fhand, &k2, sizeof(struct Keyfile));
			Close(fhand);
		}
		else
		if(fhand = Open("L:UFT_ISTEC.Key", MODE_OLDFILE))
		{
			Read(fhand, &k1, sizeof(struct Keyfile));
			Read(fhand, &k2, sizeof(struct Keyfile));
			Close(fhand);
		}
		else
		if(fhand = Open("S:UFT_ISTEC.Key", MODE_OLDFILE))
		{
			Read(fhand, &k1, sizeof(struct Keyfile));
			Read(fhand, &k2, sizeof(struct Keyfile));
			Close(fhand);
		}
		else
			return((struct Keyfile *)NULL);
	}

	/* Keys einlesen */
	Keys[0] = k1.Key0;
	Keys[1] = k1.Key1;
	Keys[2] = k1.Key2;
	Keys[3] = k1.Key3;
	Keys[4] = k1.Key4;
	Keys[5] = k1.Key5;
	Keys[6] = k1.Key6;
	Keys[7] = k1.Key7;
	Keys[8] = k1.Key8;
	Keys[9] = k1.Key9;
	if((Keys[0] != k2.Key0)	||
		(Keys[1] != k2.Key1)	||
		(Keys[2] != k2.Key2)	||
		(Keys[3] != k2.Key3)	||
		(Keys[4] != k2.Key4)	||
		(Keys[5] != k2.Key5)	||
		(Keys[6] != k2.Key6)	||
		(Keys[7] != k2.Key7)	||
		(Keys[8] != k2.Key8)	||
		(Keys[9] != k2.Key9))
		return((struct Keyfile *)-1);
	k1.Key0 = k1.Key1 = k1.Key2 = k1.Key3 = k1.Key4 = k1.Key5 = k1.Key6 = k1.Key7 = k1.Key8 = k1.Key9 = NULL;
	k2.Key0 = k2.Key1 = k2.Key2 = k2.Key3 = k2.Key4 = k2.Key5 = k2.Key6 = k2.Key7 = k2.Key8 = k2.Key9 = NULL;

	/* Key0-9 berechnen */
	{
	ULONG	K[10];
		for(n = 0 ; n < 10 ; n++) K[n] = NULL;
		for(n = 0 ; n < sizeof(struct Keyfile) ; n++)
		{
			K[0] = K[0] + k1ptr[n] * 2843 + n;
/*
			K[1] = K[1] + k1ptr[n] * 3659 + n * n;
			K[2] = K[2] + k1ptr[n] * k1ptr[n] + 4243;
			K[3] = K[3] + k1ptr[n] + k1ptr[n] + 4909;
			K[4] = K[4] + k1ptr[n] * k1ptr[n] * 6971;
			K[5] = K[5] + k1ptr[n] * 8101;
			K[6] = K[6] + k1ptr[n] * 9421 ^ 0x42;
*/
		}
/*
		K[7] = K[3] / 217 + 32;
		K[8] = K[5] ^ 0x9fab12bc;
		K[9] = K[6] * K[0];
*/

		if(K[0] != Keys[0]) return((struct Keyfile *)-1);
/*
		if(K[1] != Keys[1]) return((struct Keyfile *)-1);
		if(K[2] != Keys[2]) return((struct Keyfile *)-1);
		if(K[3] != Keys[3]) return((struct Keyfile *)-1);
		if(K[4] != Keys[4]) return((struct Keyfile *)-1);
		if(K[5] != Keys[5]) return((struct Keyfile *)-1);
		if(K[6] != Keys[6]) return((struct Keyfile *)-1);
		if(K[7] != Keys[7]) return((struct Keyfile *)-1);
		if(K[8] != Keys[8]) return((struct Keyfile *)-1);
		if(K[9] != Keys[9]) return((struct Keyfile *)-1);
*/
	}

	/* Strukturen XOREN */
	x1 = k1ptr[0];
	for(n = 1 ; n < sizeof(struct Keyfile) ; n++)
	{
		k1ptr[n] = k1ptr[n] ^ x1;
		k2ptr[n] = k1ptr[n] ^ x1 ^ 0x42;
	}
	if(!memcmp(&k1, &k2, sizeof(struct Keyfile)))
		return((struct Keyfile *)-1);

	return(&k1);
}
