BeRTOS
|
00001 00066 #include "tea.h" 00067 #include <cpu/byteorder.h> 00068 00069 static uint32_t tea_func(uint32_t *in, uint32_t *sum, uint32_t *k) 00070 { 00071 return ((*in << 4) + cpu_to_le32(k[0])) ^ (*in + *sum) ^ ((*in >> 5) + cpu_to_le32(k[1])); 00072 } 00073 00081 void tea_enc(void *_v, void *_k) 00082 { 00083 uint32_t y, z; 00084 uint32_t sum = 0; 00085 uint8_t n = ROUNDS; 00086 uint32_t *v = (uint32_t *)_v; 00087 uint32_t *k = (uint32_t *)_k; 00088 00089 y=cpu_to_le32(v[0]); 00090 z=cpu_to_le32(v[1]); 00091 00092 while(n-- > 0) 00093 { 00094 sum += DELTA; 00095 y += tea_func(&z, &sum, &(k[0])); 00096 z += tea_func(&y, &sum, &(k[2])); 00097 } 00098 00099 v[0] = le32_to_cpu(y); 00100 v[1] = le32_to_cpu(z); 00101 } 00102 00110 void tea_dec(void *_v, void *_k) 00111 { 00112 uint32_t y, z; 00113 uint32_t sum = DELTA * ROUNDS; 00114 uint8_t n = ROUNDS; 00115 uint32_t *v = (uint32_t *)_v; 00116 uint32_t *k = (uint32_t *)_k; 00117 00118 y = cpu_to_le32(v[0]); 00119 z = cpu_to_le32(v[1]); 00120 00121 while(n-- > 0) 00122 { 00123 z -= tea_func(&y, &sum, &(k[2])); 00124 y -= tea_func(&z, &sum, &(k[0])); 00125 sum -= DELTA; 00126 } 00127 00128 v[0] = le32_to_cpu(y); 00129 v[1] = le32_to_cpu(z); 00130 } 00131