00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "pch.h"
00013
00014 #include "camellia.h"
00015 #include "misc.h"
00016 #include "cpu.h"
00017
00018 NAMESPACE_BEGIN(CryptoPP)
00019
00020
00021 #define SLOW_ROUND(lh, ll, rh, rl, kh, kl) { \
00022 word32 zr = ll ^ kl; \
00023 word32 zl = lh ^ kh; \
00024 zr= rotlFixed(s1[GETBYTE(zr, 3)], 1) | \
00025 (rotrFixed(s1[GETBYTE(zr, 2)], 1) << 24) | \
00026 (s1[rotlFixed(CRYPTOPP_GET_BYTE_AS_BYTE(zr, 1),1)] << 16) | \
00027 (s1[GETBYTE(zr, 0)] << 8); \
00028 zl= (s1[GETBYTE(zl, 3)] << 24) | \
00029 (rotlFixed(s1[GETBYTE(zl, 2)], 1) << 16) | \
00030 (rotrFixed(s1[GETBYTE(zl, 1)], 1) << 8) | \
00031 s1[rotlFixed(CRYPTOPP_GET_BYTE_AS_BYTE(zl, 0), 1)]; \
00032 zl ^= zr; \
00033 zr = zl ^ rotlFixed(zr, 8); \
00034 zl = zr ^ rotrFixed(zl, 8); \
00035 rh ^= rotlFixed(zr, 16); \
00036 rh ^= zl; \
00037 rl ^= rotlFixed(zl, 8); \
00038 }
00039
00040
00041 #define ROUND(lh, ll, rh, rl, kh, kl) { \
00042 word32 th = lh ^ kh; \
00043 word32 tl = ll ^ kl; \
00044 word32 d = SP[0][GETBYTE(tl,0)] ^ SP[1][GETBYTE(tl,3)] ^ SP[2][GETBYTE(tl,2)] ^ SP[3][GETBYTE(tl,1)]; \
00045 word32 u = SP[0][GETBYTE(th,3)] ^ SP[1][GETBYTE(th,2)] ^ SP[2][GETBYTE(th,1)] ^ SP[3][GETBYTE(th,0)]; \
00046 d ^= u; \
00047 rh ^= d; \
00048 rl ^= d; \
00049 rl ^= rotrFixed(u, 8);}
00050
00051 #define DOUBLE_ROUND(lh, ll, rh, rl, k0, k1, k2, k3) \
00052 ROUND(lh, ll, rh, rl, k0, k1) \
00053 ROUND(rh, rl, lh, ll, k2, k3)
00054
00055 #ifdef IS_LITTLE_ENDIAN
00056 #define EFI(i) (1-(i))
00057 #else
00058 #define EFI(i) (i)
00059 #endif
00060
00061 void Camellia::Base::UncheckedSetKey(const byte *key, unsigned int keylen, const NameValuePairs &)
00062 {
00063 m_rounds = (keylen >= 24) ? 4 : 3;
00064 unsigned int kslen = (8 * m_rounds + 2);
00065 m_key.New(kslen*2);
00066 word32 *ks32 = m_key.data();
00067 int m=0, a=0;
00068 if (!IsForwardTransformation())
00069 m = -1, a = kslen-1;
00070
00071 word32 kl0, kl1, kl2, kl3;
00072 GetBlock<word32, BigEndian, false> getBlock(key);
00073 getBlock(kl0)(kl1)(kl2)(kl3);
00074 word32 k0=kl0, k1=kl1, k2=kl2, k3=kl3;
00075
00076 #define CALC_ADDR2(base, i, j) ((byte *)(base)+8*(i)+4*(j)+((-16*(i))&m))
00077 #define CALC_ADDR(base, i) CALC_ADDR2(base, i, 0)
00078
00079 #if !defined(WORD64_AVAILABLE)
00080 ks32 += 2*a;
00081 #define PREPARE_KS_ROUNDS
00082 #define KS_ROUND_0(i) \
00083 *(word32*)CALC_ADDR2(ks32, i+EFI(0), EFI(0)) = k0; \
00084 *(word32*)CALC_ADDR2(ks32, i+EFI(0), EFI(1)) = k1; \
00085 *(word32*)CALC_ADDR2(ks32, i+EFI(1), EFI(0)) = k2; \
00086 *(word32*)CALC_ADDR2(ks32, i+EFI(1), EFI(1)) = k3
00087 #define KS_ROUND(i, r, which) \
00088 if (which & (1<<((7-r/32)%4/2))) *(word32*)CALC_ADDR2(ks32, i+EFI((7-r/32)%4/2), EFI((7-r/32)%2)) = (k3 << (r%32)) | (k0 >> (32-r%32)); \
00089 if (which & (1<<((6-r/32)%4/2))) *(word32*)CALC_ADDR2(ks32, i+EFI((6-r/32)%4/2), EFI((6-r/32)%2)) = (k2 << (r%32)) | (k3 >> (32-r%32)); \
00090 if (which & (1<<((5-r/32)%4/2))) *(word32*)CALC_ADDR2(ks32, i+EFI((5-r/32)%4/2), EFI((5-r/32)%2)) = (k1 << (r%32)) | (k2 >> (32-r%32)); \
00091 if (which & (1<<((4-r/32)%4/2))) *(word32*)CALC_ADDR2(ks32, i+EFI((4-r/32)%4/2), EFI((4-r/32)%2)) = (k0 << (r%32)) | (k1 >> (32-r%32))
00092 #elif 1
00093 word64 kwl, kwr;
00094 ks32 += 2*a;
00095 #define PREPARE_KS_ROUNDS \
00096 kwl = (word64(k0) << 32) | k1; \
00097 kwr = (word64(k2) << 32) | k3
00098 #define KS_ROUND_0(i) \
00099 *(word64*)CALC_ADDR(ks32, i+EFI(0)) = kwl; \
00100 *(word64*)CALC_ADDR(ks32, i+EFI(1)) = kwr
00101 #define KS_ROUND(i, r, which) \
00102 if (which & (1<<int(r<64))) *(word64*)CALC_ADDR(ks32, i+EFI(r<64)) = (kwr << (r%64)) | (kwl >> (64 - (r%64))); \
00103 if (which & (1<<int(r>64))) *(word64*)CALC_ADDR(ks32, i+EFI(r>64)) = (kwl << (r%64)) | (kwr >> (64 - (r%64)))
00104 #else
00105
00106
00107 __m128i kw, kw2;
00108 __m128i *ks128 = (__m128i *)ks32+a/2;
00109 ks32 += 2*a;
00110 #define PREPARE_KS_ROUNDS \
00111 kw = _mm_set_epi32(k0, k1, k2, k3); \
00112 if (m) kw2 = kw, kw = _mm_shuffle_epi32(kw, _MM_SHUFFLE(1, 0, 3, 2)); \
00113 else kw2 = _mm_shuffle_epi32(kw, _MM_SHUFFLE(1, 0, 3, 2))
00114 #define KS_ROUND_0(i) \
00115 _mm_store_si128((__m128i *)CALC_ADDR(ks128, i), kw)
00116 #define KS_ROUND(i, r, which) { \
00117 __m128i temp; \
00118 if (r<64 && (which!=1 || m)) temp = _mm_or_si128(_mm_slli_epi64(kw, r%64), _mm_srli_epi64(kw2, 64-r%64)); \
00119 else temp = _mm_or_si128(_mm_slli_epi64(kw2, r%64), _mm_srli_epi64(kw, 64-r%64)); \
00120 if (which & 2) _mm_store_si128((__m128i *)CALC_ADDR(ks128, i), temp); \
00121 else _mm_storel_epi64((__m128i*)CALC_ADDR(ks32, i+EFI(0)), temp); \
00122 }
00123 #endif
00124
00125 if (keylen == 16)
00126 {
00127
00128 PREPARE_KS_ROUNDS;
00129 KS_ROUND_0(0);
00130 KS_ROUND(4, 15, 3);
00131 KS_ROUND(10, 45, 3);
00132 KS_ROUND(12, 60, 2);
00133 KS_ROUND(16, 77, 3);
00134 KS_ROUND(18, 94, 3);
00135 KS_ROUND(22, 111, 3);
00136
00137
00138 k0=kl0, k1=kl1, k2=kl2, k3=kl3;
00139 DOUBLE_ROUND(k0, k1, k2, k3, 0xA09E667Ful, 0x3BCC908Bul, 0xB67AE858ul, 0x4CAA73B2ul);
00140 k0^=kl0, k1^=kl1, k2^=kl2, k3^=kl3;
00141 DOUBLE_ROUND(k0, k1, k2, k3, 0xC6EF372Ful, 0xE94F82BEul, 0x54FF53A5ul, 0xF1D36F1Cul);
00142
00143 PREPARE_KS_ROUNDS;
00144 KS_ROUND_0(2);
00145 KS_ROUND(6, 15, 3);
00146 KS_ROUND(8, 30, 3);
00147 KS_ROUND(12, 45, 1);
00148 KS_ROUND(14, 60, 3);
00149 KS_ROUND(20, 94, 3);
00150 KS_ROUND(24, 47, 3);
00151 }
00152 else
00153 {
00154
00155 PREPARE_KS_ROUNDS;
00156 KS_ROUND_0(0);
00157 KS_ROUND(12, 45, 3);
00158 KS_ROUND(16, 60, 3);
00159 KS_ROUND(22, 77, 3);
00160 KS_ROUND(30, 111, 3);
00161
00162
00163 word32 kr0, kr1, kr2, kr3;
00164 GetBlock<word32, BigEndian, false>(key+16)(kr0)(kr1);
00165 if (keylen == 24)
00166 kr2 = ~kr0, kr3 = ~kr1;
00167 else
00168 GetBlock<word32, BigEndian, false>(key+24)(kr2)(kr3);
00169 k0=kr0, k1=kr1, k2=kr2, k3=kr3;
00170
00171 PREPARE_KS_ROUNDS;
00172 KS_ROUND(4, 15, 3);
00173 KS_ROUND(8, 30, 3);
00174 KS_ROUND(18, 60, 3);
00175 KS_ROUND(26, 94, 3);
00176
00177
00178 k0^=kl0, k1^=kl1, k2^=kl2, k3^=kl3;
00179 DOUBLE_ROUND(k0, k1, k2, k3, 0xA09E667Ful, 0x3BCC908Bul, 0xB67AE858ul, 0x4CAA73B2ul);
00180 k0^=kl0, k1^=kl1, k2^=kl2, k3^=kl3;
00181 DOUBLE_ROUND(k0, k1, k2, k3, 0xC6EF372Ful, 0xE94F82BEul, 0x54FF53A5ul, 0xF1D36F1Cul);
00182
00183 PREPARE_KS_ROUNDS;
00184 KS_ROUND(6, 15, 3);
00185 KS_ROUND(14, 45, 3);
00186 KS_ROUND(24, 77, 3);
00187 KS_ROUND(28, 94, 3);
00188
00189
00190 k0^=kr0, k1^=kr1, k2^=kr2, k3^=kr3;
00191 DOUBLE_ROUND(k0, k1, k2, k3, 0x10E527FAul, 0xDE682D1Dul, 0xB05688C2ul, 0xB3E6C1FDul);
00192
00193 PREPARE_KS_ROUNDS;
00194 KS_ROUND_0(2);
00195 KS_ROUND(10, 30, 3);
00196 KS_ROUND(20, 60, 3);
00197 KS_ROUND(32, 47, 3);
00198 }
00199 }
00200
00201 void Camellia::Base::ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const
00202 {
00203 #define KS(i, j) ks[i*4 + EFI(j/2)*2 + EFI(j%2)]
00204
00205 #define FL(klh, kll, krh, krl) \
00206 ll ^= rotlFixed(lh & klh, 1); \
00207 lh ^= (ll | kll); \
00208 rh ^= (rl | krl); \
00209 rl ^= rotlFixed(rh & krh, 1);
00210
00211 word32 lh, ll, rh, rl;
00212 typedef BlockGetAndPut<word32, BigEndian> Block;
00213 Block::Get(inBlock)(lh)(ll)(rh)(rl);
00214 const word32 *ks = m_key.data();
00215 lh ^= KS(0,0);
00216 ll ^= KS(0,1);
00217 rh ^= KS(0,2);
00218 rl ^= KS(0,3);
00219
00220
00221 const int cacheLineSize = GetCacheLineSize();
00222 unsigned int i;
00223 word32 u = 0;
00224 for (i=0; i<256; i+=cacheLineSize)
00225 u &= *(const word32 *)(s1+i);
00226 u &= *(const word32 *)(s1+252);
00227 lh |= u; ll |= u;
00228
00229 SLOW_ROUND(lh, ll, rh, rl, KS(1,0), KS(1,1))
00230 SLOW_ROUND(rh, rl, lh, ll, KS(1,2), KS(1,3))
00231 for (i = m_rounds-1; i > 0; --i)
00232 {
00233 DOUBLE_ROUND(lh, ll, rh, rl, KS(2,0), KS(2,1), KS(2,2), KS(2,3))
00234 DOUBLE_ROUND(lh, ll, rh, rl, KS(3,0), KS(3,1), KS(3,2), KS(3,3))
00235 FL(KS(4,0), KS(4,1), KS(4,2), KS(4,3));
00236 DOUBLE_ROUND(lh, ll, rh, rl, KS(5,0), KS(5,1), KS(5,2), KS(5,3))
00237 ks += 16;
00238 }
00239 DOUBLE_ROUND(lh, ll, rh, rl, KS(2,0), KS(2,1), KS(2,2), KS(2,3))
00240 ROUND(lh, ll, rh, rl, KS(3,0), KS(3,1))
00241 SLOW_ROUND(rh, rl, lh, ll, KS(3,2), KS(3,3))
00242 lh ^= KS(4,0);
00243 ll ^= KS(4,1);
00244 rh ^= KS(4,2);
00245 rl ^= KS(4,3);
00246 Block::Put(xorBlock, outBlock)(rh)(rl)(lh)(ll);
00247 }
00248
00249
00250
00251 const byte Camellia::Base::s1[256] =
00252 {
00253 112,130,44,236,179,39,192,229,228,133,87,53,234,12,174,65,
00254 35,239,107,147,69,25,165,33,237,14,79,78,29,101,146,189,
00255 134,184,175,143,124,235,31,206,62,48,220,95,94,197,11,26,
00256 166,225,57,202,213,71,93,61,217,1,90,214,81,86,108,77,
00257 139,13,154,102,251,204,176,45,116,18,43,32,240,177,132,153,
00258 223,76,203,194,52,126,118,5,109,183,169,49,209,23,4,215,
00259 20,88,58,97,222,27,17,28,50,15,156,22,83,24,242,34,
00260 254,68,207,178,195,181,122,145,36,8,232,168,96,252,105,80,
00261 170,208,160,125,161,137,98,151,84,91,30,149,224,255,100,210,
00262 16,196,0,72,163,247,117,219,138,3,230,218,9,63,221,148,
00263 135,92,131,2,205,74,144,51,115,103,246,243,157,127,191,226,
00264 82,155,216,38,200,55,198,59,129,150,111,75,19,190,99,46,
00265 233,121,167,140,159,110,188,142,41,245,249,182,47,253,180,89,
00266 120,152,6,106,231,70,113,186,212,37,171,66,136,162,141,250,
00267 114,7,185,85,248,238,172,10,54,73,42,104,60,56,241,164,
00268 64,40,211,123,187,201,67,193,21,227,173,244,119,199,128,158
00269 };
00270
00271 const word32 Camellia::Base::SP[4][256] = {
00272 {
00273 0x70707000, 0x82828200, 0x2c2c2c00, 0xececec00,
00274 0xb3b3b300, 0x27272700, 0xc0c0c000, 0xe5e5e500,
00275 0xe4e4e400, 0x85858500, 0x57575700, 0x35353500,
00276 0xeaeaea00, 0x0c0c0c00, 0xaeaeae00, 0x41414100,
00277 0x23232300, 0xefefef00, 0x6b6b6b00, 0x93939300,
00278 0x45454500, 0x19191900, 0xa5a5a500, 0x21212100,
00279 0xededed00, 0x0e0e0e00, 0x4f4f4f00, 0x4e4e4e00,
00280 0x1d1d1d00, 0x65656500, 0x92929200, 0xbdbdbd00,
00281 0x86868600, 0xb8b8b800, 0xafafaf00, 0x8f8f8f00,
00282 0x7c7c7c00, 0xebebeb00, 0x1f1f1f00, 0xcecece00,
00283 0x3e3e3e00, 0x30303000, 0xdcdcdc00, 0x5f5f5f00,
00284 0x5e5e5e00, 0xc5c5c500, 0x0b0b0b00, 0x1a1a1a00,
00285 0xa6a6a600, 0xe1e1e100, 0x39393900, 0xcacaca00,
00286 0xd5d5d500, 0x47474700, 0x5d5d5d00, 0x3d3d3d00,
00287 0xd9d9d900, 0x01010100, 0x5a5a5a00, 0xd6d6d600,
00288 0x51515100, 0x56565600, 0x6c6c6c00, 0x4d4d4d00,
00289 0x8b8b8b00, 0x0d0d0d00, 0x9a9a9a00, 0x66666600,
00290 0xfbfbfb00, 0xcccccc00, 0xb0b0b000, 0x2d2d2d00,
00291 0x74747400, 0x12121200, 0x2b2b2b00, 0x20202000,
00292 0xf0f0f000, 0xb1b1b100, 0x84848400, 0x99999900,
00293 0xdfdfdf00, 0x4c4c4c00, 0xcbcbcb00, 0xc2c2c200,
00294 0x34343400, 0x7e7e7e00, 0x76767600, 0x05050500,
00295 0x6d6d6d00, 0xb7b7b700, 0xa9a9a900, 0x31313100,
00296 0xd1d1d100, 0x17171700, 0x04040400, 0xd7d7d700,
00297 0x14141400, 0x58585800, 0x3a3a3a00, 0x61616100,
00298 0xdedede00, 0x1b1b1b00, 0x11111100, 0x1c1c1c00,
00299 0x32323200, 0x0f0f0f00, 0x9c9c9c00, 0x16161600,
00300 0x53535300, 0x18181800, 0xf2f2f200, 0x22222200,
00301 0xfefefe00, 0x44444400, 0xcfcfcf00, 0xb2b2b200,
00302 0xc3c3c300, 0xb5b5b500, 0x7a7a7a00, 0x91919100,
00303 0x24242400, 0x08080800, 0xe8e8e800, 0xa8a8a800,
00304 0x60606000, 0xfcfcfc00, 0x69696900, 0x50505000,
00305 0xaaaaaa00, 0xd0d0d000, 0xa0a0a000, 0x7d7d7d00,
00306 0xa1a1a100, 0x89898900, 0x62626200, 0x97979700,
00307 0x54545400, 0x5b5b5b00, 0x1e1e1e00, 0x95959500,
00308 0xe0e0e000, 0xffffff00, 0x64646400, 0xd2d2d200,
00309 0x10101000, 0xc4c4c400, 0x00000000, 0x48484800,
00310 0xa3a3a300, 0xf7f7f700, 0x75757500, 0xdbdbdb00,
00311 0x8a8a8a00, 0x03030300, 0xe6e6e600, 0xdadada00,
00312 0x09090900, 0x3f3f3f00, 0xdddddd00, 0x94949400,
00313 0x87878700, 0x5c5c5c00, 0x83838300, 0x02020200,
00314 0xcdcdcd00, 0x4a4a4a00, 0x90909000, 0x33333300,
00315 0x73737300, 0x67676700, 0xf6f6f600, 0xf3f3f300,
00316 0x9d9d9d00, 0x7f7f7f00, 0xbfbfbf00, 0xe2e2e200,
00317 0x52525200, 0x9b9b9b00, 0xd8d8d800, 0x26262600,
00318 0xc8c8c800, 0x37373700, 0xc6c6c600, 0x3b3b3b00,
00319 0x81818100, 0x96969600, 0x6f6f6f00, 0x4b4b4b00,
00320 0x13131300, 0xbebebe00, 0x63636300, 0x2e2e2e00,
00321 0xe9e9e900, 0x79797900, 0xa7a7a700, 0x8c8c8c00,
00322 0x9f9f9f00, 0x6e6e6e00, 0xbcbcbc00, 0x8e8e8e00,
00323 0x29292900, 0xf5f5f500, 0xf9f9f900, 0xb6b6b600,
00324 0x2f2f2f00, 0xfdfdfd00, 0xb4b4b400, 0x59595900,
00325 0x78787800, 0x98989800, 0x06060600, 0x6a6a6a00,
00326 0xe7e7e700, 0x46464600, 0x71717100, 0xbababa00,
00327 0xd4d4d400, 0x25252500, 0xababab00, 0x42424200,
00328 0x88888800, 0xa2a2a200, 0x8d8d8d00, 0xfafafa00,
00329 0x72727200, 0x07070700, 0xb9b9b900, 0x55555500,
00330 0xf8f8f800, 0xeeeeee00, 0xacacac00, 0x0a0a0a00,
00331 0x36363600, 0x49494900, 0x2a2a2a00, 0x68686800,
00332 0x3c3c3c00, 0x38383800, 0xf1f1f100, 0xa4a4a400,
00333 0x40404000, 0x28282800, 0xd3d3d300, 0x7b7b7b00,
00334 0xbbbbbb00, 0xc9c9c900, 0x43434300, 0xc1c1c100,
00335 0x15151500, 0xe3e3e300, 0xadadad00, 0xf4f4f400,
00336 0x77777700, 0xc7c7c700, 0x80808000, 0x9e9e9e00
00337 },
00338 {
00339 0x00e0e0e0, 0x00050505, 0x00585858, 0x00d9d9d9,
00340 0x00676767, 0x004e4e4e, 0x00818181, 0x00cbcbcb,
00341 0x00c9c9c9, 0x000b0b0b, 0x00aeaeae, 0x006a6a6a,
00342 0x00d5d5d5, 0x00181818, 0x005d5d5d, 0x00828282,
00343 0x00464646, 0x00dfdfdf, 0x00d6d6d6, 0x00272727,
00344 0x008a8a8a, 0x00323232, 0x004b4b4b, 0x00424242,
00345 0x00dbdbdb, 0x001c1c1c, 0x009e9e9e, 0x009c9c9c,
00346 0x003a3a3a, 0x00cacaca, 0x00252525, 0x007b7b7b,
00347 0x000d0d0d, 0x00717171, 0x005f5f5f, 0x001f1f1f,
00348 0x00f8f8f8, 0x00d7d7d7, 0x003e3e3e, 0x009d9d9d,
00349 0x007c7c7c, 0x00606060, 0x00b9b9b9, 0x00bebebe,
00350 0x00bcbcbc, 0x008b8b8b, 0x00161616, 0x00343434,
00351 0x004d4d4d, 0x00c3c3c3, 0x00727272, 0x00959595,
00352 0x00ababab, 0x008e8e8e, 0x00bababa, 0x007a7a7a,
00353 0x00b3b3b3, 0x00020202, 0x00b4b4b4, 0x00adadad,
00354 0x00a2a2a2, 0x00acacac, 0x00d8d8d8, 0x009a9a9a,
00355 0x00171717, 0x001a1a1a, 0x00353535, 0x00cccccc,
00356 0x00f7f7f7, 0x00999999, 0x00616161, 0x005a5a5a,
00357 0x00e8e8e8, 0x00242424, 0x00565656, 0x00404040,
00358 0x00e1e1e1, 0x00636363, 0x00090909, 0x00333333,
00359 0x00bfbfbf, 0x00989898, 0x00979797, 0x00858585,
00360 0x00686868, 0x00fcfcfc, 0x00ececec, 0x000a0a0a,
00361 0x00dadada, 0x006f6f6f, 0x00535353, 0x00626262,
00362 0x00a3a3a3, 0x002e2e2e, 0x00080808, 0x00afafaf,
00363 0x00282828, 0x00b0b0b0, 0x00747474, 0x00c2c2c2,
00364 0x00bdbdbd, 0x00363636, 0x00222222, 0x00383838,
00365 0x00646464, 0x001e1e1e, 0x00393939, 0x002c2c2c,
00366 0x00a6a6a6, 0x00303030, 0x00e5e5e5, 0x00444444,
00367 0x00fdfdfd, 0x00888888, 0x009f9f9f, 0x00656565,
00368 0x00878787, 0x006b6b6b, 0x00f4f4f4, 0x00232323,
00369 0x00484848, 0x00101010, 0x00d1d1d1, 0x00515151,
00370 0x00c0c0c0, 0x00f9f9f9, 0x00d2d2d2, 0x00a0a0a0,
00371 0x00555555, 0x00a1a1a1, 0x00414141, 0x00fafafa,
00372 0x00434343, 0x00131313, 0x00c4c4c4, 0x002f2f2f,
00373 0x00a8a8a8, 0x00b6b6b6, 0x003c3c3c, 0x002b2b2b,
00374 0x00c1c1c1, 0x00ffffff, 0x00c8c8c8, 0x00a5a5a5,
00375 0x00202020, 0x00898989, 0x00000000, 0x00909090,
00376 0x00474747, 0x00efefef, 0x00eaeaea, 0x00b7b7b7,
00377 0x00151515, 0x00060606, 0x00cdcdcd, 0x00b5b5b5,
00378 0x00121212, 0x007e7e7e, 0x00bbbbbb, 0x00292929,
00379 0x000f0f0f, 0x00b8b8b8, 0x00070707, 0x00040404,
00380 0x009b9b9b, 0x00949494, 0x00212121, 0x00666666,
00381 0x00e6e6e6, 0x00cecece, 0x00ededed, 0x00e7e7e7,
00382 0x003b3b3b, 0x00fefefe, 0x007f7f7f, 0x00c5c5c5,
00383 0x00a4a4a4, 0x00373737, 0x00b1b1b1, 0x004c4c4c,
00384 0x00919191, 0x006e6e6e, 0x008d8d8d, 0x00767676,
00385 0x00030303, 0x002d2d2d, 0x00dedede, 0x00969696,
00386 0x00262626, 0x007d7d7d, 0x00c6c6c6, 0x005c5c5c,
00387 0x00d3d3d3, 0x00f2f2f2, 0x004f4f4f, 0x00191919,
00388 0x003f3f3f, 0x00dcdcdc, 0x00797979, 0x001d1d1d,
00389 0x00525252, 0x00ebebeb, 0x00f3f3f3, 0x006d6d6d,
00390 0x005e5e5e, 0x00fbfbfb, 0x00696969, 0x00b2b2b2,
00391 0x00f0f0f0, 0x00313131, 0x000c0c0c, 0x00d4d4d4,
00392 0x00cfcfcf, 0x008c8c8c, 0x00e2e2e2, 0x00757575,
00393 0x00a9a9a9, 0x004a4a4a, 0x00575757, 0x00848484,
00394 0x00111111, 0x00454545, 0x001b1b1b, 0x00f5f5f5,
00395 0x00e4e4e4, 0x000e0e0e, 0x00737373, 0x00aaaaaa,
00396 0x00f1f1f1, 0x00dddddd, 0x00595959, 0x00141414,
00397 0x006c6c6c, 0x00929292, 0x00545454, 0x00d0d0d0,
00398 0x00787878, 0x00707070, 0x00e3e3e3, 0x00494949,
00399 0x00808080, 0x00505050, 0x00a7a7a7, 0x00f6f6f6,
00400 0x00777777, 0x00939393, 0x00868686, 0x00838383,
00401 0x002a2a2a, 0x00c7c7c7, 0x005b5b5b, 0x00e9e9e9,
00402 0x00eeeeee, 0x008f8f8f, 0x00010101, 0x003d3d3d
00403 },
00404 {
00405 0x38003838, 0x41004141, 0x16001616, 0x76007676,
00406 0xd900d9d9, 0x93009393, 0x60006060, 0xf200f2f2,
00407 0x72007272, 0xc200c2c2, 0xab00abab, 0x9a009a9a,
00408 0x75007575, 0x06000606, 0x57005757, 0xa000a0a0,
00409 0x91009191, 0xf700f7f7, 0xb500b5b5, 0xc900c9c9,
00410 0xa200a2a2, 0x8c008c8c, 0xd200d2d2, 0x90009090,
00411 0xf600f6f6, 0x07000707, 0xa700a7a7, 0x27002727,
00412 0x8e008e8e, 0xb200b2b2, 0x49004949, 0xde00dede,
00413 0x43004343, 0x5c005c5c, 0xd700d7d7, 0xc700c7c7,
00414 0x3e003e3e, 0xf500f5f5, 0x8f008f8f, 0x67006767,
00415 0x1f001f1f, 0x18001818, 0x6e006e6e, 0xaf00afaf,
00416 0x2f002f2f, 0xe200e2e2, 0x85008585, 0x0d000d0d,
00417 0x53005353, 0xf000f0f0, 0x9c009c9c, 0x65006565,
00418 0xea00eaea, 0xa300a3a3, 0xae00aeae, 0x9e009e9e,
00419 0xec00ecec, 0x80008080, 0x2d002d2d, 0x6b006b6b,
00420 0xa800a8a8, 0x2b002b2b, 0x36003636, 0xa600a6a6,
00421 0xc500c5c5, 0x86008686, 0x4d004d4d, 0x33003333,
00422 0xfd00fdfd, 0x66006666, 0x58005858, 0x96009696,
00423 0x3a003a3a, 0x09000909, 0x95009595, 0x10001010,
00424 0x78007878, 0xd800d8d8, 0x42004242, 0xcc00cccc,
00425 0xef00efef, 0x26002626, 0xe500e5e5, 0x61006161,
00426 0x1a001a1a, 0x3f003f3f, 0x3b003b3b, 0x82008282,
00427 0xb600b6b6, 0xdb00dbdb, 0xd400d4d4, 0x98009898,
00428 0xe800e8e8, 0x8b008b8b, 0x02000202, 0xeb00ebeb,
00429 0x0a000a0a, 0x2c002c2c, 0x1d001d1d, 0xb000b0b0,
00430 0x6f006f6f, 0x8d008d8d, 0x88008888, 0x0e000e0e,
00431 0x19001919, 0x87008787, 0x4e004e4e, 0x0b000b0b,
00432 0xa900a9a9, 0x0c000c0c, 0x79007979, 0x11001111,
00433 0x7f007f7f, 0x22002222, 0xe700e7e7, 0x59005959,
00434 0xe100e1e1, 0xda00dada, 0x3d003d3d, 0xc800c8c8,
00435 0x12001212, 0x04000404, 0x74007474, 0x54005454,
00436 0x30003030, 0x7e007e7e, 0xb400b4b4, 0x28002828,
00437 0x55005555, 0x68006868, 0x50005050, 0xbe00bebe,
00438 0xd000d0d0, 0xc400c4c4, 0x31003131, 0xcb00cbcb,
00439 0x2a002a2a, 0xad00adad, 0x0f000f0f, 0xca00caca,
00440 0x70007070, 0xff00ffff, 0x32003232, 0x69006969,
00441 0x08000808, 0x62006262, 0x00000000, 0x24002424,
00442 0xd100d1d1, 0xfb00fbfb, 0xba00baba, 0xed00eded,
00443 0x45004545, 0x81008181, 0x73007373, 0x6d006d6d,
00444 0x84008484, 0x9f009f9f, 0xee00eeee, 0x4a004a4a,
00445 0xc300c3c3, 0x2e002e2e, 0xc100c1c1, 0x01000101,
00446 0xe600e6e6, 0x25002525, 0x48004848, 0x99009999,
00447 0xb900b9b9, 0xb300b3b3, 0x7b007b7b, 0xf900f9f9,
00448 0xce00cece, 0xbf00bfbf, 0xdf00dfdf, 0x71007171,
00449 0x29002929, 0xcd00cdcd, 0x6c006c6c, 0x13001313,
00450 0x64006464, 0x9b009b9b, 0x63006363, 0x9d009d9d,
00451 0xc000c0c0, 0x4b004b4b, 0xb700b7b7, 0xa500a5a5,
00452 0x89008989, 0x5f005f5f, 0xb100b1b1, 0x17001717,
00453 0xf400f4f4, 0xbc00bcbc, 0xd300d3d3, 0x46004646,
00454 0xcf00cfcf, 0x37003737, 0x5e005e5e, 0x47004747,
00455 0x94009494, 0xfa00fafa, 0xfc00fcfc, 0x5b005b5b,
00456 0x97009797, 0xfe00fefe, 0x5a005a5a, 0xac00acac,
00457 0x3c003c3c, 0x4c004c4c, 0x03000303, 0x35003535,
00458 0xf300f3f3, 0x23002323, 0xb800b8b8, 0x5d005d5d,
00459 0x6a006a6a, 0x92009292, 0xd500d5d5, 0x21002121,
00460 0x44004444, 0x51005151, 0xc600c6c6, 0x7d007d7d,
00461 0x39003939, 0x83008383, 0xdc00dcdc, 0xaa00aaaa,
00462 0x7c007c7c, 0x77007777, 0x56005656, 0x05000505,
00463 0x1b001b1b, 0xa400a4a4, 0x15001515, 0x34003434,
00464 0x1e001e1e, 0x1c001c1c, 0xf800f8f8, 0x52005252,
00465 0x20002020, 0x14001414, 0xe900e9e9, 0xbd00bdbd,
00466 0xdd00dddd, 0xe400e4e4, 0xa100a1a1, 0xe000e0e0,
00467 0x8a008a8a, 0xf100f1f1, 0xd600d6d6, 0x7a007a7a,
00468 0xbb00bbbb, 0xe300e3e3, 0x40004040, 0x4f004f4f
00469 },
00470 {
00471 0x70700070, 0x2c2c002c, 0xb3b300b3, 0xc0c000c0,
00472 0xe4e400e4, 0x57570057, 0xeaea00ea, 0xaeae00ae,
00473 0x23230023, 0x6b6b006b, 0x45450045, 0xa5a500a5,
00474 0xeded00ed, 0x4f4f004f, 0x1d1d001d, 0x92920092,
00475 0x86860086, 0xafaf00af, 0x7c7c007c, 0x1f1f001f,
00476 0x3e3e003e, 0xdcdc00dc, 0x5e5e005e, 0x0b0b000b,
00477 0xa6a600a6, 0x39390039, 0xd5d500d5, 0x5d5d005d,
00478 0xd9d900d9, 0x5a5a005a, 0x51510051, 0x6c6c006c,
00479 0x8b8b008b, 0x9a9a009a, 0xfbfb00fb, 0xb0b000b0,
00480 0x74740074, 0x2b2b002b, 0xf0f000f0, 0x84840084,
00481 0xdfdf00df, 0xcbcb00cb, 0x34340034, 0x76760076,
00482 0x6d6d006d, 0xa9a900a9, 0xd1d100d1, 0x04040004,
00483 0x14140014, 0x3a3a003a, 0xdede00de, 0x11110011,
00484 0x32320032, 0x9c9c009c, 0x53530053, 0xf2f200f2,
00485 0xfefe00fe, 0xcfcf00cf, 0xc3c300c3, 0x7a7a007a,
00486 0x24240024, 0xe8e800e8, 0x60600060, 0x69690069,
00487 0xaaaa00aa, 0xa0a000a0, 0xa1a100a1, 0x62620062,
00488 0x54540054, 0x1e1e001e, 0xe0e000e0, 0x64640064,
00489 0x10100010, 0x00000000, 0xa3a300a3, 0x75750075,
00490 0x8a8a008a, 0xe6e600e6, 0x09090009, 0xdddd00dd,
00491 0x87870087, 0x83830083, 0xcdcd00cd, 0x90900090,
00492 0x73730073, 0xf6f600f6, 0x9d9d009d, 0xbfbf00bf,
00493 0x52520052, 0xd8d800d8, 0xc8c800c8, 0xc6c600c6,
00494 0x81810081, 0x6f6f006f, 0x13130013, 0x63630063,
00495 0xe9e900e9, 0xa7a700a7, 0x9f9f009f, 0xbcbc00bc,
00496 0x29290029, 0xf9f900f9, 0x2f2f002f, 0xb4b400b4,
00497 0x78780078, 0x06060006, 0xe7e700e7, 0x71710071,
00498 0xd4d400d4, 0xabab00ab, 0x88880088, 0x8d8d008d,
00499 0x72720072, 0xb9b900b9, 0xf8f800f8, 0xacac00ac,
00500 0x36360036, 0x2a2a002a, 0x3c3c003c, 0xf1f100f1,
00501 0x40400040, 0xd3d300d3, 0xbbbb00bb, 0x43430043,
00502 0x15150015, 0xadad00ad, 0x77770077, 0x80800080,
00503 0x82820082, 0xecec00ec, 0x27270027, 0xe5e500e5,
00504 0x85850085, 0x35350035, 0x0c0c000c, 0x41410041,
00505 0xefef00ef, 0x93930093, 0x19190019, 0x21210021,
00506 0x0e0e000e, 0x4e4e004e, 0x65650065, 0xbdbd00bd,
00507 0xb8b800b8, 0x8f8f008f, 0xebeb00eb, 0xcece00ce,
00508 0x30300030, 0x5f5f005f, 0xc5c500c5, 0x1a1a001a,
00509 0xe1e100e1, 0xcaca00ca, 0x47470047, 0x3d3d003d,
00510 0x01010001, 0xd6d600d6, 0x56560056, 0x4d4d004d,
00511 0x0d0d000d, 0x66660066, 0xcccc00cc, 0x2d2d002d,
00512 0x12120012, 0x20200020, 0xb1b100b1, 0x99990099,
00513 0x4c4c004c, 0xc2c200c2, 0x7e7e007e, 0x05050005,
00514 0xb7b700b7, 0x31310031, 0x17170017, 0xd7d700d7,
00515 0x58580058, 0x61610061, 0x1b1b001b, 0x1c1c001c,
00516 0x0f0f000f, 0x16160016, 0x18180018, 0x22220022,
00517 0x44440044, 0xb2b200b2, 0xb5b500b5, 0x91910091,
00518 0x08080008, 0xa8a800a8, 0xfcfc00fc, 0x50500050,
00519 0xd0d000d0, 0x7d7d007d, 0x89890089, 0x97970097,
00520 0x5b5b005b, 0x95950095, 0xffff00ff, 0xd2d200d2,
00521 0xc4c400c4, 0x48480048, 0xf7f700f7, 0xdbdb00db,
00522 0x03030003, 0xdada00da, 0x3f3f003f, 0x94940094,
00523 0x5c5c005c, 0x02020002, 0x4a4a004a, 0x33330033,
00524 0x67670067, 0xf3f300f3, 0x7f7f007f, 0xe2e200e2,
00525 0x9b9b009b, 0x26260026, 0x37370037, 0x3b3b003b,
00526 0x96960096, 0x4b4b004b, 0xbebe00be, 0x2e2e002e,
00527 0x79790079, 0x8c8c008c, 0x6e6e006e, 0x8e8e008e,
00528 0xf5f500f5, 0xb6b600b6, 0xfdfd00fd, 0x59590059,
00529 0x98980098, 0x6a6a006a, 0x46460046, 0xbaba00ba,
00530 0x25250025, 0x42420042, 0xa2a200a2, 0xfafa00fa,
00531 0x07070007, 0x55550055, 0xeeee00ee, 0x0a0a000a,
00532 0x49490049, 0x68680068, 0x38380038, 0xa4a400a4,
00533 0x28280028, 0x7b7b007b, 0xc9c900c9, 0xc1c100c1,
00534 0xe3e300e3, 0xf4f400f4, 0xc7c700c7, 0x9e9e009e
00535 }};
00536
00537 NAMESPACE_END