/* $Id: tiny_crypt.c,v 1.2 2003/10/01 12:27:33 tans Exp $ */
#include <string.h>
#define TEA_ROUNDS 0x10
#define TEA_DELTA 0x9E3779B9
#define TEA_SUM 0xE3779B90
/***********************************
* TEA block encryption function
***********************************/
void tiny_encrypt(unsigned long *const v, unsigned long *const w,
const unsigned long *const k)
{
register unsigned long
y = v[0],
z = v[1],
a = k[0],
b = k[1],
c = k[2],
d = k[3],
n = TEA_ROUNDS,
sum = 0,
delta = TEA_DELTA;
while (n-- > 0) {
sum += delta;
y += (z << 4) + a ^ z + sum ^ (z >> 5) + b;
z += (y << 4) + c ^ y + sum ^ (y >> 5) + d;
}
w[0] = y;
w[1] = z;
}
/***********************************
* TEA block decryption function
***********************************/
void tiny_decrypt(unsigned long *const v, unsigned long *const w,
const unsigned long *const k)
{
register unsigned long
y = v[0],
z = v[1],
a = k[0],
b = k[1],
c = k[2],
d = k[3],
n = TEA_ROUNDS,
sum = TEA_SUM,
delta = TEA_DELTA;
while (n-- > 0) {
z -= (y << 4) + c ^ y + sum ^ (y >> 5) + d;
y -= (z << 4) + a ^ z + sum ^ (z >> 5) + b;
sum -= delta;
}
w[0] = y;
w[1] = z;
}
/***************************************
input : 64 bits in network order
output: 64 bits in network order
dir: 0 for encryption, 1 for decryption
key: 128 bits of key
****************************************/
void tiny_crypt (const unsigned char *input, const unsigned char *key,
int dir, unsigned long *output)
{
unsigned long v[2], k[4];
int i;
memcpy(v, input, 8);
memcpy(k, key, 16);
v[0] = ntohl(v[0]);
v[1] = ntohl(v[1]);
for (i = 0; i < 4; i++) { k[i] = ntohl(k[i]); }
if (dir == 0) {
tiny_encrypt(v, output, k);
} else {
tiny_decrypt(v, output, k);
}
output[0] = htonl(output[0]);
output[1] = htonl(output[1]);
}