void
tea_encipher(long *x, long *k, int undo)
{
    unsigned long n, Xl, Xr, delta, sum;

    Xl = x[0];  Xr = x[1];

    delta = 0x9e3779b9;
    sum   = 0;

    n = 32;
    do {
	sum += delta;
	Xl  += ((Xr << 4) + (k[0] ^ Xr) + (sum ^ (Xr >> 5)) + k[1]);
	Xr  += ((Xl << 4) + (k[2] ^ Xl) + (sum ^ (Xl >> 5)) + k[3]);
    } while (--n);

    x[0] = Xl;  x[1] = Xr;
}


void
tea_decipher(long *x, long *k)
{
    unsigned long n, Xl, Xr, delta, sum;

    Xl = x[0];  Xr = x[1];

    delta = 0x9e3779b9;
    sum   = 0x6526b0d9;  /* (delta * 32) on a 32-bit machine */

    n = 32;
    do {
	Xr  -= ((Xl << 4) + (k[2] ^ Xl) + (sum ^ (Xl >> 5)) + k[3]);
	Xl  -= ((Xr << 4) + (k[0] ^ Xr) + (sum ^ (Xr >> 5)) + k[1]);
	sum -= delta;
    } while (--n);

    x[0] = Xl;  x[1] = Xr;
}


