Home | History | Annotate | Line # | Download | only in hcrypto
      1  1.1     elric /*	$NetBSD: rijndael-alg-fst.c,v 1.2 2017/01/28 21:31:47 christos Exp $	*/
      2  1.1     elric 
      3  1.1     elric /*	NetBSD: rijndael-alg-fst.c,v 1.5 2001/11/13 01:40:10 lukem Exp	*/
      4  1.1     elric /*	$KAME: rijndael-alg-fst.c,v 1.10 2003/07/15 10:47:16 itojun Exp $	*/
      5  1.1     elric /**
      6  1.1     elric  * rijndael-alg-fst.c
      7  1.1     elric  *
      8  1.1     elric  * @version 3.0 (December 2000)
      9  1.1     elric  *
     10  1.1     elric  * Optimised ANSI C code for the Rijndael cipher (now AES)
     11  1.1     elric  *
     12  1.1     elric  * @author Vincent Rijmen <vincent.rijmen (at) esat.kuleuven.ac.be>
     13  1.1     elric  * @author Antoon Bosselaers <antoon.bosselaers (at) esat.kuleuven.ac.be>
     14  1.1     elric  * @author Paulo Barreto <paulo.barreto (at) terra.com.br>
     15  1.1     elric  *
     16  1.1     elric  * This code is hereby placed in the public domain.
     17  1.1     elric  *
     18  1.1     elric  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS
     19  1.1     elric  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     20  1.1     elric  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     21  1.1     elric  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE
     22  1.1     elric  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     23  1.1     elric  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     24  1.1     elric  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
     25  1.1     elric  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     26  1.1     elric  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
     27  1.1     elric  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
     28  1.1     elric  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29  1.1     elric  */
     30  1.1     elric 
     31  1.1     elric /* "NetBSD: rijndael-alg-fst.c,v 1.5 2001/11/13 01:40:10 lukem Exp" */
     32  1.1     elric 
     33  1.2  christos #include <config.h>
     34  1.2  christos #include <krb5/roken.h>
     35  1.1     elric 
     36  1.1     elric #ifdef KRB5
     37  1.1     elric #include <krb5/krb5-types.h>
     38  1.1     elric #endif
     39  1.1     elric 
     40  1.1     elric #include "rijndael-alg-fst.h"
     41  1.1     elric 
     42  1.1     elric /*
     43  1.1     elric Te0[x] = S [x].[02, 01, 01, 03];
     44  1.1     elric Te1[x] = S [x].[03, 02, 01, 01];
     45  1.1     elric Te2[x] = S [x].[01, 03, 02, 01];
     46  1.1     elric Te3[x] = S [x].[01, 01, 03, 02];
     47  1.1     elric Te4[x] = S [x].[01, 01, 01, 01];
     48  1.1     elric 
     49  1.1     elric Td0[x] = Si[x].[0e, 09, 0d, 0b];
     50  1.1     elric Td1[x] = Si[x].[0b, 0e, 09, 0d];
     51  1.1     elric Td2[x] = Si[x].[0d, 0b, 0e, 09];
     52  1.1     elric Td3[x] = Si[x].[09, 0d, 0b, 0e];
     53  1.1     elric Td4[x] = Si[x].[01, 01, 01, 01];
     54  1.1     elric */
     55  1.1     elric 
     56  1.1     elric static const uint32_t Te0[256] = {
     57  1.1     elric     0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU,
     58  1.1     elric     0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U,
     59  1.1     elric     0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU,
     60  1.1     elric     0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU,
     61  1.1     elric     0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U,
     62  1.1     elric     0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU,
     63  1.1     elric     0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU,
     64  1.1     elric     0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU,
     65  1.1     elric     0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU,
     66  1.1     elric     0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU,
     67  1.1     elric     0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U,
     68  1.1     elric     0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU,
     69  1.1     elric     0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU,
     70  1.1     elric     0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U,
     71  1.1     elric     0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU,
     72  1.1     elric     0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU,
     73  1.1     elric     0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU,
     74  1.1     elric     0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU,
     75  1.1     elric     0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU,
     76  1.1     elric     0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U,
     77  1.1     elric     0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU,
     78  1.1     elric     0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU,
     79  1.1     elric     0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU,
     80  1.1     elric     0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU,
     81  1.1     elric     0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U,
     82  1.1     elric     0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U,
     83  1.1     elric     0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U,
     84  1.1     elric     0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U,
     85  1.1     elric     0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU,
     86  1.1     elric     0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U,
     87  1.1     elric     0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U,
     88  1.1     elric     0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU,
     89  1.1     elric     0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU,
     90  1.1     elric     0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U,
     91  1.1     elric     0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U,
     92  1.1     elric     0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U,
     93  1.1     elric     0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU,
     94  1.1     elric     0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U,
     95  1.1     elric     0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU,
     96  1.1     elric     0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U,
     97  1.1     elric     0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU,
     98  1.1     elric     0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U,
     99  1.1     elric     0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U,
    100  1.1     elric     0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU,
    101  1.1     elric     0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U,
    102  1.1     elric     0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U,
    103  1.1     elric     0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U,
    104  1.1     elric     0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U,
    105  1.1     elric     0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U,
    106  1.1     elric     0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U,
    107  1.1     elric     0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U,
    108  1.1     elric     0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U,
    109  1.1     elric     0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU,
    110  1.1     elric     0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U,
    111  1.1     elric     0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U,
    112  1.1     elric     0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U,
    113  1.1     elric     0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U,
    114  1.1     elric     0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U,
    115  1.1     elric     0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U,
    116  1.1     elric     0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU,
    117  1.1     elric     0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U,
    118  1.1     elric     0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U,
    119  1.1     elric     0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U,
    120  1.1     elric     0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU,
    121  1.1     elric };
    122  1.1     elric static const uint32_t Te1[256] = {
    123  1.1     elric     0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU,
    124  1.1     elric     0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U,
    125  1.1     elric     0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU,
    126  1.1     elric     0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U,
    127  1.1     elric     0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU,
    128  1.1     elric     0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U,
    129  1.1     elric     0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU,
    130  1.1     elric     0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U,
    131  1.1     elric     0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U,
    132  1.1     elric     0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU,
    133  1.1     elric     0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U,
    134  1.1     elric     0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U,
    135  1.1     elric     0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U,
    136  1.1     elric     0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU,
    137  1.1     elric     0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U,
    138  1.1     elric     0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U,
    139  1.1     elric     0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU,
    140  1.1     elric     0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U,
    141  1.1     elric     0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U,
    142  1.1     elric     0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U,
    143  1.1     elric     0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU,
    144  1.1     elric     0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU,
    145  1.1     elric     0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U,
    146  1.1     elric     0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU,
    147  1.1     elric     0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU,
    148  1.1     elric     0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U,
    149  1.1     elric     0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU,
    150  1.1     elric     0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U,
    151  1.1     elric     0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU,
    152  1.1     elric     0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U,
    153  1.1     elric     0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U,
    154  1.1     elric     0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U,
    155  1.1     elric     0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU,
    156  1.1     elric     0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U,
    157  1.1     elric     0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU,
    158  1.1     elric     0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U,
    159  1.1     elric     0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU,
    160  1.1     elric     0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U,
    161  1.1     elric     0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U,
    162  1.1     elric     0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU,
    163  1.1     elric     0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU,
    164  1.1     elric     0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU,
    165  1.1     elric     0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U,
    166  1.1     elric     0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U,
    167  1.1     elric     0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU,
    168  1.1     elric     0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U,
    169  1.1     elric     0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU,
    170  1.1     elric     0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U,
    171  1.1     elric     0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU,
    172  1.1     elric     0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U,
    173  1.1     elric     0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU,
    174  1.1     elric     0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU,
    175  1.1     elric     0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U,
    176  1.1     elric     0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU,
    177  1.1     elric     0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U,
    178  1.1     elric     0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU,
    179  1.1     elric     0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U,
    180  1.1     elric     0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U,
    181  1.1     elric     0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U,
    182  1.1     elric     0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU,
    183  1.1     elric     0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU,
    184  1.1     elric     0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U,
    185  1.1     elric     0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU,
    186  1.1     elric     0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U,
    187  1.1     elric };
    188  1.1     elric static const uint32_t Te2[256] = {
    189  1.1     elric     0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU,
    190  1.1     elric     0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U,
    191  1.1     elric     0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU,
    192  1.1     elric     0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U,
    193  1.1     elric     0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU,
    194  1.1     elric     0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U,
    195  1.1     elric     0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU,
    196  1.1     elric     0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U,
    197  1.1     elric     0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U,
    198  1.1     elric     0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU,
    199  1.1     elric     0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U,
    200  1.1     elric     0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U,
    201  1.1     elric     0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U,
    202  1.1     elric     0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU,
    203  1.1     elric     0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U,
    204  1.1     elric     0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U,
    205  1.1     elric     0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU,
    206  1.1     elric     0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U,
    207  1.1     elric     0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U,
    208  1.1     elric     0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U,
    209  1.1     elric     0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU,
    210  1.1     elric     0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU,
    211  1.1     elric     0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U,
    212  1.1     elric     0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU,
    213  1.1     elric     0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU,
    214  1.1     elric     0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U,
    215  1.1     elric     0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU,
    216  1.1     elric     0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U,
    217  1.1     elric     0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU,
    218  1.1     elric     0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U,
    219  1.1     elric     0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U,
    220  1.1     elric     0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U,
    221  1.1     elric     0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU,
    222  1.1     elric     0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U,
    223  1.1     elric     0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU,
    224  1.1     elric     0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U,
    225  1.1     elric     0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU,
    226  1.1     elric     0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U,
    227  1.1     elric     0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U,
    228  1.1     elric     0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU,
    229  1.1     elric     0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU,
    230  1.1     elric     0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU,
    231  1.1     elric     0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U,
    232  1.1     elric     0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U,
    233  1.1     elric     0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU,
    234  1.1     elric     0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U,
    235  1.1     elric     0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU,
    236  1.1     elric     0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U,
    237  1.1     elric     0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU,
    238  1.1     elric     0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U,
    239  1.1     elric     0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU,
    240  1.1     elric     0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU,
    241  1.1     elric     0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U,
    242  1.1     elric     0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU,
    243  1.1     elric     0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U,
    244  1.1     elric     0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU,
    245  1.1     elric     0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U,
    246  1.1     elric     0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U,
    247  1.1     elric     0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U,
    248  1.1     elric     0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU,
    249  1.1     elric     0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU,
    250  1.1     elric     0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U,
    251  1.1     elric     0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU,
    252  1.1     elric     0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U,
    253  1.1     elric };
    254  1.1     elric static const uint32_t Te3[256] = {
    255  1.1     elric 
    256  1.1     elric     0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U,
    257  1.1     elric     0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U,
    258  1.1     elric     0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U,
    259  1.1     elric     0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU,
    260  1.1     elric     0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU,
    261  1.1     elric     0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU,
    262  1.1     elric     0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U,
    263  1.1     elric     0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU,
    264  1.1     elric     0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU,
    265  1.1     elric     0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U,
    266  1.1     elric     0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U,
    267  1.1     elric     0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU,
    268  1.1     elric     0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU,
    269  1.1     elric     0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU,
    270  1.1     elric     0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU,
    271  1.1     elric     0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU,
    272  1.1     elric     0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U,
    273  1.1     elric     0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU,
    274  1.1     elric     0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU,
    275  1.1     elric     0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U,
    276  1.1     elric     0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U,
    277  1.1     elric     0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U,
    278  1.1     elric     0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U,
    279  1.1     elric     0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U,
    280  1.1     elric     0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU,
    281  1.1     elric     0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U,
    282  1.1     elric     0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU,
    283  1.1     elric     0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU,
    284  1.1     elric     0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U,
    285  1.1     elric     0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U,
    286  1.1     elric     0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U,
    287  1.1     elric     0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU,
    288  1.1     elric     0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U,
    289  1.1     elric     0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU,
    290  1.1     elric     0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU,
    291  1.1     elric     0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U,
    292  1.1     elric     0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U,
    293  1.1     elric     0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU,
    294  1.1     elric     0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U,
    295  1.1     elric     0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU,
    296  1.1     elric     0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U,
    297  1.1     elric     0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U,
    298  1.1     elric     0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U,
    299  1.1     elric     0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U,
    300  1.1     elric     0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU,
    301  1.1     elric     0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U,
    302  1.1     elric     0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU,
    303  1.1     elric     0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U,
    304  1.1     elric     0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU,
    305  1.1     elric     0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U,
    306  1.1     elric     0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU,
    307  1.1     elric     0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU,
    308  1.1     elric     0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU,
    309  1.1     elric     0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU,
    310  1.1     elric     0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U,
    311  1.1     elric     0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U,
    312  1.1     elric     0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U,
    313  1.1     elric     0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U,
    314  1.1     elric     0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U,
    315  1.1     elric     0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U,
    316  1.1     elric     0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU,
    317  1.1     elric     0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U,
    318  1.1     elric     0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU,
    319  1.1     elric     0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU,
    320  1.1     elric };
    321  1.1     elric static const uint32_t Te4[256] = {
    322  1.1     elric     0x63636363U, 0x7c7c7c7cU, 0x77777777U, 0x7b7b7b7bU,
    323  1.1     elric     0xf2f2f2f2U, 0x6b6b6b6bU, 0x6f6f6f6fU, 0xc5c5c5c5U,
    324  1.1     elric     0x30303030U, 0x01010101U, 0x67676767U, 0x2b2b2b2bU,
    325  1.1     elric     0xfefefefeU, 0xd7d7d7d7U, 0xababababU, 0x76767676U,
    326  1.1     elric     0xcacacacaU, 0x82828282U, 0xc9c9c9c9U, 0x7d7d7d7dU,
    327  1.1     elric     0xfafafafaU, 0x59595959U, 0x47474747U, 0xf0f0f0f0U,
    328  1.1     elric     0xadadadadU, 0xd4d4d4d4U, 0xa2a2a2a2U, 0xafafafafU,
    329  1.1     elric     0x9c9c9c9cU, 0xa4a4a4a4U, 0x72727272U, 0xc0c0c0c0U,
    330  1.1     elric     0xb7b7b7b7U, 0xfdfdfdfdU, 0x93939393U, 0x26262626U,
    331  1.1     elric     0x36363636U, 0x3f3f3f3fU, 0xf7f7f7f7U, 0xccccccccU,
    332  1.1     elric     0x34343434U, 0xa5a5a5a5U, 0xe5e5e5e5U, 0xf1f1f1f1U,
    333  1.1     elric     0x71717171U, 0xd8d8d8d8U, 0x31313131U, 0x15151515U,
    334  1.1     elric     0x04040404U, 0xc7c7c7c7U, 0x23232323U, 0xc3c3c3c3U,
    335  1.1     elric     0x18181818U, 0x96969696U, 0x05050505U, 0x9a9a9a9aU,
    336  1.1     elric     0x07070707U, 0x12121212U, 0x80808080U, 0xe2e2e2e2U,
    337  1.1     elric     0xebebebebU, 0x27272727U, 0xb2b2b2b2U, 0x75757575U,
    338  1.1     elric     0x09090909U, 0x83838383U, 0x2c2c2c2cU, 0x1a1a1a1aU,
    339  1.1     elric     0x1b1b1b1bU, 0x6e6e6e6eU, 0x5a5a5a5aU, 0xa0a0a0a0U,
    340  1.1     elric     0x52525252U, 0x3b3b3b3bU, 0xd6d6d6d6U, 0xb3b3b3b3U,
    341  1.1     elric     0x29292929U, 0xe3e3e3e3U, 0x2f2f2f2fU, 0x84848484U,
    342  1.1     elric     0x53535353U, 0xd1d1d1d1U, 0x00000000U, 0xededededU,
    343  1.1     elric     0x20202020U, 0xfcfcfcfcU, 0xb1b1b1b1U, 0x5b5b5b5bU,
    344  1.1     elric     0x6a6a6a6aU, 0xcbcbcbcbU, 0xbebebebeU, 0x39393939U,
    345  1.1     elric     0x4a4a4a4aU, 0x4c4c4c4cU, 0x58585858U, 0xcfcfcfcfU,
    346  1.1     elric     0xd0d0d0d0U, 0xefefefefU, 0xaaaaaaaaU, 0xfbfbfbfbU,
    347  1.1     elric     0x43434343U, 0x4d4d4d4dU, 0x33333333U, 0x85858585U,
    348  1.1     elric     0x45454545U, 0xf9f9f9f9U, 0x02020202U, 0x7f7f7f7fU,
    349  1.1     elric     0x50505050U, 0x3c3c3c3cU, 0x9f9f9f9fU, 0xa8a8a8a8U,
    350  1.1     elric     0x51515151U, 0xa3a3a3a3U, 0x40404040U, 0x8f8f8f8fU,
    351  1.1     elric     0x92929292U, 0x9d9d9d9dU, 0x38383838U, 0xf5f5f5f5U,
    352  1.1     elric     0xbcbcbcbcU, 0xb6b6b6b6U, 0xdadadadaU, 0x21212121U,
    353  1.1     elric     0x10101010U, 0xffffffffU, 0xf3f3f3f3U, 0xd2d2d2d2U,
    354  1.1     elric     0xcdcdcdcdU, 0x0c0c0c0cU, 0x13131313U, 0xececececU,
    355  1.1     elric     0x5f5f5f5fU, 0x97979797U, 0x44444444U, 0x17171717U,
    356  1.1     elric     0xc4c4c4c4U, 0xa7a7a7a7U, 0x7e7e7e7eU, 0x3d3d3d3dU,
    357  1.1     elric     0x64646464U, 0x5d5d5d5dU, 0x19191919U, 0x73737373U,
    358  1.1     elric     0x60606060U, 0x81818181U, 0x4f4f4f4fU, 0xdcdcdcdcU,
    359  1.1     elric     0x22222222U, 0x2a2a2a2aU, 0x90909090U, 0x88888888U,
    360  1.1     elric     0x46464646U, 0xeeeeeeeeU, 0xb8b8b8b8U, 0x14141414U,
    361  1.1     elric     0xdedededeU, 0x5e5e5e5eU, 0x0b0b0b0bU, 0xdbdbdbdbU,
    362  1.1     elric     0xe0e0e0e0U, 0x32323232U, 0x3a3a3a3aU, 0x0a0a0a0aU,
    363  1.1     elric     0x49494949U, 0x06060606U, 0x24242424U, 0x5c5c5c5cU,
    364  1.1     elric     0xc2c2c2c2U, 0xd3d3d3d3U, 0xacacacacU, 0x62626262U,
    365  1.1     elric     0x91919191U, 0x95959595U, 0xe4e4e4e4U, 0x79797979U,
    366  1.1     elric     0xe7e7e7e7U, 0xc8c8c8c8U, 0x37373737U, 0x6d6d6d6dU,
    367  1.1     elric     0x8d8d8d8dU, 0xd5d5d5d5U, 0x4e4e4e4eU, 0xa9a9a9a9U,
    368  1.1     elric     0x6c6c6c6cU, 0x56565656U, 0xf4f4f4f4U, 0xeaeaeaeaU,
    369  1.1     elric     0x65656565U, 0x7a7a7a7aU, 0xaeaeaeaeU, 0x08080808U,
    370  1.1     elric     0xbabababaU, 0x78787878U, 0x25252525U, 0x2e2e2e2eU,
    371  1.1     elric     0x1c1c1c1cU, 0xa6a6a6a6U, 0xb4b4b4b4U, 0xc6c6c6c6U,
    372  1.1     elric     0xe8e8e8e8U, 0xddddddddU, 0x74747474U, 0x1f1f1f1fU,
    373  1.1     elric     0x4b4b4b4bU, 0xbdbdbdbdU, 0x8b8b8b8bU, 0x8a8a8a8aU,
    374  1.1     elric     0x70707070U, 0x3e3e3e3eU, 0xb5b5b5b5U, 0x66666666U,
    375  1.1     elric     0x48484848U, 0x03030303U, 0xf6f6f6f6U, 0x0e0e0e0eU,
    376  1.1     elric     0x61616161U, 0x35353535U, 0x57575757U, 0xb9b9b9b9U,
    377  1.1     elric     0x86868686U, 0xc1c1c1c1U, 0x1d1d1d1dU, 0x9e9e9e9eU,
    378  1.1     elric     0xe1e1e1e1U, 0xf8f8f8f8U, 0x98989898U, 0x11111111U,
    379  1.1     elric     0x69696969U, 0xd9d9d9d9U, 0x8e8e8e8eU, 0x94949494U,
    380  1.1     elric     0x9b9b9b9bU, 0x1e1e1e1eU, 0x87878787U, 0xe9e9e9e9U,
    381  1.1     elric     0xcecececeU, 0x55555555U, 0x28282828U, 0xdfdfdfdfU,
    382  1.1     elric     0x8c8c8c8cU, 0xa1a1a1a1U, 0x89898989U, 0x0d0d0d0dU,
    383  1.1     elric     0xbfbfbfbfU, 0xe6e6e6e6U, 0x42424242U, 0x68686868U,
    384  1.1     elric     0x41414141U, 0x99999999U, 0x2d2d2d2dU, 0x0f0f0f0fU,
    385  1.1     elric     0xb0b0b0b0U, 0x54545454U, 0xbbbbbbbbU, 0x16161616U,
    386  1.1     elric };
    387  1.1     elric static const uint32_t Td0[256] = {
    388  1.1     elric     0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U,
    389  1.1     elric     0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U,
    390  1.1     elric     0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U,
    391  1.1     elric     0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU,
    392  1.1     elric     0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U,
    393  1.1     elric     0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U,
    394  1.1     elric     0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU,
    395  1.1     elric     0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U,
    396  1.1     elric     0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU,
    397  1.1     elric     0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U,
    398  1.1     elric     0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U,
    399  1.1     elric     0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U,
    400  1.1     elric     0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U,
    401  1.1     elric     0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU,
    402  1.1     elric     0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U,
    403  1.1     elric     0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU,
    404  1.1     elric     0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U,
    405  1.1     elric     0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU,
    406  1.1     elric     0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U,
    407  1.1     elric     0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U,
    408  1.1     elric     0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U,
    409  1.1     elric     0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU,
    410  1.1     elric     0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U,
    411  1.1     elric     0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU,
    412  1.1     elric     0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U,
    413  1.1     elric     0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU,
    414  1.1     elric     0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U,
    415  1.1     elric     0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU,
    416  1.1     elric     0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU,
    417  1.1     elric     0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U,
    418  1.1     elric     0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU,
    419  1.1     elric     0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U,
    420  1.1     elric     0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU,
    421  1.1     elric     0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U,
    422  1.1     elric     0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U,
    423  1.1     elric     0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U,
    424  1.1     elric     0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU,
    425  1.1     elric     0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U,
    426  1.1     elric     0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U,
    427  1.1     elric     0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU,
    428  1.1     elric     0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U,
    429  1.1     elric     0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U,
    430  1.1     elric     0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U,
    431  1.1     elric     0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U,
    432  1.1     elric     0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U,
    433  1.1     elric     0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU,
    434  1.1     elric     0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U,
    435  1.1     elric     0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U,
    436  1.1     elric     0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U,
    437  1.1     elric     0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U,
    438  1.1     elric     0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U,
    439  1.1     elric     0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU,
    440  1.1     elric     0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU,
    441  1.1     elric     0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU,
    442  1.1     elric     0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU,
    443  1.1     elric     0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U,
    444  1.1     elric     0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U,
    445  1.1     elric     0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU,
    446  1.1     elric     0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU,
    447  1.1     elric     0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U,
    448  1.1     elric     0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU,
    449  1.1     elric     0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U,
    450  1.1     elric     0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U,
    451  1.1     elric     0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U,
    452  1.1     elric };
    453  1.1     elric static const uint32_t Td1[256] = {
    454  1.1     elric     0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU,
    455  1.1     elric     0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U,
    456  1.1     elric     0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU,
    457  1.1     elric     0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U,
    458  1.1     elric     0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U,
    459  1.1     elric     0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U,
    460  1.1     elric     0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U,
    461  1.1     elric     0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U,
    462  1.1     elric     0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U,
    463  1.1     elric     0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU,
    464  1.1     elric     0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU,
    465  1.1     elric     0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU,
    466  1.1     elric     0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U,
    467  1.1     elric     0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU,
    468  1.1     elric     0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U,
    469  1.1     elric     0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U,
    470  1.1     elric     0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U,
    471  1.1     elric     0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU,
    472  1.1     elric     0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU,
    473  1.1     elric     0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U,
    474  1.1     elric     0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU,
    475  1.1     elric     0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U,
    476  1.1     elric     0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU,
    477  1.1     elric     0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU,
    478  1.1     elric     0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U,
    479  1.1     elric     0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U,
    480  1.1     elric     0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U,
    481  1.1     elric     0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU,
    482  1.1     elric     0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U,
    483  1.1     elric     0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU,
    484  1.1     elric     0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U,
    485  1.1     elric     0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U,
    486  1.1     elric     0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U,
    487  1.1     elric     0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU,
    488  1.1     elric     0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U,
    489  1.1     elric     0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U,
    490  1.1     elric     0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U,
    491  1.1     elric     0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U,
    492  1.1     elric     0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U,
    493  1.1     elric     0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U,
    494  1.1     elric     0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU,
    495  1.1     elric     0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU,
    496  1.1     elric     0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U,
    497  1.1     elric     0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU,
    498  1.1     elric     0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U,
    499  1.1     elric     0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU,
    500  1.1     elric     0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU,
    501  1.1     elric     0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U,
    502  1.1     elric     0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU,
    503  1.1     elric     0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U,
    504  1.1     elric     0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U,
    505  1.1     elric     0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U,
    506  1.1     elric     0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U,
    507  1.1     elric     0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U,
    508  1.1     elric     0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U,
    509  1.1     elric     0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U,
    510  1.1     elric     0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU,
    511  1.1     elric     0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U,
    512  1.1     elric     0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U,
    513  1.1     elric     0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU,
    514  1.1     elric     0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U,
    515  1.1     elric     0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U,
    516  1.1     elric     0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U,
    517  1.1     elric     0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U,
    518  1.1     elric };
    519  1.1     elric static const uint32_t Td2[256] = {
    520  1.1     elric     0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U,
    521  1.1     elric     0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U,
    522  1.1     elric     0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U,
    523  1.1     elric     0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U,
    524  1.1     elric     0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU,
    525  1.1     elric     0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U,
    526  1.1     elric     0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U,
    527  1.1     elric     0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U,
    528  1.1     elric     0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U,
    529  1.1     elric     0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU,
    530  1.1     elric     0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U,
    531  1.1     elric     0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U,
    532  1.1     elric     0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU,
    533  1.1     elric     0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U,
    534  1.1     elric     0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U,
    535  1.1     elric     0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U,
    536  1.1     elric     0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U,
    537  1.1     elric     0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U,
    538  1.1     elric     0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U,
    539  1.1     elric     0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU,
    540  1.1     elric 
    541  1.1     elric     0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U,
    542  1.1     elric     0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U,
    543  1.1     elric     0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U,
    544  1.1     elric     0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U,
    545  1.1     elric     0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U,
    546  1.1     elric     0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU,
    547  1.1     elric     0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU,
    548  1.1     elric     0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U,
    549  1.1     elric     0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU,
    550  1.1     elric     0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U,
    551  1.1     elric     0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU,
    552  1.1     elric     0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU,
    553  1.1     elric     0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU,
    554  1.1     elric     0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU,
    555  1.1     elric     0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U,
    556  1.1     elric     0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U,
    557  1.1     elric     0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U,
    558  1.1     elric     0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U,
    559  1.1     elric     0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U,
    560  1.1     elric     0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U,
    561  1.1     elric     0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U,
    562  1.1     elric     0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU,
    563  1.1     elric     0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU,
    564  1.1     elric     0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U,
    565  1.1     elric     0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U,
    566  1.1     elric     0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU,
    567  1.1     elric     0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU,
    568  1.1     elric     0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U,
    569  1.1     elric     0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U,
    570  1.1     elric     0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U,
    571  1.1     elric     0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U,
    572  1.1     elric     0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U,
    573  1.1     elric     0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U,
    574  1.1     elric     0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U,
    575  1.1     elric     0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU,
    576  1.1     elric     0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U,
    577  1.1     elric     0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U,
    578  1.1     elric     0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U,
    579  1.1     elric     0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U,
    580  1.1     elric     0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U,
    581  1.1     elric     0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U,
    582  1.1     elric     0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU,
    583  1.1     elric     0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U,
    584  1.1     elric     0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U,
    585  1.1     elric };
    586  1.1     elric static const uint32_t Td3[256] = {
    587  1.1     elric     0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU,
    588  1.1     elric     0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU,
    589  1.1     elric     0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U,
    590  1.1     elric     0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U,
    591  1.1     elric     0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU,
    592  1.1     elric     0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU,
    593  1.1     elric     0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U,
    594  1.1     elric     0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU,
    595  1.1     elric     0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U,
    596  1.1     elric     0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU,
    597  1.1     elric     0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U,
    598  1.1     elric     0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U,
    599  1.1     elric     0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U,
    600  1.1     elric     0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U,
    601  1.1     elric     0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U,
    602  1.1     elric     0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU,
    603  1.1     elric     0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU,
    604  1.1     elric     0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U,
    605  1.1     elric     0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U,
    606  1.1     elric     0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU,
    607  1.1     elric     0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU,
    608  1.1     elric     0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U,
    609  1.1     elric     0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U,
    610  1.1     elric     0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U,
    611  1.1     elric     0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U,
    612  1.1     elric     0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU,
    613  1.1     elric     0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U,
    614  1.1     elric     0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U,
    615  1.1     elric     0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU,
    616  1.1     elric     0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU,
    617  1.1     elric     0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U,
    618  1.1     elric     0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U,
    619  1.1     elric     0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U,
    620  1.1     elric     0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU,
    621  1.1     elric     0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U,
    622  1.1     elric     0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U,
    623  1.1     elric     0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U,
    624  1.1     elric     0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U,
    625  1.1     elric     0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U,
    626  1.1     elric     0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U,
    627  1.1     elric     0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U,
    628  1.1     elric     0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU,
    629  1.1     elric     0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U,
    630  1.1     elric     0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U,
    631  1.1     elric     0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU,
    632  1.1     elric     0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU,
    633  1.1     elric     0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U,
    634  1.1     elric     0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU,
    635  1.1     elric     0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U,
    636  1.1     elric     0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U,
    637  1.1     elric     0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U,
    638  1.1     elric     0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U,
    639  1.1     elric     0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U,
    640  1.1     elric     0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U,
    641  1.1     elric     0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU,
    642  1.1     elric     0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU,
    643  1.1     elric     0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU,
    644  1.1     elric     0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU,
    645  1.1     elric     0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U,
    646  1.1     elric     0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U,
    647  1.1     elric     0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U,
    648  1.1     elric     0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU,
    649  1.1     elric     0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U,
    650  1.1     elric     0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U,
    651  1.1     elric };
    652  1.1     elric static const uint32_t Td4[256] = {
    653  1.1     elric     0x52525252U, 0x09090909U, 0x6a6a6a6aU, 0xd5d5d5d5U,
    654  1.1     elric     0x30303030U, 0x36363636U, 0xa5a5a5a5U, 0x38383838U,
    655  1.1     elric     0xbfbfbfbfU, 0x40404040U, 0xa3a3a3a3U, 0x9e9e9e9eU,
    656  1.1     elric     0x81818181U, 0xf3f3f3f3U, 0xd7d7d7d7U, 0xfbfbfbfbU,
    657  1.1     elric     0x7c7c7c7cU, 0xe3e3e3e3U, 0x39393939U, 0x82828282U,
    658  1.1     elric     0x9b9b9b9bU, 0x2f2f2f2fU, 0xffffffffU, 0x87878787U,
    659  1.1     elric     0x34343434U, 0x8e8e8e8eU, 0x43434343U, 0x44444444U,
    660  1.1     elric     0xc4c4c4c4U, 0xdedededeU, 0xe9e9e9e9U, 0xcbcbcbcbU,
    661  1.1     elric     0x54545454U, 0x7b7b7b7bU, 0x94949494U, 0x32323232U,
    662  1.1     elric     0xa6a6a6a6U, 0xc2c2c2c2U, 0x23232323U, 0x3d3d3d3dU,
    663  1.1     elric     0xeeeeeeeeU, 0x4c4c4c4cU, 0x95959595U, 0x0b0b0b0bU,
    664  1.1     elric     0x42424242U, 0xfafafafaU, 0xc3c3c3c3U, 0x4e4e4e4eU,
    665  1.1     elric     0x08080808U, 0x2e2e2e2eU, 0xa1a1a1a1U, 0x66666666U,
    666  1.1     elric     0x28282828U, 0xd9d9d9d9U, 0x24242424U, 0xb2b2b2b2U,
    667  1.1     elric     0x76767676U, 0x5b5b5b5bU, 0xa2a2a2a2U, 0x49494949U,
    668  1.1     elric     0x6d6d6d6dU, 0x8b8b8b8bU, 0xd1d1d1d1U, 0x25252525U,
    669  1.1     elric     0x72727272U, 0xf8f8f8f8U, 0xf6f6f6f6U, 0x64646464U,
    670  1.1     elric     0x86868686U, 0x68686868U, 0x98989898U, 0x16161616U,
    671  1.1     elric     0xd4d4d4d4U, 0xa4a4a4a4U, 0x5c5c5c5cU, 0xccccccccU,
    672  1.1     elric     0x5d5d5d5dU, 0x65656565U, 0xb6b6b6b6U, 0x92929292U,
    673  1.1     elric     0x6c6c6c6cU, 0x70707070U, 0x48484848U, 0x50505050U,
    674  1.1     elric     0xfdfdfdfdU, 0xededededU, 0xb9b9b9b9U, 0xdadadadaU,
    675  1.1     elric     0x5e5e5e5eU, 0x15151515U, 0x46464646U, 0x57575757U,
    676  1.1     elric     0xa7a7a7a7U, 0x8d8d8d8dU, 0x9d9d9d9dU, 0x84848484U,
    677  1.1     elric     0x90909090U, 0xd8d8d8d8U, 0xababababU, 0x00000000U,
    678  1.1     elric     0x8c8c8c8cU, 0xbcbcbcbcU, 0xd3d3d3d3U, 0x0a0a0a0aU,
    679  1.1     elric     0xf7f7f7f7U, 0xe4e4e4e4U, 0x58585858U, 0x05050505U,
    680  1.1     elric     0xb8b8b8b8U, 0xb3b3b3b3U, 0x45454545U, 0x06060606U,
    681  1.1     elric     0xd0d0d0d0U, 0x2c2c2c2cU, 0x1e1e1e1eU, 0x8f8f8f8fU,
    682  1.1     elric     0xcacacacaU, 0x3f3f3f3fU, 0x0f0f0f0fU, 0x02020202U,
    683  1.1     elric     0xc1c1c1c1U, 0xafafafafU, 0xbdbdbdbdU, 0x03030303U,
    684  1.1     elric     0x01010101U, 0x13131313U, 0x8a8a8a8aU, 0x6b6b6b6bU,
    685  1.1     elric     0x3a3a3a3aU, 0x91919191U, 0x11111111U, 0x41414141U,
    686  1.1     elric     0x4f4f4f4fU, 0x67676767U, 0xdcdcdcdcU, 0xeaeaeaeaU,
    687  1.1     elric     0x97979797U, 0xf2f2f2f2U, 0xcfcfcfcfU, 0xcecececeU,
    688  1.1     elric     0xf0f0f0f0U, 0xb4b4b4b4U, 0xe6e6e6e6U, 0x73737373U,
    689  1.1     elric     0x96969696U, 0xacacacacU, 0x74747474U, 0x22222222U,
    690  1.1     elric     0xe7e7e7e7U, 0xadadadadU, 0x35353535U, 0x85858585U,
    691  1.1     elric     0xe2e2e2e2U, 0xf9f9f9f9U, 0x37373737U, 0xe8e8e8e8U,
    692  1.1     elric     0x1c1c1c1cU, 0x75757575U, 0xdfdfdfdfU, 0x6e6e6e6eU,
    693  1.1     elric     0x47474747U, 0xf1f1f1f1U, 0x1a1a1a1aU, 0x71717171U,
    694  1.1     elric     0x1d1d1d1dU, 0x29292929U, 0xc5c5c5c5U, 0x89898989U,
    695  1.1     elric     0x6f6f6f6fU, 0xb7b7b7b7U, 0x62626262U, 0x0e0e0e0eU,
    696  1.1     elric     0xaaaaaaaaU, 0x18181818U, 0xbebebebeU, 0x1b1b1b1bU,
    697  1.1     elric     0xfcfcfcfcU, 0x56565656U, 0x3e3e3e3eU, 0x4b4b4b4bU,
    698  1.1     elric     0xc6c6c6c6U, 0xd2d2d2d2U, 0x79797979U, 0x20202020U,
    699  1.1     elric     0x9a9a9a9aU, 0xdbdbdbdbU, 0xc0c0c0c0U, 0xfefefefeU,
    700  1.1     elric     0x78787878U, 0xcdcdcdcdU, 0x5a5a5a5aU, 0xf4f4f4f4U,
    701  1.1     elric     0x1f1f1f1fU, 0xddddddddU, 0xa8a8a8a8U, 0x33333333U,
    702  1.1     elric     0x88888888U, 0x07070707U, 0xc7c7c7c7U, 0x31313131U,
    703  1.1     elric     0xb1b1b1b1U, 0x12121212U, 0x10101010U, 0x59595959U,
    704  1.1     elric     0x27272727U, 0x80808080U, 0xececececU, 0x5f5f5f5fU,
    705  1.1     elric     0x60606060U, 0x51515151U, 0x7f7f7f7fU, 0xa9a9a9a9U,
    706  1.1     elric     0x19191919U, 0xb5b5b5b5U, 0x4a4a4a4aU, 0x0d0d0d0dU,
    707  1.1     elric     0x2d2d2d2dU, 0xe5e5e5e5U, 0x7a7a7a7aU, 0x9f9f9f9fU,
    708  1.1     elric     0x93939393U, 0xc9c9c9c9U, 0x9c9c9c9cU, 0xefefefefU,
    709  1.1     elric     0xa0a0a0a0U, 0xe0e0e0e0U, 0x3b3b3b3bU, 0x4d4d4d4dU,
    710  1.1     elric     0xaeaeaeaeU, 0x2a2a2a2aU, 0xf5f5f5f5U, 0xb0b0b0b0U,
    711  1.1     elric     0xc8c8c8c8U, 0xebebebebU, 0xbbbbbbbbU, 0x3c3c3c3cU,
    712  1.1     elric     0x83838383U, 0x53535353U, 0x99999999U, 0x61616161U,
    713  1.1     elric     0x17171717U, 0x2b2b2b2bU, 0x04040404U, 0x7e7e7e7eU,
    714  1.1     elric     0xbabababaU, 0x77777777U, 0xd6d6d6d6U, 0x26262626U,
    715  1.1     elric     0xe1e1e1e1U, 0x69696969U, 0x14141414U, 0x63636363U,
    716  1.1     elric     0x55555555U, 0x21212121U, 0x0c0c0c0cU, 0x7d7d7d7dU,
    717  1.1     elric };
    718  1.1     elric static const uint32_t rcon[] = {
    719  1.1     elric 	0x01000000, 0x02000000, 0x04000000, 0x08000000,
    720  1.1     elric 	0x10000000, 0x20000000, 0x40000000, 0x80000000,
    721  1.1     elric 	0x1B000000, 0x36000000, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */
    722  1.1     elric };
    723  1.1     elric 
    724  1.1     elric #define SWAP(x) (_lrotl(x, 8) & 0x00ff00ff | _lrotr(x, 8) & 0xff00ff00)
    725  1.1     elric 
    726  1.1     elric #ifdef _MSC_VER
    727  1.1     elric #define GETU32(p) SWAP(*((uint32_t *)(p)))
    728  1.1     elric #define PUTU32(ct, st) { *((uint32_t *)(ct)) = SWAP((st)); }
    729  1.1     elric #else
    730  1.1     elric #define GETU32(pt) (((uint32_t)(pt)[0] << 24) ^ ((uint32_t)(pt)[1] << 16) ^ ((uint32_t)(pt)[2] <<  8) ^ ((uint32_t)(pt)[3]))
    731  1.1     elric #define PUTU32(ct, st) { (ct)[0] = (uint8_t)((st) >> 24); (ct)[1] = (uint8_t)((st) >> 16); (ct)[2] = (uint8_t)((st) >>  8); (ct)[3] = (uint8_t)(st); }
    732  1.1     elric #endif
    733  1.1     elric 
    734  1.1     elric /**
    735  1.1     elric  * Expand the cipher key into the encryption key schedule.
    736  1.1     elric  *
    737  1.1     elric  * @return	the number of rounds for the given cipher key size.
    738  1.1     elric  */
    739  1.1     elric int rijndaelKeySetupEnc(uint32_t rk[/*4*(Nr + 1)*/], const uint8_t cipherKey[], int keyBits) {
    740  1.1     elric    	int i = 0;
    741  1.1     elric 	uint32_t temp;
    742  1.1     elric 
    743  1.1     elric 	rk[0] = GETU32(cipherKey     );
    744  1.1     elric 	rk[1] = GETU32(cipherKey +  4);
    745  1.1     elric 	rk[2] = GETU32(cipherKey +  8);
    746  1.1     elric 	rk[3] = GETU32(cipherKey + 12);
    747  1.1     elric 	if (keyBits == 128) {
    748  1.1     elric 		for (;;) {
    749  1.1     elric 			temp  = rk[3];
    750  1.1     elric 			rk[4] = rk[0] ^
    751  1.1     elric 				(Te4[(temp >> 16) & 0xff] & 0xff000000) ^
    752  1.1     elric 				(Te4[(temp >>  8) & 0xff] & 0x00ff0000) ^
    753  1.1     elric 				(Te4[(temp      ) & 0xff] & 0x0000ff00) ^
    754  1.1     elric 				(Te4[(temp >> 24)       ] & 0x000000ff) ^
    755  1.1     elric 				rcon[i];
    756  1.1     elric 			rk[5] = rk[1] ^ rk[4];
    757  1.1     elric 			rk[6] = rk[2] ^ rk[5];
    758  1.1     elric 			rk[7] = rk[3] ^ rk[6];
    759  1.1     elric 			if (++i == 10) {
    760  1.1     elric 				return 10;
    761  1.1     elric 			}
    762  1.1     elric 			rk += 4;
    763  1.1     elric 		}
    764  1.1     elric 	}
    765  1.1     elric 	rk[4] = GETU32(cipherKey + 16);
    766  1.1     elric 	rk[5] = GETU32(cipherKey + 20);
    767  1.1     elric 	if (keyBits == 192) {
    768  1.1     elric 		for (;;) {
    769  1.1     elric 			temp = rk[ 5];
    770  1.1     elric 			rk[ 6] = rk[ 0] ^
    771  1.1     elric 				(Te4[(temp >> 16) & 0xff] & 0xff000000) ^
    772  1.1     elric 				(Te4[(temp >>  8) & 0xff] & 0x00ff0000) ^
    773  1.1     elric 				(Te4[(temp      ) & 0xff] & 0x0000ff00) ^
    774  1.1     elric 				(Te4[(temp >> 24)       ] & 0x000000ff) ^
    775  1.1     elric 				rcon[i];
    776  1.1     elric 			rk[ 7] = rk[ 1] ^ rk[ 6];
    777  1.1     elric 			rk[ 8] = rk[ 2] ^ rk[ 7];
    778  1.1     elric 			rk[ 9] = rk[ 3] ^ rk[ 8];
    779  1.1     elric 			if (++i == 8) {
    780  1.1     elric 				return 12;
    781  1.1     elric 			}
    782  1.1     elric 			rk[10] = rk[ 4] ^ rk[ 9];
    783  1.1     elric 			rk[11] = rk[ 5] ^ rk[10];
    784  1.1     elric 			rk += 6;
    785  1.1     elric 		}
    786  1.1     elric 	}
    787  1.1     elric 	rk[6] = GETU32(cipherKey + 24);
    788  1.1     elric 	rk[7] = GETU32(cipherKey + 28);
    789  1.1     elric 	if (keyBits == 256) {
    790  1.1     elric         for (;;) {
    791  1.1     elric         	temp = rk[ 7];
    792  1.1     elric         	rk[ 8] = rk[ 0] ^
    793  1.1     elric         		(Te4[(temp >> 16) & 0xff] & 0xff000000) ^
    794  1.1     elric         		(Te4[(temp >>  8) & 0xff] & 0x00ff0000) ^
    795  1.1     elric         		(Te4[(temp      ) & 0xff] & 0x0000ff00) ^
    796  1.1     elric         		(Te4[(temp >> 24)       ] & 0x000000ff) ^
    797  1.1     elric         		rcon[i];
    798  1.1     elric         	rk[ 9] = rk[ 1] ^ rk[ 8];
    799  1.1     elric         	rk[10] = rk[ 2] ^ rk[ 9];
    800  1.1     elric         	rk[11] = rk[ 3] ^ rk[10];
    801  1.1     elric 			if (++i == 7) {
    802  1.1     elric 				return 14;
    803  1.1     elric 			}
    804  1.1     elric         	temp = rk[11];
    805  1.1     elric         	rk[12] = rk[ 4] ^
    806  1.1     elric         		(Te4[(temp >> 24)       ] & 0xff000000) ^
    807  1.1     elric         		(Te4[(temp >> 16) & 0xff] & 0x00ff0000) ^
    808  1.1     elric         		(Te4[(temp >>  8) & 0xff] & 0x0000ff00) ^
    809  1.1     elric         		(Te4[(temp      ) & 0xff] & 0x000000ff);
    810  1.1     elric         	rk[13] = rk[ 5] ^ rk[12];
    811  1.1     elric         	rk[14] = rk[ 6] ^ rk[13];
    812  1.1     elric         	rk[15] = rk[ 7] ^ rk[14];
    813  1.1     elric 
    814  1.1     elric 			rk += 8;
    815  1.1     elric         }
    816  1.1     elric 	}
    817  1.1     elric 	return 0;
    818  1.1     elric }
    819  1.1     elric 
    820  1.1     elric /**
    821  1.1     elric  * Expand the cipher key into the decryption key schedule.
    822  1.1     elric  *
    823  1.1     elric  * @return	the number of rounds for the given cipher key size.
    824  1.1     elric  */
    825  1.1     elric int rijndaelKeySetupDec(uint32_t rk[/*4*(Nr + 1)*/], const uint8_t cipherKey[], int keyBits) {
    826  1.1     elric 	int Nr, i, j;
    827  1.1     elric 	uint32_t temp;
    828  1.1     elric 
    829  1.1     elric 	/* expand the cipher key: */
    830  1.1     elric 	Nr = rijndaelKeySetupEnc(rk, cipherKey, keyBits);
    831  1.1     elric 	/* invert the order of the round keys: */
    832  1.1     elric 	for (i = 0, j = 4*Nr; i < j; i += 4, j -= 4) {
    833  1.1     elric 		temp = rk[i    ]; rk[i    ] = rk[j    ]; rk[j    ] = temp;
    834  1.1     elric 		temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp;
    835  1.1     elric 		temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp;
    836  1.1     elric 		temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp;
    837  1.1     elric 	}
    838  1.1     elric 	/* apply the inverse MixColumn transform to all round keys but the first and the last: */
    839  1.1     elric 	for (i = 1; i < Nr; i++) {
    840  1.1     elric 		rk += 4;
    841  1.1     elric 		rk[0] =
    842  1.1     elric 			Td0[Te4[(rk[0] >> 24)       ] & 0xff] ^
    843  1.1     elric 			Td1[Te4[(rk[0] >> 16) & 0xff] & 0xff] ^
    844  1.1     elric 			Td2[Te4[(rk[0] >>  8) & 0xff] & 0xff] ^
    845  1.1     elric 			Td3[Te4[(rk[0]      ) & 0xff] & 0xff];
    846  1.1     elric 		rk[1] =
    847  1.1     elric 			Td0[Te4[(rk[1] >> 24)       ] & 0xff] ^
    848  1.1     elric 			Td1[Te4[(rk[1] >> 16) & 0xff] & 0xff] ^
    849  1.1     elric 			Td2[Te4[(rk[1] >>  8) & 0xff] & 0xff] ^
    850  1.1     elric 			Td3[Te4[(rk[1]      ) & 0xff] & 0xff];
    851  1.1     elric 		rk[2] =
    852  1.1     elric 			Td0[Te4[(rk[2] >> 24)       ] & 0xff] ^
    853  1.1     elric 			Td1[Te4[(rk[2] >> 16) & 0xff] & 0xff] ^
    854  1.1     elric 			Td2[Te4[(rk[2] >>  8) & 0xff] & 0xff] ^
    855  1.1     elric 			Td3[Te4[(rk[2]      ) & 0xff] & 0xff];
    856  1.1     elric 		rk[3] =
    857  1.1     elric 			Td0[Te4[(rk[3] >> 24)       ] & 0xff] ^
    858  1.1     elric 			Td1[Te4[(rk[3] >> 16) & 0xff] & 0xff] ^
    859  1.1     elric 			Td2[Te4[(rk[3] >>  8) & 0xff] & 0xff] ^
    860  1.1     elric 			Td3[Te4[(rk[3]      ) & 0xff] & 0xff];
    861  1.1     elric 	}
    862  1.1     elric 	return Nr;
    863  1.1     elric }
    864  1.1     elric 
    865  1.1     elric void rijndaelEncrypt(const uint32_t rk[/*4*(Nr + 1)*/], int Nr, const uint8_t pt[16], uint8_t ct[16]) {
    866  1.1     elric 	uint32_t s0, s1, s2, s3, t0, t1, t2, t3;
    867  1.1     elric #ifndef FULL_UNROLL
    868  1.1     elric     int r;
    869  1.1     elric #endif /* ?FULL_UNROLL */
    870  1.1     elric 
    871  1.1     elric     /*
    872  1.1     elric 	 * map byte array block to cipher state
    873  1.1     elric 	 * and add initial round key:
    874  1.1     elric 	 */
    875  1.1     elric 	s0 = GETU32(pt     ) ^ rk[0];
    876  1.1     elric 	s1 = GETU32(pt +  4) ^ rk[1];
    877  1.1     elric 	s2 = GETU32(pt +  8) ^ rk[2];
    878  1.1     elric 	s3 = GETU32(pt + 12) ^ rk[3];
    879  1.1     elric #ifdef FULL_UNROLL
    880  1.1     elric     /* round 1: */
    881  1.1     elric    	t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[ 4];
    882  1.1     elric    	t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[ 5];
    883  1.1     elric    	t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[ 6];
    884  1.1     elric    	t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[ 7];
    885  1.1     elric    	/* round 2: */
    886  1.1     elric    	s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[ 8];
    887  1.1     elric    	s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[ 9];
    888  1.1     elric    	s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[10];
    889  1.1     elric    	s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[11];
    890  1.1     elric     /* round 3: */
    891  1.1     elric    	t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[12];
    892  1.1     elric    	t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[13];
    893  1.1     elric    	t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[14];
    894  1.1     elric    	t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[15];
    895  1.1     elric    	/* round 4: */
    896  1.1     elric    	s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[16];
    897  1.1     elric    	s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[17];
    898  1.1     elric    	s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[18];
    899  1.1     elric    	s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[19];
    900  1.1     elric     /* round 5: */
    901  1.1     elric    	t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[20];
    902  1.1     elric    	t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[21];
    903  1.1     elric    	t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[22];
    904  1.1     elric    	t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[23];
    905  1.1     elric    	/* round 6: */
    906  1.1     elric    	s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[24];
    907  1.1     elric    	s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[25];
    908  1.1     elric    	s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[26];
    909  1.1     elric    	s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[27];
    910  1.1     elric     /* round 7: */
    911  1.1     elric    	t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[28];
    912  1.1     elric    	t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[29];
    913  1.1     elric    	t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[30];
    914  1.1     elric    	t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[31];
    915  1.1     elric    	/* round 8: */
    916  1.1     elric    	s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[32];
    917  1.1     elric    	s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[33];
    918  1.1     elric    	s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[34];
    919  1.1     elric    	s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[35];
    920  1.1     elric     /* round 9: */
    921  1.1     elric    	t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[36];
    922  1.1     elric    	t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[37];
    923  1.1     elric    	t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[38];
    924  1.1     elric    	t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[39];
    925  1.1     elric     if (Nr > 10) {
    926  1.1     elric         /* round 10: */
    927  1.1     elric         s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[40];
    928  1.1     elric         s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[41];
    929  1.1     elric         s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[42];
    930  1.1     elric         s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[43];
    931  1.1     elric         /* round 11: */
    932  1.1     elric         t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[44];
    933  1.1     elric         t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[45];
    934  1.1     elric         t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[46];
    935  1.1     elric         t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[47];
    936  1.1     elric         if (Nr > 12) {
    937  1.1     elric             /* round 12: */
    938  1.1     elric             s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[48];
    939  1.1     elric             s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[49];
    940  1.1     elric             s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[50];
    941  1.1     elric             s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[51];
    942  1.1     elric             /* round 13: */
    943  1.1     elric             t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[52];
    944  1.1     elric             t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[53];
    945  1.1     elric             t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[54];
    946  1.1     elric             t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[55];
    947  1.1     elric         }
    948  1.1     elric     }
    949  1.1     elric     rk += Nr << 2;
    950  1.1     elric #else  /* !FULL_UNROLL */
    951  1.1     elric     /*
    952  1.1     elric 	 * Nr - 1 full rounds:
    953  1.1     elric 	 */
    954  1.1     elric     r = Nr >> 1;
    955  1.1     elric     for (;;) {
    956  1.1     elric         t0 =
    957  1.1     elric             Te0[(s0 >> 24)       ] ^
    958  1.1     elric             Te1[(s1 >> 16) & 0xff] ^
    959  1.1     elric             Te2[(s2 >>  8) & 0xff] ^
    960  1.1     elric             Te3[(s3      ) & 0xff] ^
    961  1.1     elric             rk[4];
    962  1.1     elric         t1 =
    963  1.1     elric             Te0[(s1 >> 24)       ] ^
    964  1.1     elric             Te1[(s2 >> 16) & 0xff] ^
    965  1.1     elric             Te2[(s3 >>  8) & 0xff] ^
    966  1.1     elric             Te3[(s0      ) & 0xff] ^
    967  1.1     elric             rk[5];
    968  1.1     elric         t2 =
    969  1.1     elric             Te0[(s2 >> 24)       ] ^
    970  1.1     elric             Te1[(s3 >> 16) & 0xff] ^
    971  1.1     elric             Te2[(s0 >>  8) & 0xff] ^
    972  1.1     elric             Te3[(s1      ) & 0xff] ^
    973  1.1     elric             rk[6];
    974  1.1     elric         t3 =
    975  1.1     elric             Te0[(s3 >> 24)       ] ^
    976  1.1     elric             Te1[(s0 >> 16) & 0xff] ^
    977  1.1     elric             Te2[(s1 >>  8) & 0xff] ^
    978  1.1     elric             Te3[(s2      ) & 0xff] ^
    979  1.1     elric             rk[7];
    980  1.1     elric 
    981  1.1     elric         rk += 8;
    982  1.1     elric         if (--r == 0) {
    983  1.1     elric             break;
    984  1.1     elric         }
    985  1.1     elric 
    986  1.1     elric         s0 =
    987  1.1     elric             Te0[(t0 >> 24)       ] ^
    988  1.1     elric             Te1[(t1 >> 16) & 0xff] ^
    989  1.1     elric             Te2[(t2 >>  8) & 0xff] ^
    990  1.1     elric             Te3[(t3      ) & 0xff] ^
    991  1.1     elric             rk[0];
    992  1.1     elric         s1 =
    993  1.1     elric             Te0[(t1 >> 24)       ] ^
    994  1.1     elric             Te1[(t2 >> 16) & 0xff] ^
    995  1.1     elric             Te2[(t3 >>  8) & 0xff] ^
    996  1.1     elric             Te3[(t0      ) & 0xff] ^
    997  1.1     elric             rk[1];
    998  1.1     elric         s2 =
    999  1.1     elric             Te0[(t2 >> 24)       ] ^
   1000  1.1     elric             Te1[(t3 >> 16) & 0xff] ^
   1001  1.1     elric             Te2[(t0 >>  8) & 0xff] ^
   1002  1.1     elric             Te3[(t1      ) & 0xff] ^
   1003  1.1     elric             rk[2];
   1004  1.1     elric         s3 =
   1005  1.1     elric             Te0[(t3 >> 24)       ] ^
   1006  1.1     elric             Te1[(t0 >> 16) & 0xff] ^
   1007  1.1     elric             Te2[(t1 >>  8) & 0xff] ^
   1008  1.1     elric             Te3[(t2      ) & 0xff] ^
   1009  1.1     elric             rk[3];
   1010  1.1     elric     }
   1011  1.1     elric #endif /* ?FULL_UNROLL */
   1012  1.1     elric     /*
   1013  1.1     elric 	 * apply last round and
   1014  1.1     elric 	 * map cipher state to byte array block:
   1015  1.1     elric 	 */
   1016  1.1     elric 	s0 =
   1017  1.1     elric 		(Te4[(t0 >> 24)       ] & 0xff000000) ^
   1018  1.1     elric 		(Te4[(t1 >> 16) & 0xff] & 0x00ff0000) ^
   1019  1.1     elric 		(Te4[(t2 >>  8) & 0xff] & 0x0000ff00) ^
   1020  1.1     elric 		(Te4[(t3      ) & 0xff] & 0x000000ff) ^
   1021  1.1     elric 		rk[0];
   1022  1.1     elric 	PUTU32(ct     , s0);
   1023  1.1     elric 	s1 =
   1024  1.1     elric 		(Te4[(t1 >> 24)       ] & 0xff000000) ^
   1025  1.1     elric 		(Te4[(t2 >> 16) & 0xff] & 0x00ff0000) ^
   1026  1.1     elric 		(Te4[(t3 >>  8) & 0xff] & 0x0000ff00) ^
   1027  1.1     elric 		(Te4[(t0      ) & 0xff] & 0x000000ff) ^
   1028  1.1     elric 		rk[1];
   1029  1.1     elric 	PUTU32(ct +  4, s1);
   1030  1.1     elric 	s2 =
   1031  1.1     elric 		(Te4[(t2 >> 24)       ] & 0xff000000) ^
   1032  1.1     elric 		(Te4[(t3 >> 16) & 0xff] & 0x00ff0000) ^
   1033  1.1     elric 		(Te4[(t0 >>  8) & 0xff] & 0x0000ff00) ^
   1034  1.1     elric 		(Te4[(t1      ) & 0xff] & 0x000000ff) ^
   1035  1.1     elric 		rk[2];
   1036  1.1     elric 	PUTU32(ct +  8, s2);
   1037  1.1     elric 	s3 =
   1038  1.1     elric 		(Te4[(t3 >> 24)       ] & 0xff000000) ^
   1039  1.1     elric 		(Te4[(t0 >> 16) & 0xff] & 0x00ff0000) ^
   1040  1.1     elric 		(Te4[(t1 >>  8) & 0xff] & 0x0000ff00) ^
   1041  1.1     elric 		(Te4[(t2      ) & 0xff] & 0x000000ff) ^
   1042  1.1     elric 		rk[3];
   1043  1.1     elric 	PUTU32(ct + 12, s3);
   1044  1.1     elric }
   1045  1.1     elric 
   1046  1.1     elric void rijndaelDecrypt(const uint32_t rk[/*4*(Nr + 1)*/], int Nr, const uint8_t ct[16], uint8_t pt[16]) {
   1047  1.1     elric 	uint32_t s0, s1, s2, s3, t0, t1, t2, t3;
   1048  1.1     elric #ifndef FULL_UNROLL
   1049  1.1     elric     int r;
   1050  1.1     elric #endif /* ?FULL_UNROLL */
   1051  1.1     elric 
   1052  1.1     elric     /*
   1053  1.1     elric 	 * map byte array block to cipher state
   1054  1.1     elric 	 * and add initial round key:
   1055  1.1     elric 	 */
   1056  1.1     elric     s0 = GETU32(ct     ) ^ rk[0];
   1057  1.1     elric     s1 = GETU32(ct +  4) ^ rk[1];
   1058  1.1     elric     s2 = GETU32(ct +  8) ^ rk[2];
   1059  1.1     elric     s3 = GETU32(ct + 12) ^ rk[3];
   1060  1.1     elric #ifdef FULL_UNROLL
   1061  1.1     elric     /* round 1: */
   1062  1.1     elric     t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[ 4];
   1063  1.1     elric     t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[ 5];
   1064  1.1     elric     t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[ 6];
   1065  1.1     elric     t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[ 7];
   1066  1.1     elric     /* round 2: */
   1067  1.1     elric     s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[ 8];
   1068  1.1     elric     s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[ 9];
   1069  1.1     elric     s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[10];
   1070  1.1     elric     s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[11];
   1071  1.1     elric     /* round 3: */
   1072  1.1     elric     t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[12];
   1073  1.1     elric     t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[13];
   1074  1.1     elric     t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[14];
   1075  1.1     elric     t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[15];
   1076  1.1     elric     /* round 4: */
   1077  1.1     elric     s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[16];
   1078  1.1     elric     s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[17];
   1079  1.1     elric     s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[18];
   1080  1.1     elric     s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[19];
   1081  1.1     elric     /* round 5: */
   1082  1.1     elric     t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[20];
   1083  1.1     elric     t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[21];
   1084  1.1     elric     t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[22];
   1085  1.1     elric     t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[23];
   1086  1.1     elric     /* round 6: */
   1087  1.1     elric     s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[24];
   1088  1.1     elric     s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[25];
   1089  1.1     elric     s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[26];
   1090  1.1     elric     s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[27];
   1091  1.1     elric     /* round 7: */
   1092  1.1     elric     t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[28];
   1093  1.1     elric     t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[29];
   1094  1.1     elric     t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[30];
   1095  1.1     elric     t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[31];
   1096  1.1     elric     /* round 8: */
   1097  1.1     elric     s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[32];
   1098  1.1     elric     s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[33];
   1099  1.1     elric     s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[34];
   1100  1.1     elric     s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[35];
   1101  1.1     elric     /* round 9: */
   1102  1.1     elric     t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[36];
   1103  1.1     elric     t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[37];
   1104  1.1     elric     t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[38];
   1105  1.1     elric     t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[39];
   1106  1.1     elric     if (Nr > 10) {
   1107  1.1     elric         /* round 10: */
   1108  1.1     elric         s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[40];
   1109  1.1     elric         s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[41];
   1110  1.1     elric         s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[42];
   1111  1.1     elric         s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[43];
   1112  1.1     elric         /* round 11: */
   1113  1.1     elric         t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[44];
   1114  1.1     elric         t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[45];
   1115  1.1     elric         t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[46];
   1116  1.1     elric         t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[47];
   1117  1.1     elric         if (Nr > 12) {
   1118  1.1     elric             /* round 12: */
   1119  1.1     elric             s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[48];
   1120  1.1     elric             s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[49];
   1121  1.1     elric             s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[50];
   1122  1.1     elric             s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[51];
   1123  1.1     elric             /* round 13: */
   1124  1.1     elric             t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[52];
   1125  1.1     elric             t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[53];
   1126  1.1     elric             t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[54];
   1127  1.1     elric             t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[55];
   1128  1.1     elric         }
   1129  1.1     elric     }
   1130  1.1     elric 	rk += Nr << 2;
   1131  1.1     elric #else  /* !FULL_UNROLL */
   1132  1.1     elric     /*
   1133  1.1     elric      * Nr - 1 full rounds:
   1134  1.1     elric      */
   1135  1.1     elric     r = Nr >> 1;
   1136  1.1     elric     for (;;) {
   1137  1.1     elric         t0 =
   1138  1.1     elric             Td0[(s0 >> 24)       ] ^
   1139  1.1     elric             Td1[(s3 >> 16) & 0xff] ^
   1140  1.1     elric             Td2[(s2 >>  8) & 0xff] ^
   1141  1.1     elric             Td3[(s1      ) & 0xff] ^
   1142  1.1     elric             rk[4];
   1143  1.1     elric         t1 =
   1144  1.1     elric             Td0[(s1 >> 24)       ] ^
   1145  1.1     elric             Td1[(s0 >> 16) & 0xff] ^
   1146  1.1     elric             Td2[(s3 >>  8) & 0xff] ^
   1147  1.1     elric             Td3[(s2      ) & 0xff] ^
   1148  1.1     elric             rk[5];
   1149  1.1     elric         t2 =
   1150  1.1     elric             Td0[(s2 >> 24)       ] ^
   1151  1.1     elric             Td1[(s1 >> 16) & 0xff] ^
   1152  1.1     elric             Td2[(s0 >>  8) & 0xff] ^
   1153  1.1     elric             Td3[(s3      ) & 0xff] ^
   1154  1.1     elric             rk[6];
   1155  1.1     elric         t3 =
   1156  1.1     elric             Td0[(s3 >> 24)       ] ^
   1157  1.1     elric             Td1[(s2 >> 16) & 0xff] ^
   1158  1.1     elric             Td2[(s1 >>  8) & 0xff] ^
   1159  1.1     elric             Td3[(s0      ) & 0xff] ^
   1160  1.1     elric             rk[7];
   1161  1.1     elric 
   1162  1.1     elric         rk += 8;
   1163  1.1     elric         if (--r == 0) {
   1164  1.1     elric             break;
   1165  1.1     elric         }
   1166  1.1     elric 
   1167  1.1     elric         s0 =
   1168  1.1     elric             Td0[(t0 >> 24)       ] ^
   1169  1.1     elric             Td1[(t3 >> 16) & 0xff] ^
   1170  1.1     elric             Td2[(t2 >>  8) & 0xff] ^
   1171  1.1     elric             Td3[(t1      ) & 0xff] ^
   1172  1.1     elric             rk[0];
   1173  1.1     elric         s1 =
   1174  1.1     elric             Td0[(t1 >> 24)       ] ^
   1175  1.1     elric             Td1[(t0 >> 16) & 0xff] ^
   1176  1.1     elric             Td2[(t3 >>  8) & 0xff] ^
   1177  1.1     elric             Td3[(t2      ) & 0xff] ^
   1178  1.1     elric             rk[1];
   1179  1.1     elric         s2 =
   1180  1.1     elric             Td0[(t2 >> 24)       ] ^
   1181  1.1     elric             Td1[(t1 >> 16) & 0xff] ^
   1182  1.1     elric             Td2[(t0 >>  8) & 0xff] ^
   1183  1.1     elric             Td3[(t3      ) & 0xff] ^
   1184  1.1     elric             rk[2];
   1185  1.1     elric         s3 =
   1186  1.1     elric             Td0[(t3 >> 24)       ] ^
   1187  1.1     elric             Td1[(t2 >> 16) & 0xff] ^
   1188  1.1     elric             Td2[(t1 >>  8) & 0xff] ^
   1189  1.1     elric             Td3[(t0      ) & 0xff] ^
   1190  1.1     elric             rk[3];
   1191  1.1     elric     }
   1192  1.1     elric #endif /* ?FULL_UNROLL */
   1193  1.1     elric     /*
   1194  1.1     elric 	 * apply last round and
   1195  1.1     elric 	 * map cipher state to byte array block:
   1196  1.1     elric 	 */
   1197  1.1     elric    	s0 =
   1198  1.1     elric    		(Td4[(t0 >> 24)       ] & 0xff000000) ^
   1199  1.1     elric    		(Td4[(t3 >> 16) & 0xff] & 0x00ff0000) ^
   1200  1.1     elric    		(Td4[(t2 >>  8) & 0xff] & 0x0000ff00) ^
   1201  1.1     elric    		(Td4[(t1      ) & 0xff] & 0x000000ff) ^
   1202  1.1     elric    		rk[0];
   1203  1.1     elric 	PUTU32(pt     , s0);
   1204  1.1     elric    	s1 =
   1205  1.1     elric    		(Td4[(t1 >> 24)       ] & 0xff000000) ^
   1206  1.1     elric    		(Td4[(t0 >> 16) & 0xff] & 0x00ff0000) ^
   1207  1.1     elric    		(Td4[(t3 >>  8) & 0xff] & 0x0000ff00) ^
   1208  1.1     elric    		(Td4[(t2      ) & 0xff] & 0x000000ff) ^
   1209  1.1     elric    		rk[1];
   1210  1.1     elric 	PUTU32(pt +  4, s1);
   1211  1.1     elric    	s2 =
   1212  1.1     elric    		(Td4[(t2 >> 24)       ] & 0xff000000) ^
   1213  1.1     elric    		(Td4[(t1 >> 16) & 0xff] & 0x00ff0000) ^
   1214  1.1     elric    		(Td4[(t0 >>  8) & 0xff] & 0x0000ff00) ^
   1215  1.1     elric    		(Td4[(t3      ) & 0xff] & 0x000000ff) ^
   1216  1.1     elric    		rk[2];
   1217  1.1     elric 	PUTU32(pt +  8, s2);
   1218  1.1     elric    	s3 =
   1219  1.1     elric    		(Td4[(t3 >> 24)       ] & 0xff000000) ^
   1220  1.1     elric    		(Td4[(t2 >> 16) & 0xff] & 0x00ff0000) ^
   1221  1.1     elric    		(Td4[(t1 >>  8) & 0xff] & 0x0000ff00) ^
   1222  1.1     elric    		(Td4[(t0      ) & 0xff] & 0x000000ff) ^
   1223  1.1     elric    		rk[3];
   1224  1.1     elric 	PUTU32(pt + 12, s3);
   1225  1.1     elric }
   1226