Crypto++
tea.cpp
1 // tea.cpp - modified by Wei Dai from code in the original paper
2 
3 #include "pch.h"
4 #include "tea.h"
5 #include "misc.h"
6 
7 NAMESPACE_BEGIN(CryptoPP)
8 
9 static const word32 DELTA = 0x9e3779b9;
10 typedef BlockGetAndPut<word32, BigEndian> Block;
11 
12 void TEA::Base::UncheckedSetKey(const byte *userKey, unsigned int length, const NameValuePairs &params)
13 {
14  AssertValidKeyLength(length);
15 
16  GetUserKey(BIG_ENDIAN_ORDER, m_k.begin(), 4, userKey, KEYLENGTH);
17  m_limit = GetRoundsAndThrowIfInvalid(params, this) * DELTA;
18 }
19 
20 void TEA::Enc::ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const
21 {
22  word32 y, z;
23  Block::Get(inBlock)(y)(z);
24 
25  word32 sum = 0;
26  while (sum != m_limit)
27  {
28  sum += DELTA;
29  y += (z << 4) + m_k[0] ^ z + sum ^ (z >> 5) + m_k[1];
30  z += (y << 4) + m_k[2] ^ y + sum ^ (y >> 5) + m_k[3];
31  }
32 
33  Block::Put(xorBlock, outBlock)(y)(z);
34 }
35 
36 void TEA::Dec::ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const
37 {
38  word32 y, z;
39  Block::Get(inBlock)(y)(z);
40 
41  word32 sum = m_limit;
42  while (sum != 0)
43  {
44  z -= (y << 4) + m_k[2] ^ y + sum ^ (y >> 5) + m_k[3];
45  y -= (z << 4) + m_k[0] ^ z + sum ^ (z >> 5) + m_k[1];
46  sum -= DELTA;
47  }
48 
49  Block::Put(xorBlock, outBlock)(y)(z);
50 }
51 
52 void XTEA::Base::UncheckedSetKey(const byte *userKey, unsigned int length, const NameValuePairs &params)
53 {
54  AssertValidKeyLength(length);
55 
56  GetUserKey(BIG_ENDIAN_ORDER, m_k.begin(), 4, userKey, KEYLENGTH);
57  m_limit = GetRoundsAndThrowIfInvalid(params, this) * DELTA;
58 }
59 
60 void XTEA::Enc::ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const
61 {
62  word32 y, z;
63  Block::Get(inBlock)(y)(z);
64 
65 #ifdef __SUNPRO_CC
66  // workaround needed on Sun Studio 12u1 Sun C++ 5.10 SunOS_i386 128229-02 2009/09/21
67  size_t sum = 0;
68  while ((sum&0xffffffff) != m_limit)
69 #else
70  word32 sum = 0;
71  while (sum != m_limit)
72 #endif
73  {
74  y += (z<<4 ^ z>>5) + z ^ sum + m_k[sum&3];
75  sum += DELTA;
76  z += (y<<4 ^ y>>5) + y ^ sum + m_k[sum>>11 & 3];
77  }
78 
79  Block::Put(xorBlock, outBlock)(y)(z);
80 }
81 
82 void XTEA::Dec::ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const
83 {
84  word32 y, z;
85  Block::Get(inBlock)(y)(z);
86 
87 #ifdef __SUNPRO_CC
88  // workaround needed on Sun Studio 12u1 Sun C++ 5.10 SunOS_i386 128229-02 2009/09/21
89  size_t sum = m_limit;
90  while ((sum&0xffffffff) != 0)
91 #else
92  word32 sum = m_limit;
93  while (sum != 0)
94 #endif
95  {
96  z -= (y<<4 ^ y>>5) + y ^ sum + m_k[sum>>11 & 3];
97  sum -= DELTA;
98  y -= (z<<4 ^ z>>5) + z ^ sum + m_k[sum&3];
99  }
100 
101  Block::Put(xorBlock, outBlock)(y)(z);
102 }
103 
104 #define MX (z>>5^y<<2)+(y>>3^z<<4)^(sum^y)+(m_k[p&3^e]^z)
105 
106 void BTEA::Enc::ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const
107 {
108  unsigned int n = m_blockSize / 4;
109  word32 *v = (word32*)outBlock;
110  ConditionalByteReverse(BIG_ENDIAN_ORDER, v, (const word32*)inBlock, m_blockSize);
111 
112  word32 y = v[0], z = v[n-1], e;
113  word32 p, q = 6+52/n;
114  word32 sum = 0;
115 
116  while (q-- > 0)
117  {
118  sum += DELTA;
119  e = sum>>2 & 3;
120  for (p = 0; p < n-1; p++)
121  {
122  y = v[p+1];
123  z = v[p] += MX;
124  }
125  y = v[0];
126  z = v[n-1] += MX;
127  }
128 
129  ConditionalByteReverse(BIG_ENDIAN_ORDER, v, v, m_blockSize);
130 }
131 
132 void BTEA::Dec::ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const
133 {
134  unsigned int n = m_blockSize / 4;
135  word32 *v = (word32*)outBlock;
136  ConditionalByteReverse(BIG_ENDIAN_ORDER, v, (const word32*)inBlock, m_blockSize);
137 
138  word32 y = v[0], z = v[n-1], e;
139  word32 p, q = 6+52/n;
140  word32 sum = q * DELTA;
141 
142  while (sum != 0)
143  {
144  e = sum>>2 & 3;
145  for (p = n-1; p > 0; p--)
146  {
147  z = v[p-1];
148  y = v[p] -= MX;
149  }
150 
151  z = v[n-1];
152  y = v[0] -= MX;
153  sum -= DELTA;
154  }
155 
156  ConditionalByteReverse(BIG_ENDIAN_ORDER, v, v, m_blockSize);
157 }
158 
159 NAMESPACE_END
TEA
Definition: tea.h:19
interface for retrieving values given their names
Definition: cryptlib.h:225