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