root/maint/gnulib/lib/rijndael-alg-fst.c

/* [previous][next][first][last][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. rijndaelKeySetupEnc
  2. rijndaelKeySetupDec
  3. rijndaelEncrypt
  4. rijndaelDecrypt

   1 /* rijndael-alg-fst.c --- Rijndael cipher implementation.
   2  * Copyright (C) 2005-2006, 2009-2021 Free Software Foundation, Inc.
   3  *
   4  * This file is free software: you can redistribute it and/or modify
   5  * it under the terms of the GNU Lesser General Public License as
   6  * published by the Free Software Foundation; either version 2.1 of the
   7  * License, or (at your option) any later version.
   8  *
   9  * This file is distributed in the hope that it will be useful,
  10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12  * GNU Lesser General Public License for more details.
  13  *
  14  * You should have received a copy of the GNU Lesser General Public License
  15  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  16  *
  17  */
  18 
  19 /* Adapted for gnulib by Simon Josefsson.
  20  *
  21  * Based on public domain "Optimised C code" retrieved from (SHA1
  22  * 7c8e4b00d06685d1dbc6724a9e0d502353de339e):
  23  * https://web.archive.org/web/20060618010435/http://www.iaik.tu-graz.ac.at/research/krypto/AES/old/~rijmen/rijndael/rijndael-fst-3.0.zip
  24  */
  25 
  26 #include <config.h>
  27 
  28 /**
  29  * rijndael-alg-fst.c
  30  *
  31  * @version 3.0 (December 2000)
  32  *
  33  * Optimised ANSI C code for the Rijndael cipher (now AES)
  34  *
  35  * @author Vincent Rijmen <vincent.rijmen@esat.kuleuven.ac.be>
  36  * @author Antoon Bosselaers <antoon.bosselaers@esat.kuleuven.ac.be>
  37  * @author Paulo Barreto <paulo.barreto@terra.com.br>
  38  *
  39  * This code is hereby placed in the public domain.
  40  *
  41  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS
  42  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  43  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  44  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE
  45  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  46  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  47  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
  48  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  49  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
  50  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  51  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  52  */
  53 
  54 #include "rijndael-alg-fst.h"
  55 
  56 /*
  57 Te0[x] = S [x].[02, 01, 01, 03];
  58 Te1[x] = S [x].[03, 02, 01, 01];
  59 Te2[x] = S [x].[01, 03, 02, 01];
  60 Te3[x] = S [x].[01, 01, 03, 02];
  61 Te4[x] = S [x].[01, 01, 01, 01];
  62 
  63 Td0[x] = Si[x].[0e, 09, 0d, 0b];
  64 Td1[x] = Si[x].[0b, 0e, 09, 0d];
  65 Td2[x] = Si[x].[0d, 0b, 0e, 09];
  66 Td3[x] = Si[x].[09, 0d, 0b, 0e];
  67 Td4[x] = Si[x].[01, 01, 01, 01];
  68 */
  69 
  70 static const uint32_t Te0[256] = {
  71   0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d,
  72   0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554,
  73   0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d,
  74   0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a,
  75   0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87,
  76   0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b,
  77   0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea,
  78   0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b,
  79   0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a,
  80   0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f,
  81   0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108,
  82   0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f,
  83   0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e,
  84   0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5,
  85   0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d,
  86   0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f,
  87   0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e,
  88   0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb,
  89   0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce,
  90   0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497,
  91   0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c,
  92   0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed,
  93   0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b,
  94   0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a,
  95   0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16,
  96   0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594,
  97   0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81,
  98   0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3,
  99   0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a,
 100   0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504,
 101   0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163,
 102   0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d,
 103   0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f,
 104   0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739,
 105   0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47,
 106   0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395,
 107   0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f,
 108   0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883,
 109   0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c,
 110   0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76,
 111   0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e,
 112   0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4,
 113   0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6,
 114   0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b,
 115   0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7,
 116   0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0,
 117   0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25,
 118   0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818,
 119   0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72,
 120   0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651,
 121   0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21,
 122   0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85,
 123   0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa,
 124   0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12,
 125   0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0,
 126   0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9,
 127   0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133,
 128   0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7,
 129   0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920,
 130   0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a,
 131   0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17,
 132   0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8,
 133   0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11,
 134   0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a,
 135 };
 136 static const uint32_t Te1[256] = {
 137   0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b,
 138   0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5,
 139   0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b,
 140   0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676,
 141   0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d,
 142   0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0,
 143   0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf,
 144   0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0,
 145   0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626,
 146   0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc,
 147   0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1,
 148   0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515,
 149   0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3,
 150   0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a,
 151   0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2,
 152   0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575,
 153   0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a,
 154   0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0,
 155   0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3,
 156   0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484,
 157   0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded,
 158   0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b,
 159   0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939,
 160   0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf,
 161   0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb,
 162   0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585,
 163   0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f,
 164   0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8,
 165   0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f,
 166   0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5,
 167   0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121,
 168   0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2,
 169   0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec,
 170   0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717,
 171   0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d,
 172   0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373,
 173   0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc,
 174   0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888,
 175   0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414,
 176   0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb,
 177   0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a,
 178   0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c,
 179   0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262,
 180   0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979,
 181   0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d,
 182   0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9,
 183   0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea,
 184   0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808,
 185   0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e,
 186   0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6,
 187   0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f,
 188   0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a,
 189   0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666,
 190   0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e,
 191   0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9,
 192   0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e,
 193   0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111,
 194   0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494,
 195   0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9,
 196   0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf,
 197   0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d,
 198   0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868,
 199   0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f,
 200   0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616,
 201 };
 202 static const uint32_t Te2[256] = {
 203   0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b,
 204   0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5,
 205   0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b,
 206   0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76,
 207   0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d,
 208   0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0,
 209   0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af,
 210   0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0,
 211   0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26,
 212   0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc,
 213   0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1,
 214   0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15,
 215   0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3,
 216   0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a,
 217   0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2,
 218   0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75,
 219   0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a,
 220   0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0,
 221   0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3,
 222   0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384,
 223   0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed,
 224   0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b,
 225   0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239,
 226   0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf,
 227   0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb,
 228   0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185,
 229   0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f,
 230   0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8,
 231   0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f,
 232   0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5,
 233   0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221,
 234   0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2,
 235   0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec,
 236   0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17,
 237   0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d,
 238   0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673,
 239   0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc,
 240   0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88,
 241   0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814,
 242   0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb,
 243   0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a,
 244   0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c,
 245   0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462,
 246   0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279,
 247   0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d,
 248   0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9,
 249   0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea,
 250   0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008,
 251   0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e,
 252   0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6,
 253   0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f,
 254   0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a,
 255   0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66,
 256   0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e,
 257   0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9,
 258   0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e,
 259   0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211,
 260   0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394,
 261   0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9,
 262   0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df,
 263   0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d,
 264   0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068,
 265   0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f,
 266   0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16,
 267 };
 268 static const uint32_t Te3[256] = {
 269   0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6,
 270   0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491,
 271   0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56,
 272   0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec,
 273   0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa,
 274   0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb,
 275   0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45,
 276   0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b,
 277   0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c,
 278   0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83,
 279   0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9,
 280   0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a,
 281   0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d,
 282   0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f,
 283   0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf,
 284   0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea,
 285   0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34,
 286   0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b,
 287   0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d,
 288   0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713,
 289   0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1,
 290   0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6,
 291   0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72,
 292   0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85,
 293   0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed,
 294   0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411,
 295   0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe,
 296   0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b,
 297   0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05,
 298   0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1,
 299   0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342,
 300   0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf,
 301   0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3,
 302   0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e,
 303   0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a,
 304   0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6,
 305   0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3,
 306   0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b,
 307   0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28,
 308   0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad,
 309   0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14,
 310   0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8,
 311   0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4,
 312   0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2,
 313   0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da,
 314   0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049,
 315   0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf,
 316   0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810,
 317   0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c,
 318   0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197,
 319   0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e,
 320   0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f,
 321   0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc,
 322   0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c,
 323   0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069,
 324   0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927,
 325   0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322,
 326   0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733,
 327   0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9,
 328   0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5,
 329   0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a,
 330   0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0,
 331   0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e,
 332   0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c,
 333 };
 334 static const uint32_t Te4[256] = {
 335   0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b,
 336   0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5,
 337   0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b,
 338   0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676,
 339   0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d,
 340   0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0,
 341   0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf,
 342   0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0,
 343   0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626,
 344   0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc,
 345   0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1,
 346   0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515,
 347   0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3,
 348   0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a,
 349   0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2,
 350   0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575,
 351   0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a,
 352   0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0,
 353   0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3,
 354   0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484,
 355   0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed,
 356   0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b,
 357   0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939,
 358   0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf,
 359   0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb,
 360   0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585,
 361   0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f,
 362   0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8,
 363   0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f,
 364   0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5,
 365   0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121,
 366   0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2,
 367   0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec,
 368   0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717,
 369   0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d,
 370   0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373,
 371   0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc,
 372   0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888,
 373   0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414,
 374   0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb,
 375   0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a,
 376   0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c,
 377   0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262,
 378   0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979,
 379   0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d,
 380   0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9,
 381   0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea,
 382   0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808,
 383   0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e,
 384   0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6,
 385   0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f,
 386   0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a,
 387   0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666,
 388   0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e,
 389   0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9,
 390   0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e,
 391   0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111,
 392   0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494,
 393   0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9,
 394   0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf,
 395   0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d,
 396   0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868,
 397   0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f,
 398   0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616,
 399 };
 400 static const uint32_t Td0[256] = {
 401   0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96,
 402   0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393,
 403   0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25,
 404   0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f,
 405   0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1,
 406   0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6,
 407   0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da,
 408   0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844,
 409   0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd,
 410   0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4,
 411   0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45,
 412   0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94,
 413   0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7,
 414   0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a,
 415   0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5,
 416   0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c,
 417   0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1,
 418   0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a,
 419   0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75,
 420   0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051,
 421   0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46,
 422   0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff,
 423   0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77,
 424   0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb,
 425   0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000,
 426   0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e,
 427   0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927,
 428   0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a,
 429   0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e,
 430   0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16,
 431   0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d,
 432   0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8,
 433   0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd,
 434   0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34,
 435   0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163,
 436   0xd731dcca, 0x42638510, 0x13972240, 0x84c61120,
 437   0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d,
 438   0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0,
 439   0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422,
 440   0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef,
 441   0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36,
 442   0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4,
 443   0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662,
 444   0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5,
 445   0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3,
 446   0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b,
 447   0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8,
 448   0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6,
 449   0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6,
 450   0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0,
 451   0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815,
 452   0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f,
 453   0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df,
 454   0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f,
 455   0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e,
 456   0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713,
 457   0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89,
 458   0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c,
 459   0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf,
 460   0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86,
 461   0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f,
 462   0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541,
 463   0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190,
 464   0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742,
 465 };
 466 static const uint32_t Td1[256] = {
 467   0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e,
 468   0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303,
 469   0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c,
 470   0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3,
 471   0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0,
 472   0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9,
 473   0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259,
 474   0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8,
 475   0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971,
 476   0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a,
 477   0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f,
 478   0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b,
 479   0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8,
 480   0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab,
 481   0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708,
 482   0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682,
 483   0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2,
 484   0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe,
 485   0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb,
 486   0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10,
 487   0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd,
 488   0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015,
 489   0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e,
 490   0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee,
 491   0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000,
 492   0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72,
 493   0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39,
 494   0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e,
 495   0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91,
 496   0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a,
 497   0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17,
 498   0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9,
 499   0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60,
 500   0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e,
 501   0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1,
 502   0xcad731dc, 0x10426385, 0x40139722, 0x2084c611,
 503   0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1,
 504   0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3,
 505   0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964,
 506   0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390,
 507   0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b,
 508   0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf,
 509   0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46,
 510   0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af,
 511   0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512,
 512   0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb,
 513   0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a,
 514   0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8,
 515   0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c,
 516   0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266,
 517   0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8,
 518   0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6,
 519   0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604,
 520   0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551,
 521   0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41,
 522   0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647,
 523   0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c,
 524   0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1,
 525   0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737,
 526   0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db,
 527   0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340,
 528   0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95,
 529   0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1,
 530   0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857,
 531 };
 532 static const uint32_t Td2[256] = {
 533   0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27,
 534   0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3,
 535   0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502,
 536   0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562,
 537   0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe,
 538   0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3,
 539   0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552,
 540   0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9,
 541   0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9,
 542   0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce,
 543   0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253,
 544   0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908,
 545   0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b,
 546   0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655,
 547   0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337,
 548   0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16,
 549   0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69,
 550   0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6,
 551   0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6,
 552   0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e,
 553   0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6,
 554   0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050,
 555   0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9,
 556   0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8,
 557   0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000,
 558   0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a,
 559   0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d,
 560   0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436,
 561   0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b,
 562   0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12,
 563   0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b,
 564   0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e,
 565   0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f,
 566   0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb,
 567   0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4,
 568   0xdccad731, 0x85104263, 0x22401397, 0x112084c6,
 569   0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729,
 570   0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1,
 571   0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9,
 572   0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233,
 573   0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4,
 574   0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad,
 575   0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e,
 576   0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3,
 577   0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25,
 578   0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b,
 579   0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f,
 580   0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15,
 581   0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0,
 582   0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2,
 583   0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7,
 584   0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791,
 585   0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496,
 586   0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665,
 587   0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b,
 588   0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6,
 589   0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13,
 590   0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47,
 591   0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7,
 592   0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844,
 593   0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3,
 594   0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d,
 595   0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456,
 596   0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8,
 597 };
 598 static const uint32_t Td3[256] = {
 599   0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a,
 600   0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b,
 601   0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5,
 602   0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5,
 603   0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d,
 604   0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b,
 605   0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95,
 606   0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e,
 607   0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27,
 608   0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d,
 609   0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562,
 610   0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9,
 611   0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752,
 612   0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66,
 613   0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3,
 614   0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced,
 615   0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e,
 616   0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4,
 617   0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4,
 618   0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd,
 619   0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d,
 620   0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60,
 621   0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767,
 622   0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79,
 623   0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000,
 624   0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c,
 625   0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736,
 626   0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24,
 627   0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b,
 628   0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c,
 629   0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12,
 630   0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814,
 631   0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3,
 632   0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b,
 633   0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8,
 634   0x31dccad7, 0x63851042, 0x97224013, 0xc6112084,
 635   0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7,
 636   0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077,
 637   0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247,
 638   0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22,
 639   0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698,
 640   0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f,
 641   0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254,
 642   0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582,
 643   0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf,
 644   0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb,
 645   0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883,
 646   0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef,
 647   0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629,
 648   0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035,
 649   0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533,
 650   0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17,
 651   0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4,
 652   0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46,
 653   0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb,
 654   0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d,
 655   0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb,
 656   0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a,
 657   0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73,
 658   0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678,
 659   0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2,
 660   0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff,
 661   0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064,
 662   0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0,
 663 };
 664 static const uint32_t Td4[256] = {
 665   0x52525252, 0x09090909, 0x6a6a6a6a, 0xd5d5d5d5,
 666   0x30303030, 0x36363636, 0xa5a5a5a5, 0x38383838,
 667   0xbfbfbfbf, 0x40404040, 0xa3a3a3a3, 0x9e9e9e9e,
 668   0x81818181, 0xf3f3f3f3, 0xd7d7d7d7, 0xfbfbfbfb,
 669   0x7c7c7c7c, 0xe3e3e3e3, 0x39393939, 0x82828282,
 670   0x9b9b9b9b, 0x2f2f2f2f, 0xffffffff, 0x87878787,
 671   0x34343434, 0x8e8e8e8e, 0x43434343, 0x44444444,
 672   0xc4c4c4c4, 0xdededede, 0xe9e9e9e9, 0xcbcbcbcb,
 673   0x54545454, 0x7b7b7b7b, 0x94949494, 0x32323232,
 674   0xa6a6a6a6, 0xc2c2c2c2, 0x23232323, 0x3d3d3d3d,
 675   0xeeeeeeee, 0x4c4c4c4c, 0x95959595, 0x0b0b0b0b,
 676   0x42424242, 0xfafafafa, 0xc3c3c3c3, 0x4e4e4e4e,
 677   0x08080808, 0x2e2e2e2e, 0xa1a1a1a1, 0x66666666,
 678   0x28282828, 0xd9d9d9d9, 0x24242424, 0xb2b2b2b2,
 679   0x76767676, 0x5b5b5b5b, 0xa2a2a2a2, 0x49494949,
 680   0x6d6d6d6d, 0x8b8b8b8b, 0xd1d1d1d1, 0x25252525,
 681   0x72727272, 0xf8f8f8f8, 0xf6f6f6f6, 0x64646464,
 682   0x86868686, 0x68686868, 0x98989898, 0x16161616,
 683   0xd4d4d4d4, 0xa4a4a4a4, 0x5c5c5c5c, 0xcccccccc,
 684   0x5d5d5d5d, 0x65656565, 0xb6b6b6b6, 0x92929292,
 685   0x6c6c6c6c, 0x70707070, 0x48484848, 0x50505050,
 686   0xfdfdfdfd, 0xedededed, 0xb9b9b9b9, 0xdadadada,
 687   0x5e5e5e5e, 0x15151515, 0x46464646, 0x57575757,
 688   0xa7a7a7a7, 0x8d8d8d8d, 0x9d9d9d9d, 0x84848484,
 689   0x90909090, 0xd8d8d8d8, 0xabababab, 0x00000000,
 690   0x8c8c8c8c, 0xbcbcbcbc, 0xd3d3d3d3, 0x0a0a0a0a,
 691   0xf7f7f7f7, 0xe4e4e4e4, 0x58585858, 0x05050505,
 692   0xb8b8b8b8, 0xb3b3b3b3, 0x45454545, 0x06060606,
 693   0xd0d0d0d0, 0x2c2c2c2c, 0x1e1e1e1e, 0x8f8f8f8f,
 694   0xcacacaca, 0x3f3f3f3f, 0x0f0f0f0f, 0x02020202,
 695   0xc1c1c1c1, 0xafafafaf, 0xbdbdbdbd, 0x03030303,
 696   0x01010101, 0x13131313, 0x8a8a8a8a, 0x6b6b6b6b,
 697   0x3a3a3a3a, 0x91919191, 0x11111111, 0x41414141,
 698   0x4f4f4f4f, 0x67676767, 0xdcdcdcdc, 0xeaeaeaea,
 699   0x97979797, 0xf2f2f2f2, 0xcfcfcfcf, 0xcececece,
 700   0xf0f0f0f0, 0xb4b4b4b4, 0xe6e6e6e6, 0x73737373,
 701   0x96969696, 0xacacacac, 0x74747474, 0x22222222,
 702   0xe7e7e7e7, 0xadadadad, 0x35353535, 0x85858585,
 703   0xe2e2e2e2, 0xf9f9f9f9, 0x37373737, 0xe8e8e8e8,
 704   0x1c1c1c1c, 0x75757575, 0xdfdfdfdf, 0x6e6e6e6e,
 705   0x47474747, 0xf1f1f1f1, 0x1a1a1a1a, 0x71717171,
 706   0x1d1d1d1d, 0x29292929, 0xc5c5c5c5, 0x89898989,
 707   0x6f6f6f6f, 0xb7b7b7b7, 0x62626262, 0x0e0e0e0e,
 708   0xaaaaaaaa, 0x18181818, 0xbebebebe, 0x1b1b1b1b,
 709   0xfcfcfcfc, 0x56565656, 0x3e3e3e3e, 0x4b4b4b4b,
 710   0xc6c6c6c6, 0xd2d2d2d2, 0x79797979, 0x20202020,
 711   0x9a9a9a9a, 0xdbdbdbdb, 0xc0c0c0c0, 0xfefefefe,
 712   0x78787878, 0xcdcdcdcd, 0x5a5a5a5a, 0xf4f4f4f4,
 713   0x1f1f1f1f, 0xdddddddd, 0xa8a8a8a8, 0x33333333,
 714   0x88888888, 0x07070707, 0xc7c7c7c7, 0x31313131,
 715   0xb1b1b1b1, 0x12121212, 0x10101010, 0x59595959,
 716   0x27272727, 0x80808080, 0xecececec, 0x5f5f5f5f,
 717   0x60606060, 0x51515151, 0x7f7f7f7f, 0xa9a9a9a9,
 718   0x19191919, 0xb5b5b5b5, 0x4a4a4a4a, 0x0d0d0d0d,
 719   0x2d2d2d2d, 0xe5e5e5e5, 0x7a7a7a7a, 0x9f9f9f9f,
 720   0x93939393, 0xc9c9c9c9, 0x9c9c9c9c, 0xefefefef,
 721   0xa0a0a0a0, 0xe0e0e0e0, 0x3b3b3b3b, 0x4d4d4d4d,
 722   0xaeaeaeae, 0x2a2a2a2a, 0xf5f5f5f5, 0xb0b0b0b0,
 723   0xc8c8c8c8, 0xebebebeb, 0xbbbbbbbb, 0x3c3c3c3c,
 724   0x83838383, 0x53535353, 0x99999999, 0x61616161,
 725   0x17171717, 0x2b2b2b2b, 0x04040404, 0x7e7e7e7e,
 726   0xbabababa, 0x77777777, 0xd6d6d6d6, 0x26262626,
 727   0xe1e1e1e1, 0x69696969, 0x14141414, 0x63636363,
 728   0x55555555, 0x21212121, 0x0c0c0c0c, 0x7d7d7d7d,
 729 };
 730 static const uint32_t rcon[] = {
 731   0x01000000, 0x02000000, 0x04000000, 0x08000000,
 732   0x10000000, 0x20000000, 0x40000000, 0x80000000,
 733   0x1B000000, 0x36000000
 734     /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */
 735 };
 736 
 737 #define GETU32(pt) (((uint32_t)((pt)[0] & 0xFF) << 24) ^ \
 738                     ((uint32_t)((pt)[1] & 0xFF) << 16) ^ \
 739                     ((uint32_t)((pt)[2] & 0xFF) <<  8) ^ \
 740                     ((uint32_t)((pt)[3] & 0xFF)))
 741 #define PUTU32(ct, st) {                                        \
 742     (ct)[0] = (char)((st) >> 24);                               \
 743     (ct)[1] = (char)((st) >> 16);                               \
 744     (ct)[2] = (char)((st) >>  8);                               \
 745     (ct)[3] = (char)(st); }
 746 
 747 /**
 748  * Expand the cipher key into the encryption key schedule.
 749  *
 750  * @return      the number of rounds for the given cipher key size.
 751  */
 752 int
 753 rijndaelKeySetupEnc (uint32_t rk[ /*4*(Nr + 1) */ ],
     /* [previous][next][first][last][top][bottom][index][help] */
 754                      const char cipherKey[], size_t keyBits)
 755 {
 756   size_t i = 0;
 757   uint32_t temp;
 758 
 759   rk[0] = GETU32 (cipherKey);
 760   rk[1] = GETU32 (cipherKey + 4);
 761   rk[2] = GETU32 (cipherKey + 8);
 762   rk[3] = GETU32 (cipherKey + 12);
 763   if (keyBits == 128)
 764     {
 765       for (;;)
 766         {
 767           temp = rk[3];
 768           rk[4] = rk[0] ^
 769             (Te4[(temp >> 16) & 0xff] & 0xff000000) ^
 770             (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^
 771             (Te4[(temp) & 0xff] & 0x0000ff00) ^
 772             (Te4[(temp >> 24)] & 0x000000ff) ^ rcon[i];
 773           rk[5] = rk[1] ^ rk[4];
 774           rk[6] = rk[2] ^ rk[5];
 775           rk[7] = rk[3] ^ rk[6];
 776           if (++i == 10)
 777             {
 778               return 10;
 779             }
 780           rk += 4;
 781         }
 782     }
 783   rk[4] = GETU32 (cipherKey + 16);
 784   rk[5] = GETU32 (cipherKey + 20);
 785   if (keyBits == 192)
 786     {
 787       for (;;)
 788         {
 789           temp = rk[5];
 790           rk[6] = rk[0] ^
 791             (Te4[(temp >> 16) & 0xff] & 0xff000000) ^
 792             (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^
 793             (Te4[(temp) & 0xff] & 0x0000ff00) ^
 794             (Te4[(temp >> 24)] & 0x000000ff) ^ rcon[i];
 795           rk[7] = rk[1] ^ rk[6];
 796           rk[8] = rk[2] ^ rk[7];
 797           rk[9] = rk[3] ^ rk[8];
 798           if (++i == 8)
 799             {
 800               return 12;
 801             }
 802           rk[10] = rk[4] ^ rk[9];
 803           rk[11] = rk[5] ^ rk[10];
 804           rk += 6;
 805         }
 806     }
 807   rk[6] = GETU32 (cipherKey + 24);
 808   rk[7] = GETU32 (cipherKey + 28);
 809   if (keyBits == 256)
 810     {
 811       for (;;)
 812         {
 813           temp = rk[7];
 814           rk[8] = rk[0] ^
 815             (Te4[(temp >> 16) & 0xff] & 0xff000000) ^
 816             (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^
 817             (Te4[(temp) & 0xff] & 0x0000ff00) ^
 818             (Te4[(temp >> 24)] & 0x000000ff) ^ rcon[i];
 819           rk[9] = rk[1] ^ rk[8];
 820           rk[10] = rk[2] ^ rk[9];
 821           rk[11] = rk[3] ^ rk[10];
 822           if (++i == 7)
 823             {
 824               return 14;
 825             }
 826           temp = rk[11];
 827           rk[12] = rk[4] ^
 828             (Te4[(temp >> 24)] & 0xff000000) ^
 829             (Te4[(temp >> 16) & 0xff] & 0x00ff0000) ^
 830             (Te4[(temp >> 8) & 0xff] & 0x0000ff00) ^
 831             (Te4[(temp) & 0xff] & 0x000000ff);
 832           rk[13] = rk[5] ^ rk[12];
 833           rk[14] = rk[6] ^ rk[13];
 834           rk[15] = rk[7] ^ rk[14];
 835 
 836           rk += 8;
 837         }
 838     }
 839   return 0;
 840 }
 841 
 842 /**
 843  * Expand the cipher key into the decryption key schedule.
 844  *
 845  * @return      the number of rounds for the given cipher key size.
 846  */
 847 int
 848 rijndaelKeySetupDec (uint32_t rk[ /*4*(Nr + 1) */ ],
     /* [previous][next][first][last][top][bottom][index][help] */
 849                      const char cipherKey[], size_t keyBits)
 850 {
 851   size_t Nr, i, j;
 852   uint32_t temp;
 853 
 854   /* expand the cipher key: */
 855   Nr = rijndaelKeySetupEnc (rk, cipherKey, keyBits);
 856   /* invert the order of the round keys: */
 857   for (i = 0, j = 4 * Nr; i < j; i += 4, j -= 4)
 858     {
 859       temp = rk[i];
 860       rk[i] = rk[j];
 861       rk[j] = temp;
 862       temp = rk[i + 1];
 863       rk[i + 1] = rk[j + 1];
 864       rk[j + 1] = temp;
 865       temp = rk[i + 2];
 866       rk[i + 2] = rk[j + 2];
 867       rk[j + 2] = temp;
 868       temp = rk[i + 3];
 869       rk[i + 3] = rk[j + 3];
 870       rk[j + 3] = temp;
 871     }
 872   /* apply the inverse MixColumn transform to all round keys but the
 873      first and the last: */
 874   for (i = 1; i < Nr; i++)
 875     {
 876       rk += 4;
 877       rk[0] =
 878         Td0[Te4[(rk[0] >> 24)] & 0xff] ^
 879         Td1[Te4[(rk[0] >> 16) & 0xff] & 0xff] ^
 880         Td2[Te4[(rk[0] >> 8) & 0xff] & 0xff] ^
 881         Td3[Te4[(rk[0]) & 0xff] & 0xff];
 882       rk[1] =
 883         Td0[Te4[(rk[1] >> 24)] & 0xff] ^
 884         Td1[Te4[(rk[1] >> 16) & 0xff] & 0xff] ^
 885         Td2[Te4[(rk[1] >> 8) & 0xff] & 0xff] ^
 886         Td3[Te4[(rk[1]) & 0xff] & 0xff];
 887       rk[2] =
 888         Td0[Te4[(rk[2] >> 24)] & 0xff] ^
 889         Td1[Te4[(rk[2] >> 16) & 0xff] & 0xff] ^
 890         Td2[Te4[(rk[2] >> 8) & 0xff] & 0xff] ^
 891         Td3[Te4[(rk[2]) & 0xff] & 0xff];
 892       rk[3] =
 893         Td0[Te4[(rk[3] >> 24)] & 0xff] ^
 894         Td1[Te4[(rk[3] >> 16) & 0xff] & 0xff] ^
 895         Td2[Te4[(rk[3] >> 8) & 0xff] & 0xff] ^
 896         Td3[Te4[(rk[3]) & 0xff] & 0xff];
 897     }
 898   return Nr;
 899 }
 900 
 901 void
 902 rijndaelEncrypt (const uint32_t rk[ /*4*(Nr + 1) */ ], size_t Nr,
     /* [previous][next][first][last][top][bottom][index][help] */
 903                  const char pt[16], char ct[16])
 904 {
 905   uint32_t s0, s1, s2, s3, t0, t1, t2, t3;
 906   size_t r;
 907 
 908   /*
 909    * map byte array block to cipher state
 910    * and add initial round key:
 911    */
 912   s0 = GETU32 (pt) ^ rk[0];
 913   s1 = GETU32 (pt + 4) ^ rk[1];
 914   s2 = GETU32 (pt + 8) ^ rk[2];
 915   s3 = GETU32 (pt + 12) ^ rk[3];
 916   /*
 917    * Nr - 1 full rounds:
 918    */
 919   r = Nr >> 1;
 920   for (;;)
 921     {
 922       t0 =
 923         Te0[(s0 >> 24)] ^
 924         Te1[(s1 >> 16) & 0xff] ^
 925         Te2[(s2 >> 8) & 0xff] ^ Te3[(s3) & 0xff] ^ rk[4];
 926       t1 =
 927         Te0[(s1 >> 24)] ^
 928         Te1[(s2 >> 16) & 0xff] ^
 929         Te2[(s3 >> 8) & 0xff] ^ Te3[(s0) & 0xff] ^ rk[5];
 930       t2 =
 931         Te0[(s2 >> 24)] ^
 932         Te1[(s3 >> 16) & 0xff] ^
 933         Te2[(s0 >> 8) & 0xff] ^ Te3[(s1) & 0xff] ^ rk[6];
 934       t3 =
 935         Te0[(s3 >> 24)] ^
 936         Te1[(s0 >> 16) & 0xff] ^
 937         Te2[(s1 >> 8) & 0xff] ^ Te3[(s2) & 0xff] ^ rk[7];
 938 
 939       rk += 8;
 940       if (--r == 0)
 941         {
 942           break;
 943         }
 944 
 945       s0 =
 946         Te0[(t0 >> 24)] ^
 947         Te1[(t1 >> 16) & 0xff] ^
 948         Te2[(t2 >> 8) & 0xff] ^ Te3[(t3) & 0xff] ^ rk[0];
 949       s1 =
 950         Te0[(t1 >> 24)] ^
 951         Te1[(t2 >> 16) & 0xff] ^
 952         Te2[(t3 >> 8) & 0xff] ^ Te3[(t0) & 0xff] ^ rk[1];
 953       s2 =
 954         Te0[(t2 >> 24)] ^
 955         Te1[(t3 >> 16) & 0xff] ^
 956         Te2[(t0 >> 8) & 0xff] ^ Te3[(t1) & 0xff] ^ rk[2];
 957       s3 =
 958         Te0[(t3 >> 24)] ^
 959         Te1[(t0 >> 16) & 0xff] ^
 960         Te2[(t1 >> 8) & 0xff] ^ Te3[(t2) & 0xff] ^ rk[3];
 961     }
 962   /*
 963    * apply last round and
 964    * map cipher state to byte array block:
 965    */
 966   s0 =
 967     (Te4[(t0 >> 24)] & 0xff000000) ^
 968     (Te4[(t1 >> 16) & 0xff] & 0x00ff0000) ^
 969     (Te4[(t2 >> 8) & 0xff] & 0x0000ff00) ^
 970     (Te4[(t3) & 0xff] & 0x000000ff) ^ rk[0];
 971   PUTU32 (ct, s0);
 972   s1 =
 973     (Te4[(t1 >> 24)] & 0xff000000) ^
 974     (Te4[(t2 >> 16) & 0xff] & 0x00ff0000) ^
 975     (Te4[(t3 >> 8) & 0xff] & 0x0000ff00) ^
 976     (Te4[(t0) & 0xff] & 0x000000ff) ^ rk[1];
 977   PUTU32 (ct + 4, s1);
 978   s2 =
 979     (Te4[(t2 >> 24)] & 0xff000000) ^
 980     (Te4[(t3 >> 16) & 0xff] & 0x00ff0000) ^
 981     (Te4[(t0 >> 8) & 0xff] & 0x0000ff00) ^
 982     (Te4[(t1) & 0xff] & 0x000000ff) ^ rk[2];
 983   PUTU32 (ct + 8, s2);
 984   s3 =
 985     (Te4[(t3 >> 24)] & 0xff000000) ^
 986     (Te4[(t0 >> 16) & 0xff] & 0x00ff0000) ^
 987     (Te4[(t1 >> 8) & 0xff] & 0x0000ff00) ^
 988     (Te4[(t2) & 0xff] & 0x000000ff) ^ rk[3];
 989   PUTU32 (ct + 12, s3);
 990 }
 991 
 992 void
 993 rijndaelDecrypt (const uint32_t rk[ /*4*(Nr + 1) */ ], size_t Nr,
     /* [previous][next][first][last][top][bottom][index][help] */
 994                  const char ct[16], char pt[16])
 995 {
 996   uint32_t s0, s1, s2, s3, t0, t1, t2, t3;
 997   size_t r;
 998 
 999   /*
1000    * map byte array block to cipher state
1001    * and add initial round key:
1002    */
1003   s0 = GETU32 (ct) ^ rk[0];
1004   s1 = GETU32 (ct + 4) ^ rk[1];
1005   s2 = GETU32 (ct + 8) ^ rk[2];
1006   s3 = GETU32 (ct + 12) ^ rk[3];
1007   /*
1008    * Nr - 1 full rounds:
1009    */
1010   r = Nr >> 1;
1011   for (;;)
1012     {
1013       t0 =
1014         Td0[(s0 >> 24)] ^
1015         Td1[(s3 >> 16) & 0xff] ^
1016         Td2[(s2 >> 8) & 0xff] ^ Td3[(s1) & 0xff] ^ rk[4];
1017       t1 =
1018         Td0[(s1 >> 24)] ^
1019         Td1[(s0 >> 16) & 0xff] ^
1020         Td2[(s3 >> 8) & 0xff] ^ Td3[(s2) & 0xff] ^ rk[5];
1021       t2 =
1022         Td0[(s2 >> 24)] ^
1023         Td1[(s1 >> 16) & 0xff] ^
1024         Td2[(s0 >> 8) & 0xff] ^ Td3[(s3) & 0xff] ^ rk[6];
1025       t3 =
1026         Td0[(s3 >> 24)] ^
1027         Td1[(s2 >> 16) & 0xff] ^
1028         Td2[(s1 >> 8) & 0xff] ^ Td3[(s0) & 0xff] ^ rk[7];
1029 
1030       rk += 8;
1031       if (--r == 0)
1032         {
1033           break;
1034         }
1035 
1036       s0 =
1037         Td0[(t0 >> 24)] ^
1038         Td1[(t3 >> 16) & 0xff] ^
1039         Td2[(t2 >> 8) & 0xff] ^ Td3[(t1) & 0xff] ^ rk[0];
1040       s1 =
1041         Td0[(t1 >> 24)] ^
1042         Td1[(t0 >> 16) & 0xff] ^
1043         Td2[(t3 >> 8) & 0xff] ^ Td3[(t2) & 0xff] ^ rk[1];
1044       s2 =
1045         Td0[(t2 >> 24)] ^
1046         Td1[(t1 >> 16) & 0xff] ^
1047         Td2[(t0 >> 8) & 0xff] ^ Td3[(t3) & 0xff] ^ rk[2];
1048       s3 =
1049         Td0[(t3 >> 24)] ^
1050         Td1[(t2 >> 16) & 0xff] ^
1051         Td2[(t1 >> 8) & 0xff] ^ Td3[(t0) & 0xff] ^ rk[3];
1052     }
1053   /*
1054    * apply last round and
1055    * map cipher state to byte array block:
1056    */
1057   s0 =
1058     (Td4[(t0 >> 24)] & 0xff000000) ^
1059     (Td4[(t3 >> 16) & 0xff] & 0x00ff0000) ^
1060     (Td4[(t2 >> 8) & 0xff] & 0x0000ff00) ^
1061     (Td4[(t1) & 0xff] & 0x000000ff) ^ rk[0];
1062   PUTU32 (pt, s0);
1063   s1 =
1064     (Td4[(t1 >> 24)] & 0xff000000) ^
1065     (Td4[(t0 >> 16) & 0xff] & 0x00ff0000) ^
1066     (Td4[(t3 >> 8) & 0xff] & 0x0000ff00) ^
1067     (Td4[(t2) & 0xff] & 0x000000ff) ^ rk[1];
1068   PUTU32 (pt + 4, s1);
1069   s2 =
1070     (Td4[(t2 >> 24)] & 0xff000000) ^
1071     (Td4[(t1 >> 16) & 0xff] & 0x00ff0000) ^
1072     (Td4[(t0 >> 8) & 0xff] & 0x0000ff00) ^
1073     (Td4[(t3) & 0xff] & 0x000000ff) ^ rk[2];
1074   PUTU32 (pt + 8, s2);
1075   s3 =
1076     (Td4[(t3 >> 24)] & 0xff000000) ^
1077     (Td4[(t2 >> 16) & 0xff] & 0x00ff0000) ^
1078     (Td4[(t1 >> 8) & 0xff] & 0x0000ff00) ^
1079     (Td4[(t0) & 0xff] & 0x000000ff) ^ rk[3];
1080   PUTU32 (pt + 12, s3);
1081 }

/* [previous][next][first][last][top][bottom][index][help] */