Coverage Report

Created: 2024-11-21 07:03

/src/cryptopp/camellia.cpp
Line
Count
Source
1
// camellia.cpp - by Kevin Springle, 2003
2
// This code is hereby placed in the public domain.
3
4
/*
5
Optimisations and defense against timing attacks added in Jan 2007 by Wei Dai.
6
7
The first 2 rounds and the last round seem especially vulnerable to timing
8
attacks. The protection is similar to what was implemented for Rijndael.
9
See comments at top of rijndael.cpp for more details.
10
*/
11
12
#include "pch.h"
13
#include "config.h"
14
15
#if CRYPTOPP_MSC_VERSION
16
# pragma warning(disable: 4456)
17
# if (CRYPTOPP_MSC_VERSION >= 1400)
18
#  pragma warning(disable: 6246)
19
# endif
20
#endif
21
22
#include "camellia.h"
23
#include "misc.h"
24
#include "cpu.h"
25
26
NAMESPACE_BEGIN(CryptoPP)
27
28
// round implementation that uses a small table for protection against timing attacks
29
6.01k
#define SLOW_ROUND(lh, ll, rh, rl, kh, kl)  {             \
30
6.01k
  word32 zr = ll ^ kl;                        \
31
6.01k
  word32 zl = lh ^ kh;                        \
32
6.01k
  zr= rotlConstant<1>(s1[GETBYTE(zr, 3)]) |             \
33
6.01k
    (rotrConstant<1>(s1[GETBYTE(zr, 2)]) << 24) |          \
34
6.01k
    (s1[rotlConstant<1>(CRYPTOPP_GET_BYTE_AS_BYTE(zr, 1))] << 16) |  \
35
6.01k
    (s1[GETBYTE(zr, 0)] << 8);                   \
36
6.01k
  zl= (s1[GETBYTE(zl, 3)] << 24) |                 \
37
6.01k
    (rotlConstant<1>(s1[GETBYTE(zl, 2)]) << 16) |          \
38
6.01k
    (rotrConstant<1>(s1[GETBYTE(zl, 1)]) << 8) |         \
39
6.01k
    s1[rotlConstant<1>(CRYPTOPP_GET_BYTE_AS_BYTE(zl, 0))];      \
40
6.01k
  zl ^= zr;                             \
41
6.01k
  zr = zl ^ rotlConstant<8>(zr);                    \
42
6.01k
  zl = zr ^ rotrConstant<8>(zl);                    \
43
6.01k
  rh ^= rotlConstant<16>(zr);                     \
44
6.01k
  rh ^= zl;                             \
45
6.01k
  rl ^= rotlConstant<8>(zl);                      \
46
6.01k
  }
47
48
// normal round - same output as above but using larger tables for faster speed
49
41.9k
#define ROUND(lh, ll, rh, rl, kh, kl) { \
50
41.9k
  word32 th = lh ^ kh;          \
51
41.9k
  word32 tl = ll ^ kl;          \
52
41.9k
  word32 d = SP[0][GETBYTE(tl,0)] ^ SP[1][GETBYTE(tl,3)] ^ SP[2][GETBYTE(tl,2)] ^ SP[3][GETBYTE(tl,1)];  \
53
41.9k
  word32 u = SP[0][GETBYTE(th,3)] ^ SP[1][GETBYTE(th,2)] ^ SP[2][GETBYTE(th,1)] ^ SP[3][GETBYTE(th,0)];  \
54
41.9k
  d ^= u;                 \
55
41.9k
  rh ^= d;                \
56
41.9k
  rl ^= d;                \
57
41.9k
  rl ^= rotrConstant<8>(u);}
58
59
#define DOUBLE_ROUND(lh, ll, rh, rl, k0, k1, k2, k3)  \
60
19.9k
  ROUND(lh, ll, rh, rl, k0, k1)            \
61
19.9k
  ROUND(rh, rl, lh, ll, k2, k3)
62
63
#if (CRYPTOPP_LITTLE_ENDIAN)
64
32.0k
#define EFI(i) (1-(i))
65
#else
66
#define EFI(i) (i)
67
#endif
68
69
void Camellia::Base::UncheckedSetKey(const byte *key, unsigned int keylen, const NameValuePairs &)
70
160
{
71
160
  m_rounds = (keylen >= 24) ? 4 : 3;
72
160
  unsigned int kslen = (8 * m_rounds + 2);
73
160
  m_key.New(kslen*2);
74
160
  word32 *ks32 = m_key.data();
75
160
  int m=0, a=0;
76
160
  if (!IsForwardTransformation())
77
73
    m = -1, a = kslen-1;
78
79
160
  word32 kl0, kl1, kl2, kl3;
80
160
  GetBlock<word32, BigEndian> getBlock(key);
81
160
  getBlock(kl0)(kl1)(kl2)(kl3);
82
160
  word32 k0=kl0, k1=kl1, k2=kl2, k3=kl3;
83
84
4.32k
#define CALC_ADDR2(base, i, j)  ((byte *)(base)+8*(i)+4*(j)+((-16*(i))&m))
85
4.32k
#define CALC_ADDR(base, i)  CALC_ADDR2(base, i, 0)
86
87
160
#if 1
88
160
  word64 kwl, kwr;
89
160
  ks32 += 2*a;
90
160
#define PREPARE_KS_ROUNDS     \
91
360
  kwl = (word64(k0) << 32) | k1;  \
92
360
  kwr = (word64(k2) << 32) | k3
93
160
#define KS_ROUND_0(i)             \
94
320
  CRYPTOPP_ASSERT(IsAlignedOn(CALC_ADDR(ks32, i+EFI(0)),GetAlignmentOf<word64>()));  \
95
320
  CRYPTOPP_ASSERT(IsAlignedOn(CALC_ADDR(ks32, i+EFI(1)),GetAlignmentOf<word64>()));  \
96
320
  *(word64*)(void*)CALC_ADDR(ks32, i+EFI(0)) = kwl; \
97
320
  *(word64*)(void*)CALC_ADDR(ks32, i+EFI(1)) = kwr
98
160
#define KS_ROUND(i, r, which)                                           \
99
1.98k
  CRYPTOPP_ASSERT(IsAlignedOn(CALC_ADDR(ks32, i+EFI(r<64)),GetAlignmentOf<word64>())); \
100
1.98k
  CRYPTOPP_ASSERT(IsAlignedOn(CALC_ADDR(ks32, i+EFI(r>64)),GetAlignmentOf<word64>())); \
101
1.98k
  if (which & (1<<int(r<64))) *(word64*)(void*)CALC_ADDR(ks32, i+EFI(r<64)) = (kwr << (r%64)) | (kwl >> (64 - (r%64))); \
102
1.98k
  if (which & (1<<int(r>64))) *(word64*)(void*)CALC_ADDR(ks32, i+EFI(r>64)) = (kwl << (r%64)) | (kwr >> (64 - (r%64)))
103
#else
104
  // SSE2 version is 30% faster on Intel Core 2. Doesn't seem worth the hassle of maintenance, but left here
105
  // #if'd out in case someone needs it.
106
  __m128i kw, kw2;
107
  __m128i *ks128 = (__m128i *)ks32+a/2;
108
  ks32 += 2*a;
109
#define PREPARE_KS_ROUNDS                         \
110
  kw = _mm_set_epi32(k0, k1, k2, k3);                   \
111
  if (m) kw2 = kw, kw = _mm_shuffle_epi32(kw, _MM_SHUFFLE(1, 0, 3, 2)); \
112
  else kw2 = _mm_shuffle_epi32(kw, _MM_SHUFFLE(1, 0, 3, 2))
113
#define KS_ROUND_0(i)                   \
114
  _mm_store_si128((__m128i *)CALC_ADDR(ks128, i), kw)
115
#define KS_ROUND(i, r, which) {                                       \
116
  __m128i temp;                                               \
117
  if (r<64 && (which!=1 || m)) temp = _mm_or_si128(_mm_slli_epi64(kw, r%64), _mm_srli_epi64(kw2, 64-r%64)); \
118
  else temp = _mm_or_si128(_mm_slli_epi64(kw2, r%64), _mm_srli_epi64(kw, 64-r%64));             \
119
  if (which & 2) _mm_store_si128((__m128i *)CALC_ADDR(ks128, i), temp);                   \
120
  else _mm_storel_epi64((__m128i*)CALC_ADDR(ks32, i+EFI(0)), temp);                     \
121
  }
122
#endif
123
124
160
  if (keylen == 16)
125
140
  {
126
    // KL
127
140
    PREPARE_KS_ROUNDS;
128
140
    KS_ROUND_0(0);
129
140
    KS_ROUND(4, 15, 3);
130
140
    KS_ROUND(10, 45, 3);
131
140
    KS_ROUND(12, 60, 2);
132
140
    KS_ROUND(16, 77, 3);
133
140
    KS_ROUND(18, 94, 3);
134
140
    KS_ROUND(22, 111, 3);
135
136
    // KA
137
140
    k0=kl0, k1=kl1, k2=kl2, k3=kl3;
138
140
    DOUBLE_ROUND(k0, k1, k2, k3, 0xA09E667Ful, 0x3BCC908Bul, 0xB67AE858ul, 0x4CAA73B2ul);
139
140
    k0^=kl0, k1^=kl1, k2^=kl2, k3^=kl3;
140
140
    DOUBLE_ROUND(k0, k1, k2, k3, 0xC6EF372Ful, 0xE94F82BEul, 0x54FF53A5ul, 0xF1D36F1Cul);
141
142
140
    PREPARE_KS_ROUNDS;
143
140
    KS_ROUND_0(2);
144
140
    KS_ROUND(6, 15, 3);
145
140
    KS_ROUND(8, 30, 3);
146
140
    KS_ROUND(12, 45, 1);
147
140
    KS_ROUND(14, 60, 3);
148
140
    KS_ROUND(20, 94, 3);
149
140
    KS_ROUND(24, 47, 3);
150
140
  }
151
20
  else
152
20
  {
153
    // KL
154
20
    PREPARE_KS_ROUNDS;
155
20
    KS_ROUND_0(0);
156
20
    KS_ROUND(12, 45, 3);
157
20
    KS_ROUND(16, 60, 3);
158
20
    KS_ROUND(22, 77, 3);
159
20
    KS_ROUND(30, 111, 3);
160
161
    // KR
162
20
    word32 kr0, kr1, kr2, kr3;
163
20
    GetBlock<word32, BigEndian>(key+16)(kr0)(kr1);
164
20
    if (keylen == 24)
165
2
      kr2 = ~kr0, kr3 = ~kr1;
166
18
    else
167
18
      GetBlock<word32, BigEndian>(key+24)(kr2)(kr3);
168
20
    k0=kr0, k1=kr1, k2=kr2, k3=kr3;
169
170
20
    PREPARE_KS_ROUNDS;
171
20
    KS_ROUND(4, 15, 3);
172
20
    KS_ROUND(8, 30, 3);
173
20
    KS_ROUND(18, 60, 3);
174
20
    KS_ROUND(26, 94, 3);
175
176
    // KA
177
20
    k0^=kl0, k1^=kl1, k2^=kl2, k3^=kl3;
178
20
    DOUBLE_ROUND(k0, k1, k2, k3, 0xA09E667Ful, 0x3BCC908Bul, 0xB67AE858ul, 0x4CAA73B2ul);
179
20
    k0^=kl0, k1^=kl1, k2^=kl2, k3^=kl3;
180
20
    DOUBLE_ROUND(k0, k1, k2, k3, 0xC6EF372Ful, 0xE94F82BEul, 0x54FF53A5ul, 0xF1D36F1Cul);
181
182
20
    PREPARE_KS_ROUNDS;
183
20
    KS_ROUND(6, 15, 3);
184
20
    KS_ROUND(14, 45, 3);
185
20
    KS_ROUND(24, 77, 3);
186
20
    KS_ROUND(28, 94, 3);
187
188
    // KB
189
20
    k0^=kr0, k1^=kr1, k2^=kr2, k3^=kr3;
190
20
    DOUBLE_ROUND(k0, k1, k2, k3, 0x10E527FAul, 0xDE682D1Dul, 0xB05688C2ul, 0xB3E6C1FDul);
191
192
20
    PREPARE_KS_ROUNDS;
193
20
    KS_ROUND_0(2);
194
20
    KS_ROUND(10, 30, 3);
195
20
    KS_ROUND(20, 60, 3);
196
20
    KS_ROUND(32, 47, 3);
197
20
  }
198
160
}
199
200
void Camellia::Base::ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const
201
2.00k
{
202
16.0k
#define KS(i, j) ks[i*4 + EFI(j/2)*2 + EFI(j%2)]
203
204
2.00k
#define FL(klh, kll, krh, krl)    \
205
5.87k
  ll ^= rotlConstant<1>(lh & klh);\
206
5.87k
  lh ^= (ll | kll);       \
207
5.87k
  rh ^= (rl | krl);       \
208
5.87k
  rl ^= rotlConstant<1>(rh & krh);
209
210
2.00k
  word32 lh, ll, rh, rl;
211
2.00k
  typedef BlockGetAndPut<word32, BigEndian> Block;
212
2.00k
  Block::Get(inBlock)(lh)(ll)(rh)(rl);
213
2.00k
  const word32 *ks = m_key.data();
214
2.00k
  lh ^= KS(0,0);
215
2.00k
  ll ^= KS(0,1);
216
2.00k
  rh ^= KS(0,2);
217
2.00k
  rl ^= KS(0,3);
218
219
  // Timing attack countermeasure. see comments in Rijndael for more details
220
2.00k
  const int cacheLineSize = GetCacheLineSize();
221
2.00k
  unsigned int i;
222
2.00k
  volatile word32 _u = 0;
223
2.00k
  word32 u = _u;
224
225
10.0k
  for (i=0; i<256; i+=cacheLineSize)
226
8.01k
    u &= *(const word32 *)(void*)(s1+i);
227
2.00k
  u &= *(const word32 *)(void*)(s1+252);
228
2.00k
  lh |= u; ll |= u;
229
230
2.00k
  SLOW_ROUND(lh, ll, rh, rl, KS(1,0), KS(1,1))
231
2.00k
  SLOW_ROUND(rh, rl, lh, ll, KS(1,2), KS(1,3))
232
7.87k
  for (i = m_rounds-1; i > 0; --i)
233
5.87k
  {
234
5.87k
    DOUBLE_ROUND(lh, ll, rh, rl, KS(2,0), KS(2,1), KS(2,2), KS(2,3))
235
5.87k
    DOUBLE_ROUND(lh, ll, rh, rl, KS(3,0), KS(3,1), KS(3,2), KS(3,3))
236
5.87k
    FL(KS(4,0), KS(4,1), KS(4,2), KS(4,3));
237
5.87k
    DOUBLE_ROUND(lh, ll, rh, rl, KS(5,0), KS(5,1), KS(5,2), KS(5,3))
238
5.87k
    ks += 16;
239
5.87k
  }
240
2.00k
  DOUBLE_ROUND(lh, ll, rh, rl, KS(2,0), KS(2,1), KS(2,2), KS(2,3))
241
2.00k
  ROUND(lh, ll, rh, rl, KS(3,0), KS(3,1))
242
2.00k
  SLOW_ROUND(rh, rl, lh, ll, KS(3,2), KS(3,3))
243
2.00k
  lh ^= KS(4,0);
244
2.00k
  ll ^= KS(4,1);
245
2.00k
  rh ^= KS(4,2);
246
2.00k
  rl ^= KS(4,3);
247
2.00k
  Block::Put(xorBlock, outBlock)(rh)(rl)(lh)(ll);
248
2.00k
}
249
250
// The Camellia s-boxes
251
252
CRYPTOPP_ALIGN_DATA(4)
253
const byte Camellia::Base::s1[256] =
254
{
255
  112,130,44,236,179,39,192,229,228,133,87,53,234,12,174,65,
256
  35,239,107,147,69,25,165,33,237,14,79,78,29,101,146,189,
257
  134,184,175,143,124,235,31,206,62,48,220,95,94,197,11,26,
258
  166,225,57,202,213,71,93,61,217,1,90,214,81,86,108,77,
259
  139,13,154,102,251,204,176,45,116,18,43,32,240,177,132,153,
260
  223,76,203,194,52,126,118,5,109,183,169,49,209,23,4,215,
261
  20,88,58,97,222,27,17,28,50,15,156,22,83,24,242,34,
262
  254,68,207,178,195,181,122,145,36,8,232,168,96,252,105,80,
263
  170,208,160,125,161,137,98,151,84,91,30,149,224,255,100,210,
264
  16,196,0,72,163,247,117,219,138,3,230,218,9,63,221,148,
265
  135,92,131,2,205,74,144,51,115,103,246,243,157,127,191,226,
266
  82,155,216,38,200,55,198,59,129,150,111,75,19,190,99,46,
267
  233,121,167,140,159,110,188,142,41,245,249,182,47,253,180,89,
268
  120,152,6,106,231,70,113,186,212,37,171,66,136,162,141,250,
269
  114,7,185,85,248,238,172,10,54,73,42,104,60,56,241,164,
270
  64,40,211,123,187,201,67,193,21,227,173,244,119,199,128,158
271
};
272
273
const word32 Camellia::Base::SP[4][256] = {
274
  {
275
  0x70707000, 0x82828200, 0x2c2c2c00, 0xececec00,
276
  0xb3b3b300, 0x27272700, 0xc0c0c000, 0xe5e5e500,
277
  0xe4e4e400, 0x85858500, 0x57575700, 0x35353500,
278
  0xeaeaea00, 0x0c0c0c00, 0xaeaeae00, 0x41414100,
279
  0x23232300, 0xefefef00, 0x6b6b6b00, 0x93939300,
280
  0x45454500, 0x19191900, 0xa5a5a500, 0x21212100,
281
  0xededed00, 0x0e0e0e00, 0x4f4f4f00, 0x4e4e4e00,
282
  0x1d1d1d00, 0x65656500, 0x92929200, 0xbdbdbd00,
283
  0x86868600, 0xb8b8b800, 0xafafaf00, 0x8f8f8f00,
284
  0x7c7c7c00, 0xebebeb00, 0x1f1f1f00, 0xcecece00,
285
  0x3e3e3e00, 0x30303000, 0xdcdcdc00, 0x5f5f5f00,
286
  0x5e5e5e00, 0xc5c5c500, 0x0b0b0b00, 0x1a1a1a00,
287
  0xa6a6a600, 0xe1e1e100, 0x39393900, 0xcacaca00,
288
  0xd5d5d500, 0x47474700, 0x5d5d5d00, 0x3d3d3d00,
289
  0xd9d9d900, 0x01010100, 0x5a5a5a00, 0xd6d6d600,
290
  0x51515100, 0x56565600, 0x6c6c6c00, 0x4d4d4d00,
291
  0x8b8b8b00, 0x0d0d0d00, 0x9a9a9a00, 0x66666600,
292
  0xfbfbfb00, 0xcccccc00, 0xb0b0b000, 0x2d2d2d00,
293
  0x74747400, 0x12121200, 0x2b2b2b00, 0x20202000,
294
  0xf0f0f000, 0xb1b1b100, 0x84848400, 0x99999900,
295
  0xdfdfdf00, 0x4c4c4c00, 0xcbcbcb00, 0xc2c2c200,
296
  0x34343400, 0x7e7e7e00, 0x76767600, 0x05050500,
297
  0x6d6d6d00, 0xb7b7b700, 0xa9a9a900, 0x31313100,
298
  0xd1d1d100, 0x17171700, 0x04040400, 0xd7d7d700,
299
  0x14141400, 0x58585800, 0x3a3a3a00, 0x61616100,
300
  0xdedede00, 0x1b1b1b00, 0x11111100, 0x1c1c1c00,
301
  0x32323200, 0x0f0f0f00, 0x9c9c9c00, 0x16161600,
302
  0x53535300, 0x18181800, 0xf2f2f200, 0x22222200,
303
  0xfefefe00, 0x44444400, 0xcfcfcf00, 0xb2b2b200,
304
  0xc3c3c300, 0xb5b5b500, 0x7a7a7a00, 0x91919100,
305
  0x24242400, 0x08080800, 0xe8e8e800, 0xa8a8a800,
306
  0x60606000, 0xfcfcfc00, 0x69696900, 0x50505000,
307
  0xaaaaaa00, 0xd0d0d000, 0xa0a0a000, 0x7d7d7d00,
308
  0xa1a1a100, 0x89898900, 0x62626200, 0x97979700,
309
  0x54545400, 0x5b5b5b00, 0x1e1e1e00, 0x95959500,
310
  0xe0e0e000, 0xffffff00, 0x64646400, 0xd2d2d200,
311
  0x10101000, 0xc4c4c400, 0x00000000, 0x48484800,
312
  0xa3a3a300, 0xf7f7f700, 0x75757500, 0xdbdbdb00,
313
  0x8a8a8a00, 0x03030300, 0xe6e6e600, 0xdadada00,
314
  0x09090900, 0x3f3f3f00, 0xdddddd00, 0x94949400,
315
  0x87878700, 0x5c5c5c00, 0x83838300, 0x02020200,
316
  0xcdcdcd00, 0x4a4a4a00, 0x90909000, 0x33333300,
317
  0x73737300, 0x67676700, 0xf6f6f600, 0xf3f3f300,
318
  0x9d9d9d00, 0x7f7f7f00, 0xbfbfbf00, 0xe2e2e200,
319
  0x52525200, 0x9b9b9b00, 0xd8d8d800, 0x26262600,
320
  0xc8c8c800, 0x37373700, 0xc6c6c600, 0x3b3b3b00,
321
  0x81818100, 0x96969600, 0x6f6f6f00, 0x4b4b4b00,
322
  0x13131300, 0xbebebe00, 0x63636300, 0x2e2e2e00,
323
  0xe9e9e900, 0x79797900, 0xa7a7a700, 0x8c8c8c00,
324
  0x9f9f9f00, 0x6e6e6e00, 0xbcbcbc00, 0x8e8e8e00,
325
  0x29292900, 0xf5f5f500, 0xf9f9f900, 0xb6b6b600,
326
  0x2f2f2f00, 0xfdfdfd00, 0xb4b4b400, 0x59595900,
327
  0x78787800, 0x98989800, 0x06060600, 0x6a6a6a00,
328
  0xe7e7e700, 0x46464600, 0x71717100, 0xbababa00,
329
  0xd4d4d400, 0x25252500, 0xababab00, 0x42424200,
330
  0x88888800, 0xa2a2a200, 0x8d8d8d00, 0xfafafa00,
331
  0x72727200, 0x07070700, 0xb9b9b900, 0x55555500,
332
  0xf8f8f800, 0xeeeeee00, 0xacacac00, 0x0a0a0a00,
333
  0x36363600, 0x49494900, 0x2a2a2a00, 0x68686800,
334
  0x3c3c3c00, 0x38383800, 0xf1f1f100, 0xa4a4a400,
335
  0x40404000, 0x28282800, 0xd3d3d300, 0x7b7b7b00,
336
  0xbbbbbb00, 0xc9c9c900, 0x43434300, 0xc1c1c100,
337
  0x15151500, 0xe3e3e300, 0xadadad00, 0xf4f4f400,
338
  0x77777700, 0xc7c7c700, 0x80808000, 0x9e9e9e00
339
  },
340
  {
341
  0x00e0e0e0, 0x00050505, 0x00585858, 0x00d9d9d9,
342
  0x00676767, 0x004e4e4e, 0x00818181, 0x00cbcbcb,
343
  0x00c9c9c9, 0x000b0b0b, 0x00aeaeae, 0x006a6a6a,
344
  0x00d5d5d5, 0x00181818, 0x005d5d5d, 0x00828282,
345
  0x00464646, 0x00dfdfdf, 0x00d6d6d6, 0x00272727,
346
  0x008a8a8a, 0x00323232, 0x004b4b4b, 0x00424242,
347
  0x00dbdbdb, 0x001c1c1c, 0x009e9e9e, 0x009c9c9c,
348
  0x003a3a3a, 0x00cacaca, 0x00252525, 0x007b7b7b,
349
  0x000d0d0d, 0x00717171, 0x005f5f5f, 0x001f1f1f,
350
  0x00f8f8f8, 0x00d7d7d7, 0x003e3e3e, 0x009d9d9d,
351
  0x007c7c7c, 0x00606060, 0x00b9b9b9, 0x00bebebe,
352
  0x00bcbcbc, 0x008b8b8b, 0x00161616, 0x00343434,
353
  0x004d4d4d, 0x00c3c3c3, 0x00727272, 0x00959595,
354
  0x00ababab, 0x008e8e8e, 0x00bababa, 0x007a7a7a,
355
  0x00b3b3b3, 0x00020202, 0x00b4b4b4, 0x00adadad,
356
  0x00a2a2a2, 0x00acacac, 0x00d8d8d8, 0x009a9a9a,
357
  0x00171717, 0x001a1a1a, 0x00353535, 0x00cccccc,
358
  0x00f7f7f7, 0x00999999, 0x00616161, 0x005a5a5a,
359
  0x00e8e8e8, 0x00242424, 0x00565656, 0x00404040,
360
  0x00e1e1e1, 0x00636363, 0x00090909, 0x00333333,
361
  0x00bfbfbf, 0x00989898, 0x00979797, 0x00858585,
362
  0x00686868, 0x00fcfcfc, 0x00ececec, 0x000a0a0a,
363
  0x00dadada, 0x006f6f6f, 0x00535353, 0x00626262,
364
  0x00a3a3a3, 0x002e2e2e, 0x00080808, 0x00afafaf,
365
  0x00282828, 0x00b0b0b0, 0x00747474, 0x00c2c2c2,
366
  0x00bdbdbd, 0x00363636, 0x00222222, 0x00383838,
367
  0x00646464, 0x001e1e1e, 0x00393939, 0x002c2c2c,
368
  0x00a6a6a6, 0x00303030, 0x00e5e5e5, 0x00444444,
369
  0x00fdfdfd, 0x00888888, 0x009f9f9f, 0x00656565,
370
  0x00878787, 0x006b6b6b, 0x00f4f4f4, 0x00232323,
371
  0x00484848, 0x00101010, 0x00d1d1d1, 0x00515151,
372
  0x00c0c0c0, 0x00f9f9f9, 0x00d2d2d2, 0x00a0a0a0,
373
  0x00555555, 0x00a1a1a1, 0x00414141, 0x00fafafa,
374
  0x00434343, 0x00131313, 0x00c4c4c4, 0x002f2f2f,
375
  0x00a8a8a8, 0x00b6b6b6, 0x003c3c3c, 0x002b2b2b,
376
  0x00c1c1c1, 0x00ffffff, 0x00c8c8c8, 0x00a5a5a5,
377
  0x00202020, 0x00898989, 0x00000000, 0x00909090,
378
  0x00474747, 0x00efefef, 0x00eaeaea, 0x00b7b7b7,
379
  0x00151515, 0x00060606, 0x00cdcdcd, 0x00b5b5b5,
380
  0x00121212, 0x007e7e7e, 0x00bbbbbb, 0x00292929,
381
  0x000f0f0f, 0x00b8b8b8, 0x00070707, 0x00040404,
382
  0x009b9b9b, 0x00949494, 0x00212121, 0x00666666,
383
  0x00e6e6e6, 0x00cecece, 0x00ededed, 0x00e7e7e7,
384
  0x003b3b3b, 0x00fefefe, 0x007f7f7f, 0x00c5c5c5,
385
  0x00a4a4a4, 0x00373737, 0x00b1b1b1, 0x004c4c4c,
386
  0x00919191, 0x006e6e6e, 0x008d8d8d, 0x00767676,
387
  0x00030303, 0x002d2d2d, 0x00dedede, 0x00969696,
388
  0x00262626, 0x007d7d7d, 0x00c6c6c6, 0x005c5c5c,
389
  0x00d3d3d3, 0x00f2f2f2, 0x004f4f4f, 0x00191919,
390
  0x003f3f3f, 0x00dcdcdc, 0x00797979, 0x001d1d1d,
391
  0x00525252, 0x00ebebeb, 0x00f3f3f3, 0x006d6d6d,
392
  0x005e5e5e, 0x00fbfbfb, 0x00696969, 0x00b2b2b2,
393
  0x00f0f0f0, 0x00313131, 0x000c0c0c, 0x00d4d4d4,
394
  0x00cfcfcf, 0x008c8c8c, 0x00e2e2e2, 0x00757575,
395
  0x00a9a9a9, 0x004a4a4a, 0x00575757, 0x00848484,
396
  0x00111111, 0x00454545, 0x001b1b1b, 0x00f5f5f5,
397
  0x00e4e4e4, 0x000e0e0e, 0x00737373, 0x00aaaaaa,
398
  0x00f1f1f1, 0x00dddddd, 0x00595959, 0x00141414,
399
  0x006c6c6c, 0x00929292, 0x00545454, 0x00d0d0d0,
400
  0x00787878, 0x00707070, 0x00e3e3e3, 0x00494949,
401
  0x00808080, 0x00505050, 0x00a7a7a7, 0x00f6f6f6,
402
  0x00777777, 0x00939393, 0x00868686, 0x00838383,
403
  0x002a2a2a, 0x00c7c7c7, 0x005b5b5b, 0x00e9e9e9,
404
  0x00eeeeee, 0x008f8f8f, 0x00010101, 0x003d3d3d
405
  },
406
  {
407
  0x38003838, 0x41004141, 0x16001616, 0x76007676,
408
  0xd900d9d9, 0x93009393, 0x60006060, 0xf200f2f2,
409
  0x72007272, 0xc200c2c2, 0xab00abab, 0x9a009a9a,
410
  0x75007575, 0x06000606, 0x57005757, 0xa000a0a0,
411
  0x91009191, 0xf700f7f7, 0xb500b5b5, 0xc900c9c9,
412
  0xa200a2a2, 0x8c008c8c, 0xd200d2d2, 0x90009090,
413
  0xf600f6f6, 0x07000707, 0xa700a7a7, 0x27002727,
414
  0x8e008e8e, 0xb200b2b2, 0x49004949, 0xde00dede,
415
  0x43004343, 0x5c005c5c, 0xd700d7d7, 0xc700c7c7,
416
  0x3e003e3e, 0xf500f5f5, 0x8f008f8f, 0x67006767,
417
  0x1f001f1f, 0x18001818, 0x6e006e6e, 0xaf00afaf,
418
  0x2f002f2f, 0xe200e2e2, 0x85008585, 0x0d000d0d,
419
  0x53005353, 0xf000f0f0, 0x9c009c9c, 0x65006565,
420
  0xea00eaea, 0xa300a3a3, 0xae00aeae, 0x9e009e9e,
421
  0xec00ecec, 0x80008080, 0x2d002d2d, 0x6b006b6b,
422
  0xa800a8a8, 0x2b002b2b, 0x36003636, 0xa600a6a6,
423
  0xc500c5c5, 0x86008686, 0x4d004d4d, 0x33003333,
424
  0xfd00fdfd, 0x66006666, 0x58005858, 0x96009696,
425
  0x3a003a3a, 0x09000909, 0x95009595, 0x10001010,
426
  0x78007878, 0xd800d8d8, 0x42004242, 0xcc00cccc,
427
  0xef00efef, 0x26002626, 0xe500e5e5, 0x61006161,
428
  0x1a001a1a, 0x3f003f3f, 0x3b003b3b, 0x82008282,
429
  0xb600b6b6, 0xdb00dbdb, 0xd400d4d4, 0x98009898,
430
  0xe800e8e8, 0x8b008b8b, 0x02000202, 0xeb00ebeb,
431
  0x0a000a0a, 0x2c002c2c, 0x1d001d1d, 0xb000b0b0,
432
  0x6f006f6f, 0x8d008d8d, 0x88008888, 0x0e000e0e,
433
  0x19001919, 0x87008787, 0x4e004e4e, 0x0b000b0b,
434
  0xa900a9a9, 0x0c000c0c, 0x79007979, 0x11001111,
435
  0x7f007f7f, 0x22002222, 0xe700e7e7, 0x59005959,
436
  0xe100e1e1, 0xda00dada, 0x3d003d3d, 0xc800c8c8,
437
  0x12001212, 0x04000404, 0x74007474, 0x54005454,
438
  0x30003030, 0x7e007e7e, 0xb400b4b4, 0x28002828,
439
  0x55005555, 0x68006868, 0x50005050, 0xbe00bebe,
440
  0xd000d0d0, 0xc400c4c4, 0x31003131, 0xcb00cbcb,
441
  0x2a002a2a, 0xad00adad, 0x0f000f0f, 0xca00caca,
442
  0x70007070, 0xff00ffff, 0x32003232, 0x69006969,
443
  0x08000808, 0x62006262, 0x00000000, 0x24002424,
444
  0xd100d1d1, 0xfb00fbfb, 0xba00baba, 0xed00eded,
445
  0x45004545, 0x81008181, 0x73007373, 0x6d006d6d,
446
  0x84008484, 0x9f009f9f, 0xee00eeee, 0x4a004a4a,
447
  0xc300c3c3, 0x2e002e2e, 0xc100c1c1, 0x01000101,
448
  0xe600e6e6, 0x25002525, 0x48004848, 0x99009999,
449
  0xb900b9b9, 0xb300b3b3, 0x7b007b7b, 0xf900f9f9,
450
  0xce00cece, 0xbf00bfbf, 0xdf00dfdf, 0x71007171,
451
  0x29002929, 0xcd00cdcd, 0x6c006c6c, 0x13001313,
452
  0x64006464, 0x9b009b9b, 0x63006363, 0x9d009d9d,
453
  0xc000c0c0, 0x4b004b4b, 0xb700b7b7, 0xa500a5a5,
454
  0x89008989, 0x5f005f5f, 0xb100b1b1, 0x17001717,
455
  0xf400f4f4, 0xbc00bcbc, 0xd300d3d3, 0x46004646,
456
  0xcf00cfcf, 0x37003737, 0x5e005e5e, 0x47004747,
457
  0x94009494, 0xfa00fafa, 0xfc00fcfc, 0x5b005b5b,
458
  0x97009797, 0xfe00fefe, 0x5a005a5a, 0xac00acac,
459
  0x3c003c3c, 0x4c004c4c, 0x03000303, 0x35003535,
460
  0xf300f3f3, 0x23002323, 0xb800b8b8, 0x5d005d5d,
461
  0x6a006a6a, 0x92009292, 0xd500d5d5, 0x21002121,
462
  0x44004444, 0x51005151, 0xc600c6c6, 0x7d007d7d,
463
  0x39003939, 0x83008383, 0xdc00dcdc, 0xaa00aaaa,
464
  0x7c007c7c, 0x77007777, 0x56005656, 0x05000505,
465
  0x1b001b1b, 0xa400a4a4, 0x15001515, 0x34003434,
466
  0x1e001e1e, 0x1c001c1c, 0xf800f8f8, 0x52005252,
467
  0x20002020, 0x14001414, 0xe900e9e9, 0xbd00bdbd,
468
  0xdd00dddd, 0xe400e4e4, 0xa100a1a1, 0xe000e0e0,
469
  0x8a008a8a, 0xf100f1f1, 0xd600d6d6, 0x7a007a7a,
470
  0xbb00bbbb, 0xe300e3e3, 0x40004040, 0x4f004f4f
471
  },
472
  {
473
  0x70700070, 0x2c2c002c, 0xb3b300b3, 0xc0c000c0,
474
  0xe4e400e4, 0x57570057, 0xeaea00ea, 0xaeae00ae,
475
  0x23230023, 0x6b6b006b, 0x45450045, 0xa5a500a5,
476
  0xeded00ed, 0x4f4f004f, 0x1d1d001d, 0x92920092,
477
  0x86860086, 0xafaf00af, 0x7c7c007c, 0x1f1f001f,
478
  0x3e3e003e, 0xdcdc00dc, 0x5e5e005e, 0x0b0b000b,
479
  0xa6a600a6, 0x39390039, 0xd5d500d5, 0x5d5d005d,
480
  0xd9d900d9, 0x5a5a005a, 0x51510051, 0x6c6c006c,
481
  0x8b8b008b, 0x9a9a009a, 0xfbfb00fb, 0xb0b000b0,
482
  0x74740074, 0x2b2b002b, 0xf0f000f0, 0x84840084,
483
  0xdfdf00df, 0xcbcb00cb, 0x34340034, 0x76760076,
484
  0x6d6d006d, 0xa9a900a9, 0xd1d100d1, 0x04040004,
485
  0x14140014, 0x3a3a003a, 0xdede00de, 0x11110011,
486
  0x32320032, 0x9c9c009c, 0x53530053, 0xf2f200f2,
487
  0xfefe00fe, 0xcfcf00cf, 0xc3c300c3, 0x7a7a007a,
488
  0x24240024, 0xe8e800e8, 0x60600060, 0x69690069,
489
  0xaaaa00aa, 0xa0a000a0, 0xa1a100a1, 0x62620062,
490
  0x54540054, 0x1e1e001e, 0xe0e000e0, 0x64640064,
491
  0x10100010, 0x00000000, 0xa3a300a3, 0x75750075,
492
  0x8a8a008a, 0xe6e600e6, 0x09090009, 0xdddd00dd,
493
  0x87870087, 0x83830083, 0xcdcd00cd, 0x90900090,
494
  0x73730073, 0xf6f600f6, 0x9d9d009d, 0xbfbf00bf,
495
  0x52520052, 0xd8d800d8, 0xc8c800c8, 0xc6c600c6,
496
  0x81810081, 0x6f6f006f, 0x13130013, 0x63630063,
497
  0xe9e900e9, 0xa7a700a7, 0x9f9f009f, 0xbcbc00bc,
498
  0x29290029, 0xf9f900f9, 0x2f2f002f, 0xb4b400b4,
499
  0x78780078, 0x06060006, 0xe7e700e7, 0x71710071,
500
  0xd4d400d4, 0xabab00ab, 0x88880088, 0x8d8d008d,
501
  0x72720072, 0xb9b900b9, 0xf8f800f8, 0xacac00ac,
502
  0x36360036, 0x2a2a002a, 0x3c3c003c, 0xf1f100f1,
503
  0x40400040, 0xd3d300d3, 0xbbbb00bb, 0x43430043,
504
  0x15150015, 0xadad00ad, 0x77770077, 0x80800080,
505
  0x82820082, 0xecec00ec, 0x27270027, 0xe5e500e5,
506
  0x85850085, 0x35350035, 0x0c0c000c, 0x41410041,
507
  0xefef00ef, 0x93930093, 0x19190019, 0x21210021,
508
  0x0e0e000e, 0x4e4e004e, 0x65650065, 0xbdbd00bd,
509
  0xb8b800b8, 0x8f8f008f, 0xebeb00eb, 0xcece00ce,
510
  0x30300030, 0x5f5f005f, 0xc5c500c5, 0x1a1a001a,
511
  0xe1e100e1, 0xcaca00ca, 0x47470047, 0x3d3d003d,
512
  0x01010001, 0xd6d600d6, 0x56560056, 0x4d4d004d,
513
  0x0d0d000d, 0x66660066, 0xcccc00cc, 0x2d2d002d,
514
  0x12120012, 0x20200020, 0xb1b100b1, 0x99990099,
515
  0x4c4c004c, 0xc2c200c2, 0x7e7e007e, 0x05050005,
516
  0xb7b700b7, 0x31310031, 0x17170017, 0xd7d700d7,
517
  0x58580058, 0x61610061, 0x1b1b001b, 0x1c1c001c,
518
  0x0f0f000f, 0x16160016, 0x18180018, 0x22220022,
519
  0x44440044, 0xb2b200b2, 0xb5b500b5, 0x91910091,
520
  0x08080008, 0xa8a800a8, 0xfcfc00fc, 0x50500050,
521
  0xd0d000d0, 0x7d7d007d, 0x89890089, 0x97970097,
522
  0x5b5b005b, 0x95950095, 0xffff00ff, 0xd2d200d2,
523
  0xc4c400c4, 0x48480048, 0xf7f700f7, 0xdbdb00db,
524
  0x03030003, 0xdada00da, 0x3f3f003f, 0x94940094,
525
  0x5c5c005c, 0x02020002, 0x4a4a004a, 0x33330033,
526
  0x67670067, 0xf3f300f3, 0x7f7f007f, 0xe2e200e2,
527
  0x9b9b009b, 0x26260026, 0x37370037, 0x3b3b003b,
528
  0x96960096, 0x4b4b004b, 0xbebe00be, 0x2e2e002e,
529
  0x79790079, 0x8c8c008c, 0x6e6e006e, 0x8e8e008e,
530
  0xf5f500f5, 0xb6b600b6, 0xfdfd00fd, 0x59590059,
531
  0x98980098, 0x6a6a006a, 0x46460046, 0xbaba00ba,
532
  0x25250025, 0x42420042, 0xa2a200a2, 0xfafa00fa,
533
  0x07070007, 0x55550055, 0xeeee00ee, 0x0a0a000a,
534
  0x49490049, 0x68680068, 0x38380038, 0xa4a400a4,
535
  0x28280028, 0x7b7b007b, 0xc9c900c9, 0xc1c100c1,
536
  0xe3e300e3, 0xf4f400f4, 0xc7c700c7, 0x9e9e009e
537
  }};
538
539
NAMESPACE_END