blob: 3ec35915a1b0b1cd1a8db81e5336f9ad13d49ccb [file] [log] [blame]
tanjent@gmail.com7e5c3632010-11-02 00:50:04 +00001#include "XTEA.h"
2
3#include <algorithm>
4
5static const int g_rounds = 64;
6
7// The XTEA and BTEA algorithms are public domain
8
9//----------------------------------------------------------------------------
10
11void XTEACipher::setKey ( void * key, int keySize )
12{
13 memset(m_key,0,16);
14 memcpy(m_key,key,std::min(keySize,16));
15}
16
17//----------------------------------------------------------------------------
18
19void XTEACipher::encrypt ( void * block, unsigned int nonce ) const
20{
21 uint32_t * v = (uint32_t*)block;
22 uint32_t * k = (uint32_t*)m_key;
23
24 uint32_t delta = 0x9E3779B9;
25 uint32_t sum = 0;
26
27 v[0] ^= nonce;
28
29 for(int i = 0; i < g_rounds; i++)
30 {
31 v[0] += (((v[1] << 4) ^ (v[1] >> 5)) + v[1]) ^ (sum + k[sum & 3]);
32
33 sum += delta;
34
35 v[1] += (((v[0] << 4) ^ (v[0] >> 5)) + v[0]) ^ (sum + k[(sum>>11) & 3]);
36 }
37}
38
39//----------
40
41void XTEACipher::decrypt ( void * block, unsigned int nonce ) const
42{
43 uint32_t * v = (uint32_t*)block;
44 uint32_t * k = (uint32_t*)m_key;
45
46 uint32_t delta = 0x9E3779B9;
47 uint32_t sum = delta * g_rounds;
48
49 for(int i = 0; i < g_rounds; i++)
50 {
51 v[1] -= (((v[0] << 4) ^ (v[0] >> 5)) + v[0]) ^ (sum + k[(sum>>11) & 3]);
52
53 sum -= delta;
54
55 v[0] -= (((v[1] << 4) ^ (v[1] >> 5)) + v[1]) ^ (sum + k[sum & 3]);
56 }
57
58 v[0] ^= nonce;
59}
60
61//----------------------------------------------------------------------------
62
63#define DELTA 0x9e3779b9
64#define MX ((z>>5^y<<2) + (y>>3^z<<4)) ^ ((sum^y) + (k[(p&3)^e] ^ z));
65
66void btea ( unsigned int *v, int n, unsigned int const k[4])
67{
68 const int rounds = 6 + (52/n);
69 unsigned int sum = 0;
70
71 unsigned int y = 0;
72 unsigned int z = v[n-1];
73
74 for(int round = 0; round < rounds; round++)
75 {
76 sum += DELTA;
77 unsigned int e = (sum >> 2) & 3;
78
79 int p;
80
81 for( p=0; p < n-1; p++ )
82 {
83 y = v[p+1];
84 z = v[p] += MX;
85 }
86
87 y = v[0];
88 z = v[n-1] += MX;
89 }
90}
91
92void btea_decrypt ( unsigned int *v, int n, unsigned int const k[4])
93{
94 const int rounds = 6 + (52/n);
95 unsigned int sum = rounds*DELTA;
96
97 unsigned int y = v[0];
98 unsigned int z = 0;
99
100 for(int round = 0; round < rounds; round++)
101 {
102 unsigned int e = (sum >> 2) & 3;
103
104 int p;
105
106 for( p = n-1; p > 0; p-- )
107 {
108 z = v[p-1];
109 y = v[p] -= MX;
110 }
111
112 z = v[n-1];
113 y = v[0] -= MX;
114
115 sum -= DELTA;
116 }
117}
118
119//----------------------------------------------------------------------------