• Main Page
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

camellia.cpp

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

Generated on Mon Aug 9 2010 15:56:33 for Crypto++ by  doxygen 1.7.1