source: freewrt/package/matrixssl/patches/matrixssl-1.2.4.diff@ 428f140

freewrt_1_0 freewrt_2_0
Last change on this file since 428f140 was 475ad56, checked in by Waldemar Brodkorb <wbx@…>, 20 years ago

add OpenWrt trunk revision 3830.

git-svn-id: svn://www.freewrt.org/trunk/freewrt@1 afb5a338-a214-0410-bd46-81f09a774fd1

  • Property mode set to 100644
File size: 92.2 KB
  • matrixSsl.h

    diff -urN matrixssl.old/matrixSsl.h matrixssl/matrixSsl.h
    old new  
    154154
    155155#define SSL_OPTION_DELETE_SESSION               0
    156156
     157
     158#define SSL_MD5_DIGEST_LENGTH 16
     159#define SSL_MD5_CONTEXT_DATA_SIZE 96
     160
     161typedef struct {
     162        unsigned char data[SSL_MD5_CONTEXT_DATA_SIZE];
     163} sslMd5Context_t;
     164
     165
     166#define SSL_SHA1_DIGEST_LENGTH 20
     167#define SSL_SHA1_CONTEXT_DATA_SIZE 96
     168
     169typedef struct {
     170        unsigned char data[SSL_SHA1_CONTEXT_DATA_SIZE];
     171} sslSha1Context_t;
     172
     173
     174#define SSL_CIPHER_CONTEXT_DATA_SIZE 784
     175
     176typedef struct {
     177        unsigned char data[SSL_CIPHER_CONTEXT_DATA_SIZE];
     178} sslCipherContext_t;
     179
    157180/******************************************************************************/
    158181/*
    159182        Explicitly import these apis on Windows.  If we're being included from the
     
    220243                                                                char *privBuf, int32 privLen, char *privPass,
    221244                                                                char *trustedCABuf, int32 trustedCALen);
    222245
     246
     247/*
     248        ARC4 (RC4) API
     249*/
     250
     251SSLPUBLIC void  matrixArc4Init(sslCipherContext_t *ctx, unsigned char *key,
     252                                                int keylen);
     253
     254SSLPUBLIC int   matrixArc4(sslCipherContext_t *ctx, unsigned char *in,
     255                                                unsigned char *out, int len);
     256
     257/*
     258        3DES (Triple-DES) API
     259*/
     260
     261SSLPUBLIC int   matrix3desInit(sslCipherContext_t *ctx, unsigned char *IV,
     262                                                unsigned char *key, int keylen);
     263
     264SSLPUBLIC int   matrix3desEncrypt(sslCipherContext_t *ctx, unsigned char *pt,
     265                                                unsigned char *ct, int len);
     266
     267SSLPUBLIC int   matrix3desDecrypt(sslCipherContext_t *ctx, unsigned char *ct,
     268                                                unsigned char *pt, int len);
     269
     270/*
     271        AES API
     272*/
     273
     274SSLPUBLIC int   matrixAesInit(sslCipherContext_t *ctx, unsigned char *IV,
     275                                                unsigned char *key, int keylen);
     276
     277SSLPUBLIC int   matrixAesEncrypt(sslCipherContext_t *ctx, unsigned char *pt,
     278                                                unsigned char *ct, int len);
     279
     280SSLPUBLIC int   matrixAesDecrypt(sslCipherContext_t *ctx, unsigned char *ct,
     281                                                unsigned char *pt, int len);
     282
     283/*
     284        MD5 API
     285*/
     286
     287SSLPUBLIC void  matrixMd5Init(sslMd5Context_t *ctx);
     288
     289SSLPUBLIC void  matrixMd5Update(sslMd5Context_t *ctx, const unsigned char *buf,
     290                                                unsigned long len);
     291
     292SSLPUBLIC int   matrixMd5Final(sslMd5Context_t *ctx, unsigned char *hash);
     293
     294SSLPUBLIC unsigned char *matrixMd5Digest(const unsigned char *buf,
     295                                                unsigned long len, unsigned char *hash);
     296
     297/*
     298        SHA1 API
     299*/
     300
     301SSLPUBLIC void  matrixSha1Init(sslSha1Context_t *ctx);
     302
     303SSLPUBLIC void  matrixSha1Update(sslSha1Context_t *ctx, const unsigned char *buf,
     304                                                unsigned long len);
     305
     306SSLPUBLIC int   matrixSha1Final(sslSha1Context_t *ctx, unsigned char *hash);
     307
     308SSLPUBLIC unsigned char *matrixSha1Digest(const unsigned char *buf,
     309                                                unsigned long len, unsigned char *hash);
     310
    223311/******************************************************************************/
    224312
    225313#ifdef __cplusplus
  • src/crypto/cryptoLayer.h

    diff -urN matrixssl.old/src/crypto/cryptoLayer.h matrixssl/src/crypto/cryptoLayer.h
    old new  
    115115*/
    116116/* #define USE_FULL_CERT_PARSE */
    117117/* #define USE_MD2 */
     118#define USE_AES
    118119
    119120/*
    120121        Now that we've set up the required defines, include the crypto layer header
  • src/crypto/peersec/aes.c

    diff -urN matrixssl.old/src/crypto/peersec/aes.c matrixssl/src/crypto/peersec/aes.c
    old new  
     1/*
     2 *      aes.c
     3 *
     4 *      AES CBC block cipher implementation
     5 */
     6/*
     7 *      Copyright (c) PeerSec Networks, 2002-2004. All Rights Reserved.
     8 *      The latest version of this code is available at http://www.matrixssl.org
     9 *
     10 *      This software is open source; you can redistribute it and/or modify
     11 *      it under the terms of the GNU General Public License as published by
     12 *      the Free Software Foundation; either version 2 of the License, or
     13 *      (at your option) any later version.
     14 *
     15 *      This General Public License does NOT permit incorporating this software
     16 *      into proprietary programs.  If you are unable to comply with the GPL, a
     17 *      commercial license for this software may be purchased from PeerSec Networks
     18 *      at http://www.peersec.com
     19 *     
     20 *      This program is distributed in WITHOUT ANY WARRANTY; without even the
     21 *      implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     22 *      See the GNU General Public License for more details.
     23 *     
     24 *      You should have received a copy of the GNU General Public License
     25 *      along with this program; if not, write to the Free Software
     26 *      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
     27 *      http://www.gnu.org/copyleft/gpl.html
     28 */
     29/******************************************************************************/
     30
     31#include "../cryptoLayer.h"
     32
     33#ifdef USE_AES
     34
     35/* The precomputed tables for AES */
     36/*
     37Te0[x] = S [x].[02, 01, 01, 03];
     38Te1[x] = S [x].[03, 02, 01, 01];
     39Te2[x] = S [x].[01, 03, 02, 01];
     40Te3[x] = S [x].[01, 01, 03, 02];
     41Te4[x] = S [x].[01, 01, 01, 01];
     42
     43Td0[x] = Si[x].[0e, 09, 0d, 0b];
     44Td1[x] = Si[x].[0b, 0e, 09, 0d];
     45Td2[x] = Si[x].[0d, 0b, 0e, 09];
     46Td3[x] = Si[x].[09, 0d, 0b, 0e];
     47Td4[x] = Si[x].[01, 01, 01, 01];
     48*/
     49
     50static const ulong32 TE0[256] = {
     51    0xc66363a5UL, 0xf87c7c84UL, 0xee777799UL, 0xf67b7b8dUL,
     52    0xfff2f20dUL, 0xd66b6bbdUL, 0xde6f6fb1UL, 0x91c5c554UL,
     53    0x60303050UL, 0x02010103UL, 0xce6767a9UL, 0x562b2b7dUL,
     54    0xe7fefe19UL, 0xb5d7d762UL, 0x4dababe6UL, 0xec76769aUL,
     55    0x8fcaca45UL, 0x1f82829dUL, 0x89c9c940UL, 0xfa7d7d87UL,
     56    0xeffafa15UL, 0xb25959ebUL, 0x8e4747c9UL, 0xfbf0f00bUL,
     57    0x41adadecUL, 0xb3d4d467UL, 0x5fa2a2fdUL, 0x45afafeaUL,
     58    0x239c9cbfUL, 0x53a4a4f7UL, 0xe4727296UL, 0x9bc0c05bUL,
     59    0x75b7b7c2UL, 0xe1fdfd1cUL, 0x3d9393aeUL, 0x4c26266aUL,
     60    0x6c36365aUL, 0x7e3f3f41UL, 0xf5f7f702UL, 0x83cccc4fUL,
     61    0x6834345cUL, 0x51a5a5f4UL, 0xd1e5e534UL, 0xf9f1f108UL,
     62    0xe2717193UL, 0xabd8d873UL, 0x62313153UL, 0x2a15153fUL,
     63    0x0804040cUL, 0x95c7c752UL, 0x46232365UL, 0x9dc3c35eUL,
     64    0x30181828UL, 0x379696a1UL, 0x0a05050fUL, 0x2f9a9ab5UL,
     65    0x0e070709UL, 0x24121236UL, 0x1b80809bUL, 0xdfe2e23dUL,
     66    0xcdebeb26UL, 0x4e272769UL, 0x7fb2b2cdUL, 0xea75759fUL,
     67    0x1209091bUL, 0x1d83839eUL, 0x582c2c74UL, 0x341a1a2eUL,
     68    0x361b1b2dUL, 0xdc6e6eb2UL, 0xb45a5aeeUL, 0x5ba0a0fbUL,
     69    0xa45252f6UL, 0x763b3b4dUL, 0xb7d6d661UL, 0x7db3b3ceUL,
     70    0x5229297bUL, 0xdde3e33eUL, 0x5e2f2f71UL, 0x13848497UL,
     71    0xa65353f5UL, 0xb9d1d168UL, 0x00000000UL, 0xc1eded2cUL,
     72    0x40202060UL, 0xe3fcfc1fUL, 0x79b1b1c8UL, 0xb65b5bedUL,
     73    0xd46a6abeUL, 0x8dcbcb46UL, 0x67bebed9UL, 0x7239394bUL,
     74    0x944a4adeUL, 0x984c4cd4UL, 0xb05858e8UL, 0x85cfcf4aUL,
     75    0xbbd0d06bUL, 0xc5efef2aUL, 0x4faaaae5UL, 0xedfbfb16UL,
     76    0x864343c5UL, 0x9a4d4dd7UL, 0x66333355UL, 0x11858594UL,
     77    0x8a4545cfUL, 0xe9f9f910UL, 0x04020206UL, 0xfe7f7f81UL,
     78    0xa05050f0UL, 0x783c3c44UL, 0x259f9fbaUL, 0x4ba8a8e3UL,
     79    0xa25151f3UL, 0x5da3a3feUL, 0x804040c0UL, 0x058f8f8aUL,
     80    0x3f9292adUL, 0x219d9dbcUL, 0x70383848UL, 0xf1f5f504UL,
     81    0x63bcbcdfUL, 0x77b6b6c1UL, 0xafdada75UL, 0x42212163UL,
     82    0x20101030UL, 0xe5ffff1aUL, 0xfdf3f30eUL, 0xbfd2d26dUL,
     83    0x81cdcd4cUL, 0x180c0c14UL, 0x26131335UL, 0xc3ecec2fUL,
     84    0xbe5f5fe1UL, 0x359797a2UL, 0x884444ccUL, 0x2e171739UL,
     85    0x93c4c457UL, 0x55a7a7f2UL, 0xfc7e7e82UL, 0x7a3d3d47UL,
     86    0xc86464acUL, 0xba5d5de7UL, 0x3219192bUL, 0xe6737395UL,
     87    0xc06060a0UL, 0x19818198UL, 0x9e4f4fd1UL, 0xa3dcdc7fUL,
     88    0x44222266UL, 0x542a2a7eUL, 0x3b9090abUL, 0x0b888883UL,
     89    0x8c4646caUL, 0xc7eeee29UL, 0x6bb8b8d3UL, 0x2814143cUL,
     90    0xa7dede79UL, 0xbc5e5ee2UL, 0x160b0b1dUL, 0xaddbdb76UL,
     91    0xdbe0e03bUL, 0x64323256UL, 0x743a3a4eUL, 0x140a0a1eUL,
     92    0x924949dbUL, 0x0c06060aUL, 0x4824246cUL, 0xb85c5ce4UL,
     93    0x9fc2c25dUL, 0xbdd3d36eUL, 0x43acacefUL, 0xc46262a6UL,
     94    0x399191a8UL, 0x319595a4UL, 0xd3e4e437UL, 0xf279798bUL,
     95    0xd5e7e732UL, 0x8bc8c843UL, 0x6e373759UL, 0xda6d6db7UL,
     96    0x018d8d8cUL, 0xb1d5d564UL, 0x9c4e4ed2UL, 0x49a9a9e0UL,
     97    0xd86c6cb4UL, 0xac5656faUL, 0xf3f4f407UL, 0xcfeaea25UL,
     98    0xca6565afUL, 0xf47a7a8eUL, 0x47aeaee9UL, 0x10080818UL,
     99    0x6fbabad5UL, 0xf0787888UL, 0x4a25256fUL, 0x5c2e2e72UL,
     100    0x381c1c24UL, 0x57a6a6f1UL, 0x73b4b4c7UL, 0x97c6c651UL,
     101    0xcbe8e823UL, 0xa1dddd7cUL, 0xe874749cUL, 0x3e1f1f21UL,
     102    0x964b4bddUL, 0x61bdbddcUL, 0x0d8b8b86UL, 0x0f8a8a85UL,
     103    0xe0707090UL, 0x7c3e3e42UL, 0x71b5b5c4UL, 0xcc6666aaUL,
     104    0x904848d8UL, 0x06030305UL, 0xf7f6f601UL, 0x1c0e0e12UL,
     105    0xc26161a3UL, 0x6a35355fUL, 0xae5757f9UL, 0x69b9b9d0UL,
     106    0x17868691UL, 0x99c1c158UL, 0x3a1d1d27UL, 0x279e9eb9UL,
     107    0xd9e1e138UL, 0xebf8f813UL, 0x2b9898b3UL, 0x22111133UL,
     108    0xd26969bbUL, 0xa9d9d970UL, 0x078e8e89UL, 0x339494a7UL,
     109    0x2d9b9bb6UL, 0x3c1e1e22UL, 0x15878792UL, 0xc9e9e920UL,
     110    0x87cece49UL, 0xaa5555ffUL, 0x50282878UL, 0xa5dfdf7aUL,
     111    0x038c8c8fUL, 0x59a1a1f8UL, 0x09898980UL, 0x1a0d0d17UL,
     112    0x65bfbfdaUL, 0xd7e6e631UL, 0x844242c6UL, 0xd06868b8UL,
     113    0x824141c3UL, 0x299999b0UL, 0x5a2d2d77UL, 0x1e0f0f11UL,
     114    0x7bb0b0cbUL, 0xa85454fcUL, 0x6dbbbbd6UL, 0x2c16163aUL,
     115};
     116
     117static const ulong32 Te4[256] = {
     118    0x63636363UL, 0x7c7c7c7cUL, 0x77777777UL, 0x7b7b7b7bUL,
     119    0xf2f2f2f2UL, 0x6b6b6b6bUL, 0x6f6f6f6fUL, 0xc5c5c5c5UL,
     120    0x30303030UL, 0x01010101UL, 0x67676767UL, 0x2b2b2b2bUL,
     121    0xfefefefeUL, 0xd7d7d7d7UL, 0xababababUL, 0x76767676UL,
     122    0xcacacacaUL, 0x82828282UL, 0xc9c9c9c9UL, 0x7d7d7d7dUL,
     123    0xfafafafaUL, 0x59595959UL, 0x47474747UL, 0xf0f0f0f0UL,
     124    0xadadadadUL, 0xd4d4d4d4UL, 0xa2a2a2a2UL, 0xafafafafUL,
     125    0x9c9c9c9cUL, 0xa4a4a4a4UL, 0x72727272UL, 0xc0c0c0c0UL,
     126    0xb7b7b7b7UL, 0xfdfdfdfdUL, 0x93939393UL, 0x26262626UL,
     127    0x36363636UL, 0x3f3f3f3fUL, 0xf7f7f7f7UL, 0xccccccccUL,
     128    0x34343434UL, 0xa5a5a5a5UL, 0xe5e5e5e5UL, 0xf1f1f1f1UL,
     129    0x71717171UL, 0xd8d8d8d8UL, 0x31313131UL, 0x15151515UL,
     130    0x04040404UL, 0xc7c7c7c7UL, 0x23232323UL, 0xc3c3c3c3UL,
     131    0x18181818UL, 0x96969696UL, 0x05050505UL, 0x9a9a9a9aUL,
     132    0x07070707UL, 0x12121212UL, 0x80808080UL, 0xe2e2e2e2UL,
     133    0xebebebebUL, 0x27272727UL, 0xb2b2b2b2UL, 0x75757575UL,
     134    0x09090909UL, 0x83838383UL, 0x2c2c2c2cUL, 0x1a1a1a1aUL,
     135    0x1b1b1b1bUL, 0x6e6e6e6eUL, 0x5a5a5a5aUL, 0xa0a0a0a0UL,
     136    0x52525252UL, 0x3b3b3b3bUL, 0xd6d6d6d6UL, 0xb3b3b3b3UL,
     137    0x29292929UL, 0xe3e3e3e3UL, 0x2f2f2f2fUL, 0x84848484UL,
     138    0x53535353UL, 0xd1d1d1d1UL, 0x00000000UL, 0xededededUL,
     139    0x20202020UL, 0xfcfcfcfcUL, 0xb1b1b1b1UL, 0x5b5b5b5bUL,
     140    0x6a6a6a6aUL, 0xcbcbcbcbUL, 0xbebebebeUL, 0x39393939UL,
     141    0x4a4a4a4aUL, 0x4c4c4c4cUL, 0x58585858UL, 0xcfcfcfcfUL,
     142    0xd0d0d0d0UL, 0xefefefefUL, 0xaaaaaaaaUL, 0xfbfbfbfbUL,
     143    0x43434343UL, 0x4d4d4d4dUL, 0x33333333UL, 0x85858585UL,
     144    0x45454545UL, 0xf9f9f9f9UL, 0x02020202UL, 0x7f7f7f7fUL,
     145    0x50505050UL, 0x3c3c3c3cUL, 0x9f9f9f9fUL, 0xa8a8a8a8UL,
     146    0x51515151UL, 0xa3a3a3a3UL, 0x40404040UL, 0x8f8f8f8fUL,
     147    0x92929292UL, 0x9d9d9d9dUL, 0x38383838UL, 0xf5f5f5f5UL,
     148    0xbcbcbcbcUL, 0xb6b6b6b6UL, 0xdadadadaUL, 0x21212121UL,
     149    0x10101010UL, 0xffffffffUL, 0xf3f3f3f3UL, 0xd2d2d2d2UL,
     150    0xcdcdcdcdUL, 0x0c0c0c0cUL, 0x13131313UL, 0xececececUL,
     151    0x5f5f5f5fUL, 0x97979797UL, 0x44444444UL, 0x17171717UL,
     152    0xc4c4c4c4UL, 0xa7a7a7a7UL, 0x7e7e7e7eUL, 0x3d3d3d3dUL,
     153    0x64646464UL, 0x5d5d5d5dUL, 0x19191919UL, 0x73737373UL,
     154    0x60606060UL, 0x81818181UL, 0x4f4f4f4fUL, 0xdcdcdcdcUL,
     155    0x22222222UL, 0x2a2a2a2aUL, 0x90909090UL, 0x88888888UL,
     156    0x46464646UL, 0xeeeeeeeeUL, 0xb8b8b8b8UL, 0x14141414UL,
     157    0xdedededeUL, 0x5e5e5e5eUL, 0x0b0b0b0bUL, 0xdbdbdbdbUL,
     158    0xe0e0e0e0UL, 0x32323232UL, 0x3a3a3a3aUL, 0x0a0a0a0aUL,
     159    0x49494949UL, 0x06060606UL, 0x24242424UL, 0x5c5c5c5cUL,
     160    0xc2c2c2c2UL, 0xd3d3d3d3UL, 0xacacacacUL, 0x62626262UL,
     161    0x91919191UL, 0x95959595UL, 0xe4e4e4e4UL, 0x79797979UL,
     162    0xe7e7e7e7UL, 0xc8c8c8c8UL, 0x37373737UL, 0x6d6d6d6dUL,
     163    0x8d8d8d8dUL, 0xd5d5d5d5UL, 0x4e4e4e4eUL, 0xa9a9a9a9UL,
     164    0x6c6c6c6cUL, 0x56565656UL, 0xf4f4f4f4UL, 0xeaeaeaeaUL,
     165    0x65656565UL, 0x7a7a7a7aUL, 0xaeaeaeaeUL, 0x08080808UL,
     166    0xbabababaUL, 0x78787878UL, 0x25252525UL, 0x2e2e2e2eUL,
     167    0x1c1c1c1cUL, 0xa6a6a6a6UL, 0xb4b4b4b4UL, 0xc6c6c6c6UL,
     168    0xe8e8e8e8UL, 0xddddddddUL, 0x74747474UL, 0x1f1f1f1fUL,
     169    0x4b4b4b4bUL, 0xbdbdbdbdUL, 0x8b8b8b8bUL, 0x8a8a8a8aUL,
     170    0x70707070UL, 0x3e3e3e3eUL, 0xb5b5b5b5UL, 0x66666666UL,
     171    0x48484848UL, 0x03030303UL, 0xf6f6f6f6UL, 0x0e0e0e0eUL,
     172    0x61616161UL, 0x35353535UL, 0x57575757UL, 0xb9b9b9b9UL,
     173    0x86868686UL, 0xc1c1c1c1UL, 0x1d1d1d1dUL, 0x9e9e9e9eUL,
     174    0xe1e1e1e1UL, 0xf8f8f8f8UL, 0x98989898UL, 0x11111111UL,
     175    0x69696969UL, 0xd9d9d9d9UL, 0x8e8e8e8eUL, 0x94949494UL,
     176    0x9b9b9b9bUL, 0x1e1e1e1eUL, 0x87878787UL, 0xe9e9e9e9UL,
     177    0xcecececeUL, 0x55555555UL, 0x28282828UL, 0xdfdfdfdfUL,
     178    0x8c8c8c8cUL, 0xa1a1a1a1UL, 0x89898989UL, 0x0d0d0d0dUL,
     179    0xbfbfbfbfUL, 0xe6e6e6e6UL, 0x42424242UL, 0x68686868UL,
     180    0x41414141UL, 0x99999999UL, 0x2d2d2d2dUL, 0x0f0f0f0fUL,
     181    0xb0b0b0b0UL, 0x54545454UL, 0xbbbbbbbbUL, 0x16161616UL,
     182};
     183
     184static const ulong32 TD0[256] = {
     185    0x51f4a750UL, 0x7e416553UL, 0x1a17a4c3UL, 0x3a275e96UL,
     186    0x3bab6bcbUL, 0x1f9d45f1UL, 0xacfa58abUL, 0x4be30393UL,
     187    0x2030fa55UL, 0xad766df6UL, 0x88cc7691UL, 0xf5024c25UL,
     188    0x4fe5d7fcUL, 0xc52acbd7UL, 0x26354480UL, 0xb562a38fUL,
     189    0xdeb15a49UL, 0x25ba1b67UL, 0x45ea0e98UL, 0x5dfec0e1UL,
     190    0xc32f7502UL, 0x814cf012UL, 0x8d4697a3UL, 0x6bd3f9c6UL,
     191    0x038f5fe7UL, 0x15929c95UL, 0xbf6d7aebUL, 0x955259daUL,
     192    0xd4be832dUL, 0x587421d3UL, 0x49e06929UL, 0x8ec9c844UL,
     193    0x75c2896aUL, 0xf48e7978UL, 0x99583e6bUL, 0x27b971ddUL,
     194    0xbee14fb6UL, 0xf088ad17UL, 0xc920ac66UL, 0x7dce3ab4UL,
     195    0x63df4a18UL, 0xe51a3182UL, 0x97513360UL, 0x62537f45UL,
     196    0xb16477e0UL, 0xbb6bae84UL, 0xfe81a01cUL, 0xf9082b94UL,
     197    0x70486858UL, 0x8f45fd19UL, 0x94de6c87UL, 0x527bf8b7UL,
     198    0xab73d323UL, 0x724b02e2UL, 0xe31f8f57UL, 0x6655ab2aUL,
     199    0xb2eb2807UL, 0x2fb5c203UL, 0x86c57b9aUL, 0xd33708a5UL,
     200    0x302887f2UL, 0x23bfa5b2UL, 0x02036abaUL, 0xed16825cUL,
     201    0x8acf1c2bUL, 0xa779b492UL, 0xf307f2f0UL, 0x4e69e2a1UL,
     202    0x65daf4cdUL, 0x0605bed5UL, 0xd134621fUL, 0xc4a6fe8aUL,
     203    0x342e539dUL, 0xa2f355a0UL, 0x058ae132UL, 0xa4f6eb75UL,
     204    0x0b83ec39UL, 0x4060efaaUL, 0x5e719f06UL, 0xbd6e1051UL,
     205    0x3e218af9UL, 0x96dd063dUL, 0xdd3e05aeUL, 0x4de6bd46UL,
     206    0x91548db5UL, 0x71c45d05UL, 0x0406d46fUL, 0x605015ffUL,
     207    0x1998fb24UL, 0xd6bde997UL, 0x894043ccUL, 0x67d99e77UL,
     208    0xb0e842bdUL, 0x07898b88UL, 0xe7195b38UL, 0x79c8eedbUL,
     209    0xa17c0a47UL, 0x7c420fe9UL, 0xf8841ec9UL, 0x00000000UL,
     210    0x09808683UL, 0x322bed48UL, 0x1e1170acUL, 0x6c5a724eUL,
     211    0xfd0efffbUL, 0x0f853856UL, 0x3daed51eUL, 0x362d3927UL,
     212    0x0a0fd964UL, 0x685ca621UL, 0x9b5b54d1UL, 0x24362e3aUL,
     213    0x0c0a67b1UL, 0x9357e70fUL, 0xb4ee96d2UL, 0x1b9b919eUL,
     214    0x80c0c54fUL, 0x61dc20a2UL, 0x5a774b69UL, 0x1c121a16UL,
     215    0xe293ba0aUL, 0xc0a02ae5UL, 0x3c22e043UL, 0x121b171dUL,
     216    0x0e090d0bUL, 0xf28bc7adUL, 0x2db6a8b9UL, 0x141ea9c8UL,
     217    0x57f11985UL, 0xaf75074cUL, 0xee99ddbbUL, 0xa37f60fdUL,
     218    0xf701269fUL, 0x5c72f5bcUL, 0x44663bc5UL, 0x5bfb7e34UL,
     219    0x8b432976UL, 0xcb23c6dcUL, 0xb6edfc68UL, 0xb8e4f163UL,
     220    0xd731dccaUL, 0x42638510UL, 0x13972240UL, 0x84c61120UL,
     221    0x854a247dUL, 0xd2bb3df8UL, 0xaef93211UL, 0xc729a16dUL,
     222    0x1d9e2f4bUL, 0xdcb230f3UL, 0x0d8652ecUL, 0x77c1e3d0UL,
     223    0x2bb3166cUL, 0xa970b999UL, 0x119448faUL, 0x47e96422UL,
     224    0xa8fc8cc4UL, 0xa0f03f1aUL, 0x567d2cd8UL, 0x223390efUL,
     225    0x87494ec7UL, 0xd938d1c1UL, 0x8ccaa2feUL, 0x98d40b36UL,
     226    0xa6f581cfUL, 0xa57ade28UL, 0xdab78e26UL, 0x3fadbfa4UL,
     227    0x2c3a9de4UL, 0x5078920dUL, 0x6a5fcc9bUL, 0x547e4662UL,
     228    0xf68d13c2UL, 0x90d8b8e8UL, 0x2e39f75eUL, 0x82c3aff5UL,
     229    0x9f5d80beUL, 0x69d0937cUL, 0x6fd52da9UL, 0xcf2512b3UL,
     230    0xc8ac993bUL, 0x10187da7UL, 0xe89c636eUL, 0xdb3bbb7bUL,
     231    0xcd267809UL, 0x6e5918f4UL, 0xec9ab701UL, 0x834f9aa8UL,
     232    0xe6956e65UL, 0xaaffe67eUL, 0x21bccf08UL, 0xef15e8e6UL,
     233    0xbae79bd9UL, 0x4a6f36ceUL, 0xea9f09d4UL, 0x29b07cd6UL,
     234    0x31a4b2afUL, 0x2a3f2331UL, 0xc6a59430UL, 0x35a266c0UL,
     235    0x744ebc37UL, 0xfc82caa6UL, 0xe090d0b0UL, 0x33a7d815UL,
     236    0xf104984aUL, 0x41ecdaf7UL, 0x7fcd500eUL, 0x1791f62fUL,
     237    0x764dd68dUL, 0x43efb04dUL, 0xccaa4d54UL, 0xe49604dfUL,
     238    0x9ed1b5e3UL, 0x4c6a881bUL, 0xc12c1fb8UL, 0x4665517fUL,
     239    0x9d5eea04UL, 0x018c355dUL, 0xfa877473UL, 0xfb0b412eUL,
     240    0xb3671d5aUL, 0x92dbd252UL, 0xe9105633UL, 0x6dd64713UL,
     241    0x9ad7618cUL, 0x37a10c7aUL, 0x59f8148eUL, 0xeb133c89UL,
     242    0xcea927eeUL, 0xb761c935UL, 0xe11ce5edUL, 0x7a47b13cUL,
     243    0x9cd2df59UL, 0x55f2733fUL, 0x1814ce79UL, 0x73c737bfUL,
     244    0x53f7cdeaUL, 0x5ffdaa5bUL, 0xdf3d6f14UL, 0x7844db86UL,
     245    0xcaaff381UL, 0xb968c43eUL, 0x3824342cUL, 0xc2a3405fUL,
     246    0x161dc372UL, 0xbce2250cUL, 0x283c498bUL, 0xff0d9541UL,
     247    0x39a80171UL, 0x080cb3deUL, 0xd8b4e49cUL, 0x6456c190UL,
     248    0x7bcb8461UL, 0xd532b670UL, 0x486c5c74UL, 0xd0b85742UL,
     249};
     250
     251static const ulong32 Td4[256] = {
     252    0x52525252UL, 0x09090909UL, 0x6a6a6a6aUL, 0xd5d5d5d5UL,
     253    0x30303030UL, 0x36363636UL, 0xa5a5a5a5UL, 0x38383838UL,
     254    0xbfbfbfbfUL, 0x40404040UL, 0xa3a3a3a3UL, 0x9e9e9e9eUL,
     255    0x81818181UL, 0xf3f3f3f3UL, 0xd7d7d7d7UL, 0xfbfbfbfbUL,
     256    0x7c7c7c7cUL, 0xe3e3e3e3UL, 0x39393939UL, 0x82828282UL,
     257    0x9b9b9b9bUL, 0x2f2f2f2fUL, 0xffffffffUL, 0x87878787UL,
     258    0x34343434UL, 0x8e8e8e8eUL, 0x43434343UL, 0x44444444UL,
     259    0xc4c4c4c4UL, 0xdedededeUL, 0xe9e9e9e9UL, 0xcbcbcbcbUL,
     260    0x54545454UL, 0x7b7b7b7bUL, 0x94949494UL, 0x32323232UL,
     261    0xa6a6a6a6UL, 0xc2c2c2c2UL, 0x23232323UL, 0x3d3d3d3dUL,
     262    0xeeeeeeeeUL, 0x4c4c4c4cUL, 0x95959595UL, 0x0b0b0b0bUL,
     263    0x42424242UL, 0xfafafafaUL, 0xc3c3c3c3UL, 0x4e4e4e4eUL,
     264    0x08080808UL, 0x2e2e2e2eUL, 0xa1a1a1a1UL, 0x66666666UL,
     265    0x28282828UL, 0xd9d9d9d9UL, 0x24242424UL, 0xb2b2b2b2UL,
     266    0x76767676UL, 0x5b5b5b5bUL, 0xa2a2a2a2UL, 0x49494949UL,
     267    0x6d6d6d6dUL, 0x8b8b8b8bUL, 0xd1d1d1d1UL, 0x25252525UL,
     268    0x72727272UL, 0xf8f8f8f8UL, 0xf6f6f6f6UL, 0x64646464UL,
     269    0x86868686UL, 0x68686868UL, 0x98989898UL, 0x16161616UL,
     270    0xd4d4d4d4UL, 0xa4a4a4a4UL, 0x5c5c5c5cUL, 0xccccccccUL,
     271    0x5d5d5d5dUL, 0x65656565UL, 0xb6b6b6b6UL, 0x92929292UL,
     272    0x6c6c6c6cUL, 0x70707070UL, 0x48484848UL, 0x50505050UL,
     273    0xfdfdfdfdUL, 0xededededUL, 0xb9b9b9b9UL, 0xdadadadaUL,
     274    0x5e5e5e5eUL, 0x15151515UL, 0x46464646UL, 0x57575757UL,
     275    0xa7a7a7a7UL, 0x8d8d8d8dUL, 0x9d9d9d9dUL, 0x84848484UL,
     276    0x90909090UL, 0xd8d8d8d8UL, 0xababababUL, 0x00000000UL,
     277    0x8c8c8c8cUL, 0xbcbcbcbcUL, 0xd3d3d3d3UL, 0x0a0a0a0aUL,
     278    0xf7f7f7f7UL, 0xe4e4e4e4UL, 0x58585858UL, 0x05050505UL,
     279    0xb8b8b8b8UL, 0xb3b3b3b3UL, 0x45454545UL, 0x06060606UL,
     280    0xd0d0d0d0UL, 0x2c2c2c2cUL, 0x1e1e1e1eUL, 0x8f8f8f8fUL,
     281    0xcacacacaUL, 0x3f3f3f3fUL, 0x0f0f0f0fUL, 0x02020202UL,
     282    0xc1c1c1c1UL, 0xafafafafUL, 0xbdbdbdbdUL, 0x03030303UL,
     283    0x01010101UL, 0x13131313UL, 0x8a8a8a8aUL, 0x6b6b6b6bUL,
     284    0x3a3a3a3aUL, 0x91919191UL, 0x11111111UL, 0x41414141UL,
     285    0x4f4f4f4fUL, 0x67676767UL, 0xdcdcdcdcUL, 0xeaeaeaeaUL,
     286    0x97979797UL, 0xf2f2f2f2UL, 0xcfcfcfcfUL, 0xcecececeUL,
     287    0xf0f0f0f0UL, 0xb4b4b4b4UL, 0xe6e6e6e6UL, 0x73737373UL,
     288    0x96969696UL, 0xacacacacUL, 0x74747474UL, 0x22222222UL,
     289    0xe7e7e7e7UL, 0xadadadadUL, 0x35353535UL, 0x85858585UL,
     290    0xe2e2e2e2UL, 0xf9f9f9f9UL, 0x37373737UL, 0xe8e8e8e8UL,
     291    0x1c1c1c1cUL, 0x75757575UL, 0xdfdfdfdfUL, 0x6e6e6e6eUL,
     292    0x47474747UL, 0xf1f1f1f1UL, 0x1a1a1a1aUL, 0x71717171UL,
     293    0x1d1d1d1dUL, 0x29292929UL, 0xc5c5c5c5UL, 0x89898989UL,
     294    0x6f6f6f6fUL, 0xb7b7b7b7UL, 0x62626262UL, 0x0e0e0e0eUL,
     295    0xaaaaaaaaUL, 0x18181818UL, 0xbebebebeUL, 0x1b1b1b1bUL,
     296    0xfcfcfcfcUL, 0x56565656UL, 0x3e3e3e3eUL, 0x4b4b4b4bUL,
     297    0xc6c6c6c6UL, 0xd2d2d2d2UL, 0x79797979UL, 0x20202020UL,
     298    0x9a9a9a9aUL, 0xdbdbdbdbUL, 0xc0c0c0c0UL, 0xfefefefeUL,
     299    0x78787878UL, 0xcdcdcdcdUL, 0x5a5a5a5aUL, 0xf4f4f4f4UL,
     300    0x1f1f1f1fUL, 0xddddddddUL, 0xa8a8a8a8UL, 0x33333333UL,
     301    0x88888888UL, 0x07070707UL, 0xc7c7c7c7UL, 0x31313131UL,
     302    0xb1b1b1b1UL, 0x12121212UL, 0x10101010UL, 0x59595959UL,
     303    0x27272727UL, 0x80808080UL, 0xececececUL, 0x5f5f5f5fUL,
     304    0x60606060UL, 0x51515151UL, 0x7f7f7f7fUL, 0xa9a9a9a9UL,
     305    0x19191919UL, 0xb5b5b5b5UL, 0x4a4a4a4aUL, 0x0d0d0d0dUL,
     306    0x2d2d2d2dUL, 0xe5e5e5e5UL, 0x7a7a7a7aUL, 0x9f9f9f9fUL,
     307    0x93939393UL, 0xc9c9c9c9UL, 0x9c9c9c9cUL, 0xefefefefUL,
     308    0xa0a0a0a0UL, 0xe0e0e0e0UL, 0x3b3b3b3bUL, 0x4d4d4d4dUL,
     309    0xaeaeaeaeUL, 0x2a2a2a2aUL, 0xf5f5f5f5UL, 0xb0b0b0b0UL,
     310    0xc8c8c8c8UL, 0xebebebebUL, 0xbbbbbbbbUL, 0x3c3c3c3cUL,
     311    0x83838383UL, 0x53535353UL, 0x99999999UL, 0x61616161UL,
     312    0x17171717UL, 0x2b2b2b2bUL, 0x04040404UL, 0x7e7e7e7eUL,
     313    0xbabababaUL, 0x77777777UL, 0xd6d6d6d6UL, 0x26262626UL,
     314    0xe1e1e1e1UL, 0x69696969UL, 0x14141414UL, 0x63636363UL,
     315    0x55555555UL, 0x21212121UL, 0x0c0c0c0cUL, 0x7d7d7d7dUL,
     316};
     317
     318#ifdef SMALL_CODE
     319
     320#define Te0(x) TE0[x]
     321#define Te1(x) ROR(TE0[x], 8)
     322#define Te2(x) ROR(TE0[x], 16)
     323#define Te3(x) ROR(TE0[x], 24)
     324
     325#define Td0(x) TD0[x]
     326#define Td1(x) ROR(TD0[x], 8)
     327#define Td2(x) ROR(TD0[x], 16)
     328#define Td3(x) ROR(TD0[x], 24)
     329
     330#define Te4_0 0x000000FF & Te4
     331#define Te4_1 0x0000FF00 & Te4
     332#define Te4_2 0x00FF0000 & Te4
     333#define Te4_3 0xFF000000 & Te4
     334
     335#else /* SMALL_CODE */
     336
     337#define Te0(x) TE0[x]
     338#define Te1(x) TE1[x]
     339#define Te2(x) TE2[x]
     340#define Te3(x) TE3[x]
     341
     342#define Td0(x) TD0[x]
     343#define Td1(x) TD1[x]
     344#define Td2(x) TD2[x]
     345#define Td3(x) TD3[x]
     346
     347static const ulong32 TE1[256] = {
     348    0xa5c66363UL, 0x84f87c7cUL, 0x99ee7777UL, 0x8df67b7bUL,
     349    0x0dfff2f2UL, 0xbdd66b6bUL, 0xb1de6f6fUL, 0x5491c5c5UL,
     350    0x50603030UL, 0x03020101UL, 0xa9ce6767UL, 0x7d562b2bUL,
     351    0x19e7fefeUL, 0x62b5d7d7UL, 0xe64dababUL, 0x9aec7676UL,
     352    0x458fcacaUL, 0x9d1f8282UL, 0x4089c9c9UL, 0x87fa7d7dUL,
     353    0x15effafaUL, 0xebb25959UL, 0xc98e4747UL, 0x0bfbf0f0UL,
     354    0xec41adadUL, 0x67b3d4d4UL, 0xfd5fa2a2UL, 0xea45afafUL,
     355    0xbf239c9cUL, 0xf753a4a4UL, 0x96e47272UL, 0x5b9bc0c0UL,
     356    0xc275b7b7UL, 0x1ce1fdfdUL, 0xae3d9393UL, 0x6a4c2626UL,
     357    0x5a6c3636UL, 0x417e3f3fUL, 0x02f5f7f7UL, 0x4f83ccccUL,
     358    0x5c683434UL, 0xf451a5a5UL, 0x34d1e5e5UL, 0x08f9f1f1UL,
     359    0x93e27171UL, 0x73abd8d8UL, 0x53623131UL, 0x3f2a1515UL,
     360    0x0c080404UL, 0x5295c7c7UL, 0x65462323UL, 0x5e9dc3c3UL,
     361    0x28301818UL, 0xa1379696UL, 0x0f0a0505UL, 0xb52f9a9aUL,
     362    0x090e0707UL, 0x36241212UL, 0x9b1b8080UL, 0x3ddfe2e2UL,
     363    0x26cdebebUL, 0x694e2727UL, 0xcd7fb2b2UL, 0x9fea7575UL,
     364    0x1b120909UL, 0x9e1d8383UL, 0x74582c2cUL, 0x2e341a1aUL,
     365    0x2d361b1bUL, 0xb2dc6e6eUL, 0xeeb45a5aUL, 0xfb5ba0a0UL,
     366    0xf6a45252UL, 0x4d763b3bUL, 0x61b7d6d6UL, 0xce7db3b3UL,
     367    0x7b522929UL, 0x3edde3e3UL, 0x715e2f2fUL, 0x97138484UL,
     368    0xf5a65353UL, 0x68b9d1d1UL, 0x00000000UL, 0x2cc1ededUL,
     369    0x60402020UL, 0x1fe3fcfcUL, 0xc879b1b1UL, 0xedb65b5bUL,
     370    0xbed46a6aUL, 0x468dcbcbUL, 0xd967bebeUL, 0x4b723939UL,
     371    0xde944a4aUL, 0xd4984c4cUL, 0xe8b05858UL, 0x4a85cfcfUL,
     372    0x6bbbd0d0UL, 0x2ac5efefUL, 0xe54faaaaUL, 0x16edfbfbUL,
     373    0xc5864343UL, 0xd79a4d4dUL, 0x55663333UL, 0x94118585UL,
     374    0xcf8a4545UL, 0x10e9f9f9UL, 0x06040202UL, 0x81fe7f7fUL,
     375    0xf0a05050UL, 0x44783c3cUL, 0xba259f9fUL, 0xe34ba8a8UL,
     376    0xf3a25151UL, 0xfe5da3a3UL, 0xc0804040UL, 0x8a058f8fUL,
     377    0xad3f9292UL, 0xbc219d9dUL, 0x48703838UL, 0x04f1f5f5UL,
     378    0xdf63bcbcUL, 0xc177b6b6UL, 0x75afdadaUL, 0x63422121UL,
     379    0x30201010UL, 0x1ae5ffffUL, 0x0efdf3f3UL, 0x6dbfd2d2UL,
     380    0x4c81cdcdUL, 0x14180c0cUL, 0x35261313UL, 0x2fc3ececUL,
     381    0xe1be5f5fUL, 0xa2359797UL, 0xcc884444UL, 0x392e1717UL,
     382    0x5793c4c4UL, 0xf255a7a7UL, 0x82fc7e7eUL, 0x477a3d3dUL,
     383    0xacc86464UL, 0xe7ba5d5dUL, 0x2b321919UL, 0x95e67373UL,
     384    0xa0c06060UL, 0x98198181UL, 0xd19e4f4fUL, 0x7fa3dcdcUL,
     385    0x66442222UL, 0x7e542a2aUL, 0xab3b9090UL, 0x830b8888UL,
     386    0xca8c4646UL, 0x29c7eeeeUL, 0xd36bb8b8UL, 0x3c281414UL,
     387    0x79a7dedeUL, 0xe2bc5e5eUL, 0x1d160b0bUL, 0x76addbdbUL,
     388    0x3bdbe0e0UL, 0x56643232UL, 0x4e743a3aUL, 0x1e140a0aUL,
     389    0xdb924949UL, 0x0a0c0606UL, 0x6c482424UL, 0xe4b85c5cUL,
     390    0x5d9fc2c2UL, 0x6ebdd3d3UL, 0xef43acacUL, 0xa6c46262UL,
     391    0xa8399191UL, 0xa4319595UL, 0x37d3e4e4UL, 0x8bf27979UL,
     392    0x32d5e7e7UL, 0x438bc8c8UL, 0x596e3737UL, 0xb7da6d6dUL,
     393    0x8c018d8dUL, 0x64b1d5d5UL, 0xd29c4e4eUL, 0xe049a9a9UL,
     394    0xb4d86c6cUL, 0xfaac5656UL, 0x07f3f4f4UL, 0x25cfeaeaUL,
     395    0xafca6565UL, 0x8ef47a7aUL, 0xe947aeaeUL, 0x18100808UL,
     396    0xd56fbabaUL, 0x88f07878UL, 0x6f4a2525UL, 0x725c2e2eUL,
     397    0x24381c1cUL, 0xf157a6a6UL, 0xc773b4b4UL, 0x5197c6c6UL,
     398    0x23cbe8e8UL, 0x7ca1ddddUL, 0x9ce87474UL, 0x213e1f1fUL,
     399    0xdd964b4bUL, 0xdc61bdbdUL, 0x860d8b8bUL, 0x850f8a8aUL,
     400    0x90e07070UL, 0x427c3e3eUL, 0xc471b5b5UL, 0xaacc6666UL,
     401    0xd8904848UL, 0x05060303UL, 0x01f7f6f6UL, 0x121c0e0eUL,
     402    0xa3c26161UL, 0x5f6a3535UL, 0xf9ae5757UL, 0xd069b9b9UL,
     403    0x91178686UL, 0x5899c1c1UL, 0x273a1d1dUL, 0xb9279e9eUL,
     404    0x38d9e1e1UL, 0x13ebf8f8UL, 0xb32b9898UL, 0x33221111UL,
     405    0xbbd26969UL, 0x70a9d9d9UL, 0x89078e8eUL, 0xa7339494UL,
     406    0xb62d9b9bUL, 0x223c1e1eUL, 0x92158787UL, 0x20c9e9e9UL,
     407    0x4987ceceUL, 0xffaa5555UL, 0x78502828UL, 0x7aa5dfdfUL,
     408    0x8f038c8cUL, 0xf859a1a1UL, 0x80098989UL, 0x171a0d0dUL,
     409    0xda65bfbfUL, 0x31d7e6e6UL, 0xc6844242UL, 0xb8d06868UL,
     410    0xc3824141UL, 0xb0299999UL, 0x775a2d2dUL, 0x111e0f0fUL,
     411    0xcb7bb0b0UL, 0xfca85454UL, 0xd66dbbbbUL, 0x3a2c1616UL,
     412};
     413static const ulong32 TE2[256] = {
     414    0x63a5c663UL, 0x7c84f87cUL, 0x7799ee77UL, 0x7b8df67bUL,
     415    0xf20dfff2UL, 0x6bbdd66bUL, 0x6fb1de6fUL, 0xc55491c5UL,
     416    0x30506030UL, 0x01030201UL, 0x67a9ce67UL, 0x2b7d562bUL,
     417    0xfe19e7feUL, 0xd762b5d7UL, 0xabe64dabUL, 0x769aec76UL,
     418    0xca458fcaUL, 0x829d1f82UL, 0xc94089c9UL, 0x7d87fa7dUL,
     419    0xfa15effaUL, 0x59ebb259UL, 0x47c98e47UL, 0xf00bfbf0UL,
     420    0xadec41adUL, 0xd467b3d4UL, 0xa2fd5fa2UL, 0xafea45afUL,
     421    0x9cbf239cUL, 0xa4f753a4UL, 0x7296e472UL, 0xc05b9bc0UL,
     422    0xb7c275b7UL, 0xfd1ce1fdUL, 0x93ae3d93UL, 0x266a4c26UL,
     423    0x365a6c36UL, 0x3f417e3fUL, 0xf702f5f7UL, 0xcc4f83ccUL,
     424    0x345c6834UL, 0xa5f451a5UL, 0xe534d1e5UL, 0xf108f9f1UL,
     425    0x7193e271UL, 0xd873abd8UL, 0x31536231UL, 0x153f2a15UL,
     426    0x040c0804UL, 0xc75295c7UL, 0x23654623UL, 0xc35e9dc3UL,
     427    0x18283018UL, 0x96a13796UL, 0x050f0a05UL, 0x9ab52f9aUL,
     428    0x07090e07UL, 0x12362412UL, 0x809b1b80UL, 0xe23ddfe2UL,
     429    0xeb26cdebUL, 0x27694e27UL, 0xb2cd7fb2UL, 0x759fea75UL,
     430    0x091b1209UL, 0x839e1d83UL, 0x2c74582cUL, 0x1a2e341aUL,
     431    0x1b2d361bUL, 0x6eb2dc6eUL, 0x5aeeb45aUL, 0xa0fb5ba0UL,
     432    0x52f6a452UL, 0x3b4d763bUL, 0xd661b7d6UL, 0xb3ce7db3UL,
     433    0x297b5229UL, 0xe33edde3UL, 0x2f715e2fUL, 0x84971384UL,
     434    0x53f5a653UL, 0xd168b9d1UL, 0x00000000UL, 0xed2cc1edUL,
     435    0x20604020UL, 0xfc1fe3fcUL, 0xb1c879b1UL, 0x5bedb65bUL,
     436    0x6abed46aUL, 0xcb468dcbUL, 0xbed967beUL, 0x394b7239UL,
     437    0x4ade944aUL, 0x4cd4984cUL, 0x58e8b058UL, 0xcf4a85cfUL,
     438    0xd06bbbd0UL, 0xef2ac5efUL, 0xaae54faaUL, 0xfb16edfbUL,
     439    0x43c58643UL, 0x4dd79a4dUL, 0x33556633UL, 0x85941185UL,
     440    0x45cf8a45UL, 0xf910e9f9UL, 0x02060402UL, 0x7f81fe7fUL,
     441    0x50f0a050UL, 0x3c44783cUL, 0x9fba259fUL, 0xa8e34ba8UL,
     442    0x51f3a251UL, 0xa3fe5da3UL, 0x40c08040UL, 0x8f8a058fUL,
     443    0x92ad3f92UL, 0x9dbc219dUL, 0x38487038UL, 0xf504f1f5UL,
     444    0xbcdf63bcUL, 0xb6c177b6UL, 0xda75afdaUL, 0x21634221UL,
     445    0x10302010UL, 0xff1ae5ffUL, 0xf30efdf3UL, 0xd26dbfd2UL,
     446    0xcd4c81cdUL, 0x0c14180cUL, 0x13352613UL, 0xec2fc3ecUL,
     447    0x5fe1be5fUL, 0x97a23597UL, 0x44cc8844UL, 0x17392e17UL,
     448    0xc45793c4UL, 0xa7f255a7UL, 0x7e82fc7eUL, 0x3d477a3dUL,
     449    0x64acc864UL, 0x5de7ba5dUL, 0x192b3219UL, 0x7395e673UL,
     450    0x60a0c060UL, 0x81981981UL, 0x4fd19e4fUL, 0xdc7fa3dcUL,
     451    0x22664422UL, 0x2a7e542aUL, 0x90ab3b90UL, 0x88830b88UL,
     452    0x46ca8c46UL, 0xee29c7eeUL, 0xb8d36bb8UL, 0x143c2814UL,
     453    0xde79a7deUL, 0x5ee2bc5eUL, 0x0b1d160bUL, 0xdb76addbUL,
     454    0xe03bdbe0UL, 0x32566432UL, 0x3a4e743aUL, 0x0a1e140aUL,
     455    0x49db9249UL, 0x060a0c06UL, 0x246c4824UL, 0x5ce4b85cUL,
     456    0xc25d9fc2UL, 0xd36ebdd3UL, 0xacef43acUL, 0x62a6c462UL,
     457    0x91a83991UL, 0x95a43195UL, 0xe437d3e4UL, 0x798bf279UL,
     458    0xe732d5e7UL, 0xc8438bc8UL, 0x37596e37UL, 0x6db7da6dUL,
     459    0x8d8c018dUL, 0xd564b1d5UL, 0x4ed29c4eUL, 0xa9e049a9UL,
     460    0x6cb4d86cUL, 0x56faac56UL, 0xf407f3f4UL, 0xea25cfeaUL,
     461    0x65afca65UL, 0x7a8ef47aUL, 0xaee947aeUL, 0x08181008UL,
     462    0xbad56fbaUL, 0x7888f078UL, 0x256f4a25UL, 0x2e725c2eUL,
     463    0x1c24381cUL, 0xa6f157a6UL, 0xb4c773b4UL, 0xc65197c6UL,
     464    0xe823cbe8UL, 0xdd7ca1ddUL, 0x749ce874UL, 0x1f213e1fUL,
     465    0x4bdd964bUL, 0xbddc61bdUL, 0x8b860d8bUL, 0x8a850f8aUL,
     466    0x7090e070UL, 0x3e427c3eUL, 0xb5c471b5UL, 0x66aacc66UL,
     467    0x48d89048UL, 0x03050603UL, 0xf601f7f6UL, 0x0e121c0eUL,
     468    0x61a3c261UL, 0x355f6a35UL, 0x57f9ae57UL, 0xb9d069b9UL,
     469    0x86911786UL, 0xc15899c1UL, 0x1d273a1dUL, 0x9eb9279eUL,
     470    0xe138d9e1UL, 0xf813ebf8UL, 0x98b32b98UL, 0x11332211UL,
     471    0x69bbd269UL, 0xd970a9d9UL, 0x8e89078eUL, 0x94a73394UL,
     472    0x9bb62d9bUL, 0x1e223c1eUL, 0x87921587UL, 0xe920c9e9UL,
     473    0xce4987ceUL, 0x55ffaa55UL, 0x28785028UL, 0xdf7aa5dfUL,
     474    0x8c8f038cUL, 0xa1f859a1UL, 0x89800989UL, 0x0d171a0dUL,
     475    0xbfda65bfUL, 0xe631d7e6UL, 0x42c68442UL, 0x68b8d068UL,
     476    0x41c38241UL, 0x99b02999UL, 0x2d775a2dUL, 0x0f111e0fUL,
     477    0xb0cb7bb0UL, 0x54fca854UL, 0xbbd66dbbUL, 0x163a2c16UL,
     478};
     479static const ulong32 TE3[256] = {
     480
     481    0x6363a5c6UL, 0x7c7c84f8UL, 0x777799eeUL, 0x7b7b8df6UL,
     482    0xf2f20dffUL, 0x6b6bbdd6UL, 0x6f6fb1deUL, 0xc5c55491UL,
     483    0x30305060UL, 0x01010302UL, 0x6767a9ceUL, 0x2b2b7d56UL,
     484    0xfefe19e7UL, 0xd7d762b5UL, 0xababe64dUL, 0x76769aecUL,
     485    0xcaca458fUL, 0x82829d1fUL, 0xc9c94089UL, 0x7d7d87faUL,
     486    0xfafa15efUL, 0x5959ebb2UL, 0x4747c98eUL, 0xf0f00bfbUL,
     487    0xadadec41UL, 0xd4d467b3UL, 0xa2a2fd5fUL, 0xafafea45UL,
     488    0x9c9cbf23UL, 0xa4a4f753UL, 0x727296e4UL, 0xc0c05b9bUL,
     489    0xb7b7c275UL, 0xfdfd1ce1UL, 0x9393ae3dUL, 0x26266a4cUL,
     490    0x36365a6cUL, 0x3f3f417eUL, 0xf7f702f5UL, 0xcccc4f83UL,
     491    0x34345c68UL, 0xa5a5f451UL, 0xe5e534d1UL, 0xf1f108f9UL,
     492    0x717193e2UL, 0xd8d873abUL, 0x31315362UL, 0x15153f2aUL,
     493    0x04040c08UL, 0xc7c75295UL, 0x23236546UL, 0xc3c35e9dUL,
     494    0x18182830UL, 0x9696a137UL, 0x05050f0aUL, 0x9a9ab52fUL,
     495    0x0707090eUL, 0x12123624UL, 0x80809b1bUL, 0xe2e23ddfUL,
     496    0xebeb26cdUL, 0x2727694eUL, 0xb2b2cd7fUL, 0x75759feaUL,
     497    0x09091b12UL, 0x83839e1dUL, 0x2c2c7458UL, 0x1a1a2e34UL,
     498    0x1b1b2d36UL, 0x6e6eb2dcUL, 0x5a5aeeb4UL, 0xa0a0fb5bUL,
     499    0x5252f6a4UL, 0x3b3b4d76UL, 0xd6d661b7UL, 0xb3b3ce7dUL,
     500    0x29297b52UL, 0xe3e33eddUL, 0x2f2f715eUL, 0x84849713UL,
     501    0x5353f5a6UL, 0xd1d168b9UL, 0x00000000UL, 0xeded2cc1UL,
     502    0x20206040UL, 0xfcfc1fe3UL, 0xb1b1c879UL, 0x5b5bedb6UL,
     503    0x6a6abed4UL, 0xcbcb468dUL, 0xbebed967UL, 0x39394b72UL,
     504    0x4a4ade94UL, 0x4c4cd498UL, 0x5858e8b0UL, 0xcfcf4a85UL,
     505    0xd0d06bbbUL, 0xefef2ac5UL, 0xaaaae54fUL, 0xfbfb16edUL,
     506    0x4343c586UL, 0x4d4dd79aUL, 0x33335566UL, 0x85859411UL,
     507    0x4545cf8aUL, 0xf9f910e9UL, 0x02020604UL, 0x7f7f81feUL,
     508    0x5050f0a0UL, 0x3c3c4478UL, 0x9f9fba25UL, 0xa8a8e34bUL,
     509    0x5151f3a2UL, 0xa3a3fe5dUL, 0x4040c080UL, 0x8f8f8a05UL,
     510    0x9292ad3fUL, 0x9d9dbc21UL, 0x38384870UL, 0xf5f504f1UL,
     511    0xbcbcdf63UL, 0xb6b6c177UL, 0xdada75afUL, 0x21216342UL,
     512    0x10103020UL, 0xffff1ae5UL, 0xf3f30efdUL, 0xd2d26dbfUL,
     513    0xcdcd4c81UL, 0x0c0c1418UL, 0x13133526UL, 0xecec2fc3UL,
     514    0x5f5fe1beUL, 0x9797a235UL, 0x4444cc88UL, 0x1717392eUL,
     515    0xc4c45793UL, 0xa7a7f255UL, 0x7e7e82fcUL, 0x3d3d477aUL,
     516    0x6464acc8UL, 0x5d5de7baUL, 0x19192b32UL, 0x737395e6UL,
     517    0x6060a0c0UL, 0x81819819UL, 0x4f4fd19eUL, 0xdcdc7fa3UL,
     518    0x22226644UL, 0x2a2a7e54UL, 0x9090ab3bUL, 0x8888830bUL,
     519    0x4646ca8cUL, 0xeeee29c7UL, 0xb8b8d36bUL, 0x14143c28UL,
     520    0xdede79a7UL, 0x5e5ee2bcUL, 0x0b0b1d16UL, 0xdbdb76adUL,
     521    0xe0e03bdbUL, 0x32325664UL, 0x3a3a4e74UL, 0x0a0a1e14UL,
     522    0x4949db92UL, 0x06060a0cUL, 0x24246c48UL, 0x5c5ce4b8UL,
     523    0xc2c25d9fUL, 0xd3d36ebdUL, 0xacacef43UL, 0x6262a6c4UL,
     524    0x9191a839UL, 0x9595a431UL, 0xe4e437d3UL, 0x79798bf2UL,
     525    0xe7e732d5UL, 0xc8c8438bUL, 0x3737596eUL, 0x6d6db7daUL,
     526    0x8d8d8c01UL, 0xd5d564b1UL, 0x4e4ed29cUL, 0xa9a9e049UL,
     527    0x6c6cb4d8UL, 0x5656faacUL, 0xf4f407f3UL, 0xeaea25cfUL,
     528    0x6565afcaUL, 0x7a7a8ef4UL, 0xaeaee947UL, 0x08081810UL,
     529    0xbabad56fUL, 0x787888f0UL, 0x25256f4aUL, 0x2e2e725cUL,
     530    0x1c1c2438UL, 0xa6a6f157UL, 0xb4b4c773UL, 0xc6c65197UL,
     531    0xe8e823cbUL, 0xdddd7ca1UL, 0x74749ce8UL, 0x1f1f213eUL,
     532    0x4b4bdd96UL, 0xbdbddc61UL, 0x8b8b860dUL, 0x8a8a850fUL,
     533    0x707090e0UL, 0x3e3e427cUL, 0xb5b5c471UL, 0x6666aaccUL,
     534    0x4848d890UL, 0x03030506UL, 0xf6f601f7UL, 0x0e0e121cUL,
     535    0x6161a3c2UL, 0x35355f6aUL, 0x5757f9aeUL, 0xb9b9d069UL,
     536    0x86869117UL, 0xc1c15899UL, 0x1d1d273aUL, 0x9e9eb927UL,
     537    0xe1e138d9UL, 0xf8f813ebUL, 0x9898b32bUL, 0x11113322UL,
     538    0x6969bbd2UL, 0xd9d970a9UL, 0x8e8e8907UL, 0x9494a733UL,
     539    0x9b9bb62dUL, 0x1e1e223cUL, 0x87879215UL, 0xe9e920c9UL,
     540    0xcece4987UL, 0x5555ffaaUL, 0x28287850UL, 0xdfdf7aa5UL,
     541    0x8c8c8f03UL, 0xa1a1f859UL, 0x89898009UL, 0x0d0d171aUL,
     542    0xbfbfda65UL, 0xe6e631d7UL, 0x4242c684UL, 0x6868b8d0UL,
     543    0x4141c382UL, 0x9999b029UL, 0x2d2d775aUL, 0x0f0f111eUL,
     544    0xb0b0cb7bUL, 0x5454fca8UL, 0xbbbbd66dUL, 0x16163a2cUL,
     545};
     546
     547static const ulong32 Te4_0[] = {
     5480x00000063UL, 0x0000007cUL, 0x00000077UL, 0x0000007bUL, 0x000000f2UL, 0x0000006bUL, 0x0000006fUL, 0x000000c5UL,
     5490x00000030UL, 0x00000001UL, 0x00000067UL, 0x0000002bUL, 0x000000feUL, 0x000000d7UL, 0x000000abUL, 0x00000076UL,
     5500x000000caUL, 0x00000082UL, 0x000000c9UL, 0x0000007dUL, 0x000000faUL, 0x00000059UL, 0x00000047UL, 0x000000f0UL,
     5510x000000adUL, 0x000000d4UL, 0x000000a2UL, 0x000000afUL, 0x0000009cUL, 0x000000a4UL, 0x00000072UL, 0x000000c0UL,
     5520x000000b7UL, 0x000000fdUL, 0x00000093UL, 0x00000026UL, 0x00000036UL, 0x0000003fUL, 0x000000f7UL, 0x000000ccUL,
     5530x00000034UL, 0x000000a5UL, 0x000000e5UL, 0x000000f1UL, 0x00000071UL, 0x000000d8UL, 0x00000031UL, 0x00000015UL,
     5540x00000004UL, 0x000000c7UL, 0x00000023UL, 0x000000c3UL, 0x00000018UL, 0x00000096UL, 0x00000005UL, 0x0000009aUL,
     5550x00000007UL, 0x00000012UL, 0x00000080UL, 0x000000e2UL, 0x000000ebUL, 0x00000027UL, 0x000000b2UL, 0x00000075UL,
     5560x00000009UL, 0x00000083UL, 0x0000002cUL, 0x0000001aUL, 0x0000001bUL, 0x0000006eUL, 0x0000005aUL, 0x000000a0UL,
     5570x00000052UL, 0x0000003bUL, 0x000000d6UL, 0x000000b3UL, 0x00000029UL, 0x000000e3UL, 0x0000002fUL, 0x00000084UL,
     5580x00000053UL, 0x000000d1UL, 0x00000000UL, 0x000000edUL, 0x00000020UL, 0x000000fcUL, 0x000000b1UL, 0x0000005bUL,
     5590x0000006aUL, 0x000000cbUL, 0x000000beUL, 0x00000039UL, 0x0000004aUL, 0x0000004cUL, 0x00000058UL, 0x000000cfUL,
     5600x000000d0UL, 0x000000efUL, 0x000000aaUL, 0x000000fbUL, 0x00000043UL, 0x0000004dUL, 0x00000033UL, 0x00000085UL,
     5610x00000045UL, 0x000000f9UL, 0x00000002UL, 0x0000007fUL, 0x00000050UL, 0x0000003cUL, 0x0000009fUL, 0x000000a8UL,
     5620x00000051UL, 0x000000a3UL, 0x00000040UL, 0x0000008fUL, 0x00000092UL, 0x0000009dUL, 0x00000038UL, 0x000000f5UL,
     5630x000000bcUL, 0x000000b6UL, 0x000000daUL, 0x00000021UL, 0x00000010UL, 0x000000ffUL, 0x000000f3UL, 0x000000d2UL,
     5640x000000cdUL, 0x0000000cUL, 0x00000013UL, 0x000000ecUL, 0x0000005fUL, 0x00000097UL, 0x00000044UL, 0x00000017UL,
     5650x000000c4UL, 0x000000a7UL, 0x0000007eUL, 0x0000003dUL, 0x00000064UL, 0x0000005dUL, 0x00000019UL, 0x00000073UL,
     5660x00000060UL, 0x00000081UL, 0x0000004fUL, 0x000000dcUL, 0x00000022UL, 0x0000002aUL, 0x00000090UL, 0x00000088UL,
     5670x00000046UL, 0x000000eeUL, 0x000000b8UL, 0x00000014UL, 0x000000deUL, 0x0000005eUL, 0x0000000bUL, 0x000000dbUL,
     5680x000000e0UL, 0x00000032UL, 0x0000003aUL, 0x0000000aUL, 0x00000049UL, 0x00000006UL, 0x00000024UL, 0x0000005cUL,
     5690x000000c2UL, 0x000000d3UL, 0x000000acUL, 0x00000062UL, 0x00000091UL, 0x00000095UL, 0x000000e4UL, 0x00000079UL,
     5700x000000e7UL, 0x000000c8UL, 0x00000037UL, 0x0000006dUL, 0x0000008dUL, 0x000000d5UL, 0x0000004eUL, 0x000000a9UL,
     5710x0000006cUL, 0x00000056UL, 0x000000f4UL, 0x000000eaUL, 0x00000065UL, 0x0000007aUL, 0x000000aeUL, 0x00000008UL,
     5720x000000baUL, 0x00000078UL, 0x00000025UL, 0x0000002eUL, 0x0000001cUL, 0x000000a6UL, 0x000000b4UL, 0x000000c6UL,
     5730x000000e8UL, 0x000000ddUL, 0x00000074UL, 0x0000001fUL, 0x0000004bUL, 0x000000bdUL, 0x0000008bUL, 0x0000008aUL,
     5740x00000070UL, 0x0000003eUL, 0x000000b5UL, 0x00000066UL, 0x00000048UL, 0x00000003UL, 0x000000f6UL, 0x0000000eUL,
     5750x00000061UL, 0x00000035UL, 0x00000057UL, 0x000000b9UL, 0x00000086UL, 0x000000c1UL, 0x0000001dUL, 0x0000009eUL,
     5760x000000e1UL, 0x000000f8UL, 0x00000098UL, 0x00000011UL, 0x00000069UL, 0x000000d9UL, 0x0000008eUL, 0x00000094UL,
     5770x0000009bUL, 0x0000001eUL, 0x00000087UL, 0x000000e9UL, 0x000000ceUL, 0x00000055UL, 0x00000028UL, 0x000000dfUL,
     5780x0000008cUL, 0x000000a1UL, 0x00000089UL, 0x0000000dUL, 0x000000bfUL, 0x000000e6UL, 0x00000042UL, 0x00000068UL,
     5790x00000041UL, 0x00000099UL, 0x0000002dUL, 0x0000000fUL, 0x000000b0UL, 0x00000054UL, 0x000000bbUL, 0x00000016UL
     580};
     581
     582static const ulong32 Te4_1[] = {
     5830x00006300UL, 0x00007c00UL, 0x00007700UL, 0x00007b00UL, 0x0000f200UL, 0x00006b00UL, 0x00006f00UL, 0x0000c500UL,
     5840x00003000UL, 0x00000100UL, 0x00006700UL, 0x00002b00UL, 0x0000fe00UL, 0x0000d700UL, 0x0000ab00UL, 0x00007600UL,
     5850x0000ca00UL, 0x00008200UL, 0x0000c900UL, 0x00007d00UL, 0x0000fa00UL, 0x00005900UL, 0x00004700UL, 0x0000f000UL,
     5860x0000ad00UL, 0x0000d400UL, 0x0000a200UL, 0x0000af00UL, 0x00009c00UL, 0x0000a400UL, 0x00007200UL, 0x0000c000UL,
     5870x0000b700UL, 0x0000fd00UL, 0x00009300UL, 0x00002600UL, 0x00003600UL, 0x00003f00UL, 0x0000f700UL, 0x0000cc00UL,
     5880x00003400UL, 0x0000a500UL, 0x0000e500UL, 0x0000f100UL, 0x00007100UL, 0x0000d800UL, 0x00003100UL, 0x00001500UL,
     5890x00000400UL, 0x0000c700UL, 0x00002300UL, 0x0000c300UL, 0x00001800UL, 0x00009600UL, 0x00000500UL, 0x00009a00UL,
     5900x00000700UL, 0x00001200UL, 0x00008000UL, 0x0000e200UL, 0x0000eb00UL, 0x00002700UL, 0x0000b200UL, 0x00007500UL,
     5910x00000900UL, 0x00008300UL, 0x00002c00UL, 0x00001a00UL, 0x00001b00UL, 0x00006e00UL, 0x00005a00UL, 0x0000a000UL,
     5920x00005200UL, 0x00003b00UL, 0x0000d600UL, 0x0000b300UL, 0x00002900UL, 0x0000e300UL, 0x00002f00UL, 0x00008400UL,
     5930x00005300UL, 0x0000d100UL, 0x00000000UL, 0x0000ed00UL, 0x00002000UL, 0x0000fc00UL, 0x0000b100UL, 0x00005b00UL,
     5940x00006a00UL, 0x0000cb00UL, 0x0000be00UL, 0x00003900UL, 0x00004a00UL, 0x00004c00UL, 0x00005800UL, 0x0000cf00UL,
     5950x0000d000UL, 0x0000ef00UL, 0x0000aa00UL, 0x0000fb00UL, 0x00004300UL, 0x00004d00UL, 0x00003300UL, 0x00008500UL,
     5960x00004500UL, 0x0000f900UL, 0x00000200UL, 0x00007f00UL, 0x00005000UL, 0x00003c00UL, 0x00009f00UL, 0x0000a800UL,
     5970x00005100UL, 0x0000a300UL, 0x00004000UL, 0x00008f00UL, 0x00009200UL, 0x00009d00UL, 0x00003800UL, 0x0000f500UL,
     5980x0000bc00UL, 0x0000b600UL, 0x0000da00UL, 0x00002100UL, 0x00001000UL, 0x0000ff00UL, 0x0000f300UL, 0x0000d200UL,
     5990x0000cd00UL, 0x00000c00UL, 0x00001300UL, 0x0000ec00UL, 0x00005f00UL, 0x00009700UL, 0x00004400UL, 0x00001700UL,
     6000x0000c400UL, 0x0000a700UL, 0x00007e00UL, 0x00003d00UL, 0x00006400UL, 0x00005d00UL, 0x00001900UL, 0x00007300UL,
     6010x00006000UL, 0x00008100UL, 0x00004f00UL, 0x0000dc00UL, 0x00002200UL, 0x00002a00UL, 0x00009000UL, 0x00008800UL,
     6020x00004600UL, 0x0000ee00UL, 0x0000b800UL, 0x00001400UL, 0x0000de00UL, 0x00005e00UL, 0x00000b00UL, 0x0000db00UL,
     6030x0000e000UL, 0x00003200UL, 0x00003a00UL, 0x00000a00UL, 0x00004900UL, 0x00000600UL, 0x00002400UL, 0x00005c00UL,
     6040x0000c200UL, 0x0000d300UL, 0x0000ac00UL, 0x00006200UL, 0x00009100UL, 0x00009500UL, 0x0000e400UL, 0x00007900UL,
     6050x0000e700UL, 0x0000c800UL, 0x00003700UL, 0x00006d00UL, 0x00008d00UL, 0x0000d500UL, 0x00004e00UL, 0x0000a900UL,
     6060x00006c00UL, 0x00005600UL, 0x0000f400UL, 0x0000ea00UL, 0x00006500UL, 0x00007a00UL, 0x0000ae00UL, 0x00000800UL,
     6070x0000ba00UL, 0x00007800UL, 0x00002500UL, 0x00002e00UL, 0x00001c00UL, 0x0000a600UL, 0x0000b400UL, 0x0000c600UL,
     6080x0000e800UL, 0x0000dd00UL, 0x00007400UL, 0x00001f00UL, 0x00004b00UL, 0x0000bd00UL, 0x00008b00UL, 0x00008a00UL,
     6090x00007000UL, 0x00003e00UL, 0x0000b500UL, 0x00006600UL, 0x00004800UL, 0x00000300UL, 0x0000f600UL, 0x00000e00UL,
     6100x00006100UL, 0x00003500UL, 0x00005700UL, 0x0000b900UL, 0x00008600UL, 0x0000c100UL, 0x00001d00UL, 0x00009e00UL,
     6110x0000e100UL, 0x0000f800UL, 0x00009800UL, 0x00001100UL, 0x00006900UL, 0x0000d900UL, 0x00008e00UL, 0x00009400UL,
     6120x00009b00UL, 0x00001e00UL, 0x00008700UL, 0x0000e900UL, 0x0000ce00UL, 0x00005500UL, 0x00002800UL, 0x0000df00UL,
     6130x00008c00UL, 0x0000a100UL, 0x00008900UL, 0x00000d00UL, 0x0000bf00UL, 0x0000e600UL, 0x00004200UL, 0x00006800UL,
     6140x00004100UL, 0x00009900UL, 0x00002d00UL, 0x00000f00UL, 0x0000b000UL, 0x00005400UL, 0x0000bb00UL, 0x00001600UL
     615};
     616
     617static const ulong32 Te4_2[] = {
     6180x00630000UL, 0x007c0000UL, 0x00770000UL, 0x007b0000UL, 0x00f20000UL, 0x006b0000UL, 0x006f0000UL, 0x00c50000UL,
     6190x00300000UL, 0x00010000UL, 0x00670000UL, 0x002b0000UL, 0x00fe0000UL, 0x00d70000UL, 0x00ab0000UL, 0x00760000UL,
     6200x00ca0000UL, 0x00820000UL, 0x00c90000UL, 0x007d0000UL, 0x00fa0000UL, 0x00590000UL, 0x00470000UL, 0x00f00000UL,
     6210x00ad0000UL, 0x00d40000UL, 0x00a20000UL, 0x00af0000UL, 0x009c0000UL, 0x00a40000UL, 0x00720000UL, 0x00c00000UL,
     6220x00b70000UL, 0x00fd0000UL, 0x00930000UL, 0x00260000UL, 0x00360000UL, 0x003f0000UL, 0x00f70000UL, 0x00cc0000UL,
     6230x00340000UL, 0x00a50000UL, 0x00e50000UL, 0x00f10000UL, 0x00710000UL, 0x00d80000UL, 0x00310000UL, 0x00150000UL,
     6240x00040000UL, 0x00c70000UL, 0x00230000UL, 0x00c30000UL, 0x00180000UL, 0x00960000UL, 0x00050000UL, 0x009a0000UL,
     6250x00070000UL, 0x00120000UL, 0x00800000UL, 0x00e20000UL, 0x00eb0000UL, 0x00270000UL, 0x00b20000UL, 0x00750000UL,
     6260x00090000UL, 0x00830000UL, 0x002c0000UL, 0x001a0000UL, 0x001b0000UL, 0x006e0000UL, 0x005a0000UL, 0x00a00000UL,
     6270x00520000UL, 0x003b0000UL, 0x00d60000UL, 0x00b30000UL, 0x00290000UL, 0x00e30000UL, 0x002f0000UL, 0x00840000UL,
     6280x00530000UL, 0x00d10000UL, 0x00000000UL, 0x00ed0000UL, 0x00200000UL, 0x00fc0000UL, 0x00b10000UL, 0x005b0000UL,
     6290x006a0000UL, 0x00cb0000UL, 0x00be0000UL, 0x00390000UL, 0x004a0000UL, 0x004c0000UL, 0x00580000UL, 0x00cf0000UL,
     6300x00d00000UL, 0x00ef0000UL, 0x00aa0000UL, 0x00fb0000UL, 0x00430000UL, 0x004d0000UL, 0x00330000UL, 0x00850000UL,
     6310x00450000UL, 0x00f90000UL, 0x00020000UL, 0x007f0000UL, 0x00500000UL, 0x003c0000UL, 0x009f0000UL, 0x00a80000UL,
     6320x00510000UL, 0x00a30000UL, 0x00400000UL, 0x008f0000UL, 0x00920000UL, 0x009d0000UL, 0x00380000UL, 0x00f50000UL,
     6330x00bc0000UL, 0x00b60000UL, 0x00da0000UL, 0x00210000UL, 0x00100000UL, 0x00ff0000UL, 0x00f30000UL, 0x00d20000UL,
     6340x00cd0000UL, 0x000c0000UL, 0x00130000UL, 0x00ec0000UL, 0x005f0000UL, 0x00970000UL, 0x00440000UL, 0x00170000UL,
     6350x00c40000UL, 0x00a70000UL, 0x007e0000UL, 0x003d0000UL, 0x00640000UL, 0x005d0000UL, 0x00190000UL, 0x00730000UL,
     6360x00600000UL, 0x00810000UL, 0x004f0000UL, 0x00dc0000UL, 0x00220000UL, 0x002a0000UL, 0x00900000UL, 0x00880000UL,
     6370x00460000UL, 0x00ee0000UL, 0x00b80000UL, 0x00140000UL, 0x00de0000UL, 0x005e0000UL, 0x000b0000UL, 0x00db0000UL,
     6380x00e00000UL, 0x00320000UL, 0x003a0000UL, 0x000a0000UL, 0x00490000UL, 0x00060000UL, 0x00240000UL, 0x005c0000UL,
     6390x00c20000UL, 0x00d30000UL, 0x00ac0000UL, 0x00620000UL, 0x00910000UL, 0x00950000UL, 0x00e40000UL, 0x00790000UL,
     6400x00e70000UL, 0x00c80000UL, 0x00370000UL, 0x006d0000UL, 0x008d0000UL, 0x00d50000UL, 0x004e0000UL, 0x00a90000UL,
     6410x006c0000UL, 0x00560000UL, 0x00f40000UL, 0x00ea0000UL, 0x00650000UL, 0x007a0000UL, 0x00ae0000UL, 0x00080000UL,
     6420x00ba0000UL, 0x00780000UL, 0x00250000UL, 0x002e0000UL, 0x001c0000UL, 0x00a60000UL, 0x00b40000UL, 0x00c60000UL,
     6430x00e80000UL, 0x00dd0000UL, 0x00740000UL, 0x001f0000UL, 0x004b0000UL, 0x00bd0000UL, 0x008b0000UL, 0x008a0000UL,
     6440x00700000UL, 0x003e0000UL, 0x00b50000UL, 0x00660000UL, 0x00480000UL, 0x00030000UL, 0x00f60000UL, 0x000e0000UL,
     6450x00610000UL, 0x00350000UL, 0x00570000UL, 0x00b90000UL, 0x00860000UL, 0x00c10000UL, 0x001d0000UL, 0x009e0000UL,
     6460x00e10000UL, 0x00f80000UL, 0x00980000UL, 0x00110000UL, 0x00690000UL, 0x00d90000UL, 0x008e0000UL, 0x00940000UL,
     6470x009b0000UL, 0x001e0000UL, 0x00870000UL, 0x00e90000UL, 0x00ce0000UL, 0x00550000UL, 0x00280000UL, 0x00df0000UL,
     6480x008c0000UL, 0x00a10000UL, 0x00890000UL, 0x000d0000UL, 0x00bf0000UL, 0x00e60000UL, 0x00420000UL, 0x00680000UL,
     6490x00410000UL, 0x00990000UL, 0x002d0000UL, 0x000f0000UL, 0x00b00000UL, 0x00540000UL, 0x00bb0000UL, 0x00160000UL
     650};
     651
     652static const ulong32 Te4_3[] = {
     6530x63000000UL, 0x7c000000UL, 0x77000000UL, 0x7b000000UL, 0xf2000000UL, 0x6b000000UL, 0x6f000000UL, 0xc5000000UL,
     6540x30000000UL, 0x01000000UL, 0x67000000UL, 0x2b000000UL, 0xfe000000UL, 0xd7000000UL, 0xab000000UL, 0x76000000UL,
     6550xca000000UL, 0x82000000UL, 0xc9000000UL, 0x7d000000UL, 0xfa000000UL, 0x59000000UL, 0x47000000UL, 0xf0000000UL,
     6560xad000000UL, 0xd4000000UL, 0xa2000000UL, 0xaf000000UL, 0x9c000000UL, 0xa4000000UL, 0x72000000UL, 0xc0000000UL,
     6570xb7000000UL, 0xfd000000UL, 0x93000000UL, 0x26000000UL, 0x36000000UL, 0x3f000000UL, 0xf7000000UL, 0xcc000000UL,
     6580x34000000UL, 0xa5000000UL, 0xe5000000UL, 0xf1000000UL, 0x71000000UL, 0xd8000000UL, 0x31000000UL, 0x15000000UL,
     6590x04000000UL, 0xc7000000UL, 0x23000000UL, 0xc3000000UL, 0x18000000UL, 0x96000000UL, 0x05000000UL, 0x9a000000UL,
     6600x07000000UL, 0x12000000UL, 0x80000000UL, 0xe2000000UL, 0xeb000000UL, 0x27000000UL, 0xb2000000UL, 0x75000000UL,
     6610x09000000UL, 0x83000000UL, 0x2c000000UL, 0x1a000000UL, 0x1b000000UL, 0x6e000000UL, 0x5a000000UL, 0xa0000000UL,
     6620x52000000UL, 0x3b000000UL, 0xd6000000UL, 0xb3000000UL, 0x29000000UL, 0xe3000000UL, 0x2f000000UL, 0x84000000UL,
     6630x53000000UL, 0xd1000000UL, 0x00000000UL, 0xed000000UL, 0x20000000UL, 0xfc000000UL, 0xb1000000UL, 0x5b000000UL,
     6640x6a000000UL, 0xcb000000UL, 0xbe000000UL, 0x39000000UL, 0x4a000000UL, 0x4c000000UL, 0x58000000UL, 0xcf000000UL,
     6650xd0000000UL, 0xef000000UL, 0xaa000000UL, 0xfb000000UL, 0x43000000UL, 0x4d000000UL, 0x33000000UL, 0x85000000UL,
     6660x45000000UL, 0xf9000000UL, 0x02000000UL, 0x7f000000UL, 0x50000000UL, 0x3c000000UL, 0x9f000000UL, 0xa8000000UL,
     6670x51000000UL, 0xa3000000UL, 0x40000000UL, 0x8f000000UL, 0x92000000UL, 0x9d000000UL, 0x38000000UL, 0xf5000000UL,
     6680xbc000000UL, 0xb6000000UL, 0xda000000UL, 0x21000000UL, 0x10000000UL, 0xff000000UL, 0xf3000000UL, 0xd2000000UL,
     6690xcd000000UL, 0x0c000000UL, 0x13000000UL, 0xec000000UL, 0x5f000000UL, 0x97000000UL, 0x44000000UL, 0x17000000UL,
     6700xc4000000UL, 0xa7000000UL, 0x7e000000UL, 0x3d000000UL, 0x64000000UL, 0x5d000000UL, 0x19000000UL, 0x73000000UL,
     6710x60000000UL, 0x81000000UL, 0x4f000000UL, 0xdc000000UL, 0x22000000UL, 0x2a000000UL, 0x90000000UL, 0x88000000UL,
     6720x46000000UL, 0xee000000UL, 0xb8000000UL, 0x14000000UL, 0xde000000UL, 0x5e000000UL, 0x0b000000UL, 0xdb000000UL,
     6730xe0000000UL, 0x32000000UL, 0x3a000000UL, 0x0a000000UL, 0x49000000UL, 0x06000000UL, 0x24000000UL, 0x5c000000UL,
     6740xc2000000UL, 0xd3000000UL, 0xac000000UL, 0x62000000UL, 0x91000000UL, 0x95000000UL, 0xe4000000UL, 0x79000000UL,
     6750xe7000000UL, 0xc8000000UL, 0x37000000UL, 0x6d000000UL, 0x8d000000UL, 0xd5000000UL, 0x4e000000UL, 0xa9000000UL,
     6760x6c000000UL, 0x56000000UL, 0xf4000000UL, 0xea000000UL, 0x65000000UL, 0x7a000000UL, 0xae000000UL, 0x08000000UL,
     6770xba000000UL, 0x78000000UL, 0x25000000UL, 0x2e000000UL, 0x1c000000UL, 0xa6000000UL, 0xb4000000UL, 0xc6000000UL,
     6780xe8000000UL, 0xdd000000UL, 0x74000000UL, 0x1f000000UL, 0x4b000000UL, 0xbd000000UL, 0x8b000000UL, 0x8a000000UL,
     6790x70000000UL, 0x3e000000UL, 0xb5000000UL, 0x66000000UL, 0x48000000UL, 0x03000000UL, 0xf6000000UL, 0x0e000000UL,
     6800x61000000UL, 0x35000000UL, 0x57000000UL, 0xb9000000UL, 0x86000000UL, 0xc1000000UL, 0x1d000000UL, 0x9e000000UL,
     6810xe1000000UL, 0xf8000000UL, 0x98000000UL, 0x11000000UL, 0x69000000UL, 0xd9000000UL, 0x8e000000UL, 0x94000000UL,
     6820x9b000000UL, 0x1e000000UL, 0x87000000UL, 0xe9000000UL, 0xce000000UL, 0x55000000UL, 0x28000000UL, 0xdf000000UL,
     6830x8c000000UL, 0xa1000000UL, 0x89000000UL, 0x0d000000UL, 0xbf000000UL, 0xe6000000UL, 0x42000000UL, 0x68000000UL,
     6840x41000000UL, 0x99000000UL, 0x2d000000UL, 0x0f000000UL, 0xb0000000UL, 0x54000000UL, 0xbb000000UL, 0x16000000UL
     685};
     686
     687static const ulong32 TD1[256] = {
     688    0x5051f4a7UL, 0x537e4165UL, 0xc31a17a4UL, 0x963a275eUL,
     689    0xcb3bab6bUL, 0xf11f9d45UL, 0xabacfa58UL, 0x934be303UL,
     690    0x552030faUL, 0xf6ad766dUL, 0x9188cc76UL, 0x25f5024cUL,
     691    0xfc4fe5d7UL, 0xd7c52acbUL, 0x80263544UL, 0x8fb562a3UL,
     692    0x49deb15aUL, 0x6725ba1bUL, 0x9845ea0eUL, 0xe15dfec0UL,
     693    0x02c32f75UL, 0x12814cf0UL, 0xa38d4697UL, 0xc66bd3f9UL,
     694    0xe7038f5fUL, 0x9515929cUL, 0xebbf6d7aUL, 0xda955259UL,
     695    0x2dd4be83UL, 0xd3587421UL, 0x2949e069UL, 0x448ec9c8UL,
     696    0x6a75c289UL, 0x78f48e79UL, 0x6b99583eUL, 0xdd27b971UL,
     697    0xb6bee14fUL, 0x17f088adUL, 0x66c920acUL, 0xb47dce3aUL,
     698    0x1863df4aUL, 0x82e51a31UL, 0x60975133UL, 0x4562537fUL,
     699    0xe0b16477UL, 0x84bb6baeUL, 0x1cfe81a0UL, 0x94f9082bUL,
     700    0x58704868UL, 0x198f45fdUL, 0x8794de6cUL, 0xb7527bf8UL,
     701    0x23ab73d3UL, 0xe2724b02UL, 0x57e31f8fUL, 0x2a6655abUL,
     702    0x07b2eb28UL, 0x032fb5c2UL, 0x9a86c57bUL, 0xa5d33708UL,
     703    0xf2302887UL, 0xb223bfa5UL, 0xba02036aUL, 0x5ced1682UL,
     704    0x2b8acf1cUL, 0x92a779b4UL, 0xf0f307f2UL, 0xa14e69e2UL,
     705    0xcd65daf4UL, 0xd50605beUL, 0x1fd13462UL, 0x8ac4a6feUL,
     706    0x9d342e53UL, 0xa0a2f355UL, 0x32058ae1UL, 0x75a4f6ebUL,
     707    0x390b83ecUL, 0xaa4060efUL, 0x065e719fUL, 0x51bd6e10UL,
     708    0xf93e218aUL, 0x3d96dd06UL, 0xaedd3e05UL, 0x464de6bdUL,
     709    0xb591548dUL, 0x0571c45dUL, 0x6f0406d4UL, 0xff605015UL,
     710    0x241998fbUL, 0x97d6bde9UL, 0xcc894043UL, 0x7767d99eUL,
     711    0xbdb0e842UL, 0x8807898bUL, 0x38e7195bUL, 0xdb79c8eeUL,
     712    0x47a17c0aUL, 0xe97c420fUL, 0xc9f8841eUL, 0x00000000UL,
     713    0x83098086UL, 0x48322bedUL, 0xac1e1170UL, 0x4e6c5a72UL,
     714    0xfbfd0effUL, 0x560f8538UL, 0x1e3daed5UL, 0x27362d39UL,
     715    0x640a0fd9UL, 0x21685ca6UL, 0xd19b5b54UL, 0x3a24362eUL,
     716    0xb10c0a67UL, 0x0f9357e7UL, 0xd2b4ee96UL, 0x9e1b9b91UL,
     717    0x4f80c0c5UL, 0xa261dc20UL, 0x695a774bUL, 0x161c121aUL,
     718    0x0ae293baUL, 0xe5c0a02aUL, 0x433c22e0UL, 0x1d121b17UL,
     719    0x0b0e090dUL, 0xadf28bc7UL, 0xb92db6a8UL, 0xc8141ea9UL,
     720    0x8557f119UL, 0x4caf7507UL, 0xbbee99ddUL, 0xfda37f60UL,
     721    0x9ff70126UL, 0xbc5c72f5UL, 0xc544663bUL, 0x345bfb7eUL,
     722    0x768b4329UL, 0xdccb23c6UL, 0x68b6edfcUL, 0x63b8e4f1UL,
     723    0xcad731dcUL, 0x10426385UL, 0x40139722UL, 0x2084c611UL,
     724    0x7d854a24UL, 0xf8d2bb3dUL, 0x11aef932UL, 0x6dc729a1UL,
     725    0x4b1d9e2fUL, 0xf3dcb230UL, 0xec0d8652UL, 0xd077c1e3UL,
     726    0x6c2bb316UL, 0x99a970b9UL, 0xfa119448UL, 0x2247e964UL,
     727    0xc4a8fc8cUL, 0x1aa0f03fUL, 0xd8567d2cUL, 0xef223390UL,
     728    0xc787494eUL, 0xc1d938d1UL, 0xfe8ccaa2UL, 0x3698d40bUL,
     729    0xcfa6f581UL, 0x28a57adeUL, 0x26dab78eUL, 0xa43fadbfUL,
     730    0xe42c3a9dUL, 0x0d507892UL, 0x9b6a5fccUL, 0x62547e46UL,
     731    0xc2f68d13UL, 0xe890d8b8UL, 0x5e2e39f7UL, 0xf582c3afUL,
     732    0xbe9f5d80UL, 0x7c69d093UL, 0xa96fd52dUL, 0xb3cf2512UL,
     733    0x3bc8ac99UL, 0xa710187dUL, 0x6ee89c63UL, 0x7bdb3bbbUL,
     734    0x09cd2678UL, 0xf46e5918UL, 0x01ec9ab7UL, 0xa8834f9aUL,
     735    0x65e6956eUL, 0x7eaaffe6UL, 0x0821bccfUL, 0xe6ef15e8UL,
     736    0xd9bae79bUL, 0xce4a6f36UL, 0xd4ea9f09UL, 0xd629b07cUL,
     737    0xaf31a4b2UL, 0x312a3f23UL, 0x30c6a594UL, 0xc035a266UL,
     738    0x37744ebcUL, 0xa6fc82caUL, 0xb0e090d0UL, 0x1533a7d8UL,
     739    0x4af10498UL, 0xf741ecdaUL, 0x0e7fcd50UL, 0x2f1791f6UL,
     740    0x8d764dd6UL, 0x4d43efb0UL, 0x54ccaa4dUL, 0xdfe49604UL,
     741    0xe39ed1b5UL, 0x1b4c6a88UL, 0xb8c12c1fUL, 0x7f466551UL,
     742    0x049d5eeaUL, 0x5d018c35UL, 0x73fa8774UL, 0x2efb0b41UL,
     743    0x5ab3671dUL, 0x5292dbd2UL, 0x33e91056UL, 0x136dd647UL,
     744    0x8c9ad761UL, 0x7a37a10cUL, 0x8e59f814UL, 0x89eb133cUL,
     745    0xeecea927UL, 0x35b761c9UL, 0xede11ce5UL, 0x3c7a47b1UL,
     746    0x599cd2dfUL, 0x3f55f273UL, 0x791814ceUL, 0xbf73c737UL,
     747    0xea53f7cdUL, 0x5b5ffdaaUL, 0x14df3d6fUL, 0x867844dbUL,
     748    0x81caaff3UL, 0x3eb968c4UL, 0x2c382434UL, 0x5fc2a340UL,
     749    0x72161dc3UL, 0x0cbce225UL, 0x8b283c49UL, 0x41ff0d95UL,
     750    0x7139a801UL, 0xde080cb3UL, 0x9cd8b4e4UL, 0x906456c1UL,
     751    0x617bcb84UL, 0x70d532b6UL, 0x74486c5cUL, 0x42d0b857UL,
     752};
     753static const ulong32 TD2[256] = {
     754    0xa75051f4UL, 0x65537e41UL, 0xa4c31a17UL, 0x5e963a27UL,
     755    0x6bcb3babUL, 0x45f11f9dUL, 0x58abacfaUL, 0x03934be3UL,
     756    0xfa552030UL, 0x6df6ad76UL, 0x769188ccUL, 0x4c25f502UL,
     757    0xd7fc4fe5UL, 0xcbd7c52aUL, 0x44802635UL, 0xa38fb562UL,
     758    0x5a49deb1UL, 0x1b6725baUL, 0x0e9845eaUL, 0xc0e15dfeUL,
     759    0x7502c32fUL, 0xf012814cUL, 0x97a38d46UL, 0xf9c66bd3UL,
     760    0x5fe7038fUL, 0x9c951592UL, 0x7aebbf6dUL, 0x59da9552UL,
     761    0x832dd4beUL, 0x21d35874UL, 0x692949e0UL, 0xc8448ec9UL,
     762    0x896a75c2UL, 0x7978f48eUL, 0x3e6b9958UL, 0x71dd27b9UL,
     763    0x4fb6bee1UL, 0xad17f088UL, 0xac66c920UL, 0x3ab47dceUL,
     764    0x4a1863dfUL, 0x3182e51aUL, 0x33609751UL, 0x7f456253UL,
     765    0x77e0b164UL, 0xae84bb6bUL, 0xa01cfe81UL, 0x2b94f908UL,
     766    0x68587048UL, 0xfd198f45UL, 0x6c8794deUL, 0xf8b7527bUL,
     767    0xd323ab73UL, 0x02e2724bUL, 0x8f57e31fUL, 0xab2a6655UL,
     768    0x2807b2ebUL, 0xc2032fb5UL, 0x7b9a86c5UL, 0x08a5d337UL,
     769    0x87f23028UL, 0xa5b223bfUL, 0x6aba0203UL, 0x825ced16UL,
     770    0x1c2b8acfUL, 0xb492a779UL, 0xf2f0f307UL, 0xe2a14e69UL,
     771    0xf4cd65daUL, 0xbed50605UL, 0x621fd134UL, 0xfe8ac4a6UL,
     772    0x539d342eUL, 0x55a0a2f3UL, 0xe132058aUL, 0xeb75a4f6UL,
     773    0xec390b83UL, 0xefaa4060UL, 0x9f065e71UL, 0x1051bd6eUL,
     774    0x8af93e21UL, 0x063d96ddUL, 0x05aedd3eUL, 0xbd464de6UL,
     775    0x8db59154UL, 0x5d0571c4UL, 0xd46f0406UL, 0x15ff6050UL,
     776    0xfb241998UL, 0xe997d6bdUL, 0x43cc8940UL, 0x9e7767d9UL,
     777    0x42bdb0e8UL, 0x8b880789UL, 0x5b38e719UL, 0xeedb79c8UL,
     778    0x0a47a17cUL, 0x0fe97c42UL, 0x1ec9f884UL, 0x00000000UL,
     779    0x86830980UL, 0xed48322bUL, 0x70ac1e11UL, 0x724e6c5aUL,
     780    0xfffbfd0eUL, 0x38560f85UL, 0xd51e3daeUL, 0x3927362dUL,
     781    0xd9640a0fUL, 0xa621685cUL, 0x54d19b5bUL, 0x2e3a2436UL,
     782    0x67b10c0aUL, 0xe70f9357UL, 0x96d2b4eeUL, 0x919e1b9bUL,
     783    0xc54f80c0UL, 0x20a261dcUL, 0x4b695a77UL, 0x1a161c12UL,
     784    0xba0ae293UL, 0x2ae5c0a0UL, 0xe0433c22UL, 0x171d121bUL,
     785    0x0d0b0e09UL, 0xc7adf28bUL, 0xa8b92db6UL, 0xa9c8141eUL,
     786    0x198557f1UL, 0x074caf75UL, 0xddbbee99UL, 0x60fda37fUL,
     787    0x269ff701UL, 0xf5bc5c72UL, 0x3bc54466UL, 0x7e345bfbUL,
     788    0x29768b43UL, 0xc6dccb23UL, 0xfc68b6edUL, 0xf163b8e4UL,
     789    0xdccad731UL, 0x85104263UL, 0x22401397UL, 0x112084c6UL,
     790    0x247d854aUL, 0x3df8d2bbUL, 0x3211aef9UL, 0xa16dc729UL,
     791    0x2f4b1d9eUL, 0x30f3dcb2UL, 0x52ec0d86UL, 0xe3d077c1UL,
     792    0x166c2bb3UL, 0xb999a970UL, 0x48fa1194UL, 0x642247e9UL,
     793    0x8cc4a8fcUL, 0x3f1aa0f0UL, 0x2cd8567dUL, 0x90ef2233UL,
     794    0x4ec78749UL, 0xd1c1d938UL, 0xa2fe8ccaUL, 0x0b3698d4UL,
     795    0x81cfa6f5UL, 0xde28a57aUL, 0x8e26dab7UL, 0xbfa43fadUL,
     796    0x9de42c3aUL, 0x920d5078UL, 0xcc9b6a5fUL, 0x4662547eUL,
     797    0x13c2f68dUL, 0xb8e890d8UL, 0xf75e2e39UL, 0xaff582c3UL,
     798    0x80be9f5dUL, 0x937c69d0UL, 0x2da96fd5UL, 0x12b3cf25UL,
     799    0x993bc8acUL, 0x7da71018UL, 0x636ee89cUL, 0xbb7bdb3bUL,
     800    0x7809cd26UL, 0x18f46e59UL, 0xb701ec9aUL, 0x9aa8834fUL,
     801    0x6e65e695UL, 0xe67eaaffUL, 0xcf0821bcUL, 0xe8e6ef15UL,
     802    0x9bd9bae7UL, 0x36ce4a6fUL, 0x09d4ea9fUL, 0x7cd629b0UL,
     803    0xb2af31a4UL, 0x23312a3fUL, 0x9430c6a5UL, 0x66c035a2UL,
     804    0xbc37744eUL, 0xcaa6fc82UL, 0xd0b0e090UL, 0xd81533a7UL,
     805    0x984af104UL, 0xdaf741ecUL, 0x500e7fcdUL, 0xf62f1791UL,
     806    0xd68d764dUL, 0xb04d43efUL, 0x4d54ccaaUL, 0x04dfe496UL,
     807    0xb5e39ed1UL, 0x881b4c6aUL, 0x1fb8c12cUL, 0x517f4665UL,
     808    0xea049d5eUL, 0x355d018cUL, 0x7473fa87UL, 0x412efb0bUL,
     809    0x1d5ab367UL, 0xd25292dbUL, 0x5633e910UL, 0x47136dd6UL,
     810    0x618c9ad7UL, 0x0c7a37a1UL, 0x148e59f8UL, 0x3c89eb13UL,
     811    0x27eecea9UL, 0xc935b761UL, 0xe5ede11cUL, 0xb13c7a47UL,
     812    0xdf599cd2UL, 0x733f55f2UL, 0xce791814UL, 0x37bf73c7UL,
     813    0xcdea53f7UL, 0xaa5b5ffdUL, 0x6f14df3dUL, 0xdb867844UL,
     814    0xf381caafUL, 0xc43eb968UL, 0x342c3824UL, 0x405fc2a3UL,
     815    0xc372161dUL, 0x250cbce2UL, 0x498b283cUL, 0x9541ff0dUL,
     816    0x017139a8UL, 0xb3de080cUL, 0xe49cd8b4UL, 0xc1906456UL,
     817    0x84617bcbUL, 0xb670d532UL, 0x5c74486cUL, 0x5742d0b8UL,
     818};
     819static const ulong32 TD3[256] = {
     820    0xf4a75051UL, 0x4165537eUL, 0x17a4c31aUL, 0x275e963aUL,
     821    0xab6bcb3bUL, 0x9d45f11fUL, 0xfa58abacUL, 0xe303934bUL,
     822    0x30fa5520UL, 0x766df6adUL, 0xcc769188UL, 0x024c25f5UL,
     823    0xe5d7fc4fUL, 0x2acbd7c5UL, 0x35448026UL, 0x62a38fb5UL,
     824    0xb15a49deUL, 0xba1b6725UL, 0xea0e9845UL, 0xfec0e15dUL,
     825    0x2f7502c3UL, 0x4cf01281UL, 0x4697a38dUL, 0xd3f9c66bUL,
     826    0x8f5fe703UL, 0x929c9515UL, 0x6d7aebbfUL, 0x5259da95UL,
     827    0xbe832dd4UL, 0x7421d358UL, 0xe0692949UL, 0xc9c8448eUL,
     828    0xc2896a75UL, 0x8e7978f4UL, 0x583e6b99UL, 0xb971dd27UL,
     829    0xe14fb6beUL, 0x88ad17f0UL, 0x20ac66c9UL, 0xce3ab47dUL,
     830    0xdf4a1863UL, 0x1a3182e5UL, 0x51336097UL, 0x537f4562UL,
     831    0x6477e0b1UL, 0x6bae84bbUL, 0x81a01cfeUL, 0x082b94f9UL,
     832    0x48685870UL, 0x45fd198fUL, 0xde6c8794UL, 0x7bf8b752UL,
     833    0x73d323abUL, 0x4b02e272UL, 0x1f8f57e3UL, 0x55ab2a66UL,
     834    0xeb2807b2UL, 0xb5c2032fUL, 0xc57b9a86UL, 0x3708a5d3UL,
     835    0x2887f230UL, 0xbfa5b223UL, 0x036aba02UL, 0x16825cedUL,
     836    0xcf1c2b8aUL, 0x79b492a7UL, 0x07f2f0f3UL, 0x69e2a14eUL,
     837    0xdaf4cd65UL, 0x05bed506UL, 0x34621fd1UL, 0xa6fe8ac4UL,
     838    0x2e539d34UL, 0xf355a0a2UL, 0x8ae13205UL, 0xf6eb75a4UL,
     839    0x83ec390bUL, 0x60efaa40UL, 0x719f065eUL, 0x6e1051bdUL,
     840    0x218af93eUL, 0xdd063d96UL, 0x3e05aeddUL, 0xe6bd464dUL,
     841    0x548db591UL, 0xc45d0571UL, 0x06d46f04UL, 0x5015ff60UL,
     842    0x98fb2419UL, 0xbde997d6UL, 0x4043cc89UL, 0xd99e7767UL,
     843    0xe842bdb0UL, 0x898b8807UL, 0x195b38e7UL, 0xc8eedb79UL,
     844    0x7c0a47a1UL, 0x420fe97cUL, 0x841ec9f8UL, 0x00000000UL,
     845    0x80868309UL, 0x2bed4832UL, 0x1170ac1eUL, 0x5a724e6cUL,
     846    0x0efffbfdUL, 0x8538560fUL, 0xaed51e3dUL, 0x2d392736UL,
     847    0x0fd9640aUL, 0x5ca62168UL, 0x5b54d19bUL, 0x362e3a24UL,
     848    0x0a67b10cUL, 0x57e70f93UL, 0xee96d2b4UL, 0x9b919e1bUL,
     849    0xc0c54f80UL, 0xdc20a261UL, 0x774b695aUL, 0x121a161cUL,
     850    0x93ba0ae2UL, 0xa02ae5c0UL, 0x22e0433cUL, 0x1b171d12UL,
     851    0x090d0b0eUL, 0x8bc7adf2UL, 0xb6a8b92dUL, 0x1ea9c814UL,
     852    0xf1198557UL, 0x75074cafUL, 0x99ddbbeeUL, 0x7f60fda3UL,
     853    0x01269ff7UL, 0x72f5bc5cUL, 0x663bc544UL, 0xfb7e345bUL,
     854    0x4329768bUL, 0x23c6dccbUL, 0xedfc68b6UL, 0xe4f163b8UL,
     855    0x31dccad7UL, 0x63851042UL, 0x97224013UL, 0xc6112084UL,
     856    0x4a247d85UL, 0xbb3df8d2UL, 0xf93211aeUL, 0x29a16dc7UL,
     857    0x9e2f4b1dUL, 0xb230f3dcUL, 0x8652ec0dUL, 0xc1e3d077UL,
     858    0xb3166c2bUL, 0x70b999a9UL, 0x9448fa11UL, 0xe9642247UL,
     859    0xfc8cc4a8UL, 0xf03f1aa0UL, 0x7d2cd856UL, 0x3390ef22UL,
     860    0x494ec787UL, 0x38d1c1d9UL, 0xcaa2fe8cUL, 0xd40b3698UL,
     861    0xf581cfa6UL, 0x7ade28a5UL, 0xb78e26daUL, 0xadbfa43fUL,
     862    0x3a9de42cUL, 0x78920d50UL, 0x5fcc9b6aUL, 0x7e466254UL,
     863    0x8d13c2f6UL, 0xd8b8e890UL, 0x39f75e2eUL, 0xc3aff582UL,
     864    0x5d80be9fUL, 0xd0937c69UL, 0xd52da96fUL, 0x2512b3cfUL,
     865    0xac993bc8UL, 0x187da710UL, 0x9c636ee8UL, 0x3bbb7bdbUL,
     866    0x267809cdUL, 0x5918f46eUL, 0x9ab701ecUL, 0x4f9aa883UL,
     867    0x956e65e6UL, 0xffe67eaaUL, 0xbccf0821UL, 0x15e8e6efUL,
     868    0xe79bd9baUL, 0x6f36ce4aUL, 0x9f09d4eaUL, 0xb07cd629UL,
     869    0xa4b2af31UL, 0x3f23312aUL, 0xa59430c6UL, 0xa266c035UL,
     870    0x4ebc3774UL, 0x82caa6fcUL, 0x90d0b0e0UL, 0xa7d81533UL,
     871    0x04984af1UL, 0xecdaf741UL, 0xcd500e7fUL, 0x91f62f17UL,
     872    0x4dd68d76UL, 0xefb04d43UL, 0xaa4d54ccUL, 0x9604dfe4UL,
     873    0xd1b5e39eUL, 0x6a881b4cUL, 0x2c1fb8c1UL, 0x65517f46UL,
     874    0x5eea049dUL, 0x8c355d01UL, 0x877473faUL, 0x0b412efbUL,
     875    0x671d5ab3UL, 0xdbd25292UL, 0x105633e9UL, 0xd647136dUL,
     876    0xd7618c9aUL, 0xa10c7a37UL, 0xf8148e59UL, 0x133c89ebUL,
     877    0xa927eeceUL, 0x61c935b7UL, 0x1ce5ede1UL, 0x47b13c7aUL,
     878    0xd2df599cUL, 0xf2733f55UL, 0x14ce7918UL, 0xc737bf73UL,
     879    0xf7cdea53UL, 0xfdaa5b5fUL, 0x3d6f14dfUL, 0x44db8678UL,
     880    0xaff381caUL, 0x68c43eb9UL, 0x24342c38UL, 0xa3405fc2UL,
     881    0x1dc37216UL, 0xe2250cbcUL, 0x3c498b28UL, 0x0d9541ffUL,
     882    0xa8017139UL, 0x0cb3de08UL, 0xb4e49cd8UL, 0x56c19064UL,
     883    0xcb84617bUL, 0x32b670d5UL, 0x6c5c7448UL, 0xb85742d0UL,
     884};
     885
     886static const ulong32 Tks0[] = {
     8870x00000000UL, 0x0e090d0bUL, 0x1c121a16UL, 0x121b171dUL, 0x3824342cUL, 0x362d3927UL, 0x24362e3aUL, 0x2a3f2331UL,
     8880x70486858UL, 0x7e416553UL, 0x6c5a724eUL, 0x62537f45UL, 0x486c5c74UL, 0x4665517fUL, 0x547e4662UL, 0x5a774b69UL,
     8890xe090d0b0UL, 0xee99ddbbUL, 0xfc82caa6UL, 0xf28bc7adUL, 0xd8b4e49cUL, 0xd6bde997UL, 0xc4a6fe8aUL, 0xcaaff381UL,
     8900x90d8b8e8UL, 0x9ed1b5e3UL, 0x8ccaa2feUL, 0x82c3aff5UL, 0xa8fc8cc4UL, 0xa6f581cfUL, 0xb4ee96d2UL, 0xbae79bd9UL,
     8910xdb3bbb7bUL, 0xd532b670UL, 0xc729a16dUL, 0xc920ac66UL, 0xe31f8f57UL, 0xed16825cUL, 0xff0d9541UL, 0xf104984aUL,
     8920xab73d323UL, 0xa57ade28UL, 0xb761c935UL, 0xb968c43eUL, 0x9357e70fUL, 0x9d5eea04UL, 0x8f45fd19UL, 0x814cf012UL,
     8930x3bab6bcbUL, 0x35a266c0UL, 0x27b971ddUL, 0x29b07cd6UL, 0x038f5fe7UL, 0x0d8652ecUL, 0x1f9d45f1UL, 0x119448faUL,
     8940x4be30393UL, 0x45ea0e98UL, 0x57f11985UL, 0x59f8148eUL, 0x73c737bfUL, 0x7dce3ab4UL, 0x6fd52da9UL, 0x61dc20a2UL,
     8950xad766df6UL, 0xa37f60fdUL, 0xb16477e0UL, 0xbf6d7aebUL, 0x955259daUL, 0x9b5b54d1UL, 0x894043ccUL, 0x87494ec7UL,
     8960xdd3e05aeUL, 0xd33708a5UL, 0xc12c1fb8UL, 0xcf2512b3UL, 0xe51a3182UL, 0xeb133c89UL, 0xf9082b94UL, 0xf701269fUL,
     8970x4de6bd46UL, 0x43efb04dUL, 0x51f4a750UL, 0x5ffdaa5bUL, 0x75c2896aUL, 0x7bcb8461UL, 0x69d0937cUL, 0x67d99e77UL,
     8980x3daed51eUL, 0x33a7d815UL, 0x21bccf08UL, 0x2fb5c203UL, 0x058ae132UL, 0x0b83ec39UL, 0x1998fb24UL, 0x1791f62fUL,
     8990x764dd68dUL, 0x7844db86UL, 0x6a5fcc9bUL, 0x6456c190UL, 0x4e69e2a1UL, 0x4060efaaUL, 0x527bf8b7UL, 0x5c72f5bcUL,
     9000x0605bed5UL, 0x080cb3deUL, 0x1a17a4c3UL, 0x141ea9c8UL, 0x3e218af9UL, 0x302887f2UL, 0x223390efUL, 0x2c3a9de4UL,
     9010x96dd063dUL, 0x98d40b36UL, 0x8acf1c2bUL, 0x84c61120UL, 0xaef93211UL, 0xa0f03f1aUL, 0xb2eb2807UL, 0xbce2250cUL,
     9020xe6956e65UL, 0xe89c636eUL, 0xfa877473UL, 0xf48e7978UL, 0xdeb15a49UL, 0xd0b85742UL, 0xc2a3405fUL, 0xccaa4d54UL,
     9030x41ecdaf7UL, 0x4fe5d7fcUL, 0x5dfec0e1UL, 0x53f7cdeaUL, 0x79c8eedbUL, 0x77c1e3d0UL, 0x65daf4cdUL, 0x6bd3f9c6UL,
     9040x31a4b2afUL, 0x3fadbfa4UL, 0x2db6a8b9UL, 0x23bfa5b2UL, 0x09808683UL, 0x07898b88UL, 0x15929c95UL, 0x1b9b919eUL,
     9050xa17c0a47UL, 0xaf75074cUL, 0xbd6e1051UL, 0xb3671d5aUL, 0x99583e6bUL, 0x97513360UL, 0x854a247dUL, 0x8b432976UL,
     9060xd134621fUL, 0xdf3d6f14UL, 0xcd267809UL, 0xc32f7502UL, 0xe9105633UL, 0xe7195b38UL, 0xf5024c25UL, 0xfb0b412eUL,
     9070x9ad7618cUL, 0x94de6c87UL, 0x86c57b9aUL, 0x88cc7691UL, 0xa2f355a0UL, 0xacfa58abUL, 0xbee14fb6UL, 0xb0e842bdUL,
     9080xea9f09d4UL, 0xe49604dfUL, 0xf68d13c2UL, 0xf8841ec9UL, 0xd2bb3df8UL, 0xdcb230f3UL, 0xcea927eeUL, 0xc0a02ae5UL,
     9090x7a47b13cUL, 0x744ebc37UL, 0x6655ab2aUL, 0x685ca621UL, 0x42638510UL, 0x4c6a881bUL, 0x5e719f06UL, 0x5078920dUL,
     9100x0a0fd964UL, 0x0406d46fUL, 0x161dc372UL, 0x1814ce79UL, 0x322bed48UL, 0x3c22e043UL, 0x2e39f75eUL, 0x2030fa55UL,
     9110xec9ab701UL, 0xe293ba0aUL, 0xf088ad17UL, 0xfe81a01cUL, 0xd4be832dUL, 0xdab78e26UL, 0xc8ac993bUL, 0xc6a59430UL,
     9120x9cd2df59UL, 0x92dbd252UL, 0x80c0c54fUL, 0x8ec9c844UL, 0xa4f6eb75UL, 0xaaffe67eUL, 0xb8e4f163UL, 0xb6edfc68UL,
     9130x0c0a67b1UL, 0x02036abaUL, 0x10187da7UL, 0x1e1170acUL, 0x342e539dUL, 0x3a275e96UL, 0x283c498bUL, 0x26354480UL,
     9140x7c420fe9UL, 0x724b02e2UL, 0x605015ffUL, 0x6e5918f4UL, 0x44663bc5UL, 0x4a6f36ceUL, 0x587421d3UL, 0x567d2cd8UL,
     9150x37a10c7aUL, 0x39a80171UL, 0x2bb3166cUL, 0x25ba1b67UL, 0x0f853856UL, 0x018c355dUL, 0x13972240UL, 0x1d9e2f4bUL,
     9160x47e96422UL, 0x49e06929UL, 0x5bfb7e34UL, 0x55f2733fUL, 0x7fcd500eUL, 0x71c45d05UL, 0x63df4a18UL, 0x6dd64713UL,
     9170xd731dccaUL, 0xd938d1c1UL, 0xcb23c6dcUL, 0xc52acbd7UL, 0xef15e8e6UL, 0xe11ce5edUL, 0xf307f2f0UL, 0xfd0efffbUL,
     9180xa779b492UL, 0xa970b999UL, 0xbb6bae84UL, 0xb562a38fUL, 0x9f5d80beUL, 0x91548db5UL, 0x834f9aa8UL, 0x8d4697a3UL
     919};
     920
     921static const ulong32 Tks1[] = {
     9220x00000000UL, 0x0b0e090dUL, 0x161c121aUL, 0x1d121b17UL, 0x2c382434UL, 0x27362d39UL, 0x3a24362eUL, 0x312a3f23UL,
     9230x58704868UL, 0x537e4165UL, 0x4e6c5a72UL, 0x4562537fUL, 0x74486c5cUL, 0x7f466551UL, 0x62547e46UL, 0x695a774bUL,
     9240xb0e090d0UL, 0xbbee99ddUL, 0xa6fc82caUL, 0xadf28bc7UL, 0x9cd8b4e4UL, 0x97d6bde9UL, 0x8ac4a6feUL, 0x81caaff3UL,
     9250xe890d8b8UL, 0xe39ed1b5UL, 0xfe8ccaa2UL, 0xf582c3afUL, 0xc4a8fc8cUL, 0xcfa6f581UL, 0xd2b4ee96UL, 0xd9bae79bUL,
     9260x7bdb3bbbUL, 0x70d532b6UL, 0x6dc729a1UL, 0x66c920acUL, 0x57e31f8fUL, 0x5ced1682UL, 0x41ff0d95UL, 0x4af10498UL,
     9270x23ab73d3UL, 0x28a57adeUL, 0x35b761c9UL, 0x3eb968c4UL, 0x0f9357e7UL, 0x049d5eeaUL, 0x198f45fdUL, 0x12814cf0UL,
     9280xcb3bab6bUL, 0xc035a266UL, 0xdd27b971UL, 0xd629b07cUL, 0xe7038f5fUL, 0xec0d8652UL, 0xf11f9d45UL, 0xfa119448UL,
     9290x934be303UL, 0x9845ea0eUL, 0x8557f119UL, 0x8e59f814UL, 0xbf73c737UL, 0xb47dce3aUL, 0xa96fd52dUL, 0xa261dc20UL,
     9300xf6ad766dUL, 0xfda37f60UL, 0xe0b16477UL, 0xebbf6d7aUL, 0xda955259UL, 0xd19b5b54UL, 0xcc894043UL, 0xc787494eUL,
     9310xaedd3e05UL, 0xa5d33708UL, 0xb8c12c1fUL, 0xb3cf2512UL, 0x82e51a31UL, 0x89eb133cUL, 0x94f9082bUL, 0x9ff70126UL,
     9320x464de6bdUL, 0x4d43efb0UL, 0x5051f4a7UL, 0x5b5ffdaaUL, 0x6a75c289UL, 0x617bcb84UL, 0x7c69d093UL, 0x7767d99eUL,
     9330x1e3daed5UL, 0x1533a7d8UL, 0x0821bccfUL, 0x032fb5c2UL, 0x32058ae1UL, 0x390b83ecUL, 0x241998fbUL, 0x2f1791f6UL,
     9340x8d764dd6UL, 0x867844dbUL, 0x9b6a5fccUL, 0x906456c1UL, 0xa14e69e2UL, 0xaa4060efUL, 0xb7527bf8UL, 0xbc5c72f5UL,
     9350xd50605beUL, 0xde080cb3UL, 0xc31a17a4UL, 0xc8141ea9UL, 0xf93e218aUL, 0xf2302887UL, 0xef223390UL, 0xe42c3a9dUL,
     9360x3d96dd06UL, 0x3698d40bUL, 0x2b8acf1cUL, 0x2084c611UL, 0x11aef932UL, 0x1aa0f03fUL, 0x07b2eb28UL, 0x0cbce225UL,
     9370x65e6956eUL, 0x6ee89c63UL, 0x73fa8774UL, 0x78f48e79UL, 0x49deb15aUL, 0x42d0b857UL, 0x5fc2a340UL, 0x54ccaa4dUL,
     9380xf741ecdaUL, 0xfc4fe5d7UL, 0xe15dfec0UL, 0xea53f7cdUL, 0xdb79c8eeUL, 0xd077c1e3UL, 0xcd65daf4UL, 0xc66bd3f9UL,
     9390xaf31a4b2UL, 0xa43fadbfUL, 0xb92db6a8UL, 0xb223bfa5UL, 0x83098086UL, 0x8807898bUL, 0x9515929cUL, 0x9e1b9b91UL,
     9400x47a17c0aUL, 0x4caf7507UL, 0x51bd6e10UL, 0x5ab3671dUL, 0x6b99583eUL, 0x60975133UL, 0x7d854a24UL, 0x768b4329UL,
     9410x1fd13462UL, 0x14df3d6fUL, 0x09cd2678UL, 0x02c32f75UL, 0x33e91056UL, 0x38e7195bUL, 0x25f5024cUL, 0x2efb0b41UL,
     9420x8c9ad761UL, 0x8794de6cUL, 0x9a86c57bUL, 0x9188cc76UL, 0xa0a2f355UL, 0xabacfa58UL, 0xb6bee14fUL, 0xbdb0e842UL,
     9430xd4ea9f09UL, 0xdfe49604UL, 0xc2f68d13UL, 0xc9f8841eUL, 0xf8d2bb3dUL, 0xf3dcb230UL, 0xeecea927UL, 0xe5c0a02aUL,
     9440x3c7a47b1UL, 0x37744ebcUL, 0x2a6655abUL, 0x21685ca6UL, 0x10426385UL, 0x1b4c6a88UL, 0x065e719fUL, 0x0d507892UL,
     9450x640a0fd9UL, 0x6f0406d4UL, 0x72161dc3UL, 0x791814ceUL, 0x48322bedUL, 0x433c22e0UL, 0x5e2e39f7UL, 0x552030faUL,
     9460x01ec9ab7UL, 0x0ae293baUL, 0x17f088adUL, 0x1cfe81a0UL, 0x2dd4be83UL, 0x26dab78eUL, 0x3bc8ac99UL, 0x30c6a594UL,
     9470x599cd2dfUL, 0x5292dbd2UL, 0x4f80c0c5UL, 0x448ec9c8UL, 0x75a4f6ebUL, 0x7eaaffe6UL, 0x63b8e4f1UL, 0x68b6edfcUL,
     9480xb10c0a67UL, 0xba02036aUL, 0xa710187dUL, 0xac1e1170UL, 0x9d342e53UL, 0x963a275eUL, 0x8b283c49UL, 0x80263544UL,
     9490xe97c420fUL, 0xe2724b02UL, 0xff605015UL, 0xf46e5918UL, 0xc544663bUL, 0xce4a6f36UL, 0xd3587421UL, 0xd8567d2cUL,
     9500x7a37a10cUL, 0x7139a801UL, 0x6c2bb316UL, 0x6725ba1bUL, 0x560f8538UL, 0x5d018c35UL, 0x40139722UL, 0x4b1d9e2fUL,
     9510x2247e964UL, 0x2949e069UL, 0x345bfb7eUL, 0x3f55f273UL, 0x0e7fcd50UL, 0x0571c45dUL, 0x1863df4aUL, 0x136dd647UL,
     9520xcad731dcUL, 0xc1d938d1UL, 0xdccb23c6UL, 0xd7c52acbUL, 0xe6ef15e8UL, 0xede11ce5UL, 0xf0f307f2UL, 0xfbfd0effUL,
     9530x92a779b4UL, 0x99a970b9UL, 0x84bb6baeUL, 0x8fb562a3UL, 0xbe9f5d80UL, 0xb591548dUL, 0xa8834f9aUL, 0xa38d4697UL
     954};
     955
     956static const ulong32 Tks2[] = {
     9570x00000000UL, 0x0d0b0e09UL, 0x1a161c12UL, 0x171d121bUL, 0x342c3824UL, 0x3927362dUL, 0x2e3a2436UL, 0x23312a3fUL,
     9580x68587048UL, 0x65537e41UL, 0x724e6c5aUL, 0x7f456253UL, 0x5c74486cUL, 0x517f4665UL, 0x4662547eUL, 0x4b695a77UL,
     9590xd0b0e090UL, 0xddbbee99UL, 0xcaa6fc82UL, 0xc7adf28bUL, 0xe49cd8b4UL, 0xe997d6bdUL, 0xfe8ac4a6UL, 0xf381caafUL,
     9600xb8e890d8UL, 0xb5e39ed1UL, 0xa2fe8ccaUL, 0xaff582c3UL, 0x8cc4a8fcUL, 0x81cfa6f5UL, 0x96d2b4eeUL, 0x9bd9bae7UL,
     9610xbb7bdb3bUL, 0xb670d532UL, 0xa16dc729UL, 0xac66c920UL, 0x8f57e31fUL, 0x825ced16UL, 0x9541ff0dUL, 0x984af104UL,
     9620xd323ab73UL, 0xde28a57aUL, 0xc935b761UL, 0xc43eb968UL, 0xe70f9357UL, 0xea049d5eUL, 0xfd198f45UL, 0xf012814cUL,
     9630x6bcb3babUL, 0x66c035a2UL, 0x71dd27b9UL, 0x7cd629b0UL, 0x5fe7038fUL, 0x52ec0d86UL, 0x45f11f9dUL, 0x48fa1194UL,
     9640x03934be3UL, 0x0e9845eaUL, 0x198557f1UL, 0x148e59f8UL, 0x37bf73c7UL, 0x3ab47dceUL, 0x2da96fd5UL, 0x20a261dcUL,
     9650x6df6ad76UL, 0x60fda37fUL, 0x77e0b164UL, 0x7aebbf6dUL, 0x59da9552UL, 0x54d19b5bUL, 0x43cc8940UL, 0x4ec78749UL,
     9660x05aedd3eUL, 0x08a5d337UL, 0x1fb8c12cUL, 0x12b3cf25UL, 0x3182e51aUL, 0x3c89eb13UL, 0x2b94f908UL, 0x269ff701UL,
     9670xbd464de6UL, 0xb04d43efUL, 0xa75051f4UL, 0xaa5b5ffdUL, 0x896a75c2UL, 0x84617bcbUL, 0x937c69d0UL, 0x9e7767d9UL,
     9680xd51e3daeUL, 0xd81533a7UL, 0xcf0821bcUL, 0xc2032fb5UL, 0xe132058aUL, 0xec390b83UL, 0xfb241998UL, 0xf62f1791UL,
     9690xd68d764dUL, 0xdb867844UL, 0xcc9b6a5fUL, 0xc1906456UL, 0xe2a14e69UL, 0xefaa4060UL, 0xf8b7527bUL, 0xf5bc5c72UL,
     9700xbed50605UL, 0xb3de080cUL, 0xa4c31a17UL, 0xa9c8141eUL, 0x8af93e21UL, 0x87f23028UL, 0x90ef2233UL, 0x9de42c3aUL,
     9710x063d96ddUL, 0x0b3698d4UL, 0x1c2b8acfUL, 0x112084c6UL, 0x3211aef9UL, 0x3f1aa0f0UL, 0x2807b2ebUL, 0x250cbce2UL,
     9720x6e65e695UL, 0x636ee89cUL, 0x7473fa87UL, 0x7978f48eUL, 0x5a49deb1UL, 0x5742d0b8UL, 0x405fc2a3UL, 0x4d54ccaaUL,
     9730xdaf741ecUL, 0xd7fc4fe5UL, 0xc0e15dfeUL, 0xcdea53f7UL, 0xeedb79c8UL, 0xe3d077c1UL, 0xf4cd65daUL, 0xf9c66bd3UL,
     9740xb2af31a4UL, 0xbfa43fadUL, 0xa8b92db6UL, 0xa5b223bfUL, 0x86830980UL, 0x8b880789UL, 0x9c951592UL, 0x919e1b9bUL,
     9750x0a47a17cUL, 0x074caf75UL, 0x1051bd6eUL, 0x1d5ab367UL, 0x3e6b9958UL, 0x33609751UL, 0x247d854aUL, 0x29768b43UL,
     9760x621fd134UL, 0x6f14df3dUL, 0x7809cd26UL, 0x7502c32fUL, 0x5633e910UL, 0x5b38e719UL, 0x4c25f502UL, 0x412efb0bUL,
     9770x618c9ad7UL, 0x6c8794deUL, 0x7b9a86c5UL, 0x769188ccUL, 0x55a0a2f3UL, 0x58abacfaUL, 0x4fb6bee1UL, 0x42bdb0e8UL,
     9780x09d4ea9fUL, 0x04dfe496UL, 0x13c2f68dUL, 0x1ec9f884UL, 0x3df8d2bbUL, 0x30f3dcb2UL, 0x27eecea9UL, 0x2ae5c0a0UL,
     9790xb13c7a47UL, 0xbc37744eUL, 0xab2a6655UL, 0xa621685cUL, 0x85104263UL, 0x881b4c6aUL, 0x9f065e71UL, 0x920d5078UL,
     9800xd9640a0fUL, 0xd46f0406UL, 0xc372161dUL, 0xce791814UL, 0xed48322bUL, 0xe0433c22UL, 0xf75e2e39UL, 0xfa552030UL,
     9810xb701ec9aUL, 0xba0ae293UL, 0xad17f088UL, 0xa01cfe81UL, 0x832dd4beUL, 0x8e26dab7UL, 0x993bc8acUL, 0x9430c6a5UL,
     9820xdf599cd2UL, 0xd25292dbUL, 0xc54f80c0UL, 0xc8448ec9UL, 0xeb75a4f6UL, 0xe67eaaffUL, 0xf163b8e4UL, 0xfc68b6edUL,
     9830x67b10c0aUL, 0x6aba0203UL, 0x7da71018UL, 0x70ac1e11UL, 0x539d342eUL, 0x5e963a27UL, 0x498b283cUL, 0x44802635UL,
     9840x0fe97c42UL, 0x02e2724bUL, 0x15ff6050UL, 0x18f46e59UL, 0x3bc54466UL, 0x36ce4a6fUL, 0x21d35874UL, 0x2cd8567dUL,
     9850x0c7a37a1UL, 0x017139a8UL, 0x166c2bb3UL, 0x1b6725baUL, 0x38560f85UL, 0x355d018cUL, 0x22401397UL, 0x2f4b1d9eUL,
     9860x642247e9UL, 0x692949e0UL, 0x7e345bfbUL, 0x733f55f2UL, 0x500e7fcdUL, 0x5d0571c4UL, 0x4a1863dfUL, 0x47136dd6UL,
     9870xdccad731UL, 0xd1c1d938UL, 0xc6dccb23UL, 0xcbd7c52aUL, 0xe8e6ef15UL, 0xe5ede11cUL, 0xf2f0f307UL, 0xfffbfd0eUL,
     9880xb492a779UL, 0xb999a970UL, 0xae84bb6bUL, 0xa38fb562UL, 0x80be9f5dUL, 0x8db59154UL, 0x9aa8834fUL, 0x97a38d46UL
     989};
     990
     991static const ulong32 Tks3[] = {
     9920x00000000UL, 0x090d0b0eUL, 0x121a161cUL, 0x1b171d12UL, 0x24342c38UL, 0x2d392736UL, 0x362e3a24UL, 0x3f23312aUL,
     9930x48685870UL, 0x4165537eUL, 0x5a724e6cUL, 0x537f4562UL, 0x6c5c7448UL, 0x65517f46UL, 0x7e466254UL, 0x774b695aUL,
     9940x90d0b0e0UL, 0x99ddbbeeUL, 0x82caa6fcUL, 0x8bc7adf2UL, 0xb4e49cd8UL, 0xbde997d6UL, 0xa6fe8ac4UL, 0xaff381caUL,
     9950xd8b8e890UL, 0xd1b5e39eUL, 0xcaa2fe8cUL, 0xc3aff582UL, 0xfc8cc4a8UL, 0xf581cfa6UL, 0xee96d2b4UL, 0xe79bd9baUL,
     9960x3bbb7bdbUL, 0x32b670d5UL, 0x29a16dc7UL, 0x20ac66c9UL, 0x1f8f57e3UL, 0x16825cedUL, 0x0d9541ffUL, 0x04984af1UL,
     9970x73d323abUL, 0x7ade28a5UL, 0x61c935b7UL, 0x68c43eb9UL, 0x57e70f93UL, 0x5eea049dUL, 0x45fd198fUL, 0x4cf01281UL,
     9980xab6bcb3bUL, 0xa266c035UL, 0xb971dd27UL, 0xb07cd629UL, 0x8f5fe703UL, 0x8652ec0dUL, 0x9d45f11fUL, 0x9448fa11UL,
     9990xe303934bUL, 0xea0e9845UL, 0xf1198557UL, 0xf8148e59UL, 0xc737bf73UL, 0xce3ab47dUL, 0xd52da96fUL, 0xdc20a261UL,
     10000x766df6adUL, 0x7f60fda3UL, 0x6477e0b1UL, 0x6d7aebbfUL, 0x5259da95UL, 0x5b54d19bUL, 0x4043cc89UL, 0x494ec787UL,
     10010x3e05aeddUL, 0x3708a5d3UL, 0x2c1fb8c1UL, 0x2512b3cfUL, 0x1a3182e5UL, 0x133c89ebUL, 0x082b94f9UL, 0x01269ff7UL,
     10020xe6bd464dUL, 0xefb04d43UL, 0xf4a75051UL, 0xfdaa5b5fUL, 0xc2896a75UL, 0xcb84617bUL, 0xd0937c69UL, 0xd99e7767UL,
     10030xaed51e3dUL, 0xa7d81533UL, 0xbccf0821UL, 0xb5c2032fUL, 0x8ae13205UL, 0x83ec390bUL, 0x98fb2419UL, 0x91f62f17UL,
     10040x4dd68d76UL, 0x44db8678UL, 0x5fcc9b6aUL, 0x56c19064UL, 0x69e2a14eUL, 0x60efaa40UL, 0x7bf8b752UL, 0x72f5bc5cUL,
     10050x05bed506UL, 0x0cb3de08UL, 0x17a4c31aUL, 0x1ea9c814UL, 0x218af93eUL, 0x2887f230UL, 0x3390ef22UL, 0x3a9de42cUL,
     10060xdd063d96UL, 0xd40b3698UL, 0xcf1c2b8aUL, 0xc6112084UL, 0xf93211aeUL, 0xf03f1aa0UL, 0xeb2807b2UL, 0xe2250cbcUL,
     10070x956e65e6UL, 0x9c636ee8UL, 0x877473faUL, 0x8e7978f4UL, 0xb15a49deUL, 0xb85742d0UL, 0xa3405fc2UL, 0xaa4d54ccUL,
     10080xecdaf741UL, 0xe5d7fc4fUL, 0xfec0e15dUL, 0xf7cdea53UL, 0xc8eedb79UL, 0xc1e3d077UL, 0xdaf4cd65UL, 0xd3f9c66bUL,
     10090xa4b2af31UL, 0xadbfa43fUL, 0xb6a8b92dUL, 0xbfa5b223UL, 0x80868309UL, 0x898b8807UL, 0x929c9515UL, 0x9b919e1bUL,
     10100x7c0a47a1UL, 0x75074cafUL, 0x6e1051bdUL, 0x671d5ab3UL, 0x583e6b99UL, 0x51336097UL, 0x4a247d85UL, 0x4329768bUL,
     10110x34621fd1UL, 0x3d6f14dfUL, 0x267809cdUL, 0x2f7502c3UL, 0x105633e9UL, 0x195b38e7UL, 0x024c25f5UL, 0x0b412efbUL,
     10120xd7618c9aUL, 0xde6c8794UL, 0xc57b9a86UL, 0xcc769188UL, 0xf355a0a2UL, 0xfa58abacUL, 0xe14fb6beUL, 0xe842bdb0UL,
     10130x9f09d4eaUL, 0x9604dfe4UL, 0x8d13c2f6UL, 0x841ec9f8UL, 0xbb3df8d2UL, 0xb230f3dcUL, 0xa927eeceUL, 0xa02ae5c0UL,
     10140x47b13c7aUL, 0x4ebc3774UL, 0x55ab2a66UL, 0x5ca62168UL, 0x63851042UL, 0x6a881b4cUL, 0x719f065eUL, 0x78920d50UL,
     10150x0fd9640aUL, 0x06d46f04UL, 0x1dc37216UL, 0x14ce7918UL, 0x2bed4832UL, 0x22e0433cUL, 0x39f75e2eUL, 0x30fa5520UL,
     10160x9ab701ecUL, 0x93ba0ae2UL, 0x88ad17f0UL, 0x81a01cfeUL, 0xbe832dd4UL, 0xb78e26daUL, 0xac993bc8UL, 0xa59430c6UL,
     10170xd2df599cUL, 0xdbd25292UL, 0xc0c54f80UL, 0xc9c8448eUL, 0xf6eb75a4UL, 0xffe67eaaUL, 0xe4f163b8UL, 0xedfc68b6UL,
     10180x0a67b10cUL, 0x036aba02UL, 0x187da710UL, 0x1170ac1eUL, 0x2e539d34UL, 0x275e963aUL, 0x3c498b28UL, 0x35448026UL,
     10190x420fe97cUL, 0x4b02e272UL, 0x5015ff60UL, 0x5918f46eUL, 0x663bc544UL, 0x6f36ce4aUL, 0x7421d358UL, 0x7d2cd856UL,
     10200xa10c7a37UL, 0xa8017139UL, 0xb3166c2bUL, 0xba1b6725UL, 0x8538560fUL, 0x8c355d01UL, 0x97224013UL, 0x9e2f4b1dUL,
     10210xe9642247UL, 0xe0692949UL, 0xfb7e345bUL, 0xf2733f55UL, 0xcd500e7fUL, 0xc45d0571UL, 0xdf4a1863UL, 0xd647136dUL,
     10220x31dccad7UL, 0x38d1c1d9UL, 0x23c6dccbUL, 0x2acbd7c5UL, 0x15e8e6efUL, 0x1ce5ede1UL, 0x07f2f0f3UL, 0x0efffbfdUL,
     10230x79b492a7UL, 0x70b999a9UL, 0x6bae84bbUL, 0x62a38fb5UL, 0x5d80be9fUL, 0x548db591UL, 0x4f9aa883UL, 0x4697a38dUL
     1024};
     1025
     1026#endif /* SMALL CODE */
     1027
     1028static const ulong32 rcon[] = {
     1029    0x01000000UL, 0x02000000UL, 0x04000000UL, 0x08000000UL,
     1030    0x10000000UL, 0x20000000UL, 0x40000000UL, 0x80000000UL,
     1031    0x1B000000UL, 0x36000000UL, /* for 128-bit blocks, AES never uses more than 10 rcon values */
     1032};
     1033
     1034
     1035static int      aes_setup(const unsigned char *key, int keylen, int rounds, aes_CBC *skey);
     1036static void     aes_ecb_encrypt(const unsigned char *pt, unsigned char *ct, aes_CBC *skey);
     1037static void     aes_ecb_decrypt(const unsigned char *ct, unsigned char *pt, aes_CBC *skey);
     1038
     1039#ifdef CLEAN_STACK
     1040static void _aes_ecb_decrypt(const unsigned char *ct, unsigned char *pt, aes_CBC *skey);
     1041static void _aes_ecb_encrypt(const unsigned char *pt, unsigned char *ct, aes_CBC *skey);
     1042#endif
     1043
     1044int matrixAesInit(sslCipherContext_t *ctx, unsigned char *IV, unsigned char *key, int keylen)
     1045{
     1046        int             x, err;
     1047
     1048        if (IV == NULL || key == NULL || ctx == NULL) {
     1049                return -1;
     1050        }
     1051/*
     1052        setup cipher
     1053 */
     1054        if ((err = aes_setup(key, keylen, 0, &ctx->aes)) != CRYPT_OK) {
     1055                return -1;
     1056        }
     1057/*
     1058        copy IV
     1059 */
     1060        ctx->aes.blocklen = 16;
     1061        for (x = 0; x < ctx->aes.blocklen; x++) {
     1062                ctx->aes.IV[x] = IV[x];
     1063        }
     1064        return 0;
     1065}
     1066
     1067int matrixAesEncrypt(sslCipherContext_t *ctx, unsigned char *pt, unsigned char *ct, int len)
     1068{
     1069        int                             x, i;
     1070        unsigned char   tmp[MAXBLOCKSIZE];
     1071
     1072        if (pt == NULL || ct == NULL || ctx == NULL || (len & 0x7) != 0) {
     1073                matrixStrDebugMsg("Bad parameters to matrixAesEncrypt\n", NULL);
     1074                return -1;
     1075        }
     1076
     1077/*
     1078        is blocklen valid?
     1079 */
     1080        if (ctx->aes.blocklen < 0 || ctx->aes.blocklen >
     1081                        (int)sizeof(ctx->aes.IV)) {
     1082                return -1;
     1083        }
     1084
     1085        for (i = 0; i < len; i += ctx->aes.blocklen) {
     1086/*
     1087                xor IV against plaintext
     1088 */
     1089                for (x = 0; x < ctx->aes.blocklen; x++) {
     1090                        tmp[x] = pt[x] ^ ctx->aes.IV[x];
     1091                }
     1092/*
     1093                encrypt
     1094 */
     1095                aes_ecb_encrypt(tmp, ct, &ctx->aes);
     1096
     1097/*
     1098                store IV [ciphertext] for a future block
     1099 */
     1100                for (x = 0; x < ctx->aes.blocklen; x++) {
     1101                        ctx->aes.IV[x] = ct[x];
     1102                }
     1103                ct += ctx->aes.blocklen;
     1104                pt += ctx->aes.blocklen;
     1105        }
     1106
     1107#ifdef CLEAN_STACK
     1108        zeromem(tmp, sizeof(tmp));
     1109#endif
     1110        return len;
     1111}
     1112
     1113int matrixAesDecrypt(sslCipherContext_t *ctx, unsigned char *ct, unsigned char *pt, int len)
     1114{
     1115        int                             x, i;
     1116        unsigned char   tmp[MAXBLOCKSIZE], tmp2[MAXBLOCKSIZE];
     1117
     1118        if (pt == NULL || ct == NULL || ctx == NULL || (len & 0x7) != 0) {
     1119                matrixStrDebugMsg("Bad parameters to matrixAesDecrypt\n", NULL);
     1120                return -1;
     1121        }
     1122
     1123/*
     1124        is blocklen valid?
     1125 */
     1126        if (ctx->aes.blocklen < 0 || ctx->aes.blocklen >
     1127                (int)sizeof(ctx->aes.IV)) {
     1128                return -1;
     1129        }
     1130        for (i = 0; i < len; i += ctx->aes.blocklen) {
     1131/*
     1132                decrypt the block from ct into tmp
     1133 */
     1134                aes_ecb_decrypt(ct, tmp, &ctx->aes);
     1135/*
     1136                xor IV against the plaintext of the previous step
     1137 */
     1138                for (x = 0; x < ctx->aes.blocklen; x++) {
     1139/*
     1140                        copy CT in case ct == pt
     1141 */
     1142                        tmp2[x] = ct[x];
     1143/*
     1144                        actually decrypt the byte
     1145 */
     1146                        pt[x] = tmp[x] ^ ctx->aes.IV[x];
     1147                }
     1148/*
     1149                replace IV with this current ciphertext
     1150 */
     1151                for (x = 0; x < ctx->aes.blocklen; x++) {
     1152                        ctx->aes.IV[x] = tmp2[x];
     1153                }
     1154                ct += ctx->aes.blocklen;
     1155                pt += ctx->aes.blocklen;
     1156        }
     1157#ifdef CLEAN_STACK
     1158        zeromem(tmp, sizeof(tmp));
     1159        zeromem(tmp2, sizeof(tmp2));
     1160#endif
     1161        return len;
     1162}
     1163
     1164int aes_setup(const unsigned char *key, int keylen, int rounds, aes_CBC *skey)
     1165{
     1166        int                     i, j;
     1167        ulong32         temp, *rk, *rrk;
     1168       
     1169        if (key == NULL || skey == NULL) {
     1170                return -1;
     1171        }
     1172       
     1173        if (keylen != 16 && keylen != 24 && keylen != 32) {
     1174                return CRYPT_INVALID_KEYSIZE;
     1175        }
     1176       
     1177        if (rounds != 0 && rounds != (10 + ((keylen/8)-2)*2)) {
     1178                return CRYPT_INVALID_ROUNDS;
     1179        }
     1180       
     1181        skey->key.Nr = 10 + ((keylen/8)-2)*2;
     1182               
     1183/*
     1184        setup the forward key
     1185 */
     1186        i                               = 0;
     1187        rk                              = skey->key.eK;
     1188        LOAD32H(rk[0], key         );
     1189        LOAD32H(rk[1], key +  4);
     1190        LOAD32H(rk[2], key +  8);
     1191        LOAD32H(rk[3], key + 12);
     1192        if (keylen == 16) {
     1193                j = 44;
     1194                for (;;) {
     1195                        temp  = rk[3];
     1196                        rk[4] = rk[0] ^
     1197                                (Te4_3[byte(temp, 2)]) ^
     1198                                (Te4_2[byte(temp, 1)]) ^
     1199                                (Te4_1[byte(temp, 0)]) ^
     1200                                (Te4_0[byte(temp, 3)]) ^
     1201                                rcon[i];
     1202                        rk[5] = rk[1] ^ rk[4];
     1203                        rk[6] = rk[2] ^ rk[5];
     1204                        rk[7] = rk[3] ^ rk[6];
     1205                        if (++i == 10) {
     1206                                break;
     1207                        }
     1208                        rk += 4;
     1209                }
     1210        } else if (keylen == 24) {
     1211                j = 52;
     1212                LOAD32H(rk[4], key + 16);
     1213                LOAD32H(rk[5], key + 20);
     1214                for (;;) {
     1215                #ifdef _MSC_VER
     1216                        temp = skey->key.eK[rk - skey->key.eK + 5];
     1217                #else
     1218                        temp = rk[5];
     1219                #endif /* _MSC_VER */
     1220                        rk[ 6] = rk[ 0] ^
     1221                                (Te4_3[byte(temp, 2)]) ^
     1222                                (Te4_2[byte(temp, 1)]) ^
     1223                                (Te4_1[byte(temp, 0)]) ^
     1224                                (Te4_0[byte(temp, 3)]) ^
     1225                                rcon[i];
     1226                        rk[ 7] = rk[ 1] ^ rk[ 6];
     1227                        rk[ 8] = rk[ 2] ^ rk[ 7];
     1228                        rk[ 9] = rk[ 3] ^ rk[ 8];
     1229                        if (++i == 8) {
     1230                                break;
     1231                        }
     1232                        rk[10] = rk[ 4] ^ rk[ 9];
     1233                        rk[11] = rk[ 5] ^ rk[10];
     1234                        rk += 6;
     1235                }
     1236        } else if (keylen == 32) {
     1237                j = 60;
     1238                LOAD32H(rk[4], key + 16);
     1239                LOAD32H(rk[5], key + 20);
     1240                LOAD32H(rk[6], key + 24);
     1241                LOAD32H(rk[7], key + 28);
     1242                for (;;) {
     1243                #ifdef _MSC_VER
     1244                        temp = skey->key.eK[rk - skey->key.eK + 7];
     1245                #else
     1246                        temp = rk[7];
     1247                #endif /* _MSC_VER */
     1248                        rk[ 8] = rk[ 0] ^
     1249                                (Te4_3[byte(temp, 2)]) ^
     1250                                (Te4_2[byte(temp, 1)]) ^
     1251                                (Te4_1[byte(temp, 0)]) ^
     1252                                (Te4_0[byte(temp, 3)]) ^
     1253                                rcon[i];
     1254                        rk[ 9] = rk[ 1] ^ rk[ 8];
     1255                        rk[10] = rk[ 2] ^ rk[ 9];
     1256                        rk[11] = rk[ 3] ^ rk[10];
     1257                        if (++i == 7) {
     1258                                break;
     1259                        }
     1260                        temp = rk[11];
     1261                        rk[12] = rk[ 4] ^
     1262                                (Te4_3[byte(temp, 3)]) ^
     1263                                (Te4_2[byte(temp, 2)]) ^
     1264                                (Te4_1[byte(temp, 1)]) ^
     1265                                (Te4_0[byte(temp, 0)]);
     1266                        rk[13] = rk[ 5] ^ rk[12];
     1267                        rk[14] = rk[ 6] ^ rk[13];
     1268                        rk[15] = rk[ 7] ^ rk[14];
     1269                        rk += 8;
     1270                }
     1271        } else {
     1272/*
     1273                this can't happen
     1274 */
     1275                j = 4;
     1276        }
     1277       
     1278/*
     1279        setup the inverse key now
     1280 */
     1281        rk              = skey->key.dK;
     1282        rrk             = skey->key.eK + j - 4;
     1283       
     1284/*
     1285        apply the inverse MixColumn transform to all round keys but the first and the last:
     1286 */
     1287        /* copy first */
     1288        *rk++   = *rrk++;
     1289        *rk++   = *rrk++;
     1290        *rk++   = *rrk++;
     1291        *rk             = *rrk;
     1292        rk -= 3; rrk -= 3;
     1293       
     1294        for (i = 1; i < skey->key.Nr; i++) {
     1295                rrk     -= 4;
     1296                rk      += 4;
     1297#ifdef SMALL_CODE
     1298                temp = rrk[0];
     1299                rk[0] =
     1300                        Td0(255 & Te4[byte(temp, 3)]) ^
     1301                        Td1(255 & Te4[byte(temp, 2)]) ^
     1302                        Td2(255 & Te4[byte(temp, 1)]) ^
     1303                        Td3(255 & Te4[byte(temp, 0)]);
     1304                temp = rrk[1];
     1305                rk[1] =
     1306                        Td0(255 & Te4[byte(temp, 3)]) ^
     1307                        Td1(255 & Te4[byte(temp, 2)]) ^
     1308                        Td2(255 & Te4[byte(temp, 1)]) ^
     1309                        Td3(255 & Te4[byte(temp, 0)]);
     1310                temp = rrk[2];
     1311                rk[2] =
     1312                        Td0(255 & Te4[byte(temp, 3)]) ^
     1313                        Td1(255 & Te4[byte(temp, 2)]) ^
     1314                        Td2(255 & Te4[byte(temp, 1)]) ^
     1315                        Td3(255 & Te4[byte(temp, 0)]);
     1316                temp = rrk[3];
     1317                rk[3] =
     1318                        Td0(255 & Te4[byte(temp, 3)]) ^
     1319                        Td1(255 & Te4[byte(temp, 2)]) ^
     1320                        Td2(255 & Te4[byte(temp, 1)]) ^
     1321                        Td3(255 & Te4[byte(temp, 0)]);
     1322#else /* SMALL CODE */
     1323                temp = rrk[0];
     1324                rk[0] =
     1325                        Tks0[byte(temp, 3)] ^
     1326                        Tks1[byte(temp, 2)] ^
     1327                        Tks2[byte(temp, 1)] ^
     1328                        Tks3[byte(temp, 0)];
     1329                temp = rrk[1];
     1330                rk[1] =
     1331                        Tks0[byte(temp, 3)] ^
     1332                        Tks1[byte(temp, 2)] ^
     1333                        Tks2[byte(temp, 1)] ^
     1334                        Tks3[byte(temp, 0)];
     1335                temp = rrk[2];
     1336                rk[2] =
     1337                        Tks0[byte(temp, 3)] ^
     1338                        Tks1[byte(temp, 2)] ^
     1339                        Tks2[byte(temp, 1)] ^
     1340                        Tks3[byte(temp, 0)];
     1341                temp = rrk[3];
     1342                rk[3] =
     1343                        Tks0[byte(temp, 3)] ^
     1344                        Tks1[byte(temp, 2)] ^
     1345                        Tks2[byte(temp, 1)] ^
     1346                        Tks3[byte(temp, 0)];
     1347#endif /* SMALL CODE */
     1348        }
     1349
     1350        /* copy last */
     1351        rrk     -= 4;
     1352        rk      += 4;
     1353        *rk++ = *rrk++;
     1354        *rk++ = *rrk++;
     1355        *rk++ = *rrk++;
     1356        *rk       = *rrk;
     1357
     1358        return CRYPT_OK;
     1359}
     1360
     1361#ifdef CLEAN_STACK
     1362void aes_ecb_encrypt(const unsigned char *pt, unsigned char *ct, aes_CBC *skey)
     1363{
     1364        _aes_ecb_encrypt(pt, ct, skey);
     1365        burn_stack(sizeof(unsigned long)*8 + sizeof(unsigned long*) + sizeof(int)*2);
     1366}
     1367#endif /* CLEAN_STACK */
     1368
     1369#ifdef CLEAN_STACK
     1370static void _aes_ecb_encrypt(const unsigned char *pt, unsigned char *ct, aes_CBC *skey)
     1371#else
     1372void aes_ecb_encrypt(const unsigned char *pt, unsigned char *ct, aes_CBC *skey)
     1373#endif /* CLEAN_STACK */
     1374{
     1375                ulong32         s0, s1, s2, s3, t0, t1, t2, t3, *rk;
     1376                int                     Nr, r;
     1377
     1378        if (pt == NULL || ct == NULL || skey == NULL) {
     1379                return;
     1380        }
     1381       
     1382        Nr = skey->key.Nr;
     1383        rk = skey->key.eK;
     1384       
     1385/*
     1386        map byte array block to cipher state
     1387        and add initial round key:
     1388 */
     1389        LOAD32H(s0, pt     ); s0 ^= rk[0];
     1390        LOAD32H(s1, pt +  4); s1 ^= rk[1];
     1391        LOAD32H(s2, pt +  8); s2 ^= rk[2];
     1392        LOAD32H(s3, pt + 12); s3 ^= rk[3];
     1393
     1394/*
     1395        Nr - 1 full rounds:
     1396 */
     1397        r = Nr >> 1;
     1398        for (;;) {
     1399
     1400                t0 =
     1401                        Te0(byte(s0, 3)) ^
     1402                        Te1(byte(s1, 2)) ^
     1403                        Te2(byte(s2, 1)) ^
     1404                        Te3(byte(s3, 0)) ^
     1405                        rk[4];
     1406                t1 =
     1407                        Te0(byte(s1, 3)) ^
     1408                        Te1(byte(s2, 2)) ^
     1409                        Te2(byte(s3, 1)) ^
     1410                        Te3(byte(s0, 0)) ^
     1411                        rk[5];
     1412                t2 =
     1413                        Te0(byte(s2, 3)) ^
     1414                        Te1(byte(s3, 2)) ^
     1415                        Te2(byte(s0, 1)) ^
     1416                        Te3(byte(s1, 0)) ^
     1417                        rk[6];
     1418                t3 =
     1419                        Te0(byte(s3, 3)) ^
     1420                        Te1(byte(s0, 2)) ^
     1421                        Te2(byte(s1, 1)) ^
     1422                        Te3(byte(s2, 0)) ^
     1423                        rk[7];
     1424
     1425                rk += 8;
     1426                if (--r == 0) {
     1427                        break;
     1428                }
     1429
     1430                s0 =
     1431                        Te0(byte(t0, 3)) ^
     1432                        Te1(byte(t1, 2)) ^
     1433                        Te2(byte(t2, 1)) ^
     1434                        Te3(byte(t3, 0)) ^
     1435                        rk[0];
     1436                s1 =
     1437                        Te0(byte(t1, 3)) ^
     1438                        Te1(byte(t2, 2)) ^
     1439                        Te2(byte(t3, 1)) ^
     1440                        Te3(byte(t0, 0)) ^
     1441                        rk[1];
     1442                s2 =
     1443                        Te0(byte(t2, 3)) ^
     1444                        Te1(byte(t3, 2)) ^
     1445                        Te2(byte(t0, 1)) ^
     1446                        Te3(byte(t1, 0)) ^
     1447                        rk[2];
     1448                s3 =
     1449                        Te0(byte(t3, 3)) ^
     1450                        Te1(byte(t0, 2)) ^
     1451                        Te2(byte(t1, 1)) ^
     1452                        Te3(byte(t2, 0)) ^
     1453                        rk[3];
     1454        }
     1455/*
     1456                apply last round and map cipher state to byte array block:
     1457 */
     1458        s0 =
     1459                (Te4_3[byte(t0, 3)]) ^
     1460                (Te4_2[byte(t1, 2)]) ^
     1461                (Te4_1[byte(t2, 1)]) ^
     1462                (Te4_0[byte(t3, 0)]) ^
     1463                rk[0];
     1464        STORE32H(s0, ct);
     1465        s1 =
     1466                (Te4_3[byte(t1, 3)]) ^
     1467                (Te4_2[byte(t2, 2)]) ^
     1468                (Te4_1[byte(t3, 1)]) ^
     1469                (Te4_0[byte(t0, 0)]) ^
     1470                rk[1];
     1471        STORE32H(s1, ct+4);
     1472        s2 =
     1473                (Te4_3[byte(t2, 3)]) ^
     1474                (Te4_2[byte(t3, 2)]) ^
     1475                (Te4_1[byte(t0, 1)]) ^
     1476                (Te4_0[byte(t1, 0)]) ^
     1477                rk[2];
     1478        STORE32H(s2, ct+8);
     1479        s3 =
     1480                (Te4_3[byte(t3, 3)]) ^
     1481                (Te4_2[byte(t0, 2)]) ^
     1482                (Te4_1[byte(t1, 1)]) ^
     1483                (Te4_0[byte(t2, 0)]) ^
     1484                rk[3];
     1485        STORE32H(s3, ct+12);
     1486}
     1487
     1488#ifdef CLEAN_STACK
     1489void aes_ecb_decrypt(const unsigned char *pt, unsigned char *ct, aes_CBC *skey)
     1490{
     1491        _aes_ecb_decrypt(pt, ct, skey);
     1492        burn_stack(sizeof(unsigned long)*8 + sizeof(unsigned long*) + sizeof(int)*2);
     1493}
     1494#endif /* CLEAN_STACK */
     1495
     1496#ifdef CLEAN_STACK
     1497static void _aes_ecb_decrypt(const unsigned char *ct, unsigned char *pt, aes_CBC *skey)
     1498#else
     1499void aes_ecb_decrypt(const unsigned char *ct, unsigned char *pt, aes_CBC *skey)
     1500#endif /* CLEAN_STACK */
     1501{
     1502        ulong32         s0, s1, s2, s3, t0, t1, t2, t3, *rk;
     1503        int                     Nr, r;
     1504
     1505        if (pt == NULL || ct == NULL || skey == NULL) {
     1506                return;
     1507        }
     1508
     1509        Nr = skey->key.Nr;
     1510        rk = skey->key.dK;
     1511
     1512/*
     1513        map byte array block to cipher state and add initial round key:
     1514 */
     1515        LOAD32H(s0, ct          ); s0 ^= rk[0];
     1516        LOAD32H(s1, ct  +  4); s1 ^= rk[1];
     1517        LOAD32H(s2, ct  +  8); s2 ^= rk[2];
     1518        LOAD32H(s3, ct  + 12); s3 ^= rk[3];
     1519
     1520/*
     1521        Nr - 1 full rounds:
     1522 */
     1523        r = Nr >> 1;
     1524        for     (;;) {
     1525
     1526                t0 =
     1527                        Td0(byte(s0, 3)) ^
     1528                        Td1(byte(s3, 2)) ^
     1529                        Td2(byte(s2, 1)) ^
     1530                        Td3(byte(s1, 0)) ^
     1531                        rk[4];
     1532                t1 =
     1533                        Td0(byte(s1, 3)) ^
     1534                        Td1(byte(s0, 2)) ^
     1535                        Td2(byte(s3, 1)) ^
     1536                        Td3(byte(s2, 0)) ^
     1537                        rk[5];
     1538                t2 =
     1539                        Td0(byte(s2, 3)) ^
     1540                        Td1(byte(s1, 2)) ^
     1541                        Td2(byte(s0, 1)) ^
     1542                        Td3(byte(s3, 0)) ^
     1543                        rk[6];
     1544                t3 =
     1545                        Td0(byte(s3, 3)) ^
     1546                        Td1(byte(s2, 2)) ^
     1547                        Td2(byte(s1, 1)) ^
     1548                        Td3(byte(s0, 0)) ^
     1549                        rk[7];
     1550
     1551                rk += 8;
     1552                if (--r == 0) {
     1553                        break;
     1554                }
     1555
     1556                s0 =
     1557                        Td0(byte(t0, 3)) ^
     1558                        Td1(byte(t3, 2)) ^
     1559                        Td2(byte(t2, 1)) ^
     1560                        Td3(byte(t1, 0)) ^
     1561                        rk[0];
     1562                s1 =
     1563                        Td0(byte(t1, 3)) ^
     1564                        Td1(byte(t0, 2)) ^
     1565                        Td2(byte(t3, 1)) ^
     1566                        Td3(byte(t2, 0)) ^
     1567                        rk[1];
     1568                s2 =
     1569                        Td0(byte(t2, 3)) ^
     1570                        Td1(byte(t1, 2)) ^
     1571                        Td2(byte(t0, 1)) ^
     1572                        Td3(byte(t3, 0)) ^
     1573                        rk[2];
     1574                s3 =
     1575                        Td0(byte(t3, 3)) ^
     1576                        Td1(byte(t2, 2)) ^
     1577                        Td2(byte(t1, 1)) ^
     1578                        Td3(byte(t0, 0)) ^
     1579                        rk[3];
     1580        }
     1581
     1582/*
     1583        apply last round and map cipher state to byte array block:
     1584 */
     1585        s0 =
     1586                (Td4[byte(t0, 3)] & 0xff000000) ^
     1587                (Td4[byte(t3, 2)] & 0x00ff0000) ^
     1588                (Td4[byte(t2, 1)] & 0x0000ff00) ^
     1589                (Td4[byte(t1, 0)] & 0x000000ff) ^
     1590                rk[0];
     1591        STORE32H(s0, pt);
     1592        s1 =
     1593                (Td4[byte(t1, 3)] & 0xff000000) ^
     1594                (Td4[byte(t0, 2)] & 0x00ff0000) ^
     1595                (Td4[byte(t3, 1)] & 0x0000ff00) ^
     1596                (Td4[byte(t2, 0)] & 0x000000ff) ^
     1597                rk[1];
     1598        STORE32H(s1, pt+4);
     1599        s2 =
     1600                (Td4[byte(t2, 3)] & 0xff000000) ^
     1601                (Td4[byte(t1, 2)] & 0x00ff0000) ^
     1602                (Td4[byte(t0, 1)] & 0x0000ff00) ^
     1603                (Td4[byte(t3, 0)] & 0x000000ff) ^
     1604                rk[2];
     1605        STORE32H(s2, pt+8);
     1606        s3 =
     1607                (Td4[byte(t3, 3)] & 0xff000000) ^
     1608                (Td4[byte(t2, 2)] & 0x00ff0000) ^
     1609                (Td4[byte(t1, 1)] & 0x0000ff00) ^
     1610                (Td4[byte(t0, 0)] & 0x000000ff) ^
     1611                rk[3];
     1612        STORE32H(s3, pt+12);
     1613}
     1614
     1615#ifdef CLEAN_STACK
     1616void aes(const unsigned char *ct, unsigned char *pt, aes_CBC *skey)
     1617{
     1618        _aes_ecb_decrypt(ct, pt, skey);
     1619        burn_stack(sizeof(unsigned long)*8 + sizeof(unsigned long*) + sizeof(int)*2);
     1620}
     1621#endif /* CLEAN_STACK */
     1622
     1623
     1624#ifdef PEERSEC_TEST
     1625
     1626int matrixAesTest()
     1627{
     1628        int err;
     1629        static const struct {
     1630                int keylen;
     1631                unsigned char key[32], pt[16], ct[16];
     1632        } tests[] = {
     1633        { 16,
     1634                { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
     1635                        0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f },
     1636                { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
     1637                        0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
     1638                { 0x69, 0xc4, 0xe0, 0xd8, 0x6a, 0x7b, 0x04, 0x30,
     1639                        0xd8, 0xcd, 0xb7, 0x80, 0x70, 0xb4, 0xc5, 0x5a }
     1640                }, {
     1641                24,
     1642                { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
     1643                        0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
     1644                        0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 },
     1645                { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
     1646                        0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
     1647                { 0xdd, 0xa9, 0x7c, 0xa4, 0x86, 0x4c, 0xdf, 0xe0,
     1648                        0x6e, 0xaf, 0x70, 0xa0, 0xec, 0x0d, 0x71, 0x91 }
     1649                }, {
     1650                32,
     1651                { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
     1652                        0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
     1653                        0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
     1654                        0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f },
     1655                { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
     1656                        0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },
     1657                { 0x8e, 0xa2, 0xb7, 0xca, 0x51, 0x67, 0x45, 0xbf,
     1658                        0xea, 0xfc, 0x49, 0x90, 0x4b, 0x49, 0x60, 0x89 }
     1659                }
     1660        };
     1661
     1662        aes_CBC key;
     1663        unsigned char tmp[2][16];
     1664        int i, y;
     1665
     1666        for (i = 0; i < (int)(sizeof(tests)/sizeof(tests[0])); i++) {
     1667                zeromem(&key, sizeof(key));
     1668                if ((err = aes_setup(tests[i].key, tests[i].keylen, 0, &key)) != CRYPT_OK) {
     1669                        return err;
     1670                }
     1671
     1672                aes_ecb_encrypt(tests[i].pt, tmp[0], &key);
     1673                aes_ecb_decrypt(tmp[0], tmp[1], &key);
     1674                if (memcmp(tmp[0], tests[i].ct, 16) || memcmp(tmp[1], tests[i].pt, 16)) {
     1675#if 0
     1676                        printf("\n\nTest %d failed\n", i);
     1677                        if (memcmp(tmp[0], tests[i].ct, 16)) {
     1678                                printf("CT: ");
     1679                                for (i = 0; i < 16; i++) {
     1680                                        printf("%02x ", tmp[0][i]);
     1681                                }
     1682                                printf("\n");
     1683                        } else {
     1684                                printf("PT: ");
     1685                                for (i = 0; i < 16; i++) {
     1686                                        printf("%02x ", tmp[1][i]);
     1687                                }
     1688                                printf("\n");
     1689                        }
     1690#endif /* 0 */
     1691                return CRYPT_FAIL_TESTVECTOR;
     1692                }
     1693
     1694/*
     1695                now see if we can encrypt all zero bytes 1000 times,
     1696                decrypt and come back where we started
     1697 */
     1698                for (y = 0; y < 16; y++) tmp[0][y] = 0;
     1699                for (y = 0; y < 1000; y++) aes_ecb_encrypt(tmp[0], tmp[0], &key);
     1700                for (y = 0; y < 1000; y++) aes_ecb_decrypt(tmp[0], tmp[0], &key);
     1701                for (y = 0; y < 16; y++) if (tmp[0][y] != 0) return CRYPT_FAIL_TESTVECTOR;
     1702        }
     1703        return CRYPT_OK;
     1704}
     1705#endif /* PEERSEC_TEST */
     1706
     1707#endif /* USE_AES */
     1708/******************************************************************************/
  • src/crypto/peersec/md5.c

    diff -urN matrixssl.old/src/crypto/peersec/md5.c matrixssl/src/crypto/peersec/md5.c
    old new  
    334334#ifdef CLEAN_STACK
    335335        psZeromem(md, sizeof(hash_state));
    336336#endif /* CLEAN_STACK */
    337         return 16;
     337        return SSL_MD5_HASH_SIZE;
    338338}
    339339
    340340#ifdef PEERSEC_TEST
  • src/crypto/peersec/pscrypto.h

    diff -urN matrixssl.old/src/crypto/peersec/pscrypto.h matrixssl/src/crypto/peersec/pscrypto.h
    old new  
    4040        PeerSec crypto-specific defines.
    4141 */
    4242#define SMALL_CODE
    43 #define CLEAN_STACK
     43#undef CLEAN_STACK
    4444/*
    4545        If Native 64 bit integers are not supported, we must set the 16 bit flag
    4646        to produce 32 bit mp_words in mpi.h
  • src/crypto/peersec/sha1.c

    diff -urN matrixssl.old/src/crypto/peersec/sha1.c matrixssl/src/crypto/peersec/sha1.c
    old new  
    273273#ifdef CLEAN_STACK
    274274        psZeromem(md, sizeof(hash_state));
    275275#endif /* CLEAN_STACK */
    276         return 20;
     276        return SSL_SHA1_HASH_SIZE;
    277277}
    278278
    279279#ifdef PEERSEC_TEST
  • src/Makefile

    diff -urN matrixssl.old/src/Makefile matrixssl/src/Makefile
    old new  
    1515E       =
    1616
    1717LIBRARY = libmatrixssl$(SO)
    18 STATIC  = libmatrixsslstatic$(A)
     18
     19SOVERSION_MAJ := 1
     20SOVERSION_MIN := 2
     21SOVERSION_REV := 4
     22SONAME := $(LIBRARY).$(SOVERSION_MAJ)
     23SOREAL := $(LIBRARY).$(SOVERSION_MAJ).$(SOVERSION_MIN).$(SOVERSION_REV)
     24
     25+STATIC = libmatrixsslstatic$(A)
    1926
    2027OBJECTS = \
    2128                cipherSuite$(O) \
     
    2431                sslEncode$(O) \
    2532                sslv3$(O) \
    2633                os/linux/linux$(O)      \
     34                crypto/peersec/aes$(O) \
    2735                crypto/peersec/arc4$(O) \
    2836                crypto/peersec/asn1$(O) \
    2937                crypto/peersec/base64$(O) \
     
    6674#
    6775SHARED  = -shared
    6876CFLAGS  = $(DFLAGS) -DLINUX -I./ -Icrypto/peersec
    69 LDFLAGS = -lc -lpthread -lcrypto
     77LDFLAGS = -lc -lpthread -Wl,-soname,$(SONAME)
    7078
    7179#
    7280#       Override variables for compilation on Mac OS X (Darwin)
     
    105113# Build the library
    106114#
    107115$(LIBRARY): $(OBJECTS)
    108         $(CC) $(SHARED) -o $@ $^ $(LDFLAGS)
    109         $(STRIP) $(LIBRARY)
     116        $(CC) $(SHARED) -o $(SOREAL) $^ $(LDFLAGS)
     117        ln -sf $(SOREAL) $(SONAME)
     118        ln -sf $(SONAME) $(LIBRARY)
    110119
    111120#
    112121# Build the static library
     
    119128#       Clean up all generated files
    120129#
    121130clean:
    122         rm -f $(LIBRARY) $(OBJECTS) $(STATIC)
     131        rm -f $(LIBRARY) $(OBJECTS) $(SONAME) $(SOREAL)
  • src/matrixSsl.c

    diff -urN matrixssl.old/src/matrixSsl.c matrixssl/src/matrixSsl.c
    old new  
    950950        sslAssert(ssl->hsPool == NULL);
    951951}
    952952
     953
     954/******************************************************************************/
     955/*
     956        Compute an MD5 digest
     957*/
     958unsigned char *matrixMd5Digest(
     959        const unsigned char *buf, unsigned long len, unsigned char *hash)
     960{
     961        sslMd5Context_t ctx;
     962        static unsigned char hashBuf[SSL_MD5_HASH_SIZE];
     963
     964        if (hash == NULL) {
     965                hash = hashBuf;
     966        }
     967
     968        matrixMd5Init(&ctx);
     969        matrixMd5Update(&ctx, buf, len);
     970        matrixMd5Final(&ctx, hash);
     971
     972        return hash;
     973}
     974
     975/******************************************************************************/
     976/*
     977        Compute an SHA1 digest
     978*/
     979unsigned char *matrixSha1Digest(
     980        const unsigned char *buf, unsigned long len, unsigned char *hash)
     981{
     982        sslSha1Context_t ctx;
     983        static unsigned char hashBuf[SSL_SHA1_HASH_SIZE];
     984
     985        if (hash == NULL) {
     986                hash = hashBuf;
     987        }
     988
     989        matrixSha1Init(&ctx);
     990        matrixSha1Update(&ctx, buf, len);
     991        matrixSha1Final(&ctx, hash);
     992
     993        return hash;
     994}
     995
    953996/******************************************************************************/
    954997/*
    955998        Debugging APIs
Note: See TracBrowser for help on using the repository browser.