blob: a84d688d8b6054aaea97ffbb3da67fee11d8bc63 [file] [log] [blame]
#include "TEA.h"
#include <memory.h>
#include <algorithm>
// The TEA algorithm is public domain
//-----------------------------------------------------------------------------
void TEACipher::setKey ( void * key, int keySize )
{
memset(m_key,0,16);
memcpy(m_key,key,std::min(keySize,16));
}
//----------------------------------------------------------------------------
void TEACipher::encrypt ( void * block, unsigned int /*nonce*/ ) const
{
unsigned int * v = (unsigned int*)block;
unsigned int * k = (unsigned int*)m_key;
unsigned int sum = 0;
unsigned int delta = 0x9E3779B9;
for( int i = 0; i < 32; i++ )
{
sum += delta;
v[0] += ((v[1]<<4) + k[0]) ^ (v[1] + sum) ^ ((v[1]>>5) + k[1]);
v[1] += ((v[0]<<4) + k[2]) ^ (v[0] + sum) ^ ((v[0]>>5) + k[3]);
}
}
//----------
void TEACipher::decrypt ( void * block, unsigned int /*nonce*/ ) const
{
unsigned int * v = (unsigned int*)block;
unsigned int * k = (unsigned int*)m_key;
unsigned int sum = 0xC6EF3720;
unsigned int delta = 0x9E3779B9;
for( int i = 0; i < 32; i++ )
{
v[1] -= ((v[0]<<4) + k[2]) ^ (v[0] + sum) ^ ((v[0]>>5) + k[3]);
v[0] -= ((v[1]<<4) + k[0]) ^ (v[1] + sum) ^ ((v[1]>>5) + k[1]);
sum -= delta;
}
}
//----------------------------------------------------------------------------