7ANONYMOUS_NAMESPACE_BEGIN
10using CryptoPP::rotlVariable;
11using CryptoPP::rotlConstant;
20template <
unsigned int S,
typename Fn>
23 a += fn(b, c, d) + x + k;
25 c = rotlConstant<10>(c);
28ANONYMOUS_NAMESPACE_END
32const unsigned int k0 = 0;
33const unsigned int k1 = 0x5a827999;
34const unsigned int k2 = 0x6ed9eba1;
35const unsigned int k3 = 0x8f1bbcdc;
36const unsigned int k4 = 0xa953fd4e;
37const unsigned int k5 = 0x50a28be6;
38const unsigned int k6 = 0x5c4dd124;
39const unsigned int k7 = 0x6d703ef3;
40const unsigned int k8 = 0x7a6d76e9;
41const unsigned int k9 = 0;
43void TTMAC_Base::UncheckedSetKey(
const byte *userKey,
unsigned int keylength,
const NameValuePairs &)
45 AssertValidKeyLength(keylength);
53void TTMAC_Base::Init()
55 m_digest[0] = m_digest[5] = m_key[0];
56 m_digest[1] = m_digest[6] = m_key[1];
57 m_digest[2] = m_digest[7] = m_key[2];
58 m_digest[3] = m_digest[8] = m_key[3];
59 m_digest[4] = m_digest[9] = m_key[4];
62void TTMAC_Base::TruncatedFinal(
byte *hash,
size_t size)
64 PadLastBlock(
BlockSize() - 2*
sizeof(HashWordType));
67 m_data[m_data.size()-2] = GetBitCountLo();
68 m_data[m_data.size()-1] = GetBitCountHi();
70 Transform(m_digest, m_data,
true);
74 if (size != DIGESTSIZE)
79 m_digest[3] += m_digest[1] + m_digest[4];
82 m_digest[2] += m_digest[0] + t3;
85 m_digest[0] += m_digest[1] + t3;
86 m_digest[1] += m_digest[4] + t2;
108 std::memcpy(hash, m_digest, size);
113void TTMAC_Base::Transform(
word32 *digest,
const word32 *X,
bool last)
115 word32 a1, b1, c1, d1, e1, a2, b2, c2, d2, e2;
139 Subround<11>(F, a1, b1, c1, d1, e1, X[ 0], k0);
140 Subround<14>(F, e1, a1, b1, c1, d1, X[ 1], k0);
141 Subround<15>(F, d1, e1, a1, b1, c1, X[ 2], k0);
142 Subround<12>(F, c1, d1, e1, a1, b1, X[ 3], k0);
143 Subround< 5>(F, b1, c1, d1, e1, a1, X[ 4], k0);
144 Subround< 8>(F, a1, b1, c1, d1, e1, X[ 5], k0);
145 Subround< 7>(F, e1, a1, b1, c1, d1, X[ 6], k0);
146 Subround< 9>(F, d1, e1, a1, b1, c1, X[ 7], k0);
147 Subround<11>(F, c1, d1, e1, a1, b1, X[ 8], k0);
148 Subround<13>(F, b1, c1, d1, e1, a1, X[ 9], k0);
149 Subround<14>(F, a1, b1, c1, d1, e1, X[10], k0);
150 Subround<15>(F, e1, a1, b1, c1, d1, X[11], k0);
151 Subround< 6>(F, d1, e1, a1, b1, c1, X[12], k0);
152 Subround< 7>(F, c1, d1, e1, a1, b1, X[13], k0);
153 Subround< 9>(F, b1, c1, d1, e1, a1, X[14], k0);
154 Subround< 8>(F, a1, b1, c1, d1, e1, X[15], k0);
156 Subround< 7>(G, e1, a1, b1, c1, d1, X[ 7], k1);
157 Subround< 6>(G, d1, e1, a1, b1, c1, X[ 4], k1);
158 Subround< 8>(G, c1, d1, e1, a1, b1, X[13], k1);
159 Subround<13>(G, b1, c1, d1, e1, a1, X[ 1], k1);
160 Subround<11>(G, a1, b1, c1, d1, e1, X[10], k1);
161 Subround< 9>(G, e1, a1, b1, c1, d1, X[ 6], k1);
162 Subround< 7>(G, d1, e1, a1, b1, c1, X[15], k1);
163 Subround<15>(G, c1, d1, e1, a1, b1, X[ 3], k1);
164 Subround< 7>(G, b1, c1, d1, e1, a1, X[12], k1);
165 Subround<12>(G, a1, b1, c1, d1, e1, X[ 0], k1);
166 Subround<15>(G, e1, a1, b1, c1, d1, X[ 9], k1);
167 Subround< 9>(G, d1, e1, a1, b1, c1, X[ 5], k1);
168 Subround<11>(G, c1, d1, e1, a1, b1, X[ 2], k1);
169 Subround< 7>(G, b1, c1, d1, e1, a1, X[14], k1);
170 Subround<13>(G, a1, b1, c1, d1, e1, X[11], k1);
171 Subround<12>(G, e1, a1, b1, c1, d1, X[ 8], k1);
173 Subround<11>(H, d1, e1, a1, b1, c1, X[ 3], k2);
174 Subround<13>(H, c1, d1, e1, a1, b1, X[10], k2);
175 Subround< 6>(H, b1, c1, d1, e1, a1, X[14], k2);
176 Subround< 7>(H, a1, b1, c1, d1, e1, X[ 4], k2);
177 Subround<14>(H, e1, a1, b1, c1, d1, X[ 9], k2);
178 Subround< 9>(H, d1, e1, a1, b1, c1, X[15], k2);
179 Subround<13>(H, c1, d1, e1, a1, b1, X[ 8], k2);
180 Subround<15>(H, b1, c1, d1, e1, a1, X[ 1], k2);
181 Subround<14>(H, a1, b1, c1, d1, e1, X[ 2], k2);
182 Subround< 8>(H, e1, a1, b1, c1, d1, X[ 7], k2);
183 Subround<13>(H, d1, e1, a1, b1, c1, X[ 0], k2);
184 Subround< 6>(H, c1, d1, e1, a1, b1, X[ 6], k2);
185 Subround< 5>(H, b1, c1, d1, e1, a1, X[13], k2);
186 Subround<12>(H, a1, b1, c1, d1, e1, X[11], k2);
187 Subround< 7>(H, e1, a1, b1, c1, d1, X[ 5], k2);
188 Subround< 5>(H, d1, e1, a1, b1, c1, X[12], k2);
190 Subround<11>(I, c1, d1, e1, a1, b1, X[ 1], k3);
191 Subround<12>(I, b1, c1, d1, e1, a1, X[ 9], k3);
192 Subround<14>(I, a1, b1, c1, d1, e1, X[11], k3);
193 Subround<15>(I, e1, a1, b1, c1, d1, X[10], k3);
194 Subround<14>(I, d1, e1, a1, b1, c1, X[ 0], k3);
195 Subround<15>(I, c1, d1, e1, a1, b1, X[ 8], k3);
196 Subround< 9>(I, b1, c1, d1, e1, a1, X[12], k3);
197 Subround< 8>(I, a1, b1, c1, d1, e1, X[ 4], k3);
198 Subround< 9>(I, e1, a1, b1, c1, d1, X[13], k3);
199 Subround<14>(I, d1, e1, a1, b1, c1, X[ 3], k3);
200 Subround< 5>(I, c1, d1, e1, a1, b1, X[ 7], k3);
201 Subround< 6>(I, b1, c1, d1, e1, a1, X[15], k3);
202 Subround< 8>(I, a1, b1, c1, d1, e1, X[14], k3);
203 Subround< 6>(I, e1, a1, b1, c1, d1, X[ 5], k3);
204 Subround< 5>(I, d1, e1, a1, b1, c1, X[ 6], k3);
205 Subround<12>(I, c1, d1, e1, a1, b1, X[ 2], k3);
207 Subround< 9>(J, b1, c1, d1, e1, a1, X[ 4], k4);
208 Subround<15>(J, a1, b1, c1, d1, e1, X[ 0], k4);
209 Subround< 5>(J, e1, a1, b1, c1, d1, X[ 5], k4);
210 Subround<11>(J, d1, e1, a1, b1, c1, X[ 9], k4);
211 Subround< 6>(J, c1, d1, e1, a1, b1, X[ 7], k4);
212 Subround< 8>(J, b1, c1, d1, e1, a1, X[12], k4);
213 Subround<13>(J, a1, b1, c1, d1, e1, X[ 2], k4);
214 Subround<12>(J, e1, a1, b1, c1, d1, X[10], k4);
215 Subround< 5>(J, d1, e1, a1, b1, c1, X[14], k4);
216 Subround<12>(J, c1, d1, e1, a1, b1, X[ 1], k4);
217 Subround<13>(J, b1, c1, d1, e1, a1, X[ 3], k4);
218 Subround<14>(J, a1, b1, c1, d1, e1, X[ 8], k4);
219 Subround<11>(J, e1, a1, b1, c1, d1, X[11], k4);
220 Subround< 8>(J, d1, e1, a1, b1, c1, X[ 6], k4);
221 Subround< 5>(J, c1, d1, e1, a1, b1, X[15], k4);
222 Subround< 6>(J, b1, c1, d1, e1, a1, X[13], k4);
224 Subround< 8>(J, a2, b2, c2, d2, e2, X[ 5], k5);
225 Subround< 9>(J, e2, a2, b2, c2, d2, X[14], k5);
226 Subround< 9>(J, d2, e2, a2, b2, c2, X[ 7], k5);
227 Subround<11>(J, c2, d2, e2, a2, b2, X[ 0], k5);
228 Subround<13>(J, b2, c2, d2, e2, a2, X[ 9], k5);
229 Subround<15>(J, a2, b2, c2, d2, e2, X[ 2], k5);
230 Subround<15>(J, e2, a2, b2, c2, d2, X[11], k5);
231 Subround< 5>(J, d2, e2, a2, b2, c2, X[ 4], k5);
232 Subround< 7>(J, c2, d2, e2, a2, b2, X[13], k5);
233 Subround< 7>(J, b2, c2, d2, e2, a2, X[ 6], k5);
234 Subround< 8>(J, a2, b2, c2, d2, e2, X[15], k5);
235 Subround<11>(J, e2, a2, b2, c2, d2, X[ 8], k5);
236 Subround<14>(J, d2, e2, a2, b2, c2, X[ 1], k5);
237 Subround<14>(J, c2, d2, e2, a2, b2, X[10], k5);
238 Subround<12>(J, b2, c2, d2, e2, a2, X[ 3], k5);
239 Subround< 6>(J, a2, b2, c2, d2, e2, X[12], k5);
241 Subround< 9>(I, e2, a2, b2, c2, d2, X[ 6], k6);
242 Subround<13>(I, d2, e2, a2, b2, c2, X[11], k6);
243 Subround<15>(I, c2, d2, e2, a2, b2, X[ 3], k6);
244 Subround< 7>(I, b2, c2, d2, e2, a2, X[ 7], k6);
245 Subround<12>(I, a2, b2, c2, d2, e2, X[ 0], k6);
246 Subround< 8>(I, e2, a2, b2, c2, d2, X[13], k6);
247 Subround< 9>(I, d2, e2, a2, b2, c2, X[ 5], k6);
248 Subround<11>(I, c2, d2, e2, a2, b2, X[10], k6);
249 Subround< 7>(I, b2, c2, d2, e2, a2, X[14], k6);
250 Subround< 7>(I, a2, b2, c2, d2, e2, X[15], k6);
251 Subround<12>(I, e2, a2, b2, c2, d2, X[ 8], k6);
252 Subround< 7>(I, d2, e2, a2, b2, c2, X[12], k6);
253 Subround< 6>(I, c2, d2, e2, a2, b2, X[ 4], k6);
254 Subround<15>(I, b2, c2, d2, e2, a2, X[ 9], k6);
255 Subround<13>(I, a2, b2, c2, d2, e2, X[ 1], k6);
256 Subround<11>(I, e2, a2, b2, c2, d2, X[ 2], k6);
258 Subround< 9>(H, d2, e2, a2, b2, c2, X[15], k7);
259 Subround< 7>(H, c2, d2, e2, a2, b2, X[ 5], k7);
260 Subround<15>(H, b2, c2, d2, e2, a2, X[ 1], k7);
261 Subround<11>(H, a2, b2, c2, d2, e2, X[ 3], k7);
262 Subround< 8>(H, e2, a2, b2, c2, d2, X[ 7], k7);
263 Subround< 6>(H, d2, e2, a2, b2, c2, X[14], k7);
264 Subround< 6>(H, c2, d2, e2, a2, b2, X[ 6], k7);
265 Subround<14>(H, b2, c2, d2, e2, a2, X[ 9], k7);
266 Subround<12>(H, a2, b2, c2, d2, e2, X[11], k7);
267 Subround<13>(H, e2, a2, b2, c2, d2, X[ 8], k7);
268 Subround< 5>(H, d2, e2, a2, b2, c2, X[12], k7);
269 Subround<14>(H, c2, d2, e2, a2, b2, X[ 2], k7);
270 Subround<13>(H, b2, c2, d2, e2, a2, X[10], k7);
271 Subround<13>(H, a2, b2, c2, d2, e2, X[ 0], k7);
272 Subround< 7>(H, e2, a2, b2, c2, d2, X[ 4], k7);
273 Subround< 5>(H, d2, e2, a2, b2, c2, X[13], k7);
275 Subround<15>(G, c2, d2, e2, a2, b2, X[ 8], k8);
276 Subround< 5>(G, b2, c2, d2, e2, a2, X[ 6], k8);
277 Subround< 8>(G, a2, b2, c2, d2, e2, X[ 4], k8);
278 Subround<11>(G, e2, a2, b2, c2, d2, X[ 1], k8);
279 Subround<14>(G, d2, e2, a2, b2, c2, X[ 3], k8);
280 Subround<14>(G, c2, d2, e2, a2, b2, X[11], k8);
281 Subround< 6>(G, b2, c2, d2, e2, a2, X[15], k8);
282 Subround<14>(G, a2, b2, c2, d2, e2, X[ 0], k8);
283 Subround< 6>(G, e2, a2, b2, c2, d2, X[ 5], k8);
284 Subround< 9>(G, d2, e2, a2, b2, c2, X[12], k8);
285 Subround<12>(G, c2, d2, e2, a2, b2, X[ 2], k8);
286 Subround< 9>(G, b2, c2, d2, e2, a2, X[13], k8);
287 Subround<12>(G, a2, b2, c2, d2, e2, X[ 9], k8);
288 Subround< 5>(G, e2, a2, b2, c2, d2, X[ 7], k8);
289 Subround<15>(G, d2, e2, a2, b2, c2, X[10], k8);
290 Subround< 8>(G, c2, d2, e2, a2, b2, X[14], k8);
292 Subround< 8>(F, b2, c2, d2, e2, a2, X[12], k9);
293 Subround< 5>(F, a2, b2, c2, d2, e2, X[15], k9);
294 Subround<12>(F, e2, a2, b2, c2, d2, X[10], k9);
295 Subround< 9>(F, d2, e2, a2, b2, c2, X[ 4], k9);
296 Subround<12>(F, c2, d2, e2, a2, b2, X[ 1], k9);
297 Subround< 5>(F, b2, c2, d2, e2, a2, X[ 5], k9);
298 Subround<14>(F, a2, b2, c2, d2, e2, X[ 8], k9);
299 Subround< 6>(F, e2, a2, b2, c2, d2, X[ 7], k9);
300 Subround< 8>(F, d2, e2, a2, b2, c2, X[ 6], k9);
301 Subround<13>(F, c2, d2, e2, a2, b2, X[ 2], k9);
302 Subround< 6>(F, b2, c2, d2, e2, a2, X[13], k9);
303 Subround< 5>(F, a2, b2, c2, d2, e2, X[14], k9);
304 Subround<15>(F, e2, a2, b2, c2, d2, X[ 0], k9);
305 Subround<13>(F, d2, e2, a2, b2, c2, X[ 3], k9);
306 Subround<11>(F, c2, d2, e2, a2, b2, X[ 9], k9);
307 Subround<11>(F, b2, c2, d2, e2, a2, X[11], k9);
322 trackA[0] = (b1 + e1) - d2;
328 trackB[1] = (e1 + c1) - a2;
static const int KEYLENGTH
The default key length used by the algorithm provided as a constant.
An invalid argument was detected.
void Restart()
Restart the hash.
void CorrectEndianess(HashWordType *out, const HashWordType *in, size_t byteCount)
Adjusts the byte ordering of the hash.
unsigned int BlockSize() const
Provides the block size of the hash.
Interface for retrieving values given their names.
unsigned int word32
32-bit unsigned datatype
Utility functions for the Crypto++ library.
T rotlVariable(T x, unsigned int y)
Performs a left rotate.
std::string IntToString(T value, unsigned int base=10)
Converts a value to a string.
Crypto++ library namespace.
Classes for the TTMAC message authentication code.