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, 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         // SSE2 version is 30% faster on Intel Core 2. Doesn't seem worth the hassle of maintenance, but left here
00106         // #if'd out in case someone needs it.
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                 // KL
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                 // KA
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                 // KL
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                 // KR
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                 // KA
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                 // KB
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         // timing attack countermeasure. see comments at top for more details
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 // The Camellia s-boxes
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

Generated on Fri Jun 1 11:11:19 2007 for Crypto++ by  doxygen 1.5.2