tea.c

Go to the documentation of this file.
00001 
00067 /*#*
00068  *#* $Log$
00069  *#* Revision 1.2  2007/09/19 16:23:27  batt
00070  *#* Fix doxygen warnings.
00071  *#*
00072  *#* Revision 1.1  2007/06/07 09:13:40  batt
00073  *#* Add TEA enc/decryption algorithm.
00074  *#*
00075  *#* Revision 1.1  2007/01/10 17:30:10  batt
00076  *#* Add cryptographic routines.
00077  *#*
00078  *#*/
00079 
00080 #include "tea.h"
00081 #include <cpu/byteorder.h>
00082 
00083 static uint32_t tea_func(uint32_t *in, uint32_t *sum, uint32_t *k)
00084 {
00085     return ((*in << 4) + cpu_to_le32(k[0])) ^ (*in + *sum) ^ ((*in >> 5) + cpu_to_le32(k[1]));
00086 }
00087 
00095 void tea_enc(void *_v, void *_k)
00096 {
00097     uint32_t y, z;
00098     uint32_t sum = 0;
00099     uint8_t n = ROUNDS;
00100     uint32_t *v = (uint32_t *)_v;
00101     uint32_t *k = (uint32_t *)_k;
00102 
00103     y=cpu_to_le32(v[0]);
00104     z=cpu_to_le32(v[1]);
00105 
00106     while(n-- > 0)
00107     {
00108         sum += DELTA;
00109         y += tea_func(&z, &sum, &(k[0]));
00110         z += tea_func(&y, &sum, &(k[2]));
00111     }
00112 
00113     v[0] = le32_to_cpu(y);
00114     v[1] = le32_to_cpu(z);
00115 }
00116 
00124 void tea_dec(void *_v, void *_k)
00125 {
00126     uint32_t y, z;
00127     uint32_t sum = DELTA * ROUNDS;
00128     uint8_t n = ROUNDS;
00129     uint32_t *v = (uint32_t *)_v;
00130     uint32_t *k = (uint32_t *)_k;
00131 
00132     y = cpu_to_le32(v[0]);
00133     z = cpu_to_le32(v[1]);
00134 
00135     while(n-- > 0)
00136     {
00137         z -= tea_func(&y, &sum, &(k[2]));
00138         y -= tea_func(&z, &sum, &(k[0]));
00139         sum -= DELTA;
00140     }
00141 
00142     v[0] = le32_to_cpu(y);
00143     v[1] = le32_to_cpu(z);
00144 }
00145