Package tlslite :: Package utils :: Module rijndael
[hide private]
[frames] | no frames]

Source Code for Module tlslite.utils.rijndael

   1  # Authors: 
   2  #   Bram Cohen 
   3  #   Trevor Perrin - various changes 
   4  # 
   5  # See the LICENSE file for legal information regarding use of this file. 
   6  # Also see Bram Cohen's statement below 
   7   
   8  """ 
   9  A pure python (slow) implementation of rijndael with a decent interface 
  10   
  11  To include - 
  12   
  13  from rijndael import rijndael 
  14   
  15  To do a key setup - 
  16   
  17  r = rijndael(key, block_size = 16) 
  18   
  19  key must be a string of length 16, 24, or 32 
  20  blocksize must be 16, 24, or 32. Default is 16 
  21   
  22  To use - 
  23   
  24  ciphertext = r.encrypt(plaintext) 
  25  plaintext = r.decrypt(ciphertext) 
  26   
  27  If any strings are of the wrong length a ValueError is thrown 
  28  """ 
  29   
  30  # ported from the Java reference code by Bram Cohen, bram@gawth.com, April 2001 
  31  # this code is public domain, unless someone makes 
  32  # an intellectual property claim against the reference 
  33  # code, in which case it can be made public domain by 
  34  # deleting all the comments and renaming all the variables 
  35   
  36  shifts = [[[0, 0], [1, 3], [2, 2], [3, 1]], 
  37            [[0, 0], [1, 5], [2, 4], [3, 3]], 
  38            [[0, 0], [1, 7], [3, 5], [4, 4]]] 
  39   
  40  # [keysize][block_size] 
  41  num_rounds = {16: {16: 10, 24: 12, 32: 14}, 
  42                24: {16: 12, 24: 12, 32: 14}, 
  43                32: {16: 14, 24: 14, 32: 14}} 
  44   
  45  # see unit_tests/test_tlslite_utils_rijndael.py for algorithm used to 
  46  # calculate S, Si, T, U and rcon arrays 
  47   
  48  # S box 
  49  S = (99, 124, 119, 123, 242, 107, 111, 197, 
  50       48, 1, 103, 43, 254, 215, 171, 118, 
  51       202, 130, 201, 125, 250, 89, 71, 240, 
  52       173, 212, 162, 175, 156, 164, 114, 192, 
  53       183, 253, 147, 38, 54, 63, 247, 204, 
  54       52, 165, 229, 241, 113, 216, 49, 21, 
  55       4, 199, 35, 195, 24, 150, 5, 154, 
  56       7, 18, 128, 226, 235, 39, 178, 117, 
  57       9, 131, 44, 26, 27, 110, 90, 160, 
  58       82, 59, 214, 179, 41, 227, 47, 132, 
  59       83, 209, 0, 237, 32, 252, 177, 91, 
  60       106, 203, 190, 57, 74, 76, 88, 207, 
  61       208, 239, 170, 251, 67, 77, 51, 133, 
  62       69, 249, 2, 127, 80, 60, 159, 168, 
  63       81, 163, 64, 143, 146, 157, 56, 245, 
  64       188, 182, 218, 33, 16, 255, 243, 210, 
  65       205, 12, 19, 236, 95, 151, 68, 23, 
  66       196, 167, 126, 61, 100, 93, 25, 115, 
  67       96, 129, 79, 220, 34, 42, 144, 136, 
  68       70, 238, 184, 20, 222, 94, 11, 219, 
  69       224, 50, 58, 10, 73, 6, 36, 92, 
  70       194, 211, 172, 98, 145, 149, 228, 121, 
  71       231, 200, 55, 109, 141, 213, 78, 169, 
  72       108, 86, 244, 234, 101, 122, 174, 8, 
  73       186, 120, 37, 46, 28, 166, 180, 198, 
  74       232, 221, 116, 31, 75, 189, 139, 138, 
  75       112, 62, 181, 102, 72, 3, 246, 14, 
  76       97, 53, 87, 185, 134, 193, 29, 158, 
  77       225, 248, 152, 17, 105, 217, 142, 148, 
  78       155, 30, 135, 233, 206, 85, 40, 223, 
  79       140, 161, 137, 13, 191, 230, 66, 104, 
  80       65, 153, 45, 15, 176, 84, 187, 22) 
  81   
  82  # inverse of S box 
  83  Si = (82, 9, 106, 213, 48, 54, 165, 56, 
  84        191, 64, 163, 158, 129, 243, 215, 251, 
  85        124, 227, 57, 130, 155, 47, 255, 135, 
  86        52, 142, 67, 68, 196, 222, 233, 203, 
  87        84, 123, 148, 50, 166, 194, 35, 61, 
  88        238, 76, 149, 11, 66, 250, 195, 78, 
  89        8, 46, 161, 102, 40, 217, 36, 178, 
  90        118, 91, 162, 73, 109, 139, 209, 37, 
  91        114, 248, 246, 100, 134, 104, 152, 22, 
  92        212, 164, 92, 204, 93, 101, 182, 146, 
  93        108, 112, 72, 80, 253, 237, 185, 218, 
  94        94, 21, 70, 87, 167, 141, 157, 132, 
  95        144, 216, 171, 0, 140, 188, 211, 10, 
  96        247, 228, 88, 5, 184, 179, 69, 6, 
  97        208, 44, 30, 143, 202, 63, 15, 2, 
  98        193, 175, 189, 3, 1, 19, 138, 107, 
  99        58, 145, 17, 65, 79, 103, 220, 234, 
 100        151, 242, 207, 206, 240, 180, 230, 115, 
 101        150, 172, 116, 34, 231, 173, 53, 133, 
 102        226, 249, 55, 232, 28, 117, 223, 110, 
 103        71, 241, 26, 113, 29, 41, 197, 137, 
 104        111, 183, 98, 14, 170, 24, 190, 27, 
 105        252, 86, 62, 75, 198, 210, 121, 32, 
 106        154, 219, 192, 254, 120, 205, 90, 244, 
 107        31, 221, 168, 51, 136, 7, 199, 49, 
 108        177, 18, 16, 89, 39, 128, 236, 95, 
 109        96, 81, 127, 169, 25, 181, 74, 13, 
 110        45, 229, 122, 159, 147, 201, 156, 239, 
 111        160, 224, 59, 77, 174, 42, 245, 176, 
 112        200, 235, 187, 60, 131, 83, 153, 97, 
 113        23, 43, 4, 126, 186, 119, 214, 38, 
 114        225, 105, 20, 99, 85, 33, 12, 125) 
 115   
 116  T1 = (0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, 
 117        0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, 
 118        0x60303050, 0x2010103, 0xce6767a9, 0x562b2b7d, 
 119        0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, 
 120        0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, 
 121        0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, 
 122        0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, 
 123        0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, 
 124        0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, 
 125        0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, 
 126        0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, 
 127        0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, 
 128        0x804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, 
 129        0x30181828, 0x379696a1, 0xa05050f, 0x2f9a9ab5, 
 130        0xe070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, 
 131        0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, 
 132        0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, 
 133        0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, 
 134        0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, 
 135        0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, 
 136        0xa65353f5, 0xb9d1d168, 0x0, 0xc1eded2c, 
 137        0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, 
 138        0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, 
 139        0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, 
 140        0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, 
 141        0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, 
 142        0x8a4545cf, 0xe9f9f910, 0x4020206, 0xfe7f7f81, 
 143        0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, 
 144        0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x58f8f8a, 
 145        0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, 
 146        0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, 
 147        0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, 
 148        0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, 
 149        0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, 
 150        0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, 
 151        0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, 
 152        0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, 
 153        0x44222266, 0x542a2a7e, 0x3b9090ab, 0xb888883, 
 154        0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, 
 155        0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, 
 156        0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, 
 157        0x924949db, 0xc06060a, 0x4824246c, 0xb85c5ce4, 
 158        0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, 
 159        0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, 
 160        0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, 
 161        0x18d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, 
 162        0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, 
 163        0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, 
 164        0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, 
 165        0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, 
 166        0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, 
 167        0x964b4bdd, 0x61bdbddc, 0xd8b8b86, 0xf8a8a85, 
 168        0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, 
 169        0x904848d8, 0x6030305, 0xf7f6f601, 0x1c0e0e12, 
 170        0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, 
 171        0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, 
 172        0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, 
 173        0xd26969bb, 0xa9d9d970, 0x78e8e89, 0x339494a7, 
 174        0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, 
 175        0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, 
 176        0x38c8c8f, 0x59a1a1f8, 0x9898980, 0x1a0d0d17, 
 177        0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, 
 178        0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, 
 179        0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a) 
 180   
 181  T2 = (0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, 
 182        0xdfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, 
 183        0x50603030, 0x3020101, 0xa9ce6767, 0x7d562b2b, 
 184        0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, 
 185        0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, 
 186        0x15effafa, 0xebb25959, 0xc98e4747, 0xbfbf0f0, 
 187        0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, 
 188        0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, 
 189        0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, 
 190        0x5a6c3636, 0x417e3f3f, 0x2f5f7f7, 0x4f83cccc, 
 191        0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x8f9f1f1, 
 192        0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, 
 193        0xc080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, 
 194        0x28301818, 0xa1379696, 0xf0a0505, 0xb52f9a9a, 
 195        0x90e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, 
 196        0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, 
 197        0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, 
 198        0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, 
 199        0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, 
 200        0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, 
 201        0xf5a65353, 0x68b9d1d1, 0x0, 0x2cc1eded, 
 202        0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, 
 203        0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, 
 204        0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, 
 205        0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, 
 206        0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, 
 207        0xcf8a4545, 0x10e9f9f9, 0x6040202, 0x81fe7f7f, 
 208        0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, 
 209        0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, 
 210        0xad3f9292, 0xbc219d9d, 0x48703838, 0x4f1f5f5, 
 211        0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, 
 212        0x30201010, 0x1ae5ffff, 0xefdf3f3, 0x6dbfd2d2, 
 213        0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, 
 214        0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, 
 215        0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, 
 216        0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, 
 217        0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, 
 218        0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, 
 219        0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, 
 220        0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, 
 221        0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, 
 222        0xdb924949, 0xa0c0606, 0x6c482424, 0xe4b85c5c, 
 223        0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, 
 224        0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, 
 225        0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, 
 226        0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, 
 227        0xb4d86c6c, 0xfaac5656, 0x7f3f4f4, 0x25cfeaea, 
 228        0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, 
 229        0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, 
 230        0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, 
 231        0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, 
 232        0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, 
 233        0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, 
 234        0xd8904848, 0x5060303, 0x1f7f6f6, 0x121c0e0e, 
 235        0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, 
 236        0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, 
 237        0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, 
 238        0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, 
 239        0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, 
 240        0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, 
 241        0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, 
 242        0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, 
 243        0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, 
 244        0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616) 
 245   
 246  T3 = (0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, 
 247        0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, 
 248        0x30506030, 0x1030201, 0x67a9ce67, 0x2b7d562b, 
 249        0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, 
 250        0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, 
 251        0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, 
 252        0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, 
 253        0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, 
 254        0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, 
 255        0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, 
 256        0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, 
 257        0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, 
 258        0x40c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, 
 259        0x18283018, 0x96a13796, 0x50f0a05, 0x9ab52f9a, 
 260        0x7090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, 
 261        0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, 
 262        0x91b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, 
 263        0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, 
 264        0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, 
 265        0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, 
 266        0x53f5a653, 0xd168b9d1, 0x0, 0xed2cc1ed, 
 267        0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, 
 268        0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, 
 269        0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, 
 270        0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, 
 271        0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, 
 272        0x45cf8a45, 0xf910e9f9, 0x2060402, 0x7f81fe7f, 
 273        0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, 
 274        0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, 
 275        0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, 
 276        0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, 
 277        0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, 
 278        0xcd4c81cd, 0xc14180c, 0x13352613, 0xec2fc3ec, 
 279        0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, 
 280        0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, 
 281        0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, 
 282        0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, 
 283        0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, 
 284        0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, 
 285        0xde79a7de, 0x5ee2bc5e, 0xb1d160b, 0xdb76addb, 
 286        0xe03bdbe0, 0x32566432, 0x3a4e743a, 0xa1e140a, 
 287        0x49db9249, 0x60a0c06, 0x246c4824, 0x5ce4b85c, 
 288        0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, 
 289        0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, 
 290        0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, 
 291        0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, 
 292        0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, 
 293        0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x8181008, 
 294        0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, 
 295        0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, 
 296        0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, 
 297        0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, 
 298        0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, 
 299        0x48d89048, 0x3050603, 0xf601f7f6, 0xe121c0e, 
 300        0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, 
 301        0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, 
 302        0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, 
 303        0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, 
 304        0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, 
 305        0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, 
 306        0x8c8f038c, 0xa1f859a1, 0x89800989, 0xd171a0d, 
 307        0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, 
 308        0x41c38241, 0x99b02999, 0x2d775a2d, 0xf111e0f, 
 309        0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16) 
 310   
 311  T4 = (0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, 
 312        0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, 
 313        0x30305060, 0x1010302, 0x6767a9ce, 0x2b2b7d56, 
 314        0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, 
 315        0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, 
 316        0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, 
 317        0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, 
 318        0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, 
 319        0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, 
 320        0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, 
 321        0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, 
 322        0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, 
 323        0x4040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, 
 324        0x18182830, 0x9696a137, 0x5050f0a, 0x9a9ab52f, 
 325        0x707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, 
 326        0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, 
 327        0x9091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, 
 328        0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, 
 329        0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, 
 330        0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, 
 331        0x5353f5a6, 0xd1d168b9, 0x0, 0xeded2cc1, 
 332        0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, 
 333        0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, 
 334        0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, 
 335        0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, 
 336        0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, 
 337        0x4545cf8a, 0xf9f910e9, 0x2020604, 0x7f7f81fe, 
 338        0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, 
 339        0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, 
 340        0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, 
 341        0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, 
 342        0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, 
 343        0xcdcd4c81, 0xc0c1418, 0x13133526, 0xecec2fc3, 
 344        0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, 
 345        0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, 
 346        0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, 
 347        0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, 
 348        0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, 
 349        0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, 
 350        0xdede79a7, 0x5e5ee2bc, 0xb0b1d16, 0xdbdb76ad, 
 351        0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0xa0a1e14, 
 352        0x4949db92, 0x6060a0c, 0x24246c48, 0x5c5ce4b8, 
 353        0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, 
 354        0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, 
 355        0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, 
 356        0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, 
 357        0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, 
 358        0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x8081810, 
 359        0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, 
 360        0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, 
 361        0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, 
 362        0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, 
 363        0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, 
 364        0x4848d890, 0x3030506, 0xf6f601f7, 0xe0e121c, 
 365        0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, 
 366        0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, 
 367        0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, 
 368        0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, 
 369        0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, 
 370        0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, 
 371        0x8c8c8f03, 0xa1a1f859, 0x89898009, 0xd0d171a, 
 372        0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, 
 373        0x4141c382, 0x9999b029, 0x2d2d775a, 0xf0f111e, 
 374        0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c) 
 375   
 376  T5 = (0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, 
 377        0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, 
 378        0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, 
 379        0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, 
 380        0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, 
 381        0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, 
 382        0x38f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, 
 383        0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, 
 384        0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, 
 385        0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, 
 386        0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, 
 387        0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, 
 388        0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, 
 389        0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, 
 390        0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, 
 391        0x302887f2, 0x23bfa5b2, 0x2036aba, 0xed16825c, 
 392        0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, 
 393        0x65daf4cd, 0x605bed5, 0xd134621f, 0xc4a6fe8a, 
 394        0x342e539d, 0xa2f355a0, 0x58ae132, 0xa4f6eb75, 
 395        0xb83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, 
 396        0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, 
 397        0x91548db5, 0x71c45d05, 0x406d46f, 0x605015ff, 
 398        0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, 
 399        0xb0e842bd, 0x7898b88, 0xe7195b38, 0x79c8eedb, 
 400        0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x0, 
 401        0x9808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, 
 402        0xfd0efffb, 0xf853856, 0x3daed51e, 0x362d3927, 
 403        0xa0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, 
 404        0xc0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, 
 405        0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, 
 406        0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, 
 407        0xe090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, 
 408        0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, 
 409        0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, 
 410        0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, 
 411        0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, 
 412        0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, 
 413        0x1d9e2f4b, 0xdcb230f3, 0xd8652ec, 0x77c1e3d0, 
 414        0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, 
 415        0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, 
 416        0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, 
 417        0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, 
 418        0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, 
 419        0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, 
 420        0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, 
 421        0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, 
 422        0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, 
 423        0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, 
 424        0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, 
 425        0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, 
 426        0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, 
 427        0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, 
 428        0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, 
 429        0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, 
 430        0x9d5eea04, 0x18c355d, 0xfa877473, 0xfb0b412e, 
 431        0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, 
 432        0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, 
 433        0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, 
 434        0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, 
 435        0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, 
 436        0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, 
 437        0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, 
 438        0x39a80171, 0x80cb3de, 0xd8b4e49c, 0x6456c190, 
 439        0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742) 
 440   
 441  T6 = (0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, 
 442        0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, 
 443        0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, 
 444        0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, 
 445        0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, 
 446        0x2c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, 
 447        0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, 
 448        0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, 
 449        0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, 
 450        0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, 
 451        0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, 
 452        0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, 
 453        0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, 
 454        0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, 
 455        0x7b2eb28, 0x32fb5c2, 0x9a86c57b, 0xa5d33708, 
 456        0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, 
 457        0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, 
 458        0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, 
 459        0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, 
 460        0x390b83ec, 0xaa4060ef, 0x65e719f, 0x51bd6e10, 
 461        0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, 
 462        0xb591548d, 0x571c45d, 0x6f0406d4, 0xff605015, 
 463        0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, 
 464        0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, 
 465        0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x0, 
 466        0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, 
 467        0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, 
 468        0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, 
 469        0xb10c0a67, 0xf9357e7, 0xd2b4ee96, 0x9e1b9b91, 
 470        0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, 
 471        0xae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, 
 472        0xb0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, 
 473        0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, 
 474        0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, 
 475        0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, 
 476        0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, 
 477        0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, 
 478        0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, 
 479        0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, 
 480        0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, 
 481        0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, 
 482        0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, 
 483        0xe42c3a9d, 0xd507892, 0x9b6a5fcc, 0x62547e46, 
 484        0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, 
 485        0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, 
 486        0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, 
 487        0x9cd2678, 0xf46e5918, 0x1ec9ab7, 0xa8834f9a, 
 488        0x65e6956e, 0x7eaaffe6, 0x821bccf, 0xe6ef15e8, 
 489        0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, 
 490        0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, 
 491        0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, 
 492        0x4af10498, 0xf741ecda, 0xe7fcd50, 0x2f1791f6, 
 493        0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, 
 494        0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, 
 495        0x49d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, 
 496        0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, 
 497        0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, 
 498        0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, 
 499        0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, 
 500        0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, 
 501        0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, 
 502        0x72161dc3, 0xcbce225, 0x8b283c49, 0x41ff0d95, 
 503        0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, 
 504        0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857) 
 505   
 506  T7 = (0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, 
 507        0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x3934be3, 
 508        0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, 
 509        0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, 
 510        0x5a49deb1, 0x1b6725ba, 0xe9845ea, 0xc0e15dfe, 
 511        0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, 
 512        0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, 
 513        0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, 
 514        0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, 
 515        0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, 
 516        0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, 
 517        0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, 
 518        0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, 
 519        0xd323ab73, 0x2e2724b, 0x8f57e31f, 0xab2a6655, 
 520        0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x8a5d337, 
 521        0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, 
 522        0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, 
 523        0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, 
 524        0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, 
 525        0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, 
 526        0x8af93e21, 0x63d96dd, 0x5aedd3e, 0xbd464de6, 
 527        0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, 
 528        0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, 
 529        0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, 
 530        0xa47a17c, 0xfe97c42, 0x1ec9f884, 0x0, 
 531        0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, 
 532        0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, 
 533        0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, 
 534        0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, 
 535        0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, 
 536        0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, 
 537        0xd0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, 
 538        0x198557f1, 0x74caf75, 0xddbbee99, 0x60fda37f, 
 539        0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, 
 540        0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, 
 541        0xdccad731, 0x85104263, 0x22401397, 0x112084c6, 
 542        0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, 
 543        0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, 
 544        0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, 
 545        0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, 
 546        0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0xb3698d4, 
 547        0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, 
 548        0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, 
 549        0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, 
 550        0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, 
 551        0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, 
 552        0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, 
 553        0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, 
 554        0x9bd9bae7, 0x36ce4a6f, 0x9d4ea9f, 0x7cd629b0, 
 555        0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, 
 556        0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, 
 557        0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, 
 558        0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x4dfe496, 
 559        0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, 
 560        0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, 
 561        0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, 
 562        0x618c9ad7, 0xc7a37a1, 0x148e59f8, 0x3c89eb13, 
 563        0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, 
 564        0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, 
 565        0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, 
 566        0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, 
 567        0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, 
 568        0x17139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, 
 569        0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8) 
 570   
 571  T8 = (0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, 
 572        0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, 
 573        0x30fa5520, 0x766df6ad, 0xcc769188, 0x24c25f5, 
 574        0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, 
 575        0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, 
 576        0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, 
 577        0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, 
 578        0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, 
 579        0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, 
 580        0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, 
 581        0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, 
 582        0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x82b94f9, 
 583        0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, 
 584        0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, 
 585        0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, 
 586        0x2887f230, 0xbfa5b223, 0x36aba02, 0x16825ced, 
 587        0xcf1c2b8a, 0x79b492a7, 0x7f2f0f3, 0x69e2a14e, 
 588        0xdaf4cd65, 0x5bed506, 0x34621fd1, 0xa6fe8ac4, 
 589        0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, 
 590        0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, 
 591        0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, 
 592        0x548db591, 0xc45d0571, 0x6d46f04, 0x5015ff60, 
 593        0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, 
 594        0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, 
 595        0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x0, 
 596        0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, 
 597        0xefffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, 
 598        0xfd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, 
 599        0xa67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, 
 600        0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, 
 601        0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, 
 602        0x90d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, 
 603        0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, 
 604        0x1269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, 
 605        0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, 
 606        0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, 
 607        0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, 
 608        0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, 
 609        0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, 
 610        0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, 
 611        0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, 
 612        0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, 
 613        0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, 
 614        0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, 
 615        0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, 
 616        0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, 
 617        0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, 
 618        0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, 
 619        0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, 
 620        0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, 
 621        0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, 
 622        0x4984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, 
 623        0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, 
 624        0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, 
 625        0x5eea049d, 0x8c355d01, 0x877473fa, 0xb412efb, 
 626        0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, 
 627        0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, 
 628        0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, 
 629        0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, 
 630        0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, 
 631        0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, 
 632        0x1dc37216, 0xe2250cbc, 0x3c498b28, 0xd9541ff, 
 633        0xa8017139, 0xcb3de08, 0xb4e49cd8, 0x56c19064, 
 634        0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0) 
 635   
 636  U1 = (0x0, 0xe090d0b, 0x1c121a16, 0x121b171d, 
 637        0x3824342c, 0x362d3927, 0x24362e3a, 0x2a3f2331, 
 638        0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, 
 639        0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 
 640        0xe090d0b0, 0xee99ddbb, 0xfc82caa6, 0xf28bc7ad, 
 641        0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, 
 642        0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 
 643        0xa8fc8cc4, 0xa6f581cf, 0xb4ee96d2, 0xbae79bd9, 
 644        0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, 
 645        0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 
 646        0xab73d323, 0xa57ade28, 0xb761c935, 0xb968c43e, 
 647        0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, 
 648        0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 
 649        0x38f5fe7, 0xd8652ec, 0x1f9d45f1, 0x119448fa, 
 650        0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, 
 651        0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 
 652        0xad766df6, 0xa37f60fd, 0xb16477e0, 0xbf6d7aeb, 
 653        0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, 
 654        0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 
 655        0xe51a3182, 0xeb133c89, 0xf9082b94, 0xf701269f, 
 656        0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, 
 657        0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 
 658        0x3daed51e, 0x33a7d815, 0x21bccf08, 0x2fb5c203, 
 659        0x58ae132, 0xb83ec39, 0x1998fb24, 0x1791f62f, 
 660        0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 
 661        0x4e69e2a1, 0x4060efaa, 0x527bf8b7, 0x5c72f5bc, 
 662        0x605bed5, 0x80cb3de, 0x1a17a4c3, 0x141ea9c8, 
 663        0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 
 664        0x96dd063d, 0x98d40b36, 0x8acf1c2b, 0x84c61120, 
 665        0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, 
 666        0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 
 667        0xdeb15a49, 0xd0b85742, 0xc2a3405f, 0xccaa4d54, 
 668        0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, 
 669        0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 
 670        0x31a4b2af, 0x3fadbfa4, 0x2db6a8b9, 0x23bfa5b2, 
 671        0x9808683, 0x7898b88, 0x15929c95, 0x1b9b919e, 
 672        0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 
 673        0x99583e6b, 0x97513360, 0x854a247d, 0x8b432976, 
 674        0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, 
 675        0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 
 676        0x9ad7618c, 0x94de6c87, 0x86c57b9a, 0x88cc7691, 
 677        0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, 
 678        0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 
 679        0xd2bb3df8, 0xdcb230f3, 0xcea927ee, 0xc0a02ae5, 
 680        0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, 
 681        0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 
 682        0xa0fd964, 0x406d46f, 0x161dc372, 0x1814ce79, 
 683        0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, 
 684        0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 
 685        0xd4be832d, 0xdab78e26, 0xc8ac993b, 0xc6a59430, 
 686        0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, 
 687        0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 
 688        0xc0a67b1, 0x2036aba, 0x10187da7, 0x1e1170ac, 
 689        0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, 
 690        0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 
 691        0x44663bc5, 0x4a6f36ce, 0x587421d3, 0x567d2cd8, 
 692        0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, 
 693        0xf853856, 0x18c355d, 0x13972240, 0x1d9e2f4b, 
 694        0x47e96422, 0x49e06929, 0x5bfb7e34, 0x55f2733f, 
 695        0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, 
 696        0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 
 697        0xef15e8e6, 0xe11ce5ed, 0xf307f2f0, 0xfd0efffb, 
 698        0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, 
 699        0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3) 
 700   
 701  U2 = (0x0, 0xb0e090d, 0x161c121a, 0x1d121b17, 
 702        0x2c382434, 0x27362d39, 0x3a24362e, 0x312a3f23, 
 703        0x58704868, 0x537e4165, 0x4e6c5a72, 0x4562537f, 
 704        0x74486c5c, 0x7f466551, 0x62547e46, 0x695a774b, 
 705        0xb0e090d0, 0xbbee99dd, 0xa6fc82ca, 0xadf28bc7, 
 706        0x9cd8b4e4, 0x97d6bde9, 0x8ac4a6fe, 0x81caaff3, 
 707        0xe890d8b8, 0xe39ed1b5, 0xfe8ccaa2, 0xf582c3af, 
 708        0xc4a8fc8c, 0xcfa6f581, 0xd2b4ee96, 0xd9bae79b, 
 709        0x7bdb3bbb, 0x70d532b6, 0x6dc729a1, 0x66c920ac, 
 710        0x57e31f8f, 0x5ced1682, 0x41ff0d95, 0x4af10498, 
 711        0x23ab73d3, 0x28a57ade, 0x35b761c9, 0x3eb968c4, 
 712        0xf9357e7, 0x49d5eea, 0x198f45fd, 0x12814cf0, 
 713        0xcb3bab6b, 0xc035a266, 0xdd27b971, 0xd629b07c, 
 714        0xe7038f5f, 0xec0d8652, 0xf11f9d45, 0xfa119448, 
 715        0x934be303, 0x9845ea0e, 0x8557f119, 0x8e59f814, 
 716        0xbf73c737, 0xb47dce3a, 0xa96fd52d, 0xa261dc20, 
 717        0xf6ad766d, 0xfda37f60, 0xe0b16477, 0xebbf6d7a, 
 718        0xda955259, 0xd19b5b54, 0xcc894043, 0xc787494e, 
 719        0xaedd3e05, 0xa5d33708, 0xb8c12c1f, 0xb3cf2512, 
 720        0x82e51a31, 0x89eb133c, 0x94f9082b, 0x9ff70126, 
 721        0x464de6bd, 0x4d43efb0, 0x5051f4a7, 0x5b5ffdaa, 
 722        0x6a75c289, 0x617bcb84, 0x7c69d093, 0x7767d99e, 
 723        0x1e3daed5, 0x1533a7d8, 0x821bccf, 0x32fb5c2, 
 724        0x32058ae1, 0x390b83ec, 0x241998fb, 0x2f1791f6, 
 725        0x8d764dd6, 0x867844db, 0x9b6a5fcc, 0x906456c1, 
 726        0xa14e69e2, 0xaa4060ef, 0xb7527bf8, 0xbc5c72f5, 
 727        0xd50605be, 0xde080cb3, 0xc31a17a4, 0xc8141ea9, 
 728        0xf93e218a, 0xf2302887, 0xef223390, 0xe42c3a9d, 
 729        0x3d96dd06, 0x3698d40b, 0x2b8acf1c, 0x2084c611, 
 730        0x11aef932, 0x1aa0f03f, 0x7b2eb28, 0xcbce225, 
 731        0x65e6956e, 0x6ee89c63, 0x73fa8774, 0x78f48e79, 
 732        0x49deb15a, 0x42d0b857, 0x5fc2a340, 0x54ccaa4d, 
 733        0xf741ecda, 0xfc4fe5d7, 0xe15dfec0, 0xea53f7cd, 
 734        0xdb79c8ee, 0xd077c1e3, 0xcd65daf4, 0xc66bd3f9, 
 735        0xaf31a4b2, 0xa43fadbf, 0xb92db6a8, 0xb223bfa5, 
 736        0x83098086, 0x8807898b, 0x9515929c, 0x9e1b9b91, 
 737        0x47a17c0a, 0x4caf7507, 0x51bd6e10, 0x5ab3671d, 
 738        0x6b99583e, 0x60975133, 0x7d854a24, 0x768b4329, 
 739        0x1fd13462, 0x14df3d6f, 0x9cd2678, 0x2c32f75, 
 740        0x33e91056, 0x38e7195b, 0x25f5024c, 0x2efb0b41, 
 741        0x8c9ad761, 0x8794de6c, 0x9a86c57b, 0x9188cc76, 
 742        0xa0a2f355, 0xabacfa58, 0xb6bee14f, 0xbdb0e842, 
 743        0xd4ea9f09, 0xdfe49604, 0xc2f68d13, 0xc9f8841e, 
 744        0xf8d2bb3d, 0xf3dcb230, 0xeecea927, 0xe5c0a02a, 
 745        0x3c7a47b1, 0x37744ebc, 0x2a6655ab, 0x21685ca6, 
 746        0x10426385, 0x1b4c6a88, 0x65e719f, 0xd507892, 
 747        0x640a0fd9, 0x6f0406d4, 0x72161dc3, 0x791814ce, 
 748        0x48322bed, 0x433c22e0, 0x5e2e39f7, 0x552030fa, 
 749        0x1ec9ab7, 0xae293ba, 0x17f088ad, 0x1cfe81a0, 
 750        0x2dd4be83, 0x26dab78e, 0x3bc8ac99, 0x30c6a594, 
 751        0x599cd2df, 0x5292dbd2, 0x4f80c0c5, 0x448ec9c8, 
 752        0x75a4f6eb, 0x7eaaffe6, 0x63b8e4f1, 0x68b6edfc, 
 753        0xb10c0a67, 0xba02036a, 0xa710187d, 0xac1e1170, 
 754        0x9d342e53, 0x963a275e, 0x8b283c49, 0x80263544, 
 755        0xe97c420f, 0xe2724b02, 0xff605015, 0xf46e5918, 
 756        0xc544663b, 0xce4a6f36, 0xd3587421, 0xd8567d2c, 
 757        0x7a37a10c, 0x7139a801, 0x6c2bb316, 0x6725ba1b, 
 758        0x560f8538, 0x5d018c35, 0x40139722, 0x4b1d9e2f, 
 759        0x2247e964, 0x2949e069, 0x345bfb7e, 0x3f55f273, 
 760        0xe7fcd50, 0x571c45d, 0x1863df4a, 0x136dd647, 
 761        0xcad731dc, 0xc1d938d1, 0xdccb23c6, 0xd7c52acb, 
 762        0xe6ef15e8, 0xede11ce5, 0xf0f307f2, 0xfbfd0eff, 
 763        0x92a779b4, 0x99a970b9, 0x84bb6bae, 0x8fb562a3, 
 764        0xbe9f5d80, 0xb591548d, 0xa8834f9a, 0xa38d4697) 
 765   
 766  U3 = (0x0, 0xd0b0e09, 0x1a161c12, 0x171d121b, 
 767        0x342c3824, 0x3927362d, 0x2e3a2436, 0x23312a3f, 
 768        0x68587048, 0x65537e41, 0x724e6c5a, 0x7f456253, 
 769        0x5c74486c, 0x517f4665, 0x4662547e, 0x4b695a77, 
 770        0xd0b0e090, 0xddbbee99, 0xcaa6fc82, 0xc7adf28b, 
 771        0xe49cd8b4, 0xe997d6bd, 0xfe8ac4a6, 0xf381caaf, 
 772        0xb8e890d8, 0xb5e39ed1, 0xa2fe8cca, 0xaff582c3, 
 773        0x8cc4a8fc, 0x81cfa6f5, 0x96d2b4ee, 0x9bd9bae7, 
 774        0xbb7bdb3b, 0xb670d532, 0xa16dc729, 0xac66c920, 
 775        0x8f57e31f, 0x825ced16, 0x9541ff0d, 0x984af104, 
 776        0xd323ab73, 0xde28a57a, 0xc935b761, 0xc43eb968, 
 777        0xe70f9357, 0xea049d5e, 0xfd198f45, 0xf012814c, 
 778        0x6bcb3bab, 0x66c035a2, 0x71dd27b9, 0x7cd629b0, 
 779        0x5fe7038f, 0x52ec0d86, 0x45f11f9d, 0x48fa1194, 
 780        0x3934be3, 0xe9845ea, 0x198557f1, 0x148e59f8, 
 781        0x37bf73c7, 0x3ab47dce, 0x2da96fd5, 0x20a261dc, 
 782        0x6df6ad76, 0x60fda37f, 0x77e0b164, 0x7aebbf6d, 
 783        0x59da9552, 0x54d19b5b, 0x43cc8940, 0x4ec78749, 
 784        0x5aedd3e, 0x8a5d337, 0x1fb8c12c, 0x12b3cf25, 
 785        0x3182e51a, 0x3c89eb13, 0x2b94f908, 0x269ff701, 
 786        0xbd464de6, 0xb04d43ef, 0xa75051f4, 0xaa5b5ffd, 
 787        0x896a75c2, 0x84617bcb, 0x937c69d0, 0x9e7767d9, 
 788        0xd51e3dae, 0xd81533a7, 0xcf0821bc, 0xc2032fb5, 
 789        0xe132058a, 0xec390b83, 0xfb241998, 0xf62f1791, 
 790        0xd68d764d, 0xdb867844, 0xcc9b6a5f, 0xc1906456, 
 791        0xe2a14e69, 0xefaa4060, 0xf8b7527b, 0xf5bc5c72, 
 792        0xbed50605, 0xb3de080c, 0xa4c31a17, 0xa9c8141e, 
 793        0x8af93e21, 0x87f23028, 0x90ef2233, 0x9de42c3a, 
 794        0x63d96dd, 0xb3698d4, 0x1c2b8acf, 0x112084c6, 
 795        0x3211aef9, 0x3f1aa0f0, 0x2807b2eb, 0x250cbce2, 
 796        0x6e65e695, 0x636ee89c, 0x7473fa87, 0x7978f48e, 
 797        0x5a49deb1, 0x5742d0b8, 0x405fc2a3, 0x4d54ccaa, 
 798        0xdaf741ec, 0xd7fc4fe5, 0xc0e15dfe, 0xcdea53f7, 
 799        0xeedb79c8, 0xe3d077c1, 0xf4cd65da, 0xf9c66bd3, 
 800        0xb2af31a4, 0xbfa43fad, 0xa8b92db6, 0xa5b223bf, 
 801        0x86830980, 0x8b880789, 0x9c951592, 0x919e1b9b, 
 802        0xa47a17c, 0x74caf75, 0x1051bd6e, 0x1d5ab367, 
 803        0x3e6b9958, 0x33609751, 0x247d854a, 0x29768b43, 
 804        0x621fd134, 0x6f14df3d, 0x7809cd26, 0x7502c32f, 
 805        0x5633e910, 0x5b38e719, 0x4c25f502, 0x412efb0b, 
 806        0x618c9ad7, 0x6c8794de, 0x7b9a86c5, 0x769188cc, 
 807        0x55a0a2f3, 0x58abacfa, 0x4fb6bee1, 0x42bdb0e8, 
 808        0x9d4ea9f, 0x4dfe496, 0x13c2f68d, 0x1ec9f884, 
 809        0x3df8d2bb, 0x30f3dcb2, 0x27eecea9, 0x2ae5c0a0, 
 810        0xb13c7a47, 0xbc37744e, 0xab2a6655, 0xa621685c, 
 811        0x85104263, 0x881b4c6a, 0x9f065e71, 0x920d5078, 
 812        0xd9640a0f, 0xd46f0406, 0xc372161d, 0xce791814, 
 813        0xed48322b, 0xe0433c22, 0xf75e2e39, 0xfa552030, 
 814        0xb701ec9a, 0xba0ae293, 0xad17f088, 0xa01cfe81, 
 815        0x832dd4be, 0x8e26dab7, 0x993bc8ac, 0x9430c6a5, 
 816        0xdf599cd2, 0xd25292db, 0xc54f80c0, 0xc8448ec9, 
 817        0xeb75a4f6, 0xe67eaaff, 0xf163b8e4, 0xfc68b6ed, 
 818        0x67b10c0a, 0x6aba0203, 0x7da71018, 0x70ac1e11, 
 819        0x539d342e, 0x5e963a27, 0x498b283c, 0x44802635, 
 820        0xfe97c42, 0x2e2724b, 0x15ff6050, 0x18f46e59, 
 821        0x3bc54466, 0x36ce4a6f, 0x21d35874, 0x2cd8567d, 
 822        0xc7a37a1, 0x17139a8, 0x166c2bb3, 0x1b6725ba, 
 823        0x38560f85, 0x355d018c, 0x22401397, 0x2f4b1d9e, 
 824        0x642247e9, 0x692949e0, 0x7e345bfb, 0x733f55f2, 
 825        0x500e7fcd, 0x5d0571c4, 0x4a1863df, 0x47136dd6, 
 826        0xdccad731, 0xd1c1d938, 0xc6dccb23, 0xcbd7c52a, 
 827        0xe8e6ef15, 0xe5ede11c, 0xf2f0f307, 0xfffbfd0e, 
 828        0xb492a779, 0xb999a970, 0xae84bb6b, 0xa38fb562, 
 829        0x80be9f5d, 0x8db59154, 0x9aa8834f, 0x97a38d46) 
 830   
 831  U4 = (0x0, 0x90d0b0e, 0x121a161c, 0x1b171d12, 
 832        0x24342c38, 0x2d392736, 0x362e3a24, 0x3f23312a, 
 833        0x48685870, 0x4165537e, 0x5a724e6c, 0x537f4562, 
 834        0x6c5c7448, 0x65517f46, 0x7e466254, 0x774b695a, 
 835        0x90d0b0e0, 0x99ddbbee, 0x82caa6fc, 0x8bc7adf2, 
 836        0xb4e49cd8, 0xbde997d6, 0xa6fe8ac4, 0xaff381ca, 
 837        0xd8b8e890, 0xd1b5e39e, 0xcaa2fe8c, 0xc3aff582, 
 838        0xfc8cc4a8, 0xf581cfa6, 0xee96d2b4, 0xe79bd9ba, 
 839        0x3bbb7bdb, 0x32b670d5, 0x29a16dc7, 0x20ac66c9, 
 840        0x1f8f57e3, 0x16825ced, 0xd9541ff, 0x4984af1, 
 841        0x73d323ab, 0x7ade28a5, 0x61c935b7, 0x68c43eb9, 
 842        0x57e70f93, 0x5eea049d, 0x45fd198f, 0x4cf01281, 
 843        0xab6bcb3b, 0xa266c035, 0xb971dd27, 0xb07cd629, 
 844        0x8f5fe703, 0x8652ec0d, 0x9d45f11f, 0x9448fa11, 
 845        0xe303934b, 0xea0e9845, 0xf1198557, 0xf8148e59, 
 846        0xc737bf73, 0xce3ab47d, 0xd52da96f, 0xdc20a261, 
 847        0x766df6ad, 0x7f60fda3, 0x6477e0b1, 0x6d7aebbf, 
 848        0x5259da95, 0x5b54d19b, 0x4043cc89, 0x494ec787, 
 849        0x3e05aedd, 0x3708a5d3, 0x2c1fb8c1, 0x2512b3cf, 
 850        0x1a3182e5, 0x133c89eb, 0x82b94f9, 0x1269ff7, 
 851        0xe6bd464d, 0xefb04d43, 0xf4a75051, 0xfdaa5b5f, 
 852        0xc2896a75, 0xcb84617b, 0xd0937c69, 0xd99e7767, 
 853        0xaed51e3d, 0xa7d81533, 0xbccf0821, 0xb5c2032f, 
 854        0x8ae13205, 0x83ec390b, 0x98fb2419, 0x91f62f17, 
 855        0x4dd68d76, 0x44db8678, 0x5fcc9b6a, 0x56c19064, 
 856        0x69e2a14e, 0x60efaa40, 0x7bf8b752, 0x72f5bc5c, 
 857        0x5bed506, 0xcb3de08, 0x17a4c31a, 0x1ea9c814, 
 858        0x218af93e, 0x2887f230, 0x3390ef22, 0x3a9de42c, 
 859        0xdd063d96, 0xd40b3698, 0xcf1c2b8a, 0xc6112084, 
 860        0xf93211ae, 0xf03f1aa0, 0xeb2807b2, 0xe2250cbc, 
 861        0x956e65e6, 0x9c636ee8, 0x877473fa, 0x8e7978f4, 
 862        0xb15a49de, 0xb85742d0, 0xa3405fc2, 0xaa4d54cc, 
 863        0xecdaf741, 0xe5d7fc4f, 0xfec0e15d, 0xf7cdea53, 
 864        0xc8eedb79, 0xc1e3d077, 0xdaf4cd65, 0xd3f9c66b, 
 865        0xa4b2af31, 0xadbfa43f, 0xb6a8b92d, 0xbfa5b223, 
 866        0x80868309, 0x898b8807, 0x929c9515, 0x9b919e1b, 
 867        0x7c0a47a1, 0x75074caf, 0x6e1051bd, 0x671d5ab3, 
 868        0x583e6b99, 0x51336097, 0x4a247d85, 0x4329768b, 
 869        0x34621fd1, 0x3d6f14df, 0x267809cd, 0x2f7502c3, 
 870        0x105633e9, 0x195b38e7, 0x24c25f5, 0xb412efb, 
 871        0xd7618c9a, 0xde6c8794, 0xc57b9a86, 0xcc769188, 
 872        0xf355a0a2, 0xfa58abac, 0xe14fb6be, 0xe842bdb0, 
 873        0x9f09d4ea, 0x9604dfe4, 0x8d13c2f6, 0x841ec9f8, 
 874        0xbb3df8d2, 0xb230f3dc, 0xa927eece, 0xa02ae5c0, 
 875        0x47b13c7a, 0x4ebc3774, 0x55ab2a66, 0x5ca62168, 
 876        0x63851042, 0x6a881b4c, 0x719f065e, 0x78920d50, 
 877        0xfd9640a, 0x6d46f04, 0x1dc37216, 0x14ce7918, 
 878        0x2bed4832, 0x22e0433c, 0x39f75e2e, 0x30fa5520, 
 879        0x9ab701ec, 0x93ba0ae2, 0x88ad17f0, 0x81a01cfe, 
 880        0xbe832dd4, 0xb78e26da, 0xac993bc8, 0xa59430c6, 
 881        0xd2df599c, 0xdbd25292, 0xc0c54f80, 0xc9c8448e, 
 882        0xf6eb75a4, 0xffe67eaa, 0xe4f163b8, 0xedfc68b6, 
 883        0xa67b10c, 0x36aba02, 0x187da710, 0x1170ac1e, 
 884        0x2e539d34, 0x275e963a, 0x3c498b28, 0x35448026, 
 885        0x420fe97c, 0x4b02e272, 0x5015ff60, 0x5918f46e, 
 886        0x663bc544, 0x6f36ce4a, 0x7421d358, 0x7d2cd856, 
 887        0xa10c7a37, 0xa8017139, 0xb3166c2b, 0xba1b6725, 
 888        0x8538560f, 0x8c355d01, 0x97224013, 0x9e2f4b1d, 
 889        0xe9642247, 0xe0692949, 0xfb7e345b, 0xf2733f55, 
 890        0xcd500e7f, 0xc45d0571, 0xdf4a1863, 0xd647136d, 
 891        0x31dccad7, 0x38d1c1d9, 0x23c6dccb, 0x2acbd7c5, 
 892        0x15e8e6ef, 0x1ce5ede1, 0x7f2f0f3, 0xefffbfd, 
 893        0x79b492a7, 0x70b999a9, 0x6bae84bb, 0x62a38fb5, 
 894        0x5d80be9f, 0x548db591, 0x4f9aa883, 0x4697a38d) 
 895   
 896  rcon = (0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 
 897          0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 
 898          0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 
 899          0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91) 
 900   
901 -class rijndael:
902 - def __init__(self, key, block_size = 16):
903 if block_size != 16 and block_size != 24 and block_size != 32: 904 raise ValueError('Invalid block size: ' + str(block_size)) 905 if len(key) != 16 and len(key) != 24 and len(key) != 32: 906 raise ValueError('Invalid key size: ' + str(len(key))) 907 self.block_size = block_size 908 909 ROUNDS = num_rounds[len(key)][block_size] 910 BC = block_size // 4 911 # encryption round keys 912 Ke = [[0] * BC for i in range(ROUNDS + 1)] 913 # decryption round keys 914 Kd = [[0] * BC for i in range(ROUNDS + 1)] 915 ROUND_KEY_COUNT = (ROUNDS + 1) * BC 916 KC = len(key) // 4 917 918 # copy user material bytes into temporary ints 919 tk = [] 920 for i in range(0, KC): 921 tk.append((key[i * 4] << 24) | (key[i * 4 + 1] << 16) | 922 (key[i * 4 + 2] << 8) | key[i * 4 + 3]) 923 924 # copy values into round key arrays 925 t = 0 926 j = 0 927 while j < KC and t < ROUND_KEY_COUNT: 928 Ke[t // BC][t % BC] = tk[j] 929 Kd[ROUNDS - (t // BC)][t % BC] = tk[j] 930 j += 1 931 t += 1 932 tt = 0 933 rconpointer = 0 934 while t < ROUND_KEY_COUNT: 935 # extrapolate using phi (the round key evolution function) 936 tt = tk[KC - 1] 937 tk[0] ^= (S[(tt >> 16) & 0xFF] & 0xFF) << 24 ^ \ 938 (S[(tt >> 8) & 0xFF] & 0xFF) << 16 ^ \ 939 (S[ tt & 0xFF] & 0xFF) << 8 ^ \ 940 (S[(tt >> 24) & 0xFF] & 0xFF) ^ \ 941 (rcon[rconpointer] & 0xFF) << 24 942 rconpointer += 1 943 if KC != 8: 944 for i in range(1, KC): 945 tk[i] ^= tk[i-1] 946 else: 947 for i in range(1, KC // 2): 948 tk[i] ^= tk[i-1] 949 tt = tk[KC // 2 - 1] 950 tk[KC // 2] ^= (S[ tt & 0xFF] & 0xFF) ^ \ 951 (S[(tt >> 8) & 0xFF] & 0xFF) << 8 ^ \ 952 (S[(tt >> 16) & 0xFF] & 0xFF) << 16 ^ \ 953 (S[(tt >> 24) & 0xFF] & 0xFF) << 24 954 for i in range(KC // 2 + 1, KC): 955 tk[i] ^= tk[i-1] 956 # copy values into round key arrays 957 j = 0 958 while j < KC and t < ROUND_KEY_COUNT: 959 Ke[t // BC][t % BC] = tk[j] 960 Kd[ROUNDS - (t // BC)][t % BC] = tk[j] 961 j += 1 962 t += 1 963 # inverse MixColumn where needed 964 for r in range(1, ROUNDS): 965 for j in range(BC): 966 tt = Kd[r][j] 967 Kd[r][j] = U1[(tt >> 24) & 0xFF] ^ \ 968 U2[(tt >> 16) & 0xFF] ^ \ 969 U3[(tt >> 8) & 0xFF] ^ \ 970 U4[ tt & 0xFF] 971 self.Ke = Ke 972 self.Kd = Kd
973
974 - def encrypt(self, plaintext):
975 if len(plaintext) != self.block_size: 976 raise ValueError('wrong block length, expected {0} got {1}' 977 .format(self.block_size, len(plaintext))) 978 Ke = self.Ke 979 980 BC = self.block_size // 4 981 ROUNDS = len(Ke) - 1 982 if BC == 4: 983 SC = 0 984 elif BC == 6: 985 SC = 1 986 else: 987 SC = 2 988 s1 = shifts[SC][1][0] 989 s2 = shifts[SC][2][0] 990 s3 = shifts[SC][3][0] 991 a = [0] * BC 992 # temporary work array 993 t = [] 994 # plaintext to ints + key 995 for i in range(BC): 996 t.append((plaintext[i * 4 ] << 24 | 997 plaintext[i * 4 + 1] << 16 | 998 plaintext[i * 4 + 2] << 8 | 999 plaintext[i * 4 + 3] ) ^ Ke[0][i]) 1000 # apply round transforms 1001 for r in range(1, ROUNDS): 1002 for i in range(BC): 1003 a[i] = (T1[(t[ i ] >> 24) & 0xFF] ^ 1004 T2[(t[(i + s1) % BC] >> 16) & 0xFF] ^ 1005 T3[(t[(i + s2) % BC] >> 8) & 0xFF] ^ 1006 T4[ t[(i + s3) % BC] & 0xFF] ) ^ Ke[r][i] 1007 t = a[:] 1008 # last round is special 1009 result = [] 1010 for i in range(BC): 1011 tt = Ke[ROUNDS][i] 1012 result.append((S[(t[ i ] >> 24) & 0xFF] ^ (tt>>24)) & 0xFF) 1013 result.append((S[(t[(i+s1) % BC] >> 16) & 0xFF] ^ (tt>>16)) & 0xFF) 1014 result.append((S[(t[(i+s2) % BC] >> 8) & 0xFF] ^ (tt>> 8)) & 0xFF) 1015 result.append((S[ t[(i+s3) % BC] & 0xFF] ^ tt ) & 0xFF) 1016 return bytearray(result)
1017
1018 - def decrypt(self, ciphertext):
1019 if len(ciphertext) != self.block_size: 1020 raise ValueError('wrong block length, expected {0} got {1}' 1021 .format(self.block_size, len(plaintext))) 1022 Kd = self.Kd 1023 1024 BC = self.block_size // 4 1025 ROUNDS = len(Kd) - 1 1026 if BC == 4: 1027 SC = 0 1028 elif BC == 6: 1029 SC = 1 1030 else: 1031 SC = 2 1032 s1 = shifts[SC][1][1] 1033 s2 = shifts[SC][2][1] 1034 s3 = shifts[SC][3][1] 1035 a = [0] * BC 1036 # temporary work array 1037 t = [0] * BC 1038 # ciphertext to ints + key 1039 for i in range(BC): 1040 t[i] = (ciphertext[i * 4 ] << 24 | 1041 ciphertext[i * 4 + 1] << 16 | 1042 ciphertext[i * 4 + 2] << 8 | 1043 ciphertext[i * 4 + 3] ) ^ Kd[0][i] 1044 # apply round transforms 1045 for r in range(1, ROUNDS): 1046 for i in range(BC): 1047 a[i] = (T5[(t[ i ] >> 24) & 0xFF] ^ 1048 T6[(t[(i + s1) % BC] >> 16) & 0xFF] ^ 1049 T7[(t[(i + s2) % BC] >> 8) & 0xFF] ^ 1050 T8[ t[(i + s3) % BC] & 0xFF] ) ^ Kd[r][i] 1051 t = a[:] 1052 # last round is special 1053 result = [] 1054 for i in range(BC): 1055 tt = Kd[ROUNDS][i] 1056 result.append((Si[(t[ i ] >> 24) & 0xFF] ^ (tt>>24)) &0xFF) 1057 result.append((Si[(t[(i+s1) % BC] >> 16) & 0xFF] ^ (tt>>16)) &0xFF) 1058 result.append((Si[(t[(i+s2) % BC] >> 8) & 0xFF] ^ (tt>> 8)) &0xFF) 1059 result.append((Si[ t[(i+s3) % BC] & 0xFF] ^ tt ) &0xFF) 1060 return bytearray(result)
1061
1062 -def encrypt(key, block):
1063 return rijndael(key, len(block)).encrypt(block)
1064
1065 -def decrypt(key, block):
1066 return rijndael(key, len(block)).decrypt(block)
1067
1068 -def test():
1069 def t(kl, bl): 1070 b = 'b' * bl 1071 r = rijndael('a' * kl, bl) 1072 assert r.decrypt(r.encrypt(b)) == b
1073 t(16, 16) 1074 t(16, 24) 1075 t(16, 32) 1076 t(24, 16) 1077 t(24, 24) 1078 t(24, 32) 1079 t(32, 16) 1080 t(32, 24) 1081 t(32, 32) 1082