tea.c
Go to the documentation of this file.00001
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080 #include "tea.h"
00081 #include <mware/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