~ubuntu-branches/ubuntu/precise/dropbear/precise

« back to all changes in this revision

Viewing changes to libtomcrypt/src/ciphers/anubis.c

  • Committer: Bazaar Package Importer
  • Author(s): Gerrit Pape
  • Date: 2007-03-02 20:48:18 UTC
  • mfrom: (1.3.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20070302204818-ozmbou2sbyj7dus5
Tags: 0.49-1
* new upstream release, fixes
  * CVE-2007-1099: dropbear dbclient insufficient warning on hostkey
    mismatch (closes: #412899).
  * dbclient uses static "Password:" prompt instead of using the server's
    prompt (closes: #394996).
* debian/control: Suggests: openssh-client, not ssh (closes: #405686);
  Standards-Version: 3.7.2.2.
* debian/README.Debian: ssh -> openssh-server, openssh-client; remove
  'Replacing OpenSSH "sshd" with Dropbear' part, this is simply done by not
  installing the openssh-server package.
* debian/README.runit: runsvstat -> sv status.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* LibTomCrypt, modular cryptographic library -- Tom St Denis
2
 
 *
3
 
 * LibTomCrypt is a library that provides various cryptographic
4
 
 * algorithms in a highly modular and flexible manner.
5
 
 *
6
 
 * The library is free for all purposes without any express
7
 
 * guarantee it works.
8
 
 *
9
 
 * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org
10
 
 */
11
 
 
12
 
/**
13
 
  @file anubis.c
14
 
  Anubis implementation derived from public domain source
15
 
  Authors: Paulo S.L.M. Barreto and Vincent Rijmen.
16
 
*/
17
 
 
18
 
#include "tomcrypt.h"
19
 
 
20
 
#ifdef ANUBIS
21
 
 
22
 
const struct ltc_cipher_descriptor anubis_desc = {
23
 
   "anubis",
24
 
   19,
25
 
   16, 40, 16, 12,
26
 
   &anubis_setup,
27
 
   &anubis_ecb_encrypt,
28
 
   &anubis_ecb_decrypt,
29
 
   &anubis_test,
30
 
   &anubis_done,
31
 
   &anubis_keysize,
32
 
   NULL, NULL, NULL, NULL, NULL, NULL, NULL
33
 
};
34
 
 
35
 
#define MIN_N           4 
36
 
#define MAX_N           10 
37
 
#define MIN_ROUNDS      (8 + MIN_N) 
38
 
#define MAX_ROUNDS      (8 + MAX_N) 
39
 
#define MIN_KEYSIZEB    (4*MIN_N) 
40
 
#define MAX_KEYSIZEB    (4*MAX_N) 
41
 
#define BLOCKSIZE       128 
42
 
#define BLOCKSIZEB      (BLOCKSIZE/8) 
43
 
 
44
 
 
45
 
/*
46
 
 * Though Anubis is endianness-neutral, the encryption tables are listed
47
 
 * in BIG-ENDIAN format, which is adopted throughout this implementation
48
 
 * (but little-endian notation would be equally suitable if consistently
49
 
 * employed).
50
 
 */
51
 
#if defined(ANUBIS_TWEAK)
52
 
 
53
 
static const ulong32 T0[256] = {
54
 
    0xba69d2bbU, 0x54a84de5U, 0x2f5ebce2U, 0x74e8cd25U,
55
 
    0x53a651f7U, 0xd3bb6bd0U, 0xd2b96fd6U, 0x4d9a29b3U,
56
 
    0x50a05dfdU, 0xac458acfU, 0x8d070e09U, 0xbf63c6a5U,
57
 
    0x70e0dd3dU, 0x52a455f1U, 0x9a29527bU, 0x4c982db5U,
58
 
    0xeac98f46U, 0xd5b773c4U, 0x97336655U, 0xd1bf63dcU,
59
 
    0x3366ccaaU, 0x51a259fbU, 0x5bb671c7U, 0xa651a2f3U,
60
 
    0xdea15ffeU, 0x48903dadU, 0xa84d9ad7U, 0x992f5e71U,
61
 
    0xdbab4be0U, 0x3264c8acU, 0xb773e695U, 0xfce5d732U,
62
 
    0xe3dbab70U, 0x9e214263U, 0x913f7e41U, 0x9b2b567dU,
63
 
    0xe2d9af76U, 0xbb6bd6bdU, 0x4182199bU, 0x6edca579U,
64
 
    0xa557aef9U, 0xcb8b0b80U, 0x6bd6b167U, 0x95376e59U,
65
 
    0xa15fbee1U, 0xf3fbeb10U, 0xb17ffe81U, 0x0204080cU,
66
 
    0xcc851792U, 0xc49537a2U, 0x1d3a744eU, 0x14285078U,
67
 
    0xc39b2bb0U, 0x63c69157U, 0xdaa94fe6U, 0x5dba69d3U,
68
 
    0x5fbe61dfU, 0xdca557f2U, 0x7dfae913U, 0xcd871394U,
69
 
    0x7ffee11fU, 0x5ab475c1U, 0x6cd8ad75U, 0x5cb86dd5U,
70
 
    0xf7f3fb08U, 0x264c98d4U, 0xffe3db38U, 0xedc79354U,
71
 
    0xe8cd874aU, 0x9d274e69U, 0x6fdea17fU, 0x8e010203U,
72
 
    0x19326456U, 0xa05dbae7U, 0xf0fde71aU, 0x890f1e11U,
73
 
    0x0f1e3c22U, 0x070e1c12U, 0xaf4386c5U, 0xfbebcb20U,
74
 
    0x08102030U, 0x152a547eU, 0x0d1a342eU, 0x04081018U,
75
 
    0x01020406U, 0x64c88d45U, 0xdfa35bf8U, 0x76ecc529U,
76
 
    0x79f2f90bU, 0xdda753f4U, 0x3d7af48eU, 0x162c5874U,
77
 
    0x3f7efc82U, 0x376edcb2U, 0x6ddaa973U, 0x3870e090U,
78
 
    0xb96fdeb1U, 0x73e6d137U, 0xe9cf834cU, 0x356ad4beU,
79
 
    0x55aa49e3U, 0x71e2d93bU, 0x7bf6f107U, 0x8c050a0fU,
80
 
    0x72e4d531U, 0x880d1a17U, 0xf6f1ff0eU, 0x2a54a8fcU,
81
 
    0x3e7cf884U, 0x5ebc65d9U, 0x274e9cd2U, 0x468c0589U,
82
 
    0x0c183028U, 0x65ca8943U, 0x68d0bd6dU, 0x61c2995bU,
83
 
    0x03060c0aU, 0xc19f23bcU, 0x57ae41efU, 0xd6b17fceU,
84
 
    0xd9af43ecU, 0x58b07dcdU, 0xd8ad47eaU, 0x66cc8549U,
85
 
    0xd7b37bc8U, 0x3a74e89cU, 0xc88d078aU, 0x3c78f088U,
86
 
    0xfae9cf26U, 0x96316253U, 0xa753a6f5U, 0x982d5a77U,
87
 
    0xecc59752U, 0xb86ddab7U, 0xc7933ba8U, 0xae4182c3U,
88
 
    0x69d2b96bU, 0x4b9631a7U, 0xab4b96ddU, 0xa94f9ed1U,
89
 
    0x67ce814fU, 0x0a14283cU, 0x478e018fU, 0xf2f9ef16U,
90
 
    0xb577ee99U, 0x224488ccU, 0xe5d7b364U, 0xeec19f5eU,
91
 
    0xbe61c2a3U, 0x2b56acfaU, 0x811f3e21U, 0x1224486cU,
92
 
    0x831b362dU, 0x1b366c5aU, 0x0e1c3824U, 0x23468ccaU,
93
 
    0xf5f7f304U, 0x458a0983U, 0x214284c6U, 0xce811f9eU,
94
 
    0x499239abU, 0x2c58b0e8U, 0xf9efc32cU, 0xe6d1bf6eU,
95
 
    0xb671e293U, 0x2850a0f0U, 0x172e5c72U, 0x8219322bU,
96
 
    0x1a34685cU, 0x8b0b161dU, 0xfee1df3eU, 0x8a09121bU,
97
 
    0x09122436U, 0xc98f038cU, 0x87132635U, 0x4e9c25b9U,
98
 
    0xe1dfa37cU, 0x2e5cb8e4U, 0xe4d5b762U, 0xe0dda77aU,
99
 
    0xebcb8b40U, 0x903d7a47U, 0xa455aaffU, 0x1e3c7844U,
100
 
    0x85172e39U, 0x60c09d5dU, 0x00000000U, 0x254a94deU,
101
 
    0xf4f5f702U, 0xf1ffe31cU, 0x94356a5fU, 0x0b162c3aU,
102
 
    0xe7d3bb68U, 0x75eac923U, 0xefc39b58U, 0x3468d0b8U,
103
 
    0x3162c4a6U, 0xd4b577c2U, 0xd0bd67daU, 0x86112233U,
104
 
    0x7efce519U, 0xad478ec9U, 0xfde7d334U, 0x2952a4f6U,
105
 
    0x3060c0a0U, 0x3b76ec9aU, 0x9f234665U, 0xf8edc72aU,
106
 
    0xc6913faeU, 0x13264c6aU, 0x060c1814U, 0x050a141eU,
107
 
    0xc59733a4U, 0x11224466U, 0x77eec12fU, 0x7cf8ed15U,
108
 
    0x7af4f501U, 0x78f0fd0dU, 0x366cd8b4U, 0x1c387048U,
109
 
    0x3972e496U, 0x59b279cbU, 0x18306050U, 0x56ac45e9U,
110
 
    0xb37bf68dU, 0xb07dfa87U, 0x244890d8U, 0x204080c0U,
111
 
    0xb279f28bU, 0x9239724bU, 0xa35bb6edU, 0xc09d27baU,
112
 
    0x44880d85U, 0x62c49551U, 0x10204060U, 0xb475ea9fU,
113
 
    0x84152a3fU, 0x43861197U, 0x933b764dU, 0xc2992fb6U,
114
 
    0x4a9435a1U, 0xbd67cea9U, 0x8f030605U, 0x2d5ab4eeU,
115
 
    0xbc65caafU, 0x9c254a6fU, 0x6ad4b561U, 0x40801d9dU,
116
 
    0xcf831b98U, 0xa259b2ebU, 0x801d3a27U, 0x4f9e21bfU,
117
 
    0x1f3e7c42U, 0xca890f86U, 0xaa4992dbU, 0x42841591U,
118
 
};
119
 
 
120
 
static const ulong32 T1[256] = {
121
 
    0x69babbd2U, 0xa854e54dU, 0x5e2fe2bcU, 0xe87425cdU,
122
 
    0xa653f751U, 0xbbd3d06bU, 0xb9d2d66fU, 0x9a4db329U,
123
 
    0xa050fd5dU, 0x45accf8aU, 0x078d090eU, 0x63bfa5c6U,
124
 
    0xe0703dddU, 0xa452f155U, 0x299a7b52U, 0x984cb52dU,
125
 
    0xc9ea468fU, 0xb7d5c473U, 0x33975566U, 0xbfd1dc63U,
126
 
    0x6633aaccU, 0xa251fb59U, 0xb65bc771U, 0x51a6f3a2U,
127
 
    0xa1defe5fU, 0x9048ad3dU, 0x4da8d79aU, 0x2f99715eU,
128
 
    0xabdbe04bU, 0x6432acc8U, 0x73b795e6U, 0xe5fc32d7U,
129
 
    0xdbe370abU, 0x219e6342U, 0x3f91417eU, 0x2b9b7d56U,
130
 
    0xd9e276afU, 0x6bbbbdd6U, 0x82419b19U, 0xdc6e79a5U,
131
 
    0x57a5f9aeU, 0x8bcb800bU, 0xd66b67b1U, 0x3795596eU,
132
 
    0x5fa1e1beU, 0xfbf310ebU, 0x7fb181feU, 0x04020c08U,
133
 
    0x85cc9217U, 0x95c4a237U, 0x3a1d4e74U, 0x28147850U,
134
 
    0x9bc3b02bU, 0xc6635791U, 0xa9dae64fU, 0xba5dd369U,
135
 
    0xbe5fdf61U, 0xa5dcf257U, 0xfa7d13e9U, 0x87cd9413U,
136
 
    0xfe7f1fe1U, 0xb45ac175U, 0xd86c75adU, 0xb85cd56dU,
137
 
    0xf3f708fbU, 0x4c26d498U, 0xe3ff38dbU, 0xc7ed5493U,
138
 
    0xcde84a87U, 0x279d694eU, 0xde6f7fa1U, 0x018e0302U,
139
 
    0x32195664U, 0x5da0e7baU, 0xfdf01ae7U, 0x0f89111eU,
140
 
    0x1e0f223cU, 0x0e07121cU, 0x43afc586U, 0xebfb20cbU,
141
 
    0x10083020U, 0x2a157e54U, 0x1a0d2e34U, 0x08041810U,
142
 
    0x02010604U, 0xc864458dU, 0xa3dff85bU, 0xec7629c5U,
143
 
    0xf2790bf9U, 0xa7ddf453U, 0x7a3d8ef4U, 0x2c167458U,
144
 
    0x7e3f82fcU, 0x6e37b2dcU, 0xda6d73a9U, 0x703890e0U,
145
 
    0x6fb9b1deU, 0xe67337d1U, 0xcfe94c83U, 0x6a35bed4U,
146
 
    0xaa55e349U, 0xe2713bd9U, 0xf67b07f1U, 0x058c0f0aU,
147
 
    0xe47231d5U, 0x0d88171aU, 0xf1f60effU, 0x542afca8U,
148
 
    0x7c3e84f8U, 0xbc5ed965U, 0x4e27d29cU, 0x8c468905U,
149
 
    0x180c2830U, 0xca654389U, 0xd0686dbdU, 0xc2615b99U,
150
 
    0x06030a0cU, 0x9fc1bc23U, 0xae57ef41U, 0xb1d6ce7fU,
151
 
    0xafd9ec43U, 0xb058cd7dU, 0xadd8ea47U, 0xcc664985U,
152
 
    0xb3d7c87bU, 0x743a9ce8U, 0x8dc88a07U, 0x783c88f0U,
153
 
    0xe9fa26cfU, 0x31965362U, 0x53a7f5a6U, 0x2d98775aU,
154
 
    0xc5ec5297U, 0x6db8b7daU, 0x93c7a83bU, 0x41aec382U,
155
 
    0xd2696bb9U, 0x964ba731U, 0x4babdd96U, 0x4fa9d19eU,
156
 
    0xce674f81U, 0x140a3c28U, 0x8e478f01U, 0xf9f216efU,
157
 
    0x77b599eeU, 0x4422cc88U, 0xd7e564b3U, 0xc1ee5e9fU,
158
 
    0x61bea3c2U, 0x562bfaacU, 0x1f81213eU, 0x24126c48U,
159
 
    0x1b832d36U, 0x361b5a6cU, 0x1c0e2438U, 0x4623ca8cU,
160
 
    0xf7f504f3U, 0x8a458309U, 0x4221c684U, 0x81ce9e1fU,
161
 
    0x9249ab39U, 0x582ce8b0U, 0xeff92cc3U, 0xd1e66ebfU,
162
 
    0x71b693e2U, 0x5028f0a0U, 0x2e17725cU, 0x19822b32U,
163
 
    0x341a5c68U, 0x0b8b1d16U, 0xe1fe3edfU, 0x098a1b12U,
164
 
    0x12093624U, 0x8fc98c03U, 0x13873526U, 0x9c4eb925U,
165
 
    0xdfe17ca3U, 0x5c2ee4b8U, 0xd5e462b7U, 0xdde07aa7U,
166
 
    0xcbeb408bU, 0x3d90477aU, 0x55a4ffaaU, 0x3c1e4478U,
167
 
    0x1785392eU, 0xc0605d9dU, 0x00000000U, 0x4a25de94U,
168
 
    0xf5f402f7U, 0xfff11ce3U, 0x35945f6aU, 0x160b3a2cU,
169
 
    0xd3e768bbU, 0xea7523c9U, 0xc3ef589bU, 0x6834b8d0U,
170
 
    0x6231a6c4U, 0xb5d4c277U, 0xbdd0da67U, 0x11863322U,
171
 
    0xfc7e19e5U, 0x47adc98eU, 0xe7fd34d3U, 0x5229f6a4U,
172
 
    0x6030a0c0U, 0x763b9aecU, 0x239f6546U, 0xedf82ac7U,
173
 
    0x91c6ae3fU, 0x26136a4cU, 0x0c061418U, 0x0a051e14U,
174
 
    0x97c5a433U, 0x22116644U, 0xee772fc1U, 0xf87c15edU,
175
 
    0xf47a01f5U, 0xf0780dfdU, 0x6c36b4d8U, 0x381c4870U,
176
 
    0x723996e4U, 0xb259cb79U, 0x30185060U, 0xac56e945U,
177
 
    0x7bb38df6U, 0x7db087faU, 0x4824d890U, 0x4020c080U,
178
 
    0x79b28bf2U, 0x39924b72U, 0x5ba3edb6U, 0x9dc0ba27U,
179
 
    0x8844850dU, 0xc4625195U, 0x20106040U, 0x75b49feaU,
180
 
    0x15843f2aU, 0x86439711U, 0x3b934d76U, 0x99c2b62fU,
181
 
    0x944aa135U, 0x67bda9ceU, 0x038f0506U, 0x5a2deeb4U,
182
 
    0x65bcafcaU, 0x259c6f4aU, 0xd46a61b5U, 0x80409d1dU,
183
 
    0x83cf981bU, 0x59a2ebb2U, 0x1d80273aU, 0x9e4fbf21U,
184
 
    0x3e1f427cU, 0x89ca860fU, 0x49aadb92U, 0x84429115U,
185
 
};
186
 
 
187
 
static const ulong32 T2[256] = {
188
 
    0xd2bbba69U, 0x4de554a8U, 0xbce22f5eU, 0xcd2574e8U,
189
 
    0x51f753a6U, 0x6bd0d3bbU, 0x6fd6d2b9U, 0x29b34d9aU,
190
 
    0x5dfd50a0U, 0x8acfac45U, 0x0e098d07U, 0xc6a5bf63U,
191
 
    0xdd3d70e0U, 0x55f152a4U, 0x527b9a29U, 0x2db54c98U,
192
 
    0x8f46eac9U, 0x73c4d5b7U, 0x66559733U, 0x63dcd1bfU,
193
 
    0xccaa3366U, 0x59fb51a2U, 0x71c75bb6U, 0xa2f3a651U,
194
 
    0x5ffedea1U, 0x3dad4890U, 0x9ad7a84dU, 0x5e71992fU,
195
 
    0x4be0dbabU, 0xc8ac3264U, 0xe695b773U, 0xd732fce5U,
196
 
    0xab70e3dbU, 0x42639e21U, 0x7e41913fU, 0x567d9b2bU,
197
 
    0xaf76e2d9U, 0xd6bdbb6bU, 0x199b4182U, 0xa5796edcU,
198
 
    0xaef9a557U, 0x0b80cb8bU, 0xb1676bd6U, 0x6e599537U,
199
 
    0xbee1a15fU, 0xeb10f3fbU, 0xfe81b17fU, 0x080c0204U,
200
 
    0x1792cc85U, 0x37a2c495U, 0x744e1d3aU, 0x50781428U,
201
 
    0x2bb0c39bU, 0x915763c6U, 0x4fe6daa9U, 0x69d35dbaU,
202
 
    0x61df5fbeU, 0x57f2dca5U, 0xe9137dfaU, 0x1394cd87U,
203
 
    0xe11f7ffeU, 0x75c15ab4U, 0xad756cd8U, 0x6dd55cb8U,
204
 
    0xfb08f7f3U, 0x98d4264cU, 0xdb38ffe3U, 0x9354edc7U,
205
 
    0x874ae8cdU, 0x4e699d27U, 0xa17f6fdeU, 0x02038e01U,
206
 
    0x64561932U, 0xbae7a05dU, 0xe71af0fdU, 0x1e11890fU,
207
 
    0x3c220f1eU, 0x1c12070eU, 0x86c5af43U, 0xcb20fbebU,
208
 
    0x20300810U, 0x547e152aU, 0x342e0d1aU, 0x10180408U,
209
 
    0x04060102U, 0x8d4564c8U, 0x5bf8dfa3U, 0xc52976ecU,
210
 
    0xf90b79f2U, 0x53f4dda7U, 0xf48e3d7aU, 0x5874162cU,
211
 
    0xfc823f7eU, 0xdcb2376eU, 0xa9736ddaU, 0xe0903870U,
212
 
    0xdeb1b96fU, 0xd13773e6U, 0x834ce9cfU, 0xd4be356aU,
213
 
    0x49e355aaU, 0xd93b71e2U, 0xf1077bf6U, 0x0a0f8c05U,
214
 
    0xd53172e4U, 0x1a17880dU, 0xff0ef6f1U, 0xa8fc2a54U,
215
 
    0xf8843e7cU, 0x65d95ebcU, 0x9cd2274eU, 0x0589468cU,
216
 
    0x30280c18U, 0x894365caU, 0xbd6d68d0U, 0x995b61c2U,
217
 
    0x0c0a0306U, 0x23bcc19fU, 0x41ef57aeU, 0x7fced6b1U,
218
 
    0x43ecd9afU, 0x7dcd58b0U, 0x47ead8adU, 0x854966ccU,
219
 
    0x7bc8d7b3U, 0xe89c3a74U, 0x078ac88dU, 0xf0883c78U,
220
 
    0xcf26fae9U, 0x62539631U, 0xa6f5a753U, 0x5a77982dU,
221
 
    0x9752ecc5U, 0xdab7b86dU, 0x3ba8c793U, 0x82c3ae41U,
222
 
    0xb96b69d2U, 0x31a74b96U, 0x96ddab4bU, 0x9ed1a94fU,
223
 
    0x814f67ceU, 0x283c0a14U, 0x018f478eU, 0xef16f2f9U,
224
 
    0xee99b577U, 0x88cc2244U, 0xb364e5d7U, 0x9f5eeec1U,
225
 
    0xc2a3be61U, 0xacfa2b56U, 0x3e21811fU, 0x486c1224U,
226
 
    0x362d831bU, 0x6c5a1b36U, 0x38240e1cU, 0x8cca2346U,
227
 
    0xf304f5f7U, 0x0983458aU, 0x84c62142U, 0x1f9ece81U,
228
 
    0x39ab4992U, 0xb0e82c58U, 0xc32cf9efU, 0xbf6ee6d1U,
229
 
    0xe293b671U, 0xa0f02850U, 0x5c72172eU, 0x322b8219U,
230
 
    0x685c1a34U, 0x161d8b0bU, 0xdf3efee1U, 0x121b8a09U,
231
 
    0x24360912U, 0x038cc98fU, 0x26358713U, 0x25b94e9cU,
232
 
    0xa37ce1dfU, 0xb8e42e5cU, 0xb762e4d5U, 0xa77ae0ddU,
233
 
    0x8b40ebcbU, 0x7a47903dU, 0xaaffa455U, 0x78441e3cU,
234
 
    0x2e398517U, 0x9d5d60c0U, 0x00000000U, 0x94de254aU,
235
 
    0xf702f4f5U, 0xe31cf1ffU, 0x6a5f9435U, 0x2c3a0b16U,
236
 
    0xbb68e7d3U, 0xc92375eaU, 0x9b58efc3U, 0xd0b83468U,
237
 
    0xc4a63162U, 0x77c2d4b5U, 0x67dad0bdU, 0x22338611U,
238
 
    0xe5197efcU, 0x8ec9ad47U, 0xd334fde7U, 0xa4f62952U,
239
 
    0xc0a03060U, 0xec9a3b76U, 0x46659f23U, 0xc72af8edU,
240
 
    0x3faec691U, 0x4c6a1326U, 0x1814060cU, 0x141e050aU,
241
 
    0x33a4c597U, 0x44661122U, 0xc12f77eeU, 0xed157cf8U,
242
 
    0xf5017af4U, 0xfd0d78f0U, 0xd8b4366cU, 0x70481c38U,
243
 
    0xe4963972U, 0x79cb59b2U, 0x60501830U, 0x45e956acU,
244
 
    0xf68db37bU, 0xfa87b07dU, 0x90d82448U, 0x80c02040U,
245
 
    0xf28bb279U, 0x724b9239U, 0xb6eda35bU, 0x27bac09dU,
246
 
    0x0d854488U, 0x955162c4U, 0x40601020U, 0xea9fb475U,
247
 
    0x2a3f8415U, 0x11974386U, 0x764d933bU, 0x2fb6c299U,
248
 
    0x35a14a94U, 0xcea9bd67U, 0x06058f03U, 0xb4ee2d5aU,
249
 
    0xcaafbc65U, 0x4a6f9c25U, 0xb5616ad4U, 0x1d9d4080U,
250
 
    0x1b98cf83U, 0xb2eba259U, 0x3a27801dU, 0x21bf4f9eU,
251
 
    0x7c421f3eU, 0x0f86ca89U, 0x92dbaa49U, 0x15914284U,
252
 
};
253
 
 
254
 
static const ulong32 T3[256] = {
255
 
    0xbbd269baU, 0xe54da854U, 0xe2bc5e2fU, 0x25cde874U,
256
 
    0xf751a653U, 0xd06bbbd3U, 0xd66fb9d2U, 0xb3299a4dU,
257
 
    0xfd5da050U, 0xcf8a45acU, 0x090e078dU, 0xa5c663bfU,
258
 
    0x3ddde070U, 0xf155a452U, 0x7b52299aU, 0xb52d984cU,
259
 
    0x468fc9eaU, 0xc473b7d5U, 0x55663397U, 0xdc63bfd1U,
260
 
    0xaacc6633U, 0xfb59a251U, 0xc771b65bU, 0xf3a251a6U,
261
 
    0xfe5fa1deU, 0xad3d9048U, 0xd79a4da8U, 0x715e2f99U,
262
 
    0xe04babdbU, 0xacc86432U, 0x95e673b7U, 0x32d7e5fcU,
263
 
    0x70abdbe3U, 0x6342219eU, 0x417e3f91U, 0x7d562b9bU,
264
 
    0x76afd9e2U, 0xbdd66bbbU, 0x9b198241U, 0x79a5dc6eU,
265
 
    0xf9ae57a5U, 0x800b8bcbU, 0x67b1d66bU, 0x596e3795U,
266
 
    0xe1be5fa1U, 0x10ebfbf3U, 0x81fe7fb1U, 0x0c080402U,
267
 
    0x921785ccU, 0xa23795c4U, 0x4e743a1dU, 0x78502814U,
268
 
    0xb02b9bc3U, 0x5791c663U, 0xe64fa9daU, 0xd369ba5dU,
269
 
    0xdf61be5fU, 0xf257a5dcU, 0x13e9fa7dU, 0x941387cdU,
270
 
    0x1fe1fe7fU, 0xc175b45aU, 0x75add86cU, 0xd56db85cU,
271
 
    0x08fbf3f7U, 0xd4984c26U, 0x38dbe3ffU, 0x5493c7edU,
272
 
    0x4a87cde8U, 0x694e279dU, 0x7fa1de6fU, 0x0302018eU,
273
 
    0x56643219U, 0xe7ba5da0U, 0x1ae7fdf0U, 0x111e0f89U,
274
 
    0x223c1e0fU, 0x121c0e07U, 0xc58643afU, 0x20cbebfbU,
275
 
    0x30201008U, 0x7e542a15U, 0x2e341a0dU, 0x18100804U,
276
 
    0x06040201U, 0x458dc864U, 0xf85ba3dfU, 0x29c5ec76U,
277
 
    0x0bf9f279U, 0xf453a7ddU, 0x8ef47a3dU, 0x74582c16U,
278
 
    0x82fc7e3fU, 0xb2dc6e37U, 0x73a9da6dU, 0x90e07038U,
279
 
    0xb1de6fb9U, 0x37d1e673U, 0x4c83cfe9U, 0xbed46a35U,
280
 
    0xe349aa55U, 0x3bd9e271U, 0x07f1f67bU, 0x0f0a058cU,
281
 
    0x31d5e472U, 0x171a0d88U, 0x0efff1f6U, 0xfca8542aU,
282
 
    0x84f87c3eU, 0xd965bc5eU, 0xd29c4e27U, 0x89058c46U,
283
 
    0x2830180cU, 0x4389ca65U, 0x6dbdd068U, 0x5b99c261U,
284
 
    0x0a0c0603U, 0xbc239fc1U, 0xef41ae57U, 0xce7fb1d6U,
285
 
    0xec43afd9U, 0xcd7db058U, 0xea47add8U, 0x4985cc66U,
286
 
    0xc87bb3d7U, 0x9ce8743aU, 0x8a078dc8U, 0x88f0783cU,
287
 
    0x26cfe9faU, 0x53623196U, 0xf5a653a7U, 0x775a2d98U,
288
 
    0x5297c5ecU, 0xb7da6db8U, 0xa83b93c7U, 0xc38241aeU,
289
 
    0x6bb9d269U, 0xa731964bU, 0xdd964babU, 0xd19e4fa9U,
290
 
    0x4f81ce67U, 0x3c28140aU, 0x8f018e47U, 0x16eff9f2U,
291
 
    0x99ee77b5U, 0xcc884422U, 0x64b3d7e5U, 0x5e9fc1eeU,
292
 
    0xa3c261beU, 0xfaac562bU, 0x213e1f81U, 0x6c482412U,
293
 
    0x2d361b83U, 0x5a6c361bU, 0x24381c0eU, 0xca8c4623U,
294
 
    0x04f3f7f5U, 0x83098a45U, 0xc6844221U, 0x9e1f81ceU,
295
 
    0xab399249U, 0xe8b0582cU, 0x2cc3eff9U, 0x6ebfd1e6U,
296
 
    0x93e271b6U, 0xf0a05028U, 0x725c2e17U, 0x2b321982U,
297
 
    0x5c68341aU, 0x1d160b8bU, 0x3edfe1feU, 0x1b12098aU,
298
 
    0x36241209U, 0x8c038fc9U, 0x35261387U, 0xb9259c4eU,
299
 
    0x7ca3dfe1U, 0xe4b85c2eU, 0x62b7d5e4U, 0x7aa7dde0U,
300
 
    0x408bcbebU, 0x477a3d90U, 0xffaa55a4U, 0x44783c1eU,
301
 
    0x392e1785U, 0x5d9dc060U, 0x00000000U, 0xde944a25U,
302
 
    0x02f7f5f4U, 0x1ce3fff1U, 0x5f6a3594U, 0x3a2c160bU,
303
 
    0x68bbd3e7U, 0x23c9ea75U, 0x589bc3efU, 0xb8d06834U,
304
 
    0xa6c46231U, 0xc277b5d4U, 0xda67bdd0U, 0x33221186U,
305
 
    0x19e5fc7eU, 0xc98e47adU, 0x34d3e7fdU, 0xf6a45229U,
306
 
    0xa0c06030U, 0x9aec763bU, 0x6546239fU, 0x2ac7edf8U,
307
 
    0xae3f91c6U, 0x6a4c2613U, 0x14180c06U, 0x1e140a05U,
308
 
    0xa43397c5U, 0x66442211U, 0x2fc1ee77U, 0x15edf87cU,
309
 
    0x01f5f47aU, 0x0dfdf078U, 0xb4d86c36U, 0x4870381cU,
310
 
    0x96e47239U, 0xcb79b259U, 0x50603018U, 0xe945ac56U,
311
 
    0x8df67bb3U, 0x87fa7db0U, 0xd8904824U, 0xc0804020U,
312
 
    0x8bf279b2U, 0x4b723992U, 0xedb65ba3U, 0xba279dc0U,
313
 
    0x850d8844U, 0x5195c462U, 0x60402010U, 0x9fea75b4U,
314
 
    0x3f2a1584U, 0x97118643U, 0x4d763b93U, 0xb62f99c2U,
315
 
    0xa135944aU, 0xa9ce67bdU, 0x0506038fU, 0xeeb45a2dU,
316
 
    0xafca65bcU, 0x6f4a259cU, 0x61b5d46aU, 0x9d1d8040U,
317
 
    0x981b83cfU, 0xebb259a2U, 0x273a1d80U, 0xbf219e4fU,
318
 
    0x427c3e1fU, 0x860f89caU, 0xdb9249aaU, 0x91158442U,
319
 
};
320
 
 
321
 
static const ulong32 T4[256] = {
322
 
    0xbabababaU, 0x54545454U, 0x2f2f2f2fU, 0x74747474U,
323
 
    0x53535353U, 0xd3d3d3d3U, 0xd2d2d2d2U, 0x4d4d4d4dU,
324
 
    0x50505050U, 0xacacacacU, 0x8d8d8d8dU, 0xbfbfbfbfU,
325
 
    0x70707070U, 0x52525252U, 0x9a9a9a9aU, 0x4c4c4c4cU,
326
 
    0xeaeaeaeaU, 0xd5d5d5d5U, 0x97979797U, 0xd1d1d1d1U,
327
 
    0x33333333U, 0x51515151U, 0x5b5b5b5bU, 0xa6a6a6a6U,
328
 
    0xdedededeU, 0x48484848U, 0xa8a8a8a8U, 0x99999999U,
329
 
    0xdbdbdbdbU, 0x32323232U, 0xb7b7b7b7U, 0xfcfcfcfcU,
330
 
    0xe3e3e3e3U, 0x9e9e9e9eU, 0x91919191U, 0x9b9b9b9bU,
331
 
    0xe2e2e2e2U, 0xbbbbbbbbU, 0x41414141U, 0x6e6e6e6eU,
332
 
    0xa5a5a5a5U, 0xcbcbcbcbU, 0x6b6b6b6bU, 0x95959595U,
333
 
    0xa1a1a1a1U, 0xf3f3f3f3U, 0xb1b1b1b1U, 0x02020202U,
334
 
    0xccccccccU, 0xc4c4c4c4U, 0x1d1d1d1dU, 0x14141414U,
335
 
    0xc3c3c3c3U, 0x63636363U, 0xdadadadaU, 0x5d5d5d5dU,
336
 
    0x5f5f5f5fU, 0xdcdcdcdcU, 0x7d7d7d7dU, 0xcdcdcdcdU,
337
 
    0x7f7f7f7fU, 0x5a5a5a5aU, 0x6c6c6c6cU, 0x5c5c5c5cU,
338
 
    0xf7f7f7f7U, 0x26262626U, 0xffffffffU, 0xededededU,
339
 
    0xe8e8e8e8U, 0x9d9d9d9dU, 0x6f6f6f6fU, 0x8e8e8e8eU,
340
 
    0x19191919U, 0xa0a0a0a0U, 0xf0f0f0f0U, 0x89898989U,
341
 
    0x0f0f0f0fU, 0x07070707U, 0xafafafafU, 0xfbfbfbfbU,
342
 
    0x08080808U, 0x15151515U, 0x0d0d0d0dU, 0x04040404U,
343
 
    0x01010101U, 0x64646464U, 0xdfdfdfdfU, 0x76767676U,
344
 
    0x79797979U, 0xddddddddU, 0x3d3d3d3dU, 0x16161616U,
345
 
    0x3f3f3f3fU, 0x37373737U, 0x6d6d6d6dU, 0x38383838U,
346
 
    0xb9b9b9b9U, 0x73737373U, 0xe9e9e9e9U, 0x35353535U,
347
 
    0x55555555U, 0x71717171U, 0x7b7b7b7bU, 0x8c8c8c8cU,
348
 
    0x72727272U, 0x88888888U, 0xf6f6f6f6U, 0x2a2a2a2aU,
349
 
    0x3e3e3e3eU, 0x5e5e5e5eU, 0x27272727U, 0x46464646U,
350
 
    0x0c0c0c0cU, 0x65656565U, 0x68686868U, 0x61616161U,
351
 
    0x03030303U, 0xc1c1c1c1U, 0x57575757U, 0xd6d6d6d6U,
352
 
    0xd9d9d9d9U, 0x58585858U, 0xd8d8d8d8U, 0x66666666U,
353
 
    0xd7d7d7d7U, 0x3a3a3a3aU, 0xc8c8c8c8U, 0x3c3c3c3cU,
354
 
    0xfafafafaU, 0x96969696U, 0xa7a7a7a7U, 0x98989898U,
355
 
    0xececececU, 0xb8b8b8b8U, 0xc7c7c7c7U, 0xaeaeaeaeU,
356
 
    0x69696969U, 0x4b4b4b4bU, 0xababababU, 0xa9a9a9a9U,
357
 
    0x67676767U, 0x0a0a0a0aU, 0x47474747U, 0xf2f2f2f2U,
358
 
    0xb5b5b5b5U, 0x22222222U, 0xe5e5e5e5U, 0xeeeeeeeeU,
359
 
    0xbebebebeU, 0x2b2b2b2bU, 0x81818181U, 0x12121212U,
360
 
    0x83838383U, 0x1b1b1b1bU, 0x0e0e0e0eU, 0x23232323U,
361
 
    0xf5f5f5f5U, 0x45454545U, 0x21212121U, 0xcecececeU,
362
 
    0x49494949U, 0x2c2c2c2cU, 0xf9f9f9f9U, 0xe6e6e6e6U,
363
 
    0xb6b6b6b6U, 0x28282828U, 0x17171717U, 0x82828282U,
364
 
    0x1a1a1a1aU, 0x8b8b8b8bU, 0xfefefefeU, 0x8a8a8a8aU,
365
 
    0x09090909U, 0xc9c9c9c9U, 0x87878787U, 0x4e4e4e4eU,
366
 
    0xe1e1e1e1U, 0x2e2e2e2eU, 0xe4e4e4e4U, 0xe0e0e0e0U,
367
 
    0xebebebebU, 0x90909090U, 0xa4a4a4a4U, 0x1e1e1e1eU,
368
 
    0x85858585U, 0x60606060U, 0x00000000U, 0x25252525U,
369
 
    0xf4f4f4f4U, 0xf1f1f1f1U, 0x94949494U, 0x0b0b0b0bU,
370
 
    0xe7e7e7e7U, 0x75757575U, 0xefefefefU, 0x34343434U,
371
 
    0x31313131U, 0xd4d4d4d4U, 0xd0d0d0d0U, 0x86868686U,
372
 
    0x7e7e7e7eU, 0xadadadadU, 0xfdfdfdfdU, 0x29292929U,
373
 
    0x30303030U, 0x3b3b3b3bU, 0x9f9f9f9fU, 0xf8f8f8f8U,
374
 
    0xc6c6c6c6U, 0x13131313U, 0x06060606U, 0x05050505U,
375
 
    0xc5c5c5c5U, 0x11111111U, 0x77777777U, 0x7c7c7c7cU,
376
 
    0x7a7a7a7aU, 0x78787878U, 0x36363636U, 0x1c1c1c1cU,
377
 
    0x39393939U, 0x59595959U, 0x18181818U, 0x56565656U,
378
 
    0xb3b3b3b3U, 0xb0b0b0b0U, 0x24242424U, 0x20202020U,
379
 
    0xb2b2b2b2U, 0x92929292U, 0xa3a3a3a3U, 0xc0c0c0c0U,
380
 
    0x44444444U, 0x62626262U, 0x10101010U, 0xb4b4b4b4U,
381
 
    0x84848484U, 0x43434343U, 0x93939393U, 0xc2c2c2c2U,
382
 
    0x4a4a4a4aU, 0xbdbdbdbdU, 0x8f8f8f8fU, 0x2d2d2d2dU,
383
 
    0xbcbcbcbcU, 0x9c9c9c9cU, 0x6a6a6a6aU, 0x40404040U,
384
 
    0xcfcfcfcfU, 0xa2a2a2a2U, 0x80808080U, 0x4f4f4f4fU,
385
 
    0x1f1f1f1fU, 0xcacacacaU, 0xaaaaaaaaU, 0x42424242U,
386
 
};
387
 
 
388
 
static const ulong32 T5[256] = {
389
 
    0x00000000U, 0x01020608U, 0x02040c10U, 0x03060a18U,
390
 
    0x04081820U, 0x050a1e28U, 0x060c1430U, 0x070e1238U,
391
 
    0x08103040U, 0x09123648U, 0x0a143c50U, 0x0b163a58U,
392
 
    0x0c182860U, 0x0d1a2e68U, 0x0e1c2470U, 0x0f1e2278U,
393
 
    0x10206080U, 0x11226688U, 0x12246c90U, 0x13266a98U,
394
 
    0x142878a0U, 0x152a7ea8U, 0x162c74b0U, 0x172e72b8U,
395
 
    0x183050c0U, 0x193256c8U, 0x1a345cd0U, 0x1b365ad8U,
396
 
    0x1c3848e0U, 0x1d3a4ee8U, 0x1e3c44f0U, 0x1f3e42f8U,
397
 
    0x2040c01dU, 0x2142c615U, 0x2244cc0dU, 0x2346ca05U,
398
 
    0x2448d83dU, 0x254ade35U, 0x264cd42dU, 0x274ed225U,
399
 
    0x2850f05dU, 0x2952f655U, 0x2a54fc4dU, 0x2b56fa45U,
400
 
    0x2c58e87dU, 0x2d5aee75U, 0x2e5ce46dU, 0x2f5ee265U,
401
 
    0x3060a09dU, 0x3162a695U, 0x3264ac8dU, 0x3366aa85U,
402
 
    0x3468b8bdU, 0x356abeb5U, 0x366cb4adU, 0x376eb2a5U,
403
 
    0x387090ddU, 0x397296d5U, 0x3a749ccdU, 0x3b769ac5U,
404
 
    0x3c7888fdU, 0x3d7a8ef5U, 0x3e7c84edU, 0x3f7e82e5U,
405
 
    0x40809d3aU, 0x41829b32U, 0x4284912aU, 0x43869722U,
406
 
    0x4488851aU, 0x458a8312U, 0x468c890aU, 0x478e8f02U,
407
 
    0x4890ad7aU, 0x4992ab72U, 0x4a94a16aU, 0x4b96a762U,
408
 
    0x4c98b55aU, 0x4d9ab352U, 0x4e9cb94aU, 0x4f9ebf42U,
409
 
    0x50a0fdbaU, 0x51a2fbb2U, 0x52a4f1aaU, 0x53a6f7a2U,
410
 
    0x54a8e59aU, 0x55aae392U, 0x56ace98aU, 0x57aeef82U,
411
 
    0x58b0cdfaU, 0x59b2cbf2U, 0x5ab4c1eaU, 0x5bb6c7e2U,
412
 
    0x5cb8d5daU, 0x5dbad3d2U, 0x5ebcd9caU, 0x5fbedfc2U,
413
 
    0x60c05d27U, 0x61c25b2fU, 0x62c45137U, 0x63c6573fU,
414
 
    0x64c84507U, 0x65ca430fU, 0x66cc4917U, 0x67ce4f1fU,
415
 
    0x68d06d67U, 0x69d26b6fU, 0x6ad46177U, 0x6bd6677fU,
416
 
    0x6cd87547U, 0x6dda734fU, 0x6edc7957U, 0x6fde7f5fU,
417
 
    0x70e03da7U, 0x71e23bafU, 0x72e431b7U, 0x73e637bfU,
418
 
    0x74e82587U, 0x75ea238fU, 0x76ec2997U, 0x77ee2f9fU,
419
 
    0x78f00de7U, 0x79f20befU, 0x7af401f7U, 0x7bf607ffU,
420
 
    0x7cf815c7U, 0x7dfa13cfU, 0x7efc19d7U, 0x7ffe1fdfU,
421
 
    0x801d2774U, 0x811f217cU, 0x82192b64U, 0x831b2d6cU,
422
 
    0x84153f54U, 0x8517395cU, 0x86113344U, 0x8713354cU,
423
 
    0x880d1734U, 0x890f113cU, 0x8a091b24U, 0x8b0b1d2cU,
424
 
    0x8c050f14U, 0x8d07091cU, 0x8e010304U, 0x8f03050cU,
425
 
    0x903d47f4U, 0x913f41fcU, 0x92394be4U, 0x933b4decU,
426
 
    0x94355fd4U, 0x953759dcU, 0x963153c4U, 0x973355ccU,
427
 
    0x982d77b4U, 0x992f71bcU, 0x9a297ba4U, 0x9b2b7dacU,
428
 
    0x9c256f94U, 0x9d27699cU, 0x9e216384U, 0x9f23658cU,
429
 
    0xa05de769U, 0xa15fe161U, 0xa259eb79U, 0xa35bed71U,
430
 
    0xa455ff49U, 0xa557f941U, 0xa651f359U, 0xa753f551U,
431
 
    0xa84dd729U, 0xa94fd121U, 0xaa49db39U, 0xab4bdd31U,
432
 
    0xac45cf09U, 0xad47c901U, 0xae41c319U, 0xaf43c511U,
433
 
    0xb07d87e9U, 0xb17f81e1U, 0xb2798bf9U, 0xb37b8df1U,
434
 
    0xb4759fc9U, 0xb57799c1U, 0xb67193d9U, 0xb77395d1U,
435
 
    0xb86db7a9U, 0xb96fb1a1U, 0xba69bbb9U, 0xbb6bbdb1U,
436
 
    0xbc65af89U, 0xbd67a981U, 0xbe61a399U, 0xbf63a591U,
437
 
    0xc09dba4eU, 0xc19fbc46U, 0xc299b65eU, 0xc39bb056U,
438
 
    0xc495a26eU, 0xc597a466U, 0xc691ae7eU, 0xc793a876U,
439
 
    0xc88d8a0eU, 0xc98f8c06U, 0xca89861eU, 0xcb8b8016U,
440
 
    0xcc85922eU, 0xcd879426U, 0xce819e3eU, 0xcf839836U,
441
 
    0xd0bddaceU, 0xd1bfdcc6U, 0xd2b9d6deU, 0xd3bbd0d6U,
442
 
    0xd4b5c2eeU, 0xd5b7c4e6U, 0xd6b1cefeU, 0xd7b3c8f6U,
443
 
    0xd8adea8eU, 0xd9afec86U, 0xdaa9e69eU, 0xdbabe096U,
444
 
    0xdca5f2aeU, 0xdda7f4a6U, 0xdea1febeU, 0xdfa3f8b6U,
445
 
    0xe0dd7a53U, 0xe1df7c5bU, 0xe2d97643U, 0xe3db704bU,
446
 
    0xe4d56273U, 0xe5d7647bU, 0xe6d16e63U, 0xe7d3686bU,
447
 
    0xe8cd4a13U, 0xe9cf4c1bU, 0xeac94603U, 0xebcb400bU,
448
 
    0xecc55233U, 0xedc7543bU, 0xeec15e23U, 0xefc3582bU,
449
 
    0xf0fd1ad3U, 0xf1ff1cdbU, 0xf2f916c3U, 0xf3fb10cbU,
450
 
    0xf4f502f3U, 0xf5f704fbU, 0xf6f10ee3U, 0xf7f308ebU,
451
 
    0xf8ed2a93U, 0xf9ef2c9bU, 0xfae92683U, 0xfbeb208bU,
452
 
    0xfce532b3U, 0xfde734bbU, 0xfee13ea3U, 0xffe338abU,
453
 
};
454
 
 
455
 
/**
456
 
 * The round constants.
457
 
 */
458
 
static const ulong32 rc[] = {
459
 
    0xba542f74U, 0x53d3d24dU, 0x50ac8dbfU, 0x70529a4cU,
460
 
    0xead597d1U, 0x33515ba6U, 0xde48a899U, 0xdb32b7fcU,
461
 
    0xe39e919bU, 0xe2bb416eU, 0xa5cb6b95U, 0xa1f3b102U,
462
 
    0xccc41d14U, 0xc363da5dU, 0x5fdc7dcdU, 0x7f5a6c5cU,
463
 
    0xf726ffedU, 0xe89d6f8eU, 0x19a0f089U,
464
 
};
465
 
 
466
 
 
467
 
 
468
 
#else
469
 
 
470
 
 
471
 
static const ulong32 T0[256] = {
472
 
    0xa753a6f5U, 0xd3bb6bd0U, 0xe6d1bf6eU, 0x71e2d93bU,
473
 
    0xd0bd67daU, 0xac458acfU, 0x4d9a29b3U, 0x79f2f90bU,
474
 
    0x3a74e89cU, 0xc98f038cU, 0x913f7e41U, 0xfce5d732U,
475
 
    0x1e3c7844U, 0x478e018fU, 0x54a84de5U, 0xbd67cea9U,
476
 
    0x8c050a0fU, 0xa557aef9U, 0x7af4f501U, 0xfbebcb20U,
477
 
    0x63c69157U, 0xb86ddab7U, 0xdda753f4U, 0xd4b577c2U,
478
 
    0xe5d7b364U, 0xb37bf68dU, 0xc59733a4U, 0xbe61c2a3U,
479
 
    0xa94f9ed1U, 0x880d1a17U, 0x0c183028U, 0xa259b2ebU,
480
 
    0x3972e496U, 0xdfa35bf8U, 0x2952a4f6U, 0xdaa94fe6U,
481
 
    0x2b56acfaU, 0xa84d9ad7U, 0xcb8b0b80U, 0x4c982db5U,
482
 
    0x4b9631a7U, 0x224488ccU, 0xaa4992dbU, 0x244890d8U,
483
 
    0x4182199bU, 0x70e0dd3dU, 0xa651a2f3U, 0xf9efc32cU,
484
 
    0x5ab475c1U, 0xe2d9af76U, 0xb07dfa87U, 0x366cd8b4U,
485
 
    0x7dfae913U, 0xe4d5b762U, 0x3366ccaaU, 0xffe3db38U,
486
 
    0x60c09d5dU, 0x204080c0U, 0x08102030U, 0x8b0b161dU,
487
 
    0x5ebc65d9U, 0xab4b96ddU, 0x7ffee11fU, 0x78f0fd0dU,
488
 
    0x7cf8ed15U, 0x2c58b0e8U, 0x57ae41efU, 0xd2b96fd6U,
489
 
    0xdca557f2U, 0x6ddaa973U, 0x7efce519U, 0x0d1a342eU,
490
 
    0x53a651f7U, 0x94356a5fU, 0xc39b2bb0U, 0x2850a0f0U,
491
 
    0x274e9cd2U, 0x060c1814U, 0x5fbe61dfU, 0xad478ec9U,
492
 
    0x67ce814fU, 0x5cb86dd5U, 0x55aa49e3U, 0x48903dadU,
493
 
    0x0e1c3824U, 0x52a455f1U, 0xeac98f46U, 0x42841591U,
494
 
    0x5bb671c7U, 0x5dba69d3U, 0x3060c0a0U, 0x58b07dcdU,
495
 
    0x51a259fbU, 0x59b279cbU, 0x3c78f088U, 0x4e9c25b9U,
496
 
    0x3870e090U, 0x8a09121bU, 0x72e4d531U, 0x14285078U,
497
 
    0xe7d3bb68U, 0xc6913faeU, 0xdea15ffeU, 0x50a05dfdU,
498
 
    0x8e010203U, 0x9239724bU, 0xd1bf63dcU, 0x77eec12fU,
499
 
    0x933b764dU, 0x458a0983U, 0x9a29527bU, 0xce811f9eU,
500
 
    0x2d5ab4eeU, 0x03060c0aU, 0x62c49551U, 0xb671e293U,
501
 
    0xb96fdeb1U, 0xbf63c6a5U, 0x96316253U, 0x6bd6b167U,
502
 
    0x3f7efc82U, 0x070e1c12U, 0x1224486cU, 0xae4182c3U,
503
 
    0x40801d9dU, 0x3468d0b8U, 0x468c0589U, 0x3e7cf884U,
504
 
    0xdbab4be0U, 0xcf831b98U, 0xecc59752U, 0xcc851792U,
505
 
    0xc19f23bcU, 0xa15fbee1U, 0xc09d27baU, 0xd6b17fceU,
506
 
    0x1d3a744eU, 0xf4f5f702U, 0x61c2995bU, 0x3b76ec9aU,
507
 
    0x10204060U, 0xd8ad47eaU, 0x68d0bd6dU, 0xa05dbae7U,
508
 
    0xb17ffe81U, 0x0a14283cU, 0x69d2b96bU, 0x6cd8ad75U,
509
 
    0x499239abU, 0xfae9cf26U, 0x76ecc529U, 0xc49537a2U,
510
 
    0x9e214263U, 0x9b2b567dU, 0x6edca579U, 0x992f5e71U,
511
 
    0xc2992fb6U, 0xb773e695U, 0x982d5a77U, 0xbc65caafU,
512
 
    0x8f030605U, 0x85172e39U, 0x1f3e7c42U, 0xb475ea9fU,
513
 
    0xf8edc72aU, 0x11224466U, 0x2e5cb8e4U, 0x00000000U,
514
 
    0x254a94deU, 0x1c387048U, 0x2a54a8fcU, 0x3d7af48eU,
515
 
    0x050a141eU, 0x4f9e21bfU, 0x7bf6f107U, 0xb279f28bU,
516
 
    0x3264c8acU, 0x903d7a47U, 0xaf4386c5U, 0x19326456U,
517
 
    0xa35bb6edU, 0xf7f3fb08U, 0x73e6d137U, 0x9d274e69U,
518
 
    0x152a547eU, 0x74e8cd25U, 0xeec19f5eU, 0xca890f86U,
519
 
    0x9f234665U, 0x0f1e3c22U, 0x1b366c5aU, 0x75eac923U,
520
 
    0x86112233U, 0x84152a3fU, 0x9c254a6fU, 0x4a9435a1U,
521
 
    0x97336655U, 0x1a34685cU, 0x65ca8943U, 0xf6f1ff0eU,
522
 
    0xedc79354U, 0x09122436U, 0xbb6bd6bdU, 0x264c98d4U,
523
 
    0x831b362dU, 0xebcb8b40U, 0x6fdea17fU, 0x811f3e21U,
524
 
    0x04081018U, 0x6ad4b561U, 0x43861197U, 0x01020406U,
525
 
    0x172e5c72U, 0xe1dfa37cU, 0x87132635U, 0xf5f7f304U,
526
 
    0x8d070e09U, 0xe3dbab70U, 0x23468ccaU, 0x801d3a27U,
527
 
    0x44880d85U, 0x162c5874U, 0x66cc8549U, 0x214284c6U,
528
 
    0xfee1df3eU, 0xd5b773c4U, 0x3162c4a6U, 0xd9af43ecU,
529
 
    0x356ad4beU, 0x18306050U, 0x0204080cU, 0x64c88d45U,
530
 
    0xf2f9ef16U, 0xf1ffe31cU, 0x56ac45e9U, 0xcd871394U,
531
 
    0x8219322bU, 0xc88d078aU, 0xba69d2bbU, 0xf0fde71aU,
532
 
    0xefc39b58U, 0xe9cf834cU, 0xe8cd874aU, 0xfde7d334U,
533
 
    0x890f1e11U, 0xd7b37bc8U, 0xc7933ba8U, 0xb577ee99U,
534
 
    0xa455aaffU, 0x2f5ebce2U, 0x95376e59U, 0x13264c6aU,
535
 
    0x0b162c3aU, 0xf3fbeb10U, 0xe0dda77aU, 0x376edcb2U,
536
 
};
537
 
 
538
 
static const ulong32 T1[256] = {
539
 
    0x53a7f5a6U, 0xbbd3d06bU, 0xd1e66ebfU, 0xe2713bd9U,
540
 
    0xbdd0da67U, 0x45accf8aU, 0x9a4db329U, 0xf2790bf9U,
541
 
    0x743a9ce8U, 0x8fc98c03U, 0x3f91417eU, 0xe5fc32d7U,
542
 
    0x3c1e4478U, 0x8e478f01U, 0xa854e54dU, 0x67bda9ceU,
543
 
    0x058c0f0aU, 0x57a5f9aeU, 0xf47a01f5U, 0xebfb20cbU,
544
 
    0xc6635791U, 0x6db8b7daU, 0xa7ddf453U, 0xb5d4c277U,
545
 
    0xd7e564b3U, 0x7bb38df6U, 0x97c5a433U, 0x61bea3c2U,
546
 
    0x4fa9d19eU, 0x0d88171aU, 0x180c2830U, 0x59a2ebb2U,
547
 
    0x723996e4U, 0xa3dff85bU, 0x5229f6a4U, 0xa9dae64fU,
548
 
    0x562bfaacU, 0x4da8d79aU, 0x8bcb800bU, 0x984cb52dU,
549
 
    0x964ba731U, 0x4422cc88U, 0x49aadb92U, 0x4824d890U,
550
 
    0x82419b19U, 0xe0703dddU, 0x51a6f3a2U, 0xeff92cc3U,
551
 
    0xb45ac175U, 0xd9e276afU, 0x7db087faU, 0x6c36b4d8U,
552
 
    0xfa7d13e9U, 0xd5e462b7U, 0x6633aaccU, 0xe3ff38dbU,
553
 
    0xc0605d9dU, 0x4020c080U, 0x10083020U, 0x0b8b1d16U,
554
 
    0xbc5ed965U, 0x4babdd96U, 0xfe7f1fe1U, 0xf0780dfdU,
555
 
    0xf87c15edU, 0x582ce8b0U, 0xae57ef41U, 0xb9d2d66fU,
556
 
    0xa5dcf257U, 0xda6d73a9U, 0xfc7e19e5U, 0x1a0d2e34U,
557
 
    0xa653f751U, 0x35945f6aU, 0x9bc3b02bU, 0x5028f0a0U,
558
 
    0x4e27d29cU, 0x0c061418U, 0xbe5fdf61U, 0x47adc98eU,
559
 
    0xce674f81U, 0xb85cd56dU, 0xaa55e349U, 0x9048ad3dU,
560
 
    0x1c0e2438U, 0xa452f155U, 0xc9ea468fU, 0x84429115U,
561
 
    0xb65bc771U, 0xba5dd369U, 0x6030a0c0U, 0xb058cd7dU,
562
 
    0xa251fb59U, 0xb259cb79U, 0x783c88f0U, 0x9c4eb925U,
563
 
    0x703890e0U, 0x098a1b12U, 0xe47231d5U, 0x28147850U,
564
 
    0xd3e768bbU, 0x91c6ae3fU, 0xa1defe5fU, 0xa050fd5dU,
565
 
    0x018e0302U, 0x39924b72U, 0xbfd1dc63U, 0xee772fc1U,
566
 
    0x3b934d76U, 0x8a458309U, 0x299a7b52U, 0x81ce9e1fU,
567
 
    0x5a2deeb4U, 0x06030a0cU, 0xc4625195U, 0x71b693e2U,
568
 
    0x6fb9b1deU, 0x63bfa5c6U, 0x31965362U, 0xd66b67b1U,
569
 
    0x7e3f82fcU, 0x0e07121cU, 0x24126c48U, 0x41aec382U,
570
 
    0x80409d1dU, 0x6834b8d0U, 0x8c468905U, 0x7c3e84f8U,
571
 
    0xabdbe04bU, 0x83cf981bU, 0xc5ec5297U, 0x85cc9217U,
572
 
    0x9fc1bc23U, 0x5fa1e1beU, 0x9dc0ba27U, 0xb1d6ce7fU,
573
 
    0x3a1d4e74U, 0xf5f402f7U, 0xc2615b99U, 0x763b9aecU,
574
 
    0x20106040U, 0xadd8ea47U, 0xd0686dbdU, 0x5da0e7baU,
575
 
    0x7fb181feU, 0x140a3c28U, 0xd2696bb9U, 0xd86c75adU,
576
 
    0x9249ab39U, 0xe9fa26cfU, 0xec7629c5U, 0x95c4a237U,
577
 
    0x219e6342U, 0x2b9b7d56U, 0xdc6e79a5U, 0x2f99715eU,
578
 
    0x99c2b62fU, 0x73b795e6U, 0x2d98775aU, 0x65bcafcaU,
579
 
    0x038f0506U, 0x1785392eU, 0x3e1f427cU, 0x75b49feaU,
580
 
    0xedf82ac7U, 0x22116644U, 0x5c2ee4b8U, 0x00000000U,
581
 
    0x4a25de94U, 0x381c4870U, 0x542afca8U, 0x7a3d8ef4U,
582
 
    0x0a051e14U, 0x9e4fbf21U, 0xf67b07f1U, 0x79b28bf2U,
583
 
    0x6432acc8U, 0x3d90477aU, 0x43afc586U, 0x32195664U,
584
 
    0x5ba3edb6U, 0xf3f708fbU, 0xe67337d1U, 0x279d694eU,
585
 
    0x2a157e54U, 0xe87425cdU, 0xc1ee5e9fU, 0x89ca860fU,
586
 
    0x239f6546U, 0x1e0f223cU, 0x361b5a6cU, 0xea7523c9U,
587
 
    0x11863322U, 0x15843f2aU, 0x259c6f4aU, 0x944aa135U,
588
 
    0x33975566U, 0x341a5c68U, 0xca654389U, 0xf1f60effU,
589
 
    0xc7ed5493U, 0x12093624U, 0x6bbbbdd6U, 0x4c26d498U,
590
 
    0x1b832d36U, 0xcbeb408bU, 0xde6f7fa1U, 0x1f81213eU,
591
 
    0x08041810U, 0xd46a61b5U, 0x86439711U, 0x02010604U,
592
 
    0x2e17725cU, 0xdfe17ca3U, 0x13873526U, 0xf7f504f3U,
593
 
    0x078d090eU, 0xdbe370abU, 0x4623ca8cU, 0x1d80273aU,
594
 
    0x8844850dU, 0x2c167458U, 0xcc664985U, 0x4221c684U,
595
 
    0xe1fe3edfU, 0xb7d5c473U, 0x6231a6c4U, 0xafd9ec43U,
596
 
    0x6a35bed4U, 0x30185060U, 0x04020c08U, 0xc864458dU,
597
 
    0xf9f216efU, 0xfff11ce3U, 0xac56e945U, 0x87cd9413U,
598
 
    0x19822b32U, 0x8dc88a07U, 0x69babbd2U, 0xfdf01ae7U,
599
 
    0xc3ef589bU, 0xcfe94c83U, 0xcde84a87U, 0xe7fd34d3U,
600
 
    0x0f89111eU, 0xb3d7c87bU, 0x93c7a83bU, 0x77b599eeU,
601
 
    0x55a4ffaaU, 0x5e2fe2bcU, 0x3795596eU, 0x26136a4cU,
602
 
    0x160b3a2cU, 0xfbf310ebU, 0xdde07aa7U, 0x6e37b2dcU,
603
 
};
604
 
 
605
 
static const ulong32 T2[256] = {
606
 
    0xa6f5a753U, 0x6bd0d3bbU, 0xbf6ee6d1U, 0xd93b71e2U,
607
 
    0x67dad0bdU, 0x8acfac45U, 0x29b34d9aU, 0xf90b79f2U,
608
 
    0xe89c3a74U, 0x038cc98fU, 0x7e41913fU, 0xd732fce5U,
609
 
    0x78441e3cU, 0x018f478eU, 0x4de554a8U, 0xcea9bd67U,
610
 
    0x0a0f8c05U, 0xaef9a557U, 0xf5017af4U, 0xcb20fbebU,
611
 
    0x915763c6U, 0xdab7b86dU, 0x53f4dda7U, 0x77c2d4b5U,
612
 
    0xb364e5d7U, 0xf68db37bU, 0x33a4c597U, 0xc2a3be61U,
613
 
    0x9ed1a94fU, 0x1a17880dU, 0x30280c18U, 0xb2eba259U,
614
 
    0xe4963972U, 0x5bf8dfa3U, 0xa4f62952U, 0x4fe6daa9U,
615
 
    0xacfa2b56U, 0x9ad7a84dU, 0x0b80cb8bU, 0x2db54c98U,
616
 
    0x31a74b96U, 0x88cc2244U, 0x92dbaa49U, 0x90d82448U,
617
 
    0x199b4182U, 0xdd3d70e0U, 0xa2f3a651U, 0xc32cf9efU,
618
 
    0x75c15ab4U, 0xaf76e2d9U, 0xfa87b07dU, 0xd8b4366cU,
619
 
    0xe9137dfaU, 0xb762e4d5U, 0xccaa3366U, 0xdb38ffe3U,
620
 
    0x9d5d60c0U, 0x80c02040U, 0x20300810U, 0x161d8b0bU,
621
 
    0x65d95ebcU, 0x96ddab4bU, 0xe11f7ffeU, 0xfd0d78f0U,
622
 
    0xed157cf8U, 0xb0e82c58U, 0x41ef57aeU, 0x6fd6d2b9U,
623
 
    0x57f2dca5U, 0xa9736ddaU, 0xe5197efcU, 0x342e0d1aU,
624
 
    0x51f753a6U, 0x6a5f9435U, 0x2bb0c39bU, 0xa0f02850U,
625
 
    0x9cd2274eU, 0x1814060cU, 0x61df5fbeU, 0x8ec9ad47U,
626
 
    0x814f67ceU, 0x6dd55cb8U, 0x49e355aaU, 0x3dad4890U,
627
 
    0x38240e1cU, 0x55f152a4U, 0x8f46eac9U, 0x15914284U,
628
 
    0x71c75bb6U, 0x69d35dbaU, 0xc0a03060U, 0x7dcd58b0U,
629
 
    0x59fb51a2U, 0x79cb59b2U, 0xf0883c78U, 0x25b94e9cU,
630
 
    0xe0903870U, 0x121b8a09U, 0xd53172e4U, 0x50781428U,
631
 
    0xbb68e7d3U, 0x3faec691U, 0x5ffedea1U, 0x5dfd50a0U,
632
 
    0x02038e01U, 0x724b9239U, 0x63dcd1bfU, 0xc12f77eeU,
633
 
    0x764d933bU, 0x0983458aU, 0x527b9a29U, 0x1f9ece81U,
634
 
    0xb4ee2d5aU, 0x0c0a0306U, 0x955162c4U, 0xe293b671U,
635
 
    0xdeb1b96fU, 0xc6a5bf63U, 0x62539631U, 0xb1676bd6U,
636
 
    0xfc823f7eU, 0x1c12070eU, 0x486c1224U, 0x82c3ae41U,
637
 
    0x1d9d4080U, 0xd0b83468U, 0x0589468cU, 0xf8843e7cU,
638
 
    0x4be0dbabU, 0x1b98cf83U, 0x9752ecc5U, 0x1792cc85U,
639
 
    0x23bcc19fU, 0xbee1a15fU, 0x27bac09dU, 0x7fced6b1U,
640
 
    0x744e1d3aU, 0xf702f4f5U, 0x995b61c2U, 0xec9a3b76U,
641
 
    0x40601020U, 0x47ead8adU, 0xbd6d68d0U, 0xbae7a05dU,
642
 
    0xfe81b17fU, 0x283c0a14U, 0xb96b69d2U, 0xad756cd8U,
643
 
    0x39ab4992U, 0xcf26fae9U, 0xc52976ecU, 0x37a2c495U,
644
 
    0x42639e21U, 0x567d9b2bU, 0xa5796edcU, 0x5e71992fU,
645
 
    0x2fb6c299U, 0xe695b773U, 0x5a77982dU, 0xcaafbc65U,
646
 
    0x06058f03U, 0x2e398517U, 0x7c421f3eU, 0xea9fb475U,
647
 
    0xc72af8edU, 0x44661122U, 0xb8e42e5cU, 0x00000000U,
648
 
    0x94de254aU, 0x70481c38U, 0xa8fc2a54U, 0xf48e3d7aU,
649
 
    0x141e050aU, 0x21bf4f9eU, 0xf1077bf6U, 0xf28bb279U,
650
 
    0xc8ac3264U, 0x7a47903dU, 0x86c5af43U, 0x64561932U,
651
 
    0xb6eda35bU, 0xfb08f7f3U, 0xd13773e6U, 0x4e699d27U,
652
 
    0x547e152aU, 0xcd2574e8U, 0x9f5eeec1U, 0x0f86ca89U,
653
 
    0x46659f23U, 0x3c220f1eU, 0x6c5a1b36U, 0xc92375eaU,
654
 
    0x22338611U, 0x2a3f8415U, 0x4a6f9c25U, 0x35a14a94U,
655
 
    0x66559733U, 0x685c1a34U, 0x894365caU, 0xff0ef6f1U,
656
 
    0x9354edc7U, 0x24360912U, 0xd6bdbb6bU, 0x98d4264cU,
657
 
    0x362d831bU, 0x8b40ebcbU, 0xa17f6fdeU, 0x3e21811fU,
658
 
    0x10180408U, 0xb5616ad4U, 0x11974386U, 0x04060102U,
659
 
    0x5c72172eU, 0xa37ce1dfU, 0x26358713U, 0xf304f5f7U,
660
 
    0x0e098d07U, 0xab70e3dbU, 0x8cca2346U, 0x3a27801dU,
661
 
    0x0d854488U, 0x5874162cU, 0x854966ccU, 0x84c62142U,
662
 
    0xdf3efee1U, 0x73c4d5b7U, 0xc4a63162U, 0x43ecd9afU,
663
 
    0xd4be356aU, 0x60501830U, 0x080c0204U, 0x8d4564c8U,
664
 
    0xef16f2f9U, 0xe31cf1ffU, 0x45e956acU, 0x1394cd87U,
665
 
    0x322b8219U, 0x078ac88dU, 0xd2bbba69U, 0xe71af0fdU,
666
 
    0x9b58efc3U, 0x834ce9cfU, 0x874ae8cdU, 0xd334fde7U,
667
 
    0x1e11890fU, 0x7bc8d7b3U, 0x3ba8c793U, 0xee99b577U,
668
 
    0xaaffa455U, 0xbce22f5eU, 0x6e599537U, 0x4c6a1326U,
669
 
    0x2c3a0b16U, 0xeb10f3fbU, 0xa77ae0ddU, 0xdcb2376eU,
670
 
};
671
 
 
672
 
static const ulong32 T3[256] = {
673
 
    0xf5a653a7U, 0xd06bbbd3U, 0x6ebfd1e6U, 0x3bd9e271U,
674
 
    0xda67bdd0U, 0xcf8a45acU, 0xb3299a4dU, 0x0bf9f279U,
675
 
    0x9ce8743aU, 0x8c038fc9U, 0x417e3f91U, 0x32d7e5fcU,
676
 
    0x44783c1eU, 0x8f018e47U, 0xe54da854U, 0xa9ce67bdU,
677
 
    0x0f0a058cU, 0xf9ae57a5U, 0x01f5f47aU, 0x20cbebfbU,
678
 
    0x5791c663U, 0xb7da6db8U, 0xf453a7ddU, 0xc277b5d4U,
679
 
    0x64b3d7e5U, 0x8df67bb3U, 0xa43397c5U, 0xa3c261beU,
680
 
    0xd19e4fa9U, 0x171a0d88U, 0x2830180cU, 0xebb259a2U,
681
 
    0x96e47239U, 0xf85ba3dfU, 0xf6a45229U, 0xe64fa9daU,
682
 
    0xfaac562bU, 0xd79a4da8U, 0x800b8bcbU, 0xb52d984cU,
683
 
    0xa731964bU, 0xcc884422U, 0xdb9249aaU, 0xd8904824U,
684
 
    0x9b198241U, 0x3ddde070U, 0xf3a251a6U, 0x2cc3eff9U,
685
 
    0xc175b45aU, 0x76afd9e2U, 0x87fa7db0U, 0xb4d86c36U,
686
 
    0x13e9fa7dU, 0x62b7d5e4U, 0xaacc6633U, 0x38dbe3ffU,
687
 
    0x5d9dc060U, 0xc0804020U, 0x30201008U, 0x1d160b8bU,
688
 
    0xd965bc5eU, 0xdd964babU, 0x1fe1fe7fU, 0x0dfdf078U,
689
 
    0x15edf87cU, 0xe8b0582cU, 0xef41ae57U, 0xd66fb9d2U,
690
 
    0xf257a5dcU, 0x73a9da6dU, 0x19e5fc7eU, 0x2e341a0dU,
691
 
    0xf751a653U, 0x5f6a3594U, 0xb02b9bc3U, 0xf0a05028U,
692
 
    0xd29c4e27U, 0x14180c06U, 0xdf61be5fU, 0xc98e47adU,
693
 
    0x4f81ce67U, 0xd56db85cU, 0xe349aa55U, 0xad3d9048U,
694
 
    0x24381c0eU, 0xf155a452U, 0x468fc9eaU, 0x91158442U,
695
 
    0xc771b65bU, 0xd369ba5dU, 0xa0c06030U, 0xcd7db058U,
696
 
    0xfb59a251U, 0xcb79b259U, 0x88f0783cU, 0xb9259c4eU,
697
 
    0x90e07038U, 0x1b12098aU, 0x31d5e472U, 0x78502814U,
698
 
    0x68bbd3e7U, 0xae3f91c6U, 0xfe5fa1deU, 0xfd5da050U,
699
 
    0x0302018eU, 0x4b723992U, 0xdc63bfd1U, 0x2fc1ee77U,
700
 
    0x4d763b93U, 0x83098a45U, 0x7b52299aU, 0x9e1f81ceU,
701
 
    0xeeb45a2dU, 0x0a0c0603U, 0x5195c462U, 0x93e271b6U,
702
 
    0xb1de6fb9U, 0xa5c663bfU, 0x53623196U, 0x67b1d66bU,
703
 
    0x82fc7e3fU, 0x121c0e07U, 0x6c482412U, 0xc38241aeU,
704
 
    0x9d1d8040U, 0xb8d06834U, 0x89058c46U, 0x84f87c3eU,
705
 
    0xe04babdbU, 0x981b83cfU, 0x5297c5ecU, 0x921785ccU,
706
 
    0xbc239fc1U, 0xe1be5fa1U, 0xba279dc0U, 0xce7fb1d6U,
707
 
    0x4e743a1dU, 0x02f7f5f4U, 0x5b99c261U, 0x9aec763bU,
708
 
    0x60402010U, 0xea47add8U, 0x6dbdd068U, 0xe7ba5da0U,
709
 
    0x81fe7fb1U, 0x3c28140aU, 0x6bb9d269U, 0x75add86cU,
710
 
    0xab399249U, 0x26cfe9faU, 0x29c5ec76U, 0xa23795c4U,
711
 
    0x6342219eU, 0x7d562b9bU, 0x79a5dc6eU, 0x715e2f99U,
712
 
    0xb62f99c2U, 0x95e673b7U, 0x775a2d98U, 0xafca65bcU,
713
 
    0x0506038fU, 0x392e1785U, 0x427c3e1fU, 0x9fea75b4U,
714
 
    0x2ac7edf8U, 0x66442211U, 0xe4b85c2eU, 0x00000000U,
715
 
    0xde944a25U, 0x4870381cU, 0xfca8542aU, 0x8ef47a3dU,
716
 
    0x1e140a05U, 0xbf219e4fU, 0x07f1f67bU, 0x8bf279b2U,
717
 
    0xacc86432U, 0x477a3d90U, 0xc58643afU, 0x56643219U,
718
 
    0xedb65ba3U, 0x08fbf3f7U, 0x37d1e673U, 0x694e279dU,
719
 
    0x7e542a15U, 0x25cde874U, 0x5e9fc1eeU, 0x860f89caU,
720
 
    0x6546239fU, 0x223c1e0fU, 0x5a6c361bU, 0x23c9ea75U,
721
 
    0x33221186U, 0x3f2a1584U, 0x6f4a259cU, 0xa135944aU,
722
 
    0x55663397U, 0x5c68341aU, 0x4389ca65U, 0x0efff1f6U,
723
 
    0x5493c7edU, 0x36241209U, 0xbdd66bbbU, 0xd4984c26U,
724
 
    0x2d361b83U, 0x408bcbebU, 0x7fa1de6fU, 0x213e1f81U,
725
 
    0x18100804U, 0x61b5d46aU, 0x97118643U, 0x06040201U,
726
 
    0x725c2e17U, 0x7ca3dfe1U, 0x35261387U, 0x04f3f7f5U,
727
 
    0x090e078dU, 0x70abdbe3U, 0xca8c4623U, 0x273a1d80U,
728
 
    0x850d8844U, 0x74582c16U, 0x4985cc66U, 0xc6844221U,
729
 
    0x3edfe1feU, 0xc473b7d5U, 0xa6c46231U, 0xec43afd9U,
730
 
    0xbed46a35U, 0x50603018U, 0x0c080402U, 0x458dc864U,
731
 
    0x16eff9f2U, 0x1ce3fff1U, 0xe945ac56U, 0x941387cdU,
732
 
    0x2b321982U, 0x8a078dc8U, 0xbbd269baU, 0x1ae7fdf0U,
733
 
    0x589bc3efU, 0x4c83cfe9U, 0x4a87cde8U, 0x34d3e7fdU,
734
 
    0x111e0f89U, 0xc87bb3d7U, 0xa83b93c7U, 0x99ee77b5U,
735
 
    0xffaa55a4U, 0xe2bc5e2fU, 0x596e3795U, 0x6a4c2613U,
736
 
    0x3a2c160bU, 0x10ebfbf3U, 0x7aa7dde0U, 0xb2dc6e37U,
737
 
};
738
 
 
739
 
static const ulong32 T4[256] = {
740
 
    0xa7a7a7a7U, 0xd3d3d3d3U, 0xe6e6e6e6U, 0x71717171U,
741
 
    0xd0d0d0d0U, 0xacacacacU, 0x4d4d4d4dU, 0x79797979U,
742
 
    0x3a3a3a3aU, 0xc9c9c9c9U, 0x91919191U, 0xfcfcfcfcU,
743
 
    0x1e1e1e1eU, 0x47474747U, 0x54545454U, 0xbdbdbdbdU,
744
 
    0x8c8c8c8cU, 0xa5a5a5a5U, 0x7a7a7a7aU, 0xfbfbfbfbU,
745
 
    0x63636363U, 0xb8b8b8b8U, 0xddddddddU, 0xd4d4d4d4U,
746
 
    0xe5e5e5e5U, 0xb3b3b3b3U, 0xc5c5c5c5U, 0xbebebebeU,
747
 
    0xa9a9a9a9U, 0x88888888U, 0x0c0c0c0cU, 0xa2a2a2a2U,
748
 
    0x39393939U, 0xdfdfdfdfU, 0x29292929U, 0xdadadadaU,
749
 
    0x2b2b2b2bU, 0xa8a8a8a8U, 0xcbcbcbcbU, 0x4c4c4c4cU,
750
 
    0x4b4b4b4bU, 0x22222222U, 0xaaaaaaaaU, 0x24242424U,
751
 
    0x41414141U, 0x70707070U, 0xa6a6a6a6U, 0xf9f9f9f9U,
752
 
    0x5a5a5a5aU, 0xe2e2e2e2U, 0xb0b0b0b0U, 0x36363636U,
753
 
    0x7d7d7d7dU, 0xe4e4e4e4U, 0x33333333U, 0xffffffffU,
754
 
    0x60606060U, 0x20202020U, 0x08080808U, 0x8b8b8b8bU,
755
 
    0x5e5e5e5eU, 0xababababU, 0x7f7f7f7fU, 0x78787878U,
756
 
    0x7c7c7c7cU, 0x2c2c2c2cU, 0x57575757U, 0xd2d2d2d2U,
757
 
    0xdcdcdcdcU, 0x6d6d6d6dU, 0x7e7e7e7eU, 0x0d0d0d0dU,
758
 
    0x53535353U, 0x94949494U, 0xc3c3c3c3U, 0x28282828U,
759
 
    0x27272727U, 0x06060606U, 0x5f5f5f5fU, 0xadadadadU,
760
 
    0x67676767U, 0x5c5c5c5cU, 0x55555555U, 0x48484848U,
761
 
    0x0e0e0e0eU, 0x52525252U, 0xeaeaeaeaU, 0x42424242U,
762
 
    0x5b5b5b5bU, 0x5d5d5d5dU, 0x30303030U, 0x58585858U,
763
 
    0x51515151U, 0x59595959U, 0x3c3c3c3cU, 0x4e4e4e4eU,
764
 
    0x38383838U, 0x8a8a8a8aU, 0x72727272U, 0x14141414U,
765
 
    0xe7e7e7e7U, 0xc6c6c6c6U, 0xdedededeU, 0x50505050U,
766
 
    0x8e8e8e8eU, 0x92929292U, 0xd1d1d1d1U, 0x77777777U,
767
 
    0x93939393U, 0x45454545U, 0x9a9a9a9aU, 0xcecececeU,
768
 
    0x2d2d2d2dU, 0x03030303U, 0x62626262U, 0xb6b6b6b6U,
769
 
    0xb9b9b9b9U, 0xbfbfbfbfU, 0x96969696U, 0x6b6b6b6bU,
770
 
    0x3f3f3f3fU, 0x07070707U, 0x12121212U, 0xaeaeaeaeU,
771
 
    0x40404040U, 0x34343434U, 0x46464646U, 0x3e3e3e3eU,
772
 
    0xdbdbdbdbU, 0xcfcfcfcfU, 0xececececU, 0xccccccccU,
773
 
    0xc1c1c1c1U, 0xa1a1a1a1U, 0xc0c0c0c0U, 0xd6d6d6d6U,
774
 
    0x1d1d1d1dU, 0xf4f4f4f4U, 0x61616161U, 0x3b3b3b3bU,
775
 
    0x10101010U, 0xd8d8d8d8U, 0x68686868U, 0xa0a0a0a0U,
776
 
    0xb1b1b1b1U, 0x0a0a0a0aU, 0x69696969U, 0x6c6c6c6cU,
777
 
    0x49494949U, 0xfafafafaU, 0x76767676U, 0xc4c4c4c4U,
778
 
    0x9e9e9e9eU, 0x9b9b9b9bU, 0x6e6e6e6eU, 0x99999999U,
779
 
    0xc2c2c2c2U, 0xb7b7b7b7U, 0x98989898U, 0xbcbcbcbcU,
780
 
    0x8f8f8f8fU, 0x85858585U, 0x1f1f1f1fU, 0xb4b4b4b4U,
781
 
    0xf8f8f8f8U, 0x11111111U, 0x2e2e2e2eU, 0x00000000U,
782
 
    0x25252525U, 0x1c1c1c1cU, 0x2a2a2a2aU, 0x3d3d3d3dU,
783
 
    0x05050505U, 0x4f4f4f4fU, 0x7b7b7b7bU, 0xb2b2b2b2U,
784
 
    0x32323232U, 0x90909090U, 0xafafafafU, 0x19191919U,
785
 
    0xa3a3a3a3U, 0xf7f7f7f7U, 0x73737373U, 0x9d9d9d9dU,
786
 
    0x15151515U, 0x74747474U, 0xeeeeeeeeU, 0xcacacacaU,
787
 
    0x9f9f9f9fU, 0x0f0f0f0fU, 0x1b1b1b1bU, 0x75757575U,
788
 
    0x86868686U, 0x84848484U, 0x9c9c9c9cU, 0x4a4a4a4aU,
789
 
    0x97979797U, 0x1a1a1a1aU, 0x65656565U, 0xf6f6f6f6U,
790
 
    0xededededU, 0x09090909U, 0xbbbbbbbbU, 0x26262626U,
791
 
    0x83838383U, 0xebebebebU, 0x6f6f6f6fU, 0x81818181U,
792
 
    0x04040404U, 0x6a6a6a6aU, 0x43434343U, 0x01010101U,
793
 
    0x17171717U, 0xe1e1e1e1U, 0x87878787U, 0xf5f5f5f5U,
794
 
    0x8d8d8d8dU, 0xe3e3e3e3U, 0x23232323U, 0x80808080U,
795
 
    0x44444444U, 0x16161616U, 0x66666666U, 0x21212121U,
796
 
    0xfefefefeU, 0xd5d5d5d5U, 0x31313131U, 0xd9d9d9d9U,
797
 
    0x35353535U, 0x18181818U, 0x02020202U, 0x64646464U,
798
 
    0xf2f2f2f2U, 0xf1f1f1f1U, 0x56565656U, 0xcdcdcdcdU,
799
 
    0x82828282U, 0xc8c8c8c8U, 0xbabababaU, 0xf0f0f0f0U,
800
 
    0xefefefefU, 0xe9e9e9e9U, 0xe8e8e8e8U, 0xfdfdfdfdU,
801
 
    0x89898989U, 0xd7d7d7d7U, 0xc7c7c7c7U, 0xb5b5b5b5U,
802
 
    0xa4a4a4a4U, 0x2f2f2f2fU, 0x95959595U, 0x13131313U,
803
 
    0x0b0b0b0bU, 0xf3f3f3f3U, 0xe0e0e0e0U, 0x37373737U,
804
 
};
805
 
 
806
 
static const ulong32 T5[256] = {
807
 
    0x00000000U, 0x01020608U, 0x02040c10U, 0x03060a18U,
808
 
    0x04081820U, 0x050a1e28U, 0x060c1430U, 0x070e1238U,
809
 
    0x08103040U, 0x09123648U, 0x0a143c50U, 0x0b163a58U,
810
 
    0x0c182860U, 0x0d1a2e68U, 0x0e1c2470U, 0x0f1e2278U,
811
 
    0x10206080U, 0x11226688U, 0x12246c90U, 0x13266a98U,
812
 
    0x142878a0U, 0x152a7ea8U, 0x162c74b0U, 0x172e72b8U,
813
 
    0x183050c0U, 0x193256c8U, 0x1a345cd0U, 0x1b365ad8U,
814
 
    0x1c3848e0U, 0x1d3a4ee8U, 0x1e3c44f0U, 0x1f3e42f8U,
815
 
    0x2040c01dU, 0x2142c615U, 0x2244cc0dU, 0x2346ca05U,
816
 
    0x2448d83dU, 0x254ade35U, 0x264cd42dU, 0x274ed225U,
817
 
    0x2850f05dU, 0x2952f655U, 0x2a54fc4dU, 0x2b56fa45U,
818
 
    0x2c58e87dU, 0x2d5aee75U, 0x2e5ce46dU, 0x2f5ee265U,
819
 
    0x3060a09dU, 0x3162a695U, 0x3264ac8dU, 0x3366aa85U,
820
 
    0x3468b8bdU, 0x356abeb5U, 0x366cb4adU, 0x376eb2a5U,
821
 
    0x387090ddU, 0x397296d5U, 0x3a749ccdU, 0x3b769ac5U,
822
 
    0x3c7888fdU, 0x3d7a8ef5U, 0x3e7c84edU, 0x3f7e82e5U,
823
 
    0x40809d3aU, 0x41829b32U, 0x4284912aU, 0x43869722U,
824
 
    0x4488851aU, 0x458a8312U, 0x468c890aU, 0x478e8f02U,
825
 
    0x4890ad7aU, 0x4992ab72U, 0x4a94a16aU, 0x4b96a762U,
826
 
    0x4c98b55aU, 0x4d9ab352U, 0x4e9cb94aU, 0x4f9ebf42U,
827
 
    0x50a0fdbaU, 0x51a2fbb2U, 0x52a4f1aaU, 0x53a6f7a2U,
828
 
    0x54a8e59aU, 0x55aae392U, 0x56ace98aU, 0x57aeef82U,
829
 
    0x58b0cdfaU, 0x59b2cbf2U, 0x5ab4c1eaU, 0x5bb6c7e2U,
830
 
    0x5cb8d5daU, 0x5dbad3d2U, 0x5ebcd9caU, 0x5fbedfc2U,
831
 
    0x60c05d27U, 0x61c25b2fU, 0x62c45137U, 0x63c6573fU,
832
 
    0x64c84507U, 0x65ca430fU, 0x66cc4917U, 0x67ce4f1fU,
833
 
    0x68d06d67U, 0x69d26b6fU, 0x6ad46177U, 0x6bd6677fU,
834
 
    0x6cd87547U, 0x6dda734fU, 0x6edc7957U, 0x6fde7f5fU,
835
 
    0x70e03da7U, 0x71e23bafU, 0x72e431b7U, 0x73e637bfU,
836
 
    0x74e82587U, 0x75ea238fU, 0x76ec2997U, 0x77ee2f9fU,
837
 
    0x78f00de7U, 0x79f20befU, 0x7af401f7U, 0x7bf607ffU,
838
 
    0x7cf815c7U, 0x7dfa13cfU, 0x7efc19d7U, 0x7ffe1fdfU,
839
 
    0x801d2774U, 0x811f217cU, 0x82192b64U, 0x831b2d6cU,
840
 
    0x84153f54U, 0x8517395cU, 0x86113344U, 0x8713354cU,
841
 
    0x880d1734U, 0x890f113cU, 0x8a091b24U, 0x8b0b1d2cU,
842
 
    0x8c050f14U, 0x8d07091cU, 0x8e010304U, 0x8f03050cU,
843
 
    0x903d47f4U, 0x913f41fcU, 0x92394be4U, 0x933b4decU,
844
 
    0x94355fd4U, 0x953759dcU, 0x963153c4U, 0x973355ccU,
845
 
    0x982d77b4U, 0x992f71bcU, 0x9a297ba4U, 0x9b2b7dacU,
846
 
    0x9c256f94U, 0x9d27699cU, 0x9e216384U, 0x9f23658cU,
847
 
    0xa05de769U, 0xa15fe161U, 0xa259eb79U, 0xa35bed71U,
848
 
    0xa455ff49U, 0xa557f941U, 0xa651f359U, 0xa753f551U,
849
 
    0xa84dd729U, 0xa94fd121U, 0xaa49db39U, 0xab4bdd31U,
850
 
    0xac45cf09U, 0xad47c901U, 0xae41c319U, 0xaf43c511U,
851
 
    0xb07d87e9U, 0xb17f81e1U, 0xb2798bf9U, 0xb37b8df1U,
852
 
    0xb4759fc9U, 0xb57799c1U, 0xb67193d9U, 0xb77395d1U,
853
 
    0xb86db7a9U, 0xb96fb1a1U, 0xba69bbb9U, 0xbb6bbdb1U,
854
 
    0xbc65af89U, 0xbd67a981U, 0xbe61a399U, 0xbf63a591U,
855
 
    0xc09dba4eU, 0xc19fbc46U, 0xc299b65eU, 0xc39bb056U,
856
 
    0xc495a26eU, 0xc597a466U, 0xc691ae7eU, 0xc793a876U,
857
 
    0xc88d8a0eU, 0xc98f8c06U, 0xca89861eU, 0xcb8b8016U,
858
 
    0xcc85922eU, 0xcd879426U, 0xce819e3eU, 0xcf839836U,
859
 
    0xd0bddaceU, 0xd1bfdcc6U, 0xd2b9d6deU, 0xd3bbd0d6U,
860
 
    0xd4b5c2eeU, 0xd5b7c4e6U, 0xd6b1cefeU, 0xd7b3c8f6U,
861
 
    0xd8adea8eU, 0xd9afec86U, 0xdaa9e69eU, 0xdbabe096U,
862
 
    0xdca5f2aeU, 0xdda7f4a6U, 0xdea1febeU, 0xdfa3f8b6U,
863
 
    0xe0dd7a53U, 0xe1df7c5bU, 0xe2d97643U, 0xe3db704bU,
864
 
    0xe4d56273U, 0xe5d7647bU, 0xe6d16e63U, 0xe7d3686bU,
865
 
    0xe8cd4a13U, 0xe9cf4c1bU, 0xeac94603U, 0xebcb400bU,
866
 
    0xecc55233U, 0xedc7543bU, 0xeec15e23U, 0xefc3582bU,
867
 
    0xf0fd1ad3U, 0xf1ff1cdbU, 0xf2f916c3U, 0xf3fb10cbU,
868
 
    0xf4f502f3U, 0xf5f704fbU, 0xf6f10ee3U, 0xf7f308ebU,
869
 
    0xf8ed2a93U, 0xf9ef2c9bU, 0xfae92683U, 0xfbeb208bU,
870
 
    0xfce532b3U, 0xfde734bbU, 0xfee13ea3U, 0xffe338abU,
871
 
};
872
 
 
873
 
/**
874
 
 * The round constants.
875
 
 */
876
 
static const ulong32 rc[] = {
877
 
   0xa7d3e671U, 0xd0ac4d79U, 0x3ac991fcU, 0x1e4754bdU,
878
 
   0x8ca57afbU, 0x63b8ddd4U, 0xe5b3c5beU, 0xa9880ca2U,
879
 
   0x39df29daU, 0x2ba8cb4cU, 0x4b22aa24U, 0x4170a6f9U,
880
 
   0x5ae2b036U, 0x7de433ffU, 0x6020088bU, 0x5eab7f78U,
881
 
   0x7c2c57d2U, 0xdc6d7e0dU, 0x5394c328U,
882
 
};
883
 
 
884
 
#endif
885
 
 
886
 
 /**
887
 
    Initialize the Anubis block cipher
888
 
    @param key The symmetric key you wish to pass
889
 
    @param keylen The key length in bytes
890
 
    @param num_rounds The number of rounds desired (0 for default)
891
 
    @param skey The key in as scheduled by this function.
892
 
    @return CRYPT_OK if successful
893
 
 */
894
 
#ifdef CLEAN_STACK
895
 
static int _anubis_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey)
896
 
#else
897
 
int  anubis_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey)
898
 
#endif
899
 
{
900
 
   int N, R, i, pos, r;
901
 
   ulong32 kappa[MAX_N];
902
 
   ulong32 inter[MAX_N];
903
 
   ulong32 v, K0, K1, K2, K3;
904
 
 
905
 
   LTC_ARGCHK(key  != NULL);
906
 
   LTC_ARGCHK(skey != NULL);
907
 
 
908
 
   /* Valid sizes (in bytes) are 16, 20, 24, 28, 32, 36, and 40. */
909
 
   if ((keylen & 3) || (keylen < 16) || (keylen > 40)) {
910
 
      return CRYPT_INVALID_KEYSIZE;
911
 
   }
912
 
   skey->anubis.keyBits = keylen*8;
913
 
 
914
 
   /*
915
 
    * determine the N length parameter:
916
 
    * (N.B. it is assumed that the key length is valid!)
917
 
    */
918
 
   N = skey->anubis.keyBits >> 5;
919
 
 
920
 
   /*
921
 
    * determine number of rounds from key size:
922
 
    */
923
 
   skey->anubis.R = R = 8 + N;
924
 
 
925
 
   if (num_rounds != 0 && num_rounds != skey->anubis.R) {
926
 
      return CRYPT_INVALID_ROUNDS;
927
 
   }
928
 
 
929
 
    /*
930
 
    * map cipher key to initial key state (mu):
931
 
    */
932
 
    for (i = 0, pos = 0; i < N; i++, pos += 4) {
933
 
      kappa[i] =
934
 
         (key[pos    ] << 24) ^
935
 
         (key[pos + 1] << 16) ^
936
 
         (key[pos + 2] <<  8) ^
937
 
         (key[pos + 3]      );
938
 
    }
939
 
 
940
 
   /*
941
 
    * generate R + 1 round keys:
942
 
    */
943
 
   for (r = 0; r <= R; r++) {
944
 
      /*
945
 
       * generate r-th round key K^r:
946
 
       */
947
 
      K0 = T4[(kappa[N - 1] >> 24)       ];
948
 
      K1 = T4[(kappa[N - 1] >> 16) & 0xff];
949
 
      K2 = T4[(kappa[N - 1] >>  8) & 0xff];
950
 
      K3 = T4[(kappa[N - 1]      ) & 0xff];
951
 
      for (i = N - 2; i >= 0; i--) {
952
 
         K0 = T4[(kappa[i] >> 24)       ] ^
953
 
            (T5[(K0 >> 24)       ] & 0xff000000U) ^
954
 
            (T5[(K0 >> 16) & 0xff] & 0x00ff0000U) ^
955
 
            (T5[(K0 >>  8) & 0xff] & 0x0000ff00U) ^
956
 
            (T5[(K0      ) & 0xff] & 0x000000ffU);
957
 
         K1 = T4[(kappa[i] >> 16) & 0xff] ^
958
 
            (T5[(K1 >> 24)       ] & 0xff000000U) ^
959
 
            (T5[(K1 >> 16) & 0xff] & 0x00ff0000U) ^
960
 
            (T5[(K1 >>  8) & 0xff] & 0x0000ff00U) ^
961
 
            (T5[(K1      ) & 0xff] & 0x000000ffU);
962
 
         K2 = T4[(kappa[i] >>  8) & 0xff] ^
963
 
            (T5[(K2 >> 24)       ] & 0xff000000U) ^
964
 
            (T5[(K2 >> 16) & 0xff] & 0x00ff0000U) ^
965
 
            (T5[(K2 >>  8) & 0xff] & 0x0000ff00U) ^
966
 
            (T5[(K2      ) & 0xff] & 0x000000ffU);
967
 
         K3 = T4[(kappa[i]      ) & 0xff] ^
968
 
            (T5[(K3 >> 24)       ] & 0xff000000U) ^
969
 
            (T5[(K3 >> 16) & 0xff] & 0x00ff0000U) ^
970
 
            (T5[(K3 >>  8) & 0xff] & 0x0000ff00U) ^
971
 
            (T5[(K3      ) & 0xff] & 0x000000ffU);
972
 
      }
973
 
      /*
974
 
      -- this is the code to use with the large U tables:
975
 
      K0 = K1 = K2 = K3 = 0;
976
 
      for (i = 0; i < N; i++) {
977
 
         K0 ^= U[i][(kappa[i] >> 24)       ];
978
 
         K1 ^= U[i][(kappa[i] >> 16) & 0xff];
979
 
         K2 ^= U[i][(kappa[i] >>  8) & 0xff];
980
 
         K3 ^= U[i][(kappa[i]      ) & 0xff];
981
 
      }
982
 
      */
983
 
      skey->anubis.roundKeyEnc[r][0] = K0;
984
 
      skey->anubis.roundKeyEnc[r][1] = K1;
985
 
      skey->anubis.roundKeyEnc[r][2] = K2;
986
 
      skey->anubis.roundKeyEnc[r][3] = K3;
987
 
 
988
 
      /*
989
 
       * compute kappa^{r+1} from kappa^r:
990
 
       */
991
 
      if (r == R) {
992
 
         break;
993
 
      }
994
 
      for (i = 0; i < N; i++) {
995
 
         int j = i;
996
 
         inter[i]  = T0[(kappa[j--] >> 24)       ]; if (j < 0) j = N - 1;
997
 
         inter[i] ^= T1[(kappa[j--] >> 16) & 0xff]; if (j < 0) j = N - 1;
998
 
         inter[i] ^= T2[(kappa[j--] >>  8) & 0xff]; if (j < 0) j = N - 1;
999
 
         inter[i] ^= T3[(kappa[j  ]      ) & 0xff];
1000
 
      }
1001
 
      kappa[0] = inter[0] ^ rc[r];
1002
 
      for (i = 1; i < N; i++) {
1003
 
         kappa[i] = inter[i];
1004
 
      }
1005
 
   }
1006
 
 
1007
 
   /*
1008
 
    * generate inverse key schedule: K'^0 = K^R, K'^R = K^0, K'^r = theta(K^{R-r}):
1009
 
    */
1010
 
   for (i = 0; i < 4; i++) {
1011
 
      skey->anubis.roundKeyDec[0][i] = skey->anubis.roundKeyEnc[R][i];
1012
 
      skey->anubis.roundKeyDec[R][i] = skey->anubis.roundKeyEnc[0][i];
1013
 
   }
1014
 
   for (r = 1; r < R; r++) {
1015
 
      for (i = 0; i < 4; i++) {
1016
 
         v = skey->anubis.roundKeyEnc[R - r][i];
1017
 
         skey->anubis.roundKeyDec[r][i] =
1018
 
            T0[T4[(v >> 24)       ] & 0xff] ^
1019
 
            T1[T4[(v >> 16) & 0xff] & 0xff] ^
1020
 
            T2[T4[(v >>  8) & 0xff] & 0xff] ^
1021
 
            T3[T4[(v      ) & 0xff] & 0xff];
1022
 
      }
1023
 
   }
1024
 
 
1025
 
   return CRYPT_OK;
1026
 
}
1027
 
 
1028
 
#ifdef CLEAN_STACK
1029
 
int  anubis_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey)
1030
 
{
1031
 
  int err;
1032
 
  err = _anubis_setup(key, keylen, num_rounds, skey);
1033
 
  burn_stack(sizeof(int) * 5 + sizeof(ulong32) * (MAX_N + MAX_N + 5));
1034
 
  return err;
1035
 
}
1036
 
#endif
1037
 
  
1038
 
 
1039
 
static void anubis_crypt(const unsigned char *plaintext, unsigned char *ciphertext,
1040
 
                         ulong32 roundKey[18 + 1][4], int R) {
1041
 
   int i, pos, r;
1042
 
   ulong32 state[4];
1043
 
   ulong32 inter[4];
1044
 
 
1045
 
    /*
1046
 
    * map plaintext block to cipher state (mu)
1047
 
    * and add initial round key (sigma[K^0]):
1048
 
    */
1049
 
    for (i = 0, pos = 0; i < 4; i++, pos += 4) {
1050
 
      state[i] =
1051
 
         (plaintext[pos    ] << 24) ^
1052
 
         (plaintext[pos + 1] << 16) ^
1053
 
         (plaintext[pos + 2] <<  8) ^
1054
 
         (plaintext[pos + 3]      ) ^
1055
 
         roundKey[0][i];
1056
 
    }
1057
 
 
1058
 
    /*
1059
 
     * R - 1 full rounds:
1060
 
     */
1061
 
    for (r = 1; r < R; r++) {
1062
 
      inter[0] =
1063
 
         T0[(state[0] >> 24)       ] ^
1064
 
         T1[(state[1] >> 24)       ] ^
1065
 
         T2[(state[2] >> 24)       ] ^
1066
 
         T3[(state[3] >> 24)       ] ^
1067
 
         roundKey[r][0];
1068
 
      inter[1] =
1069
 
         T0[(state[0] >> 16) & 0xff] ^
1070
 
         T1[(state[1] >> 16) & 0xff] ^
1071
 
         T2[(state[2] >> 16) & 0xff] ^
1072
 
         T3[(state[3] >> 16) & 0xff] ^
1073
 
         roundKey[r][1];
1074
 
      inter[2] =
1075
 
         T0[(state[0] >>  8) & 0xff] ^
1076
 
         T1[(state[1] >>  8) & 0xff] ^
1077
 
         T2[(state[2] >>  8) & 0xff] ^
1078
 
         T3[(state[3] >>  8) & 0xff] ^
1079
 
         roundKey[r][2];
1080
 
      inter[3] =
1081
 
         T0[(state[0]      ) & 0xff] ^
1082
 
         T1[(state[1]      ) & 0xff] ^
1083
 
         T2[(state[2]      ) & 0xff] ^
1084
 
         T3[(state[3]      ) & 0xff] ^
1085
 
         roundKey[r][3];
1086
 
      state[0] = inter[0];
1087
 
      state[1] = inter[1];
1088
 
      state[2] = inter[2];
1089
 
      state[3] = inter[3];
1090
 
    }
1091
 
 
1092
 
    /*
1093
 
    * last round:
1094
 
    */
1095
 
   inter[0] =
1096
 
      (T0[(state[0] >> 24)       ] & 0xff000000U) ^
1097
 
      (T1[(state[1] >> 24)       ] & 0x00ff0000U) ^
1098
 
      (T2[(state[2] >> 24)       ] & 0x0000ff00U) ^
1099
 
      (T3[(state[3] >> 24)       ] & 0x000000ffU) ^
1100
 
      roundKey[R][0];
1101
 
   inter[1] =
1102
 
      (T0[(state[0] >> 16) & 0xff] & 0xff000000U) ^
1103
 
      (T1[(state[1] >> 16) & 0xff] & 0x00ff0000U) ^
1104
 
      (T2[(state[2] >> 16) & 0xff] & 0x0000ff00U) ^
1105
 
      (T3[(state[3] >> 16) & 0xff] & 0x000000ffU) ^
1106
 
      roundKey[R][1];
1107
 
   inter[2] =
1108
 
      (T0[(state[0] >>  8) & 0xff] & 0xff000000U) ^
1109
 
      (T1[(state[1] >>  8) & 0xff] & 0x00ff0000U) ^
1110
 
      (T2[(state[2] >>  8) & 0xff] & 0x0000ff00U) ^
1111
 
      (T3[(state[3] >>  8) & 0xff] & 0x000000ffU) ^
1112
 
      roundKey[R][2];
1113
 
   inter[3] =
1114
 
      (T0[(state[0]      ) & 0xff] & 0xff000000U) ^
1115
 
      (T1[(state[1]      ) & 0xff] & 0x00ff0000U) ^
1116
 
      (T2[(state[2]      ) & 0xff] & 0x0000ff00U) ^
1117
 
      (T3[(state[3]      ) & 0xff] & 0x000000ffU) ^
1118
 
      roundKey[R][3];
1119
 
 
1120
 
   /*
1121
 
    * map cipher state to ciphertext block (mu^{-1}):
1122
 
    */
1123
 
    for (i = 0, pos = 0; i < 4; i++, pos += 4) {
1124
 
        ulong32 w = inter[i];
1125
 
        ciphertext[pos    ] = (unsigned char)(w >> 24);
1126
 
        ciphertext[pos + 1] = (unsigned char)(w >> 16);
1127
 
        ciphertext[pos + 2] = (unsigned char)(w >>  8);
1128
 
        ciphertext[pos + 3] = (unsigned char)(w      );
1129
 
    }
1130
 
}
1131
 
 
1132
 
/**
1133
 
  Encrypts a block of text with Anubis
1134
 
  @param pt The input plaintext (16 bytes)
1135
 
  @param ct The output ciphertext (16 bytes)
1136
 
  @param skey The key as scheduled
1137
 
*/
1138
 
void anubis_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey)
1139
 
{
1140
 
   LTC_ARGCHK(pt   != NULL);
1141
 
   LTC_ARGCHK(ct   != NULL);
1142
 
   LTC_ARGCHK(skey != NULL);
1143
 
   anubis_crypt(pt, ct, skey->anubis.roundKeyEnc, skey->anubis.R);
1144
 
}
1145
 
 
1146
 
/**
1147
 
  Decrypts a block of text with Anubis
1148
 
  @param ct The input ciphertext (16 bytes)
1149
 
  @param pt The output plaintext (16 bytes)
1150
 
  @param skey The key as scheduled 
1151
 
*/
1152
 
void anubis_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey)
1153
 
{
1154
 
   LTC_ARGCHK(pt   != NULL);
1155
 
   LTC_ARGCHK(ct   != NULL);
1156
 
   LTC_ARGCHK(skey != NULL);
1157
 
   anubis_crypt(ct, pt, skey->anubis.roundKeyDec, skey->anubis.R);
1158
 
}
1159
 
 
1160
 
/**
1161
 
  Performs a self-test of the Anubis block cipher
1162
 
  @return CRYPT_OK if functional, CRYPT_NOP if self-test has been disabled
1163
 
*/
1164
 
int anubis_test(void)
1165
 
{
1166
 
#if !defined(LTC_TEST)
1167
 
  return CRYPT_NOP;
1168
 
#else
1169
 
  static const struct test {
1170
 
     int keylen;
1171
 
     unsigned char pt[16], ct[16], key[40];
1172
 
  } tests[] = {
1173
 
#ifndef ANUBIS_TWEAK
1174
 
  /**** ORIGINAL ANUBIS ****/
1175
 
  /* 128 bit keys */
1176
 
{
1177
 
   16,
1178
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1179
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1180
 
   { 0xF0, 0x68, 0x60, 0xFC, 0x67, 0x30, 0xE8, 0x18, 
1181
 
     0xF1, 0x32, 0xC7, 0x8A, 0xF4, 0x13, 0x2A, 0xFE },
1182
 
   { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1183
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
1184
 
}, {
1185
 
   16,
1186
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1187
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1188
 
   { 0xA8, 0x66, 0x84, 0x80, 0x07, 0x74, 0x5C, 0x89, 
1189
 
     0xFC, 0x5E, 0xB5, 0xBA, 0xD4, 0xFE, 0x32, 0x6D },
1190
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1191
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }
1192
 
},
1193
 
 
1194
 
   /* 160-bit keys */
1195
 
{
1196
 
   20,
1197
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1198
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1199
 
   { 0xBD, 0x5E, 0x32, 0xBE, 0x51, 0x67, 0xA8, 0xE2,
1200
 
     0x72, 0xD7, 0x95, 0x0F, 0x83, 0xC6, 0x8C, 0x31 },
1201
 
   { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1202
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1203
 
     0x00, 0x00, 0x00, 0x00 }
1204
 
}, {
1205
 
   20,
1206
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1207
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1208
 
   { 0x4C, 0x1F, 0x86, 0x2E, 0x11, 0xEB, 0xCE, 0xEB,
1209
 
     0xFE, 0xB9, 0x73, 0xC9, 0xDF, 0xEF, 0x7A, 0xDB },
1210
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1211
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1212
 
     0x00, 0x00, 0x00, 0x01 }
1213
 
},
1214
 
 
1215
 
  /* 192-bit keys */
1216
 
{
1217
 
   24,
1218
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1219
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1220
 
   { 0x17, 0xAC, 0x57, 0x44, 0x9D, 0x59, 0x61, 0x66, 
1221
 
     0xD0, 0xC7, 0x9E, 0x04, 0x7C, 0xC7, 0x58, 0xF0 },
1222
 
   { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1223
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1224
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
1225
 
}, {
1226
 
   24,
1227
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1228
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1229
 
   { 0x71, 0x52, 0xB4, 0xEB, 0x1D, 0xAA, 0x36, 0xFD, 
1230
 
     0x57, 0x14, 0x5F, 0x57, 0x04, 0x9F, 0x70, 0x74 },
1231
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1232
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1233
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }
1234
 
},
1235
 
 
1236
 
  /* 224-bit keys */
1237
 
{
1238
 
   28,
1239
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1240
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1241
 
   { 0xA2, 0xF0, 0xA6, 0xB9, 0x17, 0x93, 0x2A, 0x3B, 
1242
 
     0xEF, 0x08, 0xE8, 0x7A, 0x58, 0xD6, 0xF8, 0x53 },
1243
 
   { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1244
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1245
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1246
 
     0x00, 0x00, 0x00, 0x00 }
1247
 
}, {
1248
 
   28,
1249
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1250
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1251
 
   { 0xF0, 0xCA, 0xFC, 0x78, 0x8B, 0x4B, 0x4E, 0x53, 
1252
 
     0x8B, 0xC4, 0x32, 0x6A, 0xF5, 0xB9, 0x1B, 0x5F },
1253
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1254
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1255
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1256
 
     0x00, 0x00, 0x00, 0x01 }
1257
 
},
1258
 
 
1259
 
  /* 256-bit keys */
1260
 
{
1261
 
   32,
1262
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1263
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1264
 
   { 0xE0, 0x86, 0xAC, 0x45, 0x6B, 0x3C, 0xE5, 0x13, 
1265
 
     0xED, 0xF5, 0xDF, 0xDD, 0xD6, 0x3B, 0x71, 0x93 },
1266
 
   { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1267
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1268
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1269
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
1270
 
}, {
1271
 
   32,
1272
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1273
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1274
 
   { 0x50, 0x01, 0xB9, 0xF5, 0x21, 0xC1, 0xC1, 0x29, 
1275
 
     0x00, 0xD5, 0xEC, 0x98, 0x2B, 0x9E, 0xE8, 0x21 },
1276
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1277
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1278
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1279
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }
1280
 
},
1281
 
 
1282
 
  /* 288-bit keys */
1283
 
{
1284
 
   36,
1285
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1286
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1287
 
   { 0xE8, 0xF4, 0xAF, 0x2B, 0x21, 0xA0, 0x87, 0x9B, 
1288
 
     0x41, 0x95, 0xB9, 0x71, 0x75, 0x79, 0x04, 0x7C },
1289
 
   { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1290
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1291
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1292
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1293
 
     0x00, 0x00, 0x00, 0x00 }
1294
 
}, {
1295
 
   36,
1296
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1297
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1298
 
   { 0xE6, 0xA6, 0xA5, 0xBC, 0x8B, 0x63, 0x6F, 0xE2, 
1299
 
     0xBD, 0xA7, 0xA7, 0x53, 0xAB, 0x40, 0x22, 0xE0 },
1300
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1301
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1302
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1303
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1304
 
     0x00, 0x00, 0x00, 0x01 }
1305
 
},
1306
 
 
1307
 
  /* 320-bit keys */
1308
 
{
1309
 
   40,
1310
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1311
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1312
 
   { 0x17, 0x04, 0xD7, 0x2C, 0xC6, 0x85, 0x76, 0x02, 
1313
 
     0x4B, 0xCC, 0x39, 0x80, 0xD8, 0x22, 0xEA, 0xA4 },
1314
 
   { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1315
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1316
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1317
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1318
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
1319
 
}, {
1320
 
   40,
1321
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1322
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1323
 
   { 0x7A, 0x41, 0xE6, 0x7D, 0x4F, 0xD8, 0x64, 0xF0, 
1324
 
     0x44, 0xA8, 0x3C, 0x73, 0x81, 0x7E, 0x53, 0xD8 },
1325
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1326
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1327
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1328
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1329
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }
1330
 
}
1331
 
#else
1332
 
  /**** Tweaked ANUBIS ****/
1333
 
  /* 128 bit keys */
1334
 
{
1335
 
   16,
1336
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1337
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1338
 
   { 0xB8, 0x35, 0xBD, 0xC3, 0x34, 0x82, 0x9D, 0x83,
1339
 
     0x71, 0xBF, 0xA3, 0x71, 0xE4, 0xB3, 0xC4, 0xFD },
1340
 
   { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1341
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
1342
 
}, {
1343
 
   16,
1344
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1345
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1346
 
   { 0xE6, 0x14, 0x1E, 0xAF, 0xEB, 0xE0, 0x59, 0x3C,
1347
 
     0x48, 0xE1, 0xCD, 0xF2, 0x1B, 0xBA, 0xA1, 0x89 },
1348
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1349
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }
1350
 
},
1351
 
 
1352
 
   /* 160-bit keys */
1353
 
{
1354
 
   20,
1355
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1356
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1357
 
   { 0x97, 0x59, 0x79, 0x4B, 0x5C, 0xA0, 0x70, 0x73,
1358
 
     0x24, 0xEF, 0xB3, 0x58, 0x67, 0xCA, 0xD4, 0xB3 },
1359
 
   { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1360
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1361
 
     0x00, 0x00, 0x00, 0x00 }
1362
 
}, {
1363
 
   20,
1364
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1365
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1366
 
   { 0xB8, 0x0D, 0xFB, 0x9B, 0xE4, 0xA1, 0x58, 0x87,
1367
 
     0xB3, 0x76, 0xD5, 0x02, 0x18, 0x95, 0xC1, 0x2E },
1368
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1369
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1370
 
     0x00, 0x00, 0x00, 0x01 }
1371
 
},
1372
 
 
1373
 
  /* 192-bit keys */
1374
 
{
1375
 
   24,
1376
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1377
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1378
 
   { 0x7D, 0x62, 0x3B, 0x52, 0xC7, 0x4C, 0x64, 0xD8,
1379
 
     0xEB, 0xC7, 0x2D, 0x57, 0x97, 0x85, 0x43, 0x8F },
1380
 
   { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1381
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1382
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
1383
 
}, {
1384
 
   24,
1385
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1386
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1387
 
   { 0xB1, 0x0A, 0x59, 0xDD, 0x5D, 0x5D, 0x8D, 0x67,
1388
 
     0xEC, 0xEE, 0x4A, 0xC4, 0xBE, 0x4F, 0xA8, 0x4F },
1389
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1390
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1391
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }
1392
 
},
1393
 
 
1394
 
  /* 224-bit keys */
1395
 
{
1396
 
   28,
1397
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1398
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1399
 
   { 0x68, 0x9E, 0x05, 0x94, 0x6A, 0x94, 0x43, 0x8F,
1400
 
     0xE7, 0x8E, 0x37, 0x3D, 0x24, 0x97, 0x92, 0xF5 },
1401
 
   { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1402
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1403
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1404
 
     0x00, 0x00, 0x00, 0x00 }
1405
 
}, {
1406
 
   28,
1407
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1408
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1409
 
   { 0xDD, 0xB7, 0xB0, 0xB4, 0xE9, 0xB4, 0x9B, 0x9C,
1410
 
     0x38, 0x20, 0x25, 0x0B, 0x47, 0xC2, 0x1F, 0x89 },
1411
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1412
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1413
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1414
 
     0x00, 0x00, 0x00, 0x01 }
1415
 
},
1416
 
 
1417
 
  /* 256-bit keys */
1418
 
{
1419
 
   32,
1420
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1421
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1422
 
   { 0x96, 0x00, 0xF0, 0x76, 0x91, 0x69, 0x29, 0x87,
1423
 
     0xF5, 0xE5, 0x97, 0xDB, 0xDB, 0xAF, 0x1B, 0x0A },
1424
 
   { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1425
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1426
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1427
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
1428
 
}, {
1429
 
   32,
1430
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1431
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1432
 
   { 0x69, 0x9C, 0xAF, 0xDD, 0x94, 0xC7, 0xBC, 0x60,
1433
 
     0x44, 0xFE, 0x02, 0x05, 0x8A, 0x6E, 0xEF, 0xBD },
1434
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1435
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1436
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1437
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }
1438
 
},
1439
 
 
1440
 
  /* 288-bit keys */
1441
 
{
1442
 
   36,
1443
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1444
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1445
 
   { 0x0F, 0xC7, 0xA2, 0xC0, 0x11, 0x17, 0xAC, 0x43,
1446
 
     0x52, 0x5E, 0xDF, 0x6C, 0xF3, 0x96, 0x33, 0x6C },
1447
 
   { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1448
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1449
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1450
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1451
 
     0x00, 0x00, 0x00, 0x00 }
1452
 
}, {
1453
 
   36,
1454
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1455
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1456
 
   { 0xAD, 0x08, 0x4F, 0xED, 0x55, 0xA6, 0x94, 0x3E,
1457
 
     0x7E, 0x5E, 0xED, 0x05, 0xA1, 0x9D, 0x41, 0xB4 },
1458
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1459
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1460
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1461
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1462
 
     0x00, 0x00, 0x00, 0x01 }
1463
 
},
1464
 
 
1465
 
  /* 320-bit keys */
1466
 
{
1467
 
   40,
1468
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1469
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1470
 
   { 0xFE, 0xE2, 0x0E, 0x2A, 0x9D, 0xC5, 0x83, 0xBA,
1471
 
     0xA3, 0xA6, 0xD6, 0xA6, 0xF2, 0xE8, 0x06, 0xA5 },
1472
 
   { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1473
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1474
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1475
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1476
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
1477
 
}, {
1478
 
   40,
1479
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1480
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
1481
 
   { 0x86, 0x3D, 0xCC, 0x4A, 0x60, 0x34, 0x9C, 0x28,
1482
 
     0xA7, 0xDA, 0xA4, 0x3B, 0x0A, 0xD7, 0xFD, 0xC7 },
1483
 
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1484
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1485
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1486
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1487
 
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }
1488
 
}
1489
 
#endif
1490
 
};
1491
 
   int x, y;
1492
 
   unsigned char buf[2][16];
1493
 
   symmetric_key skey;
1494
 
 
1495
 
   for (x = 0; x < (int)(sizeof(tests)/sizeof(tests[0])); x++) {
1496
 
       anubis_setup(tests[x].key, tests[x].keylen, 0, &skey);
1497
 
       anubis_ecb_encrypt(tests[x].pt, buf[0], &skey);
1498
 
       anubis_ecb_decrypt(buf[0], buf[1], &skey);
1499
 
       if (memcmp(buf[0], tests[x].ct, 16) || memcmp(buf[1], tests[x].pt, 16)) {
1500
 
          return CRYPT_FAIL_TESTVECTOR;
1501
 
       }
1502
 
 
1503
 
       for (y = 0; y < 1000; y++) anubis_ecb_encrypt(buf[0], buf[0], &skey);
1504
 
       for (y = 0; y < 1000; y++) anubis_ecb_decrypt(buf[0], buf[0], &skey);
1505
 
       if (memcmp(buf[0], tests[x].ct, 16)) {
1506
 
          return CRYPT_FAIL_TESTVECTOR;
1507
 
       }
1508
 
 
1509
 
   }
1510
 
   return CRYPT_OK;
1511
 
#endif
1512
 
}
1513
 
 
1514
 
/** Terminate the context 
1515
 
   @param skey    The scheduled key
1516
 
*/
1517
 
void anubis_done(symmetric_key *skey)
1518
 
{
1519
 
}
1520
 
 
1521
 
/**
1522
 
  Gets suitable key size
1523
 
  @param keysize [in/out] The length of the recommended key (in bytes).  This function will store the suitable size back in this variable.
1524
 
  @return CRYPT_OK if the input key size is acceptable.
1525
 
*/
1526
 
int anubis_keysize(int *keysize)
1527
 
{
1528
 
   LTC_ARGCHK(keysize != NULL);
1529
 
   if (*keysize >= 40) {
1530
 
      *keysize = 40;
1531
 
   } else if (*keysize >= 36) {
1532
 
      *keysize = 36;
1533
 
   } else if (*keysize >= 32) {
1534
 
      *keysize = 32;
1535
 
   } else if (*keysize >= 28) {
1536
 
      *keysize = 28;
1537
 
   } else if (*keysize >= 24) {
1538
 
      *keysize = 24;
1539
 
   } else if (*keysize >= 20) {
1540
 
      *keysize = 20;
1541
 
   } else if (*keysize >= 16) {
1542
 
      *keysize = 16;
1543
 
   } else {
1544
 
      return CRYPT_INVALID_KEYSIZE;
1545
 
   }
1546
 
   return CRYPT_OK;
1547
 
}
1548
 
 
1549
 
#endif
1550
 
 
 
1
/* LibTomCrypt, modular cryptographic library -- Tom St Denis
 
2
 *
 
3
 * LibTomCrypt is a library that provides various cryptographic
 
4
 * algorithms in a highly modular and flexible manner.
 
5
 *
 
6
 * The library is free for all purposes without any express
 
7
 * guarantee it works.
 
8
 *
 
9
 * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com
 
10
 */
 
11
 
 
12
/**
 
13
  @file anubis.c
 
14
  Anubis implementation derived from public domain source
 
15
  Authors: Paulo S.L.M. Barreto and Vincent Rijmen.
 
16
*/
 
17
 
 
18
#include "tomcrypt.h"
 
19
 
 
20
#ifdef ANUBIS
 
21
 
 
22
const struct ltc_cipher_descriptor anubis_desc = {
 
23
   "anubis",
 
24
   19,
 
25
   16, 40, 16, 12,
 
26
   &anubis_setup,
 
27
   &anubis_ecb_encrypt,
 
28
   &anubis_ecb_decrypt,
 
29
   &anubis_test,
 
30
   &anubis_done,
 
31
   &anubis_keysize,
 
32
   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
 
33
};
 
34
 
 
35
#define MIN_N           4 
 
36
#define MAX_N           10 
 
37
#define MIN_ROUNDS      (8 + MIN_N) 
 
38
#define MAX_ROUNDS      (8 + MAX_N) 
 
39
#define MIN_KEYSIZEB    (4*MIN_N) 
 
40
#define MAX_KEYSIZEB    (4*MAX_N) 
 
41
#define BLOCKSIZE       128 
 
42
#define BLOCKSIZEB      (BLOCKSIZE/8) 
 
43
 
 
44
 
 
45
/*
 
46
 * Though Anubis is endianness-neutral, the encryption tables are listed
 
47
 * in BIG-ENDIAN format, which is adopted throughout this implementation
 
48
 * (but little-endian notation would be equally suitable if consistently
 
49
 * employed).
 
50
 */
 
51
#if defined(ANUBIS_TWEAK)
 
52
 
 
53
static const ulong32 T0[256] = {
 
54
    0xba69d2bbU, 0x54a84de5U, 0x2f5ebce2U, 0x74e8cd25U,
 
55
    0x53a651f7U, 0xd3bb6bd0U, 0xd2b96fd6U, 0x4d9a29b3U,
 
56
    0x50a05dfdU, 0xac458acfU, 0x8d070e09U, 0xbf63c6a5U,
 
57
    0x70e0dd3dU, 0x52a455f1U, 0x9a29527bU, 0x4c982db5U,
 
58
    0xeac98f46U, 0xd5b773c4U, 0x97336655U, 0xd1bf63dcU,
 
59
    0x3366ccaaU, 0x51a259fbU, 0x5bb671c7U, 0xa651a2f3U,
 
60
    0xdea15ffeU, 0x48903dadU, 0xa84d9ad7U, 0x992f5e71U,
 
61
    0xdbab4be0U, 0x3264c8acU, 0xb773e695U, 0xfce5d732U,
 
62
    0xe3dbab70U, 0x9e214263U, 0x913f7e41U, 0x9b2b567dU,
 
63
    0xe2d9af76U, 0xbb6bd6bdU, 0x4182199bU, 0x6edca579U,
 
64
    0xa557aef9U, 0xcb8b0b80U, 0x6bd6b167U, 0x95376e59U,
 
65
    0xa15fbee1U, 0xf3fbeb10U, 0xb17ffe81U, 0x0204080cU,
 
66
    0xcc851792U, 0xc49537a2U, 0x1d3a744eU, 0x14285078U,
 
67
    0xc39b2bb0U, 0x63c69157U, 0xdaa94fe6U, 0x5dba69d3U,
 
68
    0x5fbe61dfU, 0xdca557f2U, 0x7dfae913U, 0xcd871394U,
 
69
    0x7ffee11fU, 0x5ab475c1U, 0x6cd8ad75U, 0x5cb86dd5U,
 
70
    0xf7f3fb08U, 0x264c98d4U, 0xffe3db38U, 0xedc79354U,
 
71
    0xe8cd874aU, 0x9d274e69U, 0x6fdea17fU, 0x8e010203U,
 
72
    0x19326456U, 0xa05dbae7U, 0xf0fde71aU, 0x890f1e11U,
 
73
    0x0f1e3c22U, 0x070e1c12U, 0xaf4386c5U, 0xfbebcb20U,
 
74
    0x08102030U, 0x152a547eU, 0x0d1a342eU, 0x04081018U,
 
75
    0x01020406U, 0x64c88d45U, 0xdfa35bf8U, 0x76ecc529U,
 
76
    0x79f2f90bU, 0xdda753f4U, 0x3d7af48eU, 0x162c5874U,
 
77
    0x3f7efc82U, 0x376edcb2U, 0x6ddaa973U, 0x3870e090U,
 
78
    0xb96fdeb1U, 0x73e6d137U, 0xe9cf834cU, 0x356ad4beU,
 
79
    0x55aa49e3U, 0x71e2d93bU, 0x7bf6f107U, 0x8c050a0fU,
 
80
    0x72e4d531U, 0x880d1a17U, 0xf6f1ff0eU, 0x2a54a8fcU,
 
81
    0x3e7cf884U, 0x5ebc65d9U, 0x274e9cd2U, 0x468c0589U,
 
82
    0x0c183028U, 0x65ca8943U, 0x68d0bd6dU, 0x61c2995bU,
 
83
    0x03060c0aU, 0xc19f23bcU, 0x57ae41efU, 0xd6b17fceU,
 
84
    0xd9af43ecU, 0x58b07dcdU, 0xd8ad47eaU, 0x66cc8549U,
 
85
    0xd7b37bc8U, 0x3a74e89cU, 0xc88d078aU, 0x3c78f088U,
 
86
    0xfae9cf26U, 0x96316253U, 0xa753a6f5U, 0x982d5a77U,
 
87
    0xecc59752U, 0xb86ddab7U, 0xc7933ba8U, 0xae4182c3U,
 
88
    0x69d2b96bU, 0x4b9631a7U, 0xab4b96ddU, 0xa94f9ed1U,
 
89
    0x67ce814fU, 0x0a14283cU, 0x478e018fU, 0xf2f9ef16U,
 
90
    0xb577ee99U, 0x224488ccU, 0xe5d7b364U, 0xeec19f5eU,
 
91
    0xbe61c2a3U, 0x2b56acfaU, 0x811f3e21U, 0x1224486cU,
 
92
    0x831b362dU, 0x1b366c5aU, 0x0e1c3824U, 0x23468ccaU,
 
93
    0xf5f7f304U, 0x458a0983U, 0x214284c6U, 0xce811f9eU,
 
94
    0x499239abU, 0x2c58b0e8U, 0xf9efc32cU, 0xe6d1bf6eU,
 
95
    0xb671e293U, 0x2850a0f0U, 0x172e5c72U, 0x8219322bU,
 
96
    0x1a34685cU, 0x8b0b161dU, 0xfee1df3eU, 0x8a09121bU,
 
97
    0x09122436U, 0xc98f038cU, 0x87132635U, 0x4e9c25b9U,
 
98
    0xe1dfa37cU, 0x2e5cb8e4U, 0xe4d5b762U, 0xe0dda77aU,
 
99
    0xebcb8b40U, 0x903d7a47U, 0xa455aaffU, 0x1e3c7844U,
 
100
    0x85172e39U, 0x60c09d5dU, 0x00000000U, 0x254a94deU,
 
101
    0xf4f5f702U, 0xf1ffe31cU, 0x94356a5fU, 0x0b162c3aU,
 
102
    0xe7d3bb68U, 0x75eac923U, 0xefc39b58U, 0x3468d0b8U,
 
103
    0x3162c4a6U, 0xd4b577c2U, 0xd0bd67daU, 0x86112233U,
 
104
    0x7efce519U, 0xad478ec9U, 0xfde7d334U, 0x2952a4f6U,
 
105
    0x3060c0a0U, 0x3b76ec9aU, 0x9f234665U, 0xf8edc72aU,
 
106
    0xc6913faeU, 0x13264c6aU, 0x060c1814U, 0x050a141eU,
 
107
    0xc59733a4U, 0x11224466U, 0x77eec12fU, 0x7cf8ed15U,
 
108
    0x7af4f501U, 0x78f0fd0dU, 0x366cd8b4U, 0x1c387048U,
 
109
    0x3972e496U, 0x59b279cbU, 0x18306050U, 0x56ac45e9U,
 
110
    0xb37bf68dU, 0xb07dfa87U, 0x244890d8U, 0x204080c0U,
 
111
    0xb279f28bU, 0x9239724bU, 0xa35bb6edU, 0xc09d27baU,
 
112
    0x44880d85U, 0x62c49551U, 0x10204060U, 0xb475ea9fU,
 
113
    0x84152a3fU, 0x43861197U, 0x933b764dU, 0xc2992fb6U,
 
114
    0x4a9435a1U, 0xbd67cea9U, 0x8f030605U, 0x2d5ab4eeU,
 
115
    0xbc65caafU, 0x9c254a6fU, 0x6ad4b561U, 0x40801d9dU,
 
116
    0xcf831b98U, 0xa259b2ebU, 0x801d3a27U, 0x4f9e21bfU,
 
117
    0x1f3e7c42U, 0xca890f86U, 0xaa4992dbU, 0x42841591U,
 
118
};
 
119
 
 
120
static const ulong32 T1[256] = {
 
121
    0x69babbd2U, 0xa854e54dU, 0x5e2fe2bcU, 0xe87425cdU,
 
122
    0xa653f751U, 0xbbd3d06bU, 0xb9d2d66fU, 0x9a4db329U,
 
123
    0xa050fd5dU, 0x45accf8aU, 0x078d090eU, 0x63bfa5c6U,
 
124
    0xe0703dddU, 0xa452f155U, 0x299a7b52U, 0x984cb52dU,
 
125
    0xc9ea468fU, 0xb7d5c473U, 0x33975566U, 0xbfd1dc63U,
 
126
    0x6633aaccU, 0xa251fb59U, 0xb65bc771U, 0x51a6f3a2U,
 
127
    0xa1defe5fU, 0x9048ad3dU, 0x4da8d79aU, 0x2f99715eU,
 
128
    0xabdbe04bU, 0x6432acc8U, 0x73b795e6U, 0xe5fc32d7U,
 
129
    0xdbe370abU, 0x219e6342U, 0x3f91417eU, 0x2b9b7d56U,
 
130
    0xd9e276afU, 0x6bbbbdd6U, 0x82419b19U, 0xdc6e79a5U,
 
131
    0x57a5f9aeU, 0x8bcb800bU, 0xd66b67b1U, 0x3795596eU,
 
132
    0x5fa1e1beU, 0xfbf310ebU, 0x7fb181feU, 0x04020c08U,
 
133
    0x85cc9217U, 0x95c4a237U, 0x3a1d4e74U, 0x28147850U,
 
134
    0x9bc3b02bU, 0xc6635791U, 0xa9dae64fU, 0xba5dd369U,
 
135
    0xbe5fdf61U, 0xa5dcf257U, 0xfa7d13e9U, 0x87cd9413U,
 
136
    0xfe7f1fe1U, 0xb45ac175U, 0xd86c75adU, 0xb85cd56dU,
 
137
    0xf3f708fbU, 0x4c26d498U, 0xe3ff38dbU, 0xc7ed5493U,
 
138
    0xcde84a87U, 0x279d694eU, 0xde6f7fa1U, 0x018e0302U,
 
139
    0x32195664U, 0x5da0e7baU, 0xfdf01ae7U, 0x0f89111eU,
 
140
    0x1e0f223cU, 0x0e07121cU, 0x43afc586U, 0xebfb20cbU,
 
141
    0x10083020U, 0x2a157e54U, 0x1a0d2e34U, 0x08041810U,
 
142
    0x02010604U, 0xc864458dU, 0xa3dff85bU, 0xec7629c5U,
 
143
    0xf2790bf9U, 0xa7ddf453U, 0x7a3d8ef4U, 0x2c167458U,
 
144
    0x7e3f82fcU, 0x6e37b2dcU, 0xda6d73a9U, 0x703890e0U,
 
145
    0x6fb9b1deU, 0xe67337d1U, 0xcfe94c83U, 0x6a35bed4U,
 
146
    0xaa55e349U, 0xe2713bd9U, 0xf67b07f1U, 0x058c0f0aU,
 
147
    0xe47231d5U, 0x0d88171aU, 0xf1f60effU, 0x542afca8U,
 
148
    0x7c3e84f8U, 0xbc5ed965U, 0x4e27d29cU, 0x8c468905U,
 
149
    0x180c2830U, 0xca654389U, 0xd0686dbdU, 0xc2615b99U,
 
150
    0x06030a0cU, 0x9fc1bc23U, 0xae57ef41U, 0xb1d6ce7fU,
 
151
    0xafd9ec43U, 0xb058cd7dU, 0xadd8ea47U, 0xcc664985U,
 
152
    0xb3d7c87bU, 0x743a9ce8U, 0x8dc88a07U, 0x783c88f0U,
 
153
    0xe9fa26cfU, 0x31965362U, 0x53a7f5a6U, 0x2d98775aU,
 
154
    0xc5ec5297U, 0x6db8b7daU, 0x93c7a83bU, 0x41aec382U,
 
155
    0xd2696bb9U, 0x964ba731U, 0x4babdd96U, 0x4fa9d19eU,
 
156
    0xce674f81U, 0x140a3c28U, 0x8e478f01U, 0xf9f216efU,
 
157
    0x77b599eeU, 0x4422cc88U, 0xd7e564b3U, 0xc1ee5e9fU,
 
158
    0x61bea3c2U, 0x562bfaacU, 0x1f81213eU, 0x24126c48U,
 
159
    0x1b832d36U, 0x361b5a6cU, 0x1c0e2438U, 0x4623ca8cU,
 
160
    0xf7f504f3U, 0x8a458309U, 0x4221c684U, 0x81ce9e1fU,
 
161
    0x9249ab39U, 0x582ce8b0U, 0xeff92cc3U, 0xd1e66ebfU,
 
162
    0x71b693e2U, 0x5028f0a0U, 0x2e17725cU, 0x19822b32U,
 
163
    0x341a5c68U, 0x0b8b1d16U, 0xe1fe3edfU, 0x098a1b12U,
 
164
    0x12093624U, 0x8fc98c03U, 0x13873526U, 0x9c4eb925U,
 
165
    0xdfe17ca3U, 0x5c2ee4b8U, 0xd5e462b7U, 0xdde07aa7U,
 
166
    0xcbeb408bU, 0x3d90477aU, 0x55a4ffaaU, 0x3c1e4478U,
 
167
    0x1785392eU, 0xc0605d9dU, 0x00000000U, 0x4a25de94U,
 
168
    0xf5f402f7U, 0xfff11ce3U, 0x35945f6aU, 0x160b3a2cU,
 
169
    0xd3e768bbU, 0xea7523c9U, 0xc3ef589bU, 0x6834b8d0U,
 
170
    0x6231a6c4U, 0xb5d4c277U, 0xbdd0da67U, 0x11863322U,
 
171
    0xfc7e19e5U, 0x47adc98eU, 0xe7fd34d3U, 0x5229f6a4U,
 
172
    0x6030a0c0U, 0x763b9aecU, 0x239f6546U, 0xedf82ac7U,
 
173
    0x91c6ae3fU, 0x26136a4cU, 0x0c061418U, 0x0a051e14U,
 
174
    0x97c5a433U, 0x22116644U, 0xee772fc1U, 0xf87c15edU,
 
175
    0xf47a01f5U, 0xf0780dfdU, 0x6c36b4d8U, 0x381c4870U,
 
176
    0x723996e4U, 0xb259cb79U, 0x30185060U, 0xac56e945U,
 
177
    0x7bb38df6U, 0x7db087faU, 0x4824d890U, 0x4020c080U,
 
178
    0x79b28bf2U, 0x39924b72U, 0x5ba3edb6U, 0x9dc0ba27U,
 
179
    0x8844850dU, 0xc4625195U, 0x20106040U, 0x75b49feaU,
 
180
    0x15843f2aU, 0x86439711U, 0x3b934d76U, 0x99c2b62fU,
 
181
    0x944aa135U, 0x67bda9ceU, 0x038f0506U, 0x5a2deeb4U,
 
182
    0x65bcafcaU, 0x259c6f4aU, 0xd46a61b5U, 0x80409d1dU,
 
183
    0x83cf981bU, 0x59a2ebb2U, 0x1d80273aU, 0x9e4fbf21U,
 
184
    0x3e1f427cU, 0x89ca860fU, 0x49aadb92U, 0x84429115U,
 
185
};
 
186
 
 
187
static const ulong32 T2[256] = {
 
188
    0xd2bbba69U, 0x4de554a8U, 0xbce22f5eU, 0xcd2574e8U,
 
189
    0x51f753a6U, 0x6bd0d3bbU, 0x6fd6d2b9U, 0x29b34d9aU,
 
190
    0x5dfd50a0U, 0x8acfac45U, 0x0e098d07U, 0xc6a5bf63U,
 
191
    0xdd3d70e0U, 0x55f152a4U, 0x527b9a29U, 0x2db54c98U,
 
192
    0x8f46eac9U, 0x73c4d5b7U, 0x66559733U, 0x63dcd1bfU,
 
193
    0xccaa3366U, 0x59fb51a2U, 0x71c75bb6U, 0xa2f3a651U,
 
194
    0x5ffedea1U, 0x3dad4890U, 0x9ad7a84dU, 0x5e71992fU,
 
195
    0x4be0dbabU, 0xc8ac3264U, 0xe695b773U, 0xd732fce5U,
 
196
    0xab70e3dbU, 0x42639e21U, 0x7e41913fU, 0x567d9b2bU,
 
197
    0xaf76e2d9U, 0xd6bdbb6bU, 0x199b4182U, 0xa5796edcU,
 
198
    0xaef9a557U, 0x0b80cb8bU, 0xb1676bd6U, 0x6e599537U,
 
199
    0xbee1a15fU, 0xeb10f3fbU, 0xfe81b17fU, 0x080c0204U,
 
200
    0x1792cc85U, 0x37a2c495U, 0x744e1d3aU, 0x50781428U,
 
201
    0x2bb0c39bU, 0x915763c6U, 0x4fe6daa9U, 0x69d35dbaU,
 
202
    0x61df5fbeU, 0x57f2dca5U, 0xe9137dfaU, 0x1394cd87U,
 
203
    0xe11f7ffeU, 0x75c15ab4U, 0xad756cd8U, 0x6dd55cb8U,
 
204
    0xfb08f7f3U, 0x98d4264cU, 0xdb38ffe3U, 0x9354edc7U,
 
205
    0x874ae8cdU, 0x4e699d27U, 0xa17f6fdeU, 0x02038e01U,
 
206
    0x64561932U, 0xbae7a05dU, 0xe71af0fdU, 0x1e11890fU,
 
207
    0x3c220f1eU, 0x1c12070eU, 0x86c5af43U, 0xcb20fbebU,
 
208
    0x20300810U, 0x547e152aU, 0x342e0d1aU, 0x10180408U,
 
209
    0x04060102U, 0x8d4564c8U, 0x5bf8dfa3U, 0xc52976ecU,
 
210
    0xf90b79f2U, 0x53f4dda7U, 0xf48e3d7aU, 0x5874162cU,
 
211
    0xfc823f7eU, 0xdcb2376eU, 0xa9736ddaU, 0xe0903870U,
 
212
    0xdeb1b96fU, 0xd13773e6U, 0x834ce9cfU, 0xd4be356aU,
 
213
    0x49e355aaU, 0xd93b71e2U, 0xf1077bf6U, 0x0a0f8c05U,
 
214
    0xd53172e4U, 0x1a17880dU, 0xff0ef6f1U, 0xa8fc2a54U,
 
215
    0xf8843e7cU, 0x65d95ebcU, 0x9cd2274eU, 0x0589468cU,
 
216
    0x30280c18U, 0x894365caU, 0xbd6d68d0U, 0x995b61c2U,
 
217
    0x0c0a0306U, 0x23bcc19fU, 0x41ef57aeU, 0x7fced6b1U,
 
218
    0x43ecd9afU, 0x7dcd58b0U, 0x47ead8adU, 0x854966ccU,
 
219
    0x7bc8d7b3U, 0xe89c3a74U, 0x078ac88dU, 0xf0883c78U,
 
220
    0xcf26fae9U, 0x62539631U, 0xa6f5a753U, 0x5a77982dU,
 
221
    0x9752ecc5U, 0xdab7b86dU, 0x3ba8c793U, 0x82c3ae41U,
 
222
    0xb96b69d2U, 0x31a74b96U, 0x96ddab4bU, 0x9ed1a94fU,
 
223
    0x814f67ceU, 0x283c0a14U, 0x018f478eU, 0xef16f2f9U,
 
224
    0xee99b577U, 0x88cc2244U, 0xb364e5d7U, 0x9f5eeec1U,
 
225
    0xc2a3be61U, 0xacfa2b56U, 0x3e21811fU, 0x486c1224U,
 
226
    0x362d831bU, 0x6c5a1b36U, 0x38240e1cU, 0x8cca2346U,
 
227
    0xf304f5f7U, 0x0983458aU, 0x84c62142U, 0x1f9ece81U,
 
228
    0x39ab4992U, 0xb0e82c58U, 0xc32cf9efU, 0xbf6ee6d1U,
 
229
    0xe293b671U, 0xa0f02850U, 0x5c72172eU, 0x322b8219U,
 
230
    0x685c1a34U, 0x161d8b0bU, 0xdf3efee1U, 0x121b8a09U,
 
231
    0x24360912U, 0x038cc98fU, 0x26358713U, 0x25b94e9cU,
 
232
    0xa37ce1dfU, 0xb8e42e5cU, 0xb762e4d5U, 0xa77ae0ddU,
 
233
    0x8b40ebcbU, 0x7a47903dU, 0xaaffa455U, 0x78441e3cU,
 
234
    0x2e398517U, 0x9d5d60c0U, 0x00000000U, 0x94de254aU,
 
235
    0xf702f4f5U, 0xe31cf1ffU, 0x6a5f9435U, 0x2c3a0b16U,
 
236
    0xbb68e7d3U, 0xc92375eaU, 0x9b58efc3U, 0xd0b83468U,
 
237
    0xc4a63162U, 0x77c2d4b5U, 0x67dad0bdU, 0x22338611U,
 
238
    0xe5197efcU, 0x8ec9ad47U, 0xd334fde7U, 0xa4f62952U,
 
239
    0xc0a03060U, 0xec9a3b76U, 0x46659f23U, 0xc72af8edU,
 
240
    0x3faec691U, 0x4c6a1326U, 0x1814060cU, 0x141e050aU,
 
241
    0x33a4c597U, 0x44661122U, 0xc12f77eeU, 0xed157cf8U,
 
242
    0xf5017af4U, 0xfd0d78f0U, 0xd8b4366cU, 0x70481c38U,
 
243
    0xe4963972U, 0x79cb59b2U, 0x60501830U, 0x45e956acU,
 
244
    0xf68db37bU, 0xfa87b07dU, 0x90d82448U, 0x80c02040U,
 
245
    0xf28bb279U, 0x724b9239U, 0xb6eda35bU, 0x27bac09dU,
 
246
    0x0d854488U, 0x955162c4U, 0x40601020U, 0xea9fb475U,
 
247
    0x2a3f8415U, 0x11974386U, 0x764d933bU, 0x2fb6c299U,
 
248
    0x35a14a94U, 0xcea9bd67U, 0x06058f03U, 0xb4ee2d5aU,
 
249
    0xcaafbc65U, 0x4a6f9c25U, 0xb5616ad4U, 0x1d9d4080U,
 
250
    0x1b98cf83U, 0xb2eba259U, 0x3a27801dU, 0x21bf4f9eU,
 
251
    0x7c421f3eU, 0x0f86ca89U, 0x92dbaa49U, 0x15914284U,
 
252
};
 
253
 
 
254
static const ulong32 T3[256] = {
 
255
    0xbbd269baU, 0xe54da854U, 0xe2bc5e2fU, 0x25cde874U,
 
256
    0xf751a653U, 0xd06bbbd3U, 0xd66fb9d2U, 0xb3299a4dU,
 
257
    0xfd5da050U, 0xcf8a45acU, 0x090e078dU, 0xa5c663bfU,
 
258
    0x3ddde070U, 0xf155a452U, 0x7b52299aU, 0xb52d984cU,
 
259
    0x468fc9eaU, 0xc473b7d5U, 0x55663397U, 0xdc63bfd1U,
 
260
    0xaacc6633U, 0xfb59a251U, 0xc771b65bU, 0xf3a251a6U,
 
261
    0xfe5fa1deU, 0xad3d9048U, 0xd79a4da8U, 0x715e2f99U,
 
262
    0xe04babdbU, 0xacc86432U, 0x95e673b7U, 0x32d7e5fcU,
 
263
    0x70abdbe3U, 0x6342219eU, 0x417e3f91U, 0x7d562b9bU,
 
264
    0x76afd9e2U, 0xbdd66bbbU, 0x9b198241U, 0x79a5dc6eU,
 
265
    0xf9ae57a5U, 0x800b8bcbU, 0x67b1d66bU, 0x596e3795U,
 
266
    0xe1be5fa1U, 0x10ebfbf3U, 0x81fe7fb1U, 0x0c080402U,
 
267
    0x921785ccU, 0xa23795c4U, 0x4e743a1dU, 0x78502814U,
 
268
    0xb02b9bc3U, 0x5791c663U, 0xe64fa9daU, 0xd369ba5dU,
 
269
    0xdf61be5fU, 0xf257a5dcU, 0x13e9fa7dU, 0x941387cdU,
 
270
    0x1fe1fe7fU, 0xc175b45aU, 0x75add86cU, 0xd56db85cU,
 
271
    0x08fbf3f7U, 0xd4984c26U, 0x38dbe3ffU, 0x5493c7edU,
 
272
    0x4a87cde8U, 0x694e279dU, 0x7fa1de6fU, 0x0302018eU,
 
273
    0x56643219U, 0xe7ba5da0U, 0x1ae7fdf0U, 0x111e0f89U,
 
274
    0x223c1e0fU, 0x121c0e07U, 0xc58643afU, 0x20cbebfbU,
 
275
    0x30201008U, 0x7e542a15U, 0x2e341a0dU, 0x18100804U,
 
276
    0x06040201U, 0x458dc864U, 0xf85ba3dfU, 0x29c5ec76U,
 
277
    0x0bf9f279U, 0xf453a7ddU, 0x8ef47a3dU, 0x74582c16U,
 
278
    0x82fc7e3fU, 0xb2dc6e37U, 0x73a9da6dU, 0x90e07038U,
 
279
    0xb1de6fb9U, 0x37d1e673U, 0x4c83cfe9U, 0xbed46a35U,
 
280
    0xe349aa55U, 0x3bd9e271U, 0x07f1f67bU, 0x0f0a058cU,
 
281
    0x31d5e472U, 0x171a0d88U, 0x0efff1f6U, 0xfca8542aU,
 
282
    0x84f87c3eU, 0xd965bc5eU, 0xd29c4e27U, 0x89058c46U,
 
283
    0x2830180cU, 0x4389ca65U, 0x6dbdd068U, 0x5b99c261U,
 
284
    0x0a0c0603U, 0xbc239fc1U, 0xef41ae57U, 0xce7fb1d6U,
 
285
    0xec43afd9U, 0xcd7db058U, 0xea47add8U, 0x4985cc66U,
 
286
    0xc87bb3d7U, 0x9ce8743aU, 0x8a078dc8U, 0x88f0783cU,
 
287
    0x26cfe9faU, 0x53623196U, 0xf5a653a7U, 0x775a2d98U,
 
288
    0x5297c5ecU, 0xb7da6db8U, 0xa83b93c7U, 0xc38241aeU,
 
289
    0x6bb9d269U, 0xa731964bU, 0xdd964babU, 0xd19e4fa9U,
 
290
    0x4f81ce67U, 0x3c28140aU, 0x8f018e47U, 0x16eff9f2U,
 
291
    0x99ee77b5U, 0xcc884422U, 0x64b3d7e5U, 0x5e9fc1eeU,
 
292
    0xa3c261beU, 0xfaac562bU, 0x213e1f81U, 0x6c482412U,
 
293
    0x2d361b83U, 0x5a6c361bU, 0x24381c0eU, 0xca8c4623U,
 
294
    0x04f3f7f5U, 0x83098a45U, 0xc6844221U, 0x9e1f81ceU,
 
295
    0xab399249U, 0xe8b0582cU, 0x2cc3eff9U, 0x6ebfd1e6U,
 
296
    0x93e271b6U, 0xf0a05028U, 0x725c2e17U, 0x2b321982U,
 
297
    0x5c68341aU, 0x1d160b8bU, 0x3edfe1feU, 0x1b12098aU,
 
298
    0x36241209U, 0x8c038fc9U, 0x35261387U, 0xb9259c4eU,
 
299
    0x7ca3dfe1U, 0xe4b85c2eU, 0x62b7d5e4U, 0x7aa7dde0U,
 
300
    0x408bcbebU, 0x477a3d90U, 0xffaa55a4U, 0x44783c1eU,
 
301
    0x392e1785U, 0x5d9dc060U, 0x00000000U, 0xde944a25U,
 
302
    0x02f7f5f4U, 0x1ce3fff1U, 0x5f6a3594U, 0x3a2c160bU,
 
303
    0x68bbd3e7U, 0x23c9ea75U, 0x589bc3efU, 0xb8d06834U,
 
304
    0xa6c46231U, 0xc277b5d4U, 0xda67bdd0U, 0x33221186U,
 
305
    0x19e5fc7eU, 0xc98e47adU, 0x34d3e7fdU, 0xf6a45229U,
 
306
    0xa0c06030U, 0x9aec763bU, 0x6546239fU, 0x2ac7edf8U,
 
307
    0xae3f91c6U, 0x6a4c2613U, 0x14180c06U, 0x1e140a05U,
 
308
    0xa43397c5U, 0x66442211U, 0x2fc1ee77U, 0x15edf87cU,
 
309
    0x01f5f47aU, 0x0dfdf078U, 0xb4d86c36U, 0x4870381cU,
 
310
    0x96e47239U, 0xcb79b259U, 0x50603018U, 0xe945ac56U,
 
311
    0x8df67bb3U, 0x87fa7db0U, 0xd8904824U, 0xc0804020U,
 
312
    0x8bf279b2U, 0x4b723992U, 0xedb65ba3U, 0xba279dc0U,
 
313
    0x850d8844U, 0x5195c462U, 0x60402010U, 0x9fea75b4U,
 
314
    0x3f2a1584U, 0x97118643U, 0x4d763b93U, 0xb62f99c2U,
 
315
    0xa135944aU, 0xa9ce67bdU, 0x0506038fU, 0xeeb45a2dU,
 
316
    0xafca65bcU, 0x6f4a259cU, 0x61b5d46aU, 0x9d1d8040U,
 
317
    0x981b83cfU, 0xebb259a2U, 0x273a1d80U, 0xbf219e4fU,
 
318
    0x427c3e1fU, 0x860f89caU, 0xdb9249aaU, 0x91158442U,
 
319
};
 
320
 
 
321
static const ulong32 T4[256] = {
 
322
    0xbabababaU, 0x54545454U, 0x2f2f2f2fU, 0x74747474U,
 
323
    0x53535353U, 0xd3d3d3d3U, 0xd2d2d2d2U, 0x4d4d4d4dU,
 
324
    0x50505050U, 0xacacacacU, 0x8d8d8d8dU, 0xbfbfbfbfU,
 
325
    0x70707070U, 0x52525252U, 0x9a9a9a9aU, 0x4c4c4c4cU,
 
326
    0xeaeaeaeaU, 0xd5d5d5d5U, 0x97979797U, 0xd1d1d1d1U,
 
327
    0x33333333U, 0x51515151U, 0x5b5b5b5bU, 0xa6a6a6a6U,
 
328
    0xdedededeU, 0x48484848U, 0xa8a8a8a8U, 0x99999999U,
 
329
    0xdbdbdbdbU, 0x32323232U, 0xb7b7b7b7U, 0xfcfcfcfcU,
 
330
    0xe3e3e3e3U, 0x9e9e9e9eU, 0x91919191U, 0x9b9b9b9bU,
 
331
    0xe2e2e2e2U, 0xbbbbbbbbU, 0x41414141U, 0x6e6e6e6eU,
 
332
    0xa5a5a5a5U, 0xcbcbcbcbU, 0x6b6b6b6bU, 0x95959595U,
 
333
    0xa1a1a1a1U, 0xf3f3f3f3U, 0xb1b1b1b1U, 0x02020202U,
 
334
    0xccccccccU, 0xc4c4c4c4U, 0x1d1d1d1dU, 0x14141414U,
 
335
    0xc3c3c3c3U, 0x63636363U, 0xdadadadaU, 0x5d5d5d5dU,
 
336
    0x5f5f5f5fU, 0xdcdcdcdcU, 0x7d7d7d7dU, 0xcdcdcdcdU,
 
337
    0x7f7f7f7fU, 0x5a5a5a5aU, 0x6c6c6c6cU, 0x5c5c5c5cU,
 
338
    0xf7f7f7f7U, 0x26262626U, 0xffffffffU, 0xededededU,
 
339
    0xe8e8e8e8U, 0x9d9d9d9dU, 0x6f6f6f6fU, 0x8e8e8e8eU,
 
340
    0x19191919U, 0xa0a0a0a0U, 0xf0f0f0f0U, 0x89898989U,
 
341
    0x0f0f0f0fU, 0x07070707U, 0xafafafafU, 0xfbfbfbfbU,
 
342
    0x08080808U, 0x15151515U, 0x0d0d0d0dU, 0x04040404U,
 
343
    0x01010101U, 0x64646464U, 0xdfdfdfdfU, 0x76767676U,
 
344
    0x79797979U, 0xddddddddU, 0x3d3d3d3dU, 0x16161616U,
 
345
    0x3f3f3f3fU, 0x37373737U, 0x6d6d6d6dU, 0x38383838U,
 
346
    0xb9b9b9b9U, 0x73737373U, 0xe9e9e9e9U, 0x35353535U,
 
347
    0x55555555U, 0x71717171U, 0x7b7b7b7bU, 0x8c8c8c8cU,
 
348
    0x72727272U, 0x88888888U, 0xf6f6f6f6U, 0x2a2a2a2aU,
 
349
    0x3e3e3e3eU, 0x5e5e5e5eU, 0x27272727U, 0x46464646U,
 
350
    0x0c0c0c0cU, 0x65656565U, 0x68686868U, 0x61616161U,
 
351
    0x03030303U, 0xc1c1c1c1U, 0x57575757U, 0xd6d6d6d6U,
 
352
    0xd9d9d9d9U, 0x58585858U, 0xd8d8d8d8U, 0x66666666U,
 
353
    0xd7d7d7d7U, 0x3a3a3a3aU, 0xc8c8c8c8U, 0x3c3c3c3cU,
 
354
    0xfafafafaU, 0x96969696U, 0xa7a7a7a7U, 0x98989898U,
 
355
    0xececececU, 0xb8b8b8b8U, 0xc7c7c7c7U, 0xaeaeaeaeU,
 
356
    0x69696969U, 0x4b4b4b4bU, 0xababababU, 0xa9a9a9a9U,
 
357
    0x67676767U, 0x0a0a0a0aU, 0x47474747U, 0xf2f2f2f2U,
 
358
    0xb5b5b5b5U, 0x22222222U, 0xe5e5e5e5U, 0xeeeeeeeeU,
 
359
    0xbebebebeU, 0x2b2b2b2bU, 0x81818181U, 0x12121212U,
 
360
    0x83838383U, 0x1b1b1b1bU, 0x0e0e0e0eU, 0x23232323U,
 
361
    0xf5f5f5f5U, 0x45454545U, 0x21212121U, 0xcecececeU,
 
362
    0x49494949U, 0x2c2c2c2cU, 0xf9f9f9f9U, 0xe6e6e6e6U,
 
363
    0xb6b6b6b6U, 0x28282828U, 0x17171717U, 0x82828282U,
 
364
    0x1a1a1a1aU, 0x8b8b8b8bU, 0xfefefefeU, 0x8a8a8a8aU,
 
365
    0x09090909U, 0xc9c9c9c9U, 0x87878787U, 0x4e4e4e4eU,
 
366
    0xe1e1e1e1U, 0x2e2e2e2eU, 0xe4e4e4e4U, 0xe0e0e0e0U,
 
367
    0xebebebebU, 0x90909090U, 0xa4a4a4a4U, 0x1e1e1e1eU,
 
368
    0x85858585U, 0x60606060U, 0x00000000U, 0x25252525U,
 
369
    0xf4f4f4f4U, 0xf1f1f1f1U, 0x94949494U, 0x0b0b0b0bU,
 
370
    0xe7e7e7e7U, 0x75757575U, 0xefefefefU, 0x34343434U,
 
371
    0x31313131U, 0xd4d4d4d4U, 0xd0d0d0d0U, 0x86868686U,
 
372
    0x7e7e7e7eU, 0xadadadadU, 0xfdfdfdfdU, 0x29292929U,
 
373
    0x30303030U, 0x3b3b3b3bU, 0x9f9f9f9fU, 0xf8f8f8f8U,
 
374
    0xc6c6c6c6U, 0x13131313U, 0x06060606U, 0x05050505U,
 
375
    0xc5c5c5c5U, 0x11111111U, 0x77777777U, 0x7c7c7c7cU,
 
376
    0x7a7a7a7aU, 0x78787878U, 0x36363636U, 0x1c1c1c1cU,
 
377
    0x39393939U, 0x59595959U, 0x18181818U, 0x56565656U,
 
378
    0xb3b3b3b3U, 0xb0b0b0b0U, 0x24242424U, 0x20202020U,
 
379
    0xb2b2b2b2U, 0x92929292U, 0xa3a3a3a3U, 0xc0c0c0c0U,
 
380
    0x44444444U, 0x62626262U, 0x10101010U, 0xb4b4b4b4U,
 
381
    0x84848484U, 0x43434343U, 0x93939393U, 0xc2c2c2c2U,
 
382
    0x4a4a4a4aU, 0xbdbdbdbdU, 0x8f8f8f8fU, 0x2d2d2d2dU,
 
383
    0xbcbcbcbcU, 0x9c9c9c9cU, 0x6a6a6a6aU, 0x40404040U,
 
384
    0xcfcfcfcfU, 0xa2a2a2a2U, 0x80808080U, 0x4f4f4f4fU,
 
385
    0x1f1f1f1fU, 0xcacacacaU, 0xaaaaaaaaU, 0x42424242U,
 
386
};
 
387
 
 
388
static const ulong32 T5[256] = {
 
389
    0x00000000U, 0x01020608U, 0x02040c10U, 0x03060a18U,
 
390
    0x04081820U, 0x050a1e28U, 0x060c1430U, 0x070e1238U,
 
391
    0x08103040U, 0x09123648U, 0x0a143c50U, 0x0b163a58U,
 
392
    0x0c182860U, 0x0d1a2e68U, 0x0e1c2470U, 0x0f1e2278U,
 
393
    0x10206080U, 0x11226688U, 0x12246c90U, 0x13266a98U,
 
394
    0x142878a0U, 0x152a7ea8U, 0x162c74b0U, 0x172e72b8U,
 
395
    0x183050c0U, 0x193256c8U, 0x1a345cd0U, 0x1b365ad8U,
 
396
    0x1c3848e0U, 0x1d3a4ee8U, 0x1e3c44f0U, 0x1f3e42f8U,
 
397
    0x2040c01dU, 0x2142c615U, 0x2244cc0dU, 0x2346ca05U,
 
398
    0x2448d83dU, 0x254ade35U, 0x264cd42dU, 0x274ed225U,
 
399
    0x2850f05dU, 0x2952f655U, 0x2a54fc4dU, 0x2b56fa45U,
 
400
    0x2c58e87dU, 0x2d5aee75U, 0x2e5ce46dU, 0x2f5ee265U,
 
401
    0x3060a09dU, 0x3162a695U, 0x3264ac8dU, 0x3366aa85U,
 
402
    0x3468b8bdU, 0x356abeb5U, 0x366cb4adU, 0x376eb2a5U,
 
403
    0x387090ddU, 0x397296d5U, 0x3a749ccdU, 0x3b769ac5U,
 
404
    0x3c7888fdU, 0x3d7a8ef5U, 0x3e7c84edU, 0x3f7e82e5U,
 
405
    0x40809d3aU, 0x41829b32U, 0x4284912aU, 0x43869722U,
 
406
    0x4488851aU, 0x458a8312U, 0x468c890aU, 0x478e8f02U,
 
407
    0x4890ad7aU, 0x4992ab72U, 0x4a94a16aU, 0x4b96a762U,
 
408
    0x4c98b55aU, 0x4d9ab352U, 0x4e9cb94aU, 0x4f9ebf42U,
 
409
    0x50a0fdbaU, 0x51a2fbb2U, 0x52a4f1aaU, 0x53a6f7a2U,
 
410
    0x54a8e59aU, 0x55aae392U, 0x56ace98aU, 0x57aeef82U,
 
411
    0x58b0cdfaU, 0x59b2cbf2U, 0x5ab4c1eaU, 0x5bb6c7e2U,
 
412
    0x5cb8d5daU, 0x5dbad3d2U, 0x5ebcd9caU, 0x5fbedfc2U,
 
413
    0x60c05d27U, 0x61c25b2fU, 0x62c45137U, 0x63c6573fU,
 
414
    0x64c84507U, 0x65ca430fU, 0x66cc4917U, 0x67ce4f1fU,
 
415
    0x68d06d67U, 0x69d26b6fU, 0x6ad46177U, 0x6bd6677fU,
 
416
    0x6cd87547U, 0x6dda734fU, 0x6edc7957U, 0x6fde7f5fU,
 
417
    0x70e03da7U, 0x71e23bafU, 0x72e431b7U, 0x73e637bfU,
 
418
    0x74e82587U, 0x75ea238fU, 0x76ec2997U, 0x77ee2f9fU,
 
419
    0x78f00de7U, 0x79f20befU, 0x7af401f7U, 0x7bf607ffU,
 
420
    0x7cf815c7U, 0x7dfa13cfU, 0x7efc19d7U, 0x7ffe1fdfU,
 
421
    0x801d2774U, 0x811f217cU, 0x82192b64U, 0x831b2d6cU,
 
422
    0x84153f54U, 0x8517395cU, 0x86113344U, 0x8713354cU,
 
423
    0x880d1734U, 0x890f113cU, 0x8a091b24U, 0x8b0b1d2cU,
 
424
    0x8c050f14U, 0x8d07091cU, 0x8e010304U, 0x8f03050cU,
 
425
    0x903d47f4U, 0x913f41fcU, 0x92394be4U, 0x933b4decU,
 
426
    0x94355fd4U, 0x953759dcU, 0x963153c4U, 0x973355ccU,
 
427
    0x982d77b4U, 0x992f71bcU, 0x9a297ba4U, 0x9b2b7dacU,
 
428
    0x9c256f94U, 0x9d27699cU, 0x9e216384U, 0x9f23658cU,
 
429
    0xa05de769U, 0xa15fe161U, 0xa259eb79U, 0xa35bed71U,
 
430
    0xa455ff49U, 0xa557f941U, 0xa651f359U, 0xa753f551U,
 
431
    0xa84dd729U, 0xa94fd121U, 0xaa49db39U, 0xab4bdd31U,
 
432
    0xac45cf09U, 0xad47c901U, 0xae41c319U, 0xaf43c511U,
 
433
    0xb07d87e9U, 0xb17f81e1U, 0xb2798bf9U, 0xb37b8df1U,
 
434
    0xb4759fc9U, 0xb57799c1U, 0xb67193d9U, 0xb77395d1U,
 
435
    0xb86db7a9U, 0xb96fb1a1U, 0xba69bbb9U, 0xbb6bbdb1U,
 
436
    0xbc65af89U, 0xbd67a981U, 0xbe61a399U, 0xbf63a591U,
 
437
    0xc09dba4eU, 0xc19fbc46U, 0xc299b65eU, 0xc39bb056U,
 
438
    0xc495a26eU, 0xc597a466U, 0xc691ae7eU, 0xc793a876U,
 
439
    0xc88d8a0eU, 0xc98f8c06U, 0xca89861eU, 0xcb8b8016U,
 
440
    0xcc85922eU, 0xcd879426U, 0xce819e3eU, 0xcf839836U,
 
441
    0xd0bddaceU, 0xd1bfdcc6U, 0xd2b9d6deU, 0xd3bbd0d6U,
 
442
    0xd4b5c2eeU, 0xd5b7c4e6U, 0xd6b1cefeU, 0xd7b3c8f6U,
 
443
    0xd8adea8eU, 0xd9afec86U, 0xdaa9e69eU, 0xdbabe096U,
 
444
    0xdca5f2aeU, 0xdda7f4a6U, 0xdea1febeU, 0xdfa3f8b6U,
 
445
    0xe0dd7a53U, 0xe1df7c5bU, 0xe2d97643U, 0xe3db704bU,
 
446
    0xe4d56273U, 0xe5d7647bU, 0xe6d16e63U, 0xe7d3686bU,
 
447
    0xe8cd4a13U, 0xe9cf4c1bU, 0xeac94603U, 0xebcb400bU,
 
448
    0xecc55233U, 0xedc7543bU, 0xeec15e23U, 0xefc3582bU,
 
449
    0xf0fd1ad3U, 0xf1ff1cdbU, 0xf2f916c3U, 0xf3fb10cbU,
 
450
    0xf4f502f3U, 0xf5f704fbU, 0xf6f10ee3U, 0xf7f308ebU,
 
451
    0xf8ed2a93U, 0xf9ef2c9bU, 0xfae92683U, 0xfbeb208bU,
 
452
    0xfce532b3U, 0xfde734bbU, 0xfee13ea3U, 0xffe338abU,
 
453
};
 
454
 
 
455
/**
 
456
 * The round constants.
 
457
 */
 
458
static const ulong32 rc[] = {
 
459
    0xba542f74U, 0x53d3d24dU, 0x50ac8dbfU, 0x70529a4cU,
 
460
    0xead597d1U, 0x33515ba6U, 0xde48a899U, 0xdb32b7fcU,
 
461
    0xe39e919bU, 0xe2bb416eU, 0xa5cb6b95U, 0xa1f3b102U,
 
462
    0xccc41d14U, 0xc363da5dU, 0x5fdc7dcdU, 0x7f5a6c5cU,
 
463
    0xf726ffedU, 0xe89d6f8eU, 0x19a0f089U,
 
464
};
 
465
 
 
466
 
 
467
 
 
468
#else
 
469
 
 
470
 
 
471
static const ulong32 T0[256] = {
 
472
    0xa753a6f5U, 0xd3bb6bd0U, 0xe6d1bf6eU, 0x71e2d93bU,
 
473
    0xd0bd67daU, 0xac458acfU, 0x4d9a29b3U, 0x79f2f90bU,
 
474
    0x3a74e89cU, 0xc98f038cU, 0x913f7e41U, 0xfce5d732U,
 
475
    0x1e3c7844U, 0x478e018fU, 0x54a84de5U, 0xbd67cea9U,
 
476
    0x8c050a0fU, 0xa557aef9U, 0x7af4f501U, 0xfbebcb20U,
 
477
    0x63c69157U, 0xb86ddab7U, 0xdda753f4U, 0xd4b577c2U,
 
478
    0xe5d7b364U, 0xb37bf68dU, 0xc59733a4U, 0xbe61c2a3U,
 
479
    0xa94f9ed1U, 0x880d1a17U, 0x0c183028U, 0xa259b2ebU,
 
480
    0x3972e496U, 0xdfa35bf8U, 0x2952a4f6U, 0xdaa94fe6U,
 
481
    0x2b56acfaU, 0xa84d9ad7U, 0xcb8b0b80U, 0x4c982db5U,
 
482
    0x4b9631a7U, 0x224488ccU, 0xaa4992dbU, 0x244890d8U,
 
483
    0x4182199bU, 0x70e0dd3dU, 0xa651a2f3U, 0xf9efc32cU,
 
484
    0x5ab475c1U, 0xe2d9af76U, 0xb07dfa87U, 0x366cd8b4U,
 
485
    0x7dfae913U, 0xe4d5b762U, 0x3366ccaaU, 0xffe3db38U,
 
486
    0x60c09d5dU, 0x204080c0U, 0x08102030U, 0x8b0b161dU,
 
487
    0x5ebc65d9U, 0xab4b96ddU, 0x7ffee11fU, 0x78f0fd0dU,
 
488
    0x7cf8ed15U, 0x2c58b0e8U, 0x57ae41efU, 0xd2b96fd6U,
 
489
    0xdca557f2U, 0x6ddaa973U, 0x7efce519U, 0x0d1a342eU,
 
490
    0x53a651f7U, 0x94356a5fU, 0xc39b2bb0U, 0x2850a0f0U,
 
491
    0x274e9cd2U, 0x060c1814U, 0x5fbe61dfU, 0xad478ec9U,
 
492
    0x67ce814fU, 0x5cb86dd5U, 0x55aa49e3U, 0x48903dadU,
 
493
    0x0e1c3824U, 0x52a455f1U, 0xeac98f46U, 0x42841591U,
 
494
    0x5bb671c7U, 0x5dba69d3U, 0x3060c0a0U, 0x58b07dcdU,
 
495
    0x51a259fbU, 0x59b279cbU, 0x3c78f088U, 0x4e9c25b9U,
 
496
    0x3870e090U, 0x8a09121bU, 0x72e4d531U, 0x14285078U,
 
497
    0xe7d3bb68U, 0xc6913faeU, 0xdea15ffeU, 0x50a05dfdU,
 
498
    0x8e010203U, 0x9239724bU, 0xd1bf63dcU, 0x77eec12fU,
 
499
    0x933b764dU, 0x458a0983U, 0x9a29527bU, 0xce811f9eU,
 
500
    0x2d5ab4eeU, 0x03060c0aU, 0x62c49551U, 0xb671e293U,
 
501
    0xb96fdeb1U, 0xbf63c6a5U, 0x96316253U, 0x6bd6b167U,
 
502
    0x3f7efc82U, 0x070e1c12U, 0x1224486cU, 0xae4182c3U,
 
503
    0x40801d9dU, 0x3468d0b8U, 0x468c0589U, 0x3e7cf884U,
 
504
    0xdbab4be0U, 0xcf831b98U, 0xecc59752U, 0xcc851792U,
 
505
    0xc19f23bcU, 0xa15fbee1U, 0xc09d27baU, 0xd6b17fceU,
 
506
    0x1d3a744eU, 0xf4f5f702U, 0x61c2995bU, 0x3b76ec9aU,
 
507
    0x10204060U, 0xd8ad47eaU, 0x68d0bd6dU, 0xa05dbae7U,
 
508
    0xb17ffe81U, 0x0a14283cU, 0x69d2b96bU, 0x6cd8ad75U,
 
509
    0x499239abU, 0xfae9cf26U, 0x76ecc529U, 0xc49537a2U,
 
510
    0x9e214263U, 0x9b2b567dU, 0x6edca579U, 0x992f5e71U,
 
511
    0xc2992fb6U, 0xb773e695U, 0x982d5a77U, 0xbc65caafU,
 
512
    0x8f030605U, 0x85172e39U, 0x1f3e7c42U, 0xb475ea9fU,
 
513
    0xf8edc72aU, 0x11224466U, 0x2e5cb8e4U, 0x00000000U,
 
514
    0x254a94deU, 0x1c387048U, 0x2a54a8fcU, 0x3d7af48eU,
 
515
    0x050a141eU, 0x4f9e21bfU, 0x7bf6f107U, 0xb279f28bU,
 
516
    0x3264c8acU, 0x903d7a47U, 0xaf4386c5U, 0x19326456U,
 
517
    0xa35bb6edU, 0xf7f3fb08U, 0x73e6d137U, 0x9d274e69U,
 
518
    0x152a547eU, 0x74e8cd25U, 0xeec19f5eU, 0xca890f86U,
 
519
    0x9f234665U, 0x0f1e3c22U, 0x1b366c5aU, 0x75eac923U,
 
520
    0x86112233U, 0x84152a3fU, 0x9c254a6fU, 0x4a9435a1U,
 
521
    0x97336655U, 0x1a34685cU, 0x65ca8943U, 0xf6f1ff0eU,
 
522
    0xedc79354U, 0x09122436U, 0xbb6bd6bdU, 0x264c98d4U,
 
523
    0x831b362dU, 0xebcb8b40U, 0x6fdea17fU, 0x811f3e21U,
 
524
    0x04081018U, 0x6ad4b561U, 0x43861197U, 0x01020406U,
 
525
    0x172e5c72U, 0xe1dfa37cU, 0x87132635U, 0xf5f7f304U,
 
526
    0x8d070e09U, 0xe3dbab70U, 0x23468ccaU, 0x801d3a27U,
 
527
    0x44880d85U, 0x162c5874U, 0x66cc8549U, 0x214284c6U,
 
528
    0xfee1df3eU, 0xd5b773c4U, 0x3162c4a6U, 0xd9af43ecU,
 
529
    0x356ad4beU, 0x18306050U, 0x0204080cU, 0x64c88d45U,
 
530
    0xf2f9ef16U, 0xf1ffe31cU, 0x56ac45e9U, 0xcd871394U,
 
531
    0x8219322bU, 0xc88d078aU, 0xba69d2bbU, 0xf0fde71aU,
 
532
    0xefc39b58U, 0xe9cf834cU, 0xe8cd874aU, 0xfde7d334U,
 
533
    0x890f1e11U, 0xd7b37bc8U, 0xc7933ba8U, 0xb577ee99U,
 
534
    0xa455aaffU, 0x2f5ebce2U, 0x95376e59U, 0x13264c6aU,
 
535
    0x0b162c3aU, 0xf3fbeb10U, 0xe0dda77aU, 0x376edcb2U,
 
536
};
 
537
 
 
538
static const ulong32 T1[256] = {
 
539
    0x53a7f5a6U, 0xbbd3d06bU, 0xd1e66ebfU, 0xe2713bd9U,
 
540
    0xbdd0da67U, 0x45accf8aU, 0x9a4db329U, 0xf2790bf9U,
 
541
    0x743a9ce8U, 0x8fc98c03U, 0x3f91417eU, 0xe5fc32d7U,
 
542
    0x3c1e4478U, 0x8e478f01U, 0xa854e54dU, 0x67bda9ceU,
 
543
    0x058c0f0aU, 0x57a5f9aeU, 0xf47a01f5U, 0xebfb20cbU,
 
544
    0xc6635791U, 0x6db8b7daU, 0xa7ddf453U, 0xb5d4c277U,
 
545
    0xd7e564b3U, 0x7bb38df6U, 0x97c5a433U, 0x61bea3c2U,
 
546
    0x4fa9d19eU, 0x0d88171aU, 0x180c2830U, 0x59a2ebb2U,
 
547
    0x723996e4U, 0xa3dff85bU, 0x5229f6a4U, 0xa9dae64fU,
 
548
    0x562bfaacU, 0x4da8d79aU, 0x8bcb800bU, 0x984cb52dU,
 
549
    0x964ba731U, 0x4422cc88U, 0x49aadb92U, 0x4824d890U,
 
550
    0x82419b19U, 0xe0703dddU, 0x51a6f3a2U, 0xeff92cc3U,
 
551
    0xb45ac175U, 0xd9e276afU, 0x7db087faU, 0x6c36b4d8U,
 
552
    0xfa7d13e9U, 0xd5e462b7U, 0x6633aaccU, 0xe3ff38dbU,
 
553
    0xc0605d9dU, 0x4020c080U, 0x10083020U, 0x0b8b1d16U,
 
554
    0xbc5ed965U, 0x4babdd96U, 0xfe7f1fe1U, 0xf0780dfdU,
 
555
    0xf87c15edU, 0x582ce8b0U, 0xae57ef41U, 0xb9d2d66fU,
 
556
    0xa5dcf257U, 0xda6d73a9U, 0xfc7e19e5U, 0x1a0d2e34U,
 
557
    0xa653f751U, 0x35945f6aU, 0x9bc3b02bU, 0x5028f0a0U,
 
558
    0x4e27d29cU, 0x0c061418U, 0xbe5fdf61U, 0x47adc98eU,
 
559
    0xce674f81U, 0xb85cd56dU, 0xaa55e349U, 0x9048ad3dU,
 
560
    0x1c0e2438U, 0xa452f155U, 0xc9ea468fU, 0x84429115U,
 
561
    0xb65bc771U, 0xba5dd369U, 0x6030a0c0U, 0xb058cd7dU,
 
562
    0xa251fb59U, 0xb259cb79U, 0x783c88f0U, 0x9c4eb925U,
 
563
    0x703890e0U, 0x098a1b12U, 0xe47231d5U, 0x28147850U,
 
564
    0xd3e768bbU, 0x91c6ae3fU, 0xa1defe5fU, 0xa050fd5dU,
 
565
    0x018e0302U, 0x39924b72U, 0xbfd1dc63U, 0xee772fc1U,
 
566
    0x3b934d76U, 0x8a458309U, 0x299a7b52U, 0x81ce9e1fU,
 
567
    0x5a2deeb4U, 0x06030a0cU, 0xc4625195U, 0x71b693e2U,
 
568
    0x6fb9b1deU, 0x63bfa5c6U, 0x31965362U, 0xd66b67b1U,
 
569
    0x7e3f82fcU, 0x0e07121cU, 0x24126c48U, 0x41aec382U,
 
570
    0x80409d1dU, 0x6834b8d0U, 0x8c468905U, 0x7c3e84f8U,
 
571
    0xabdbe04bU, 0x83cf981bU, 0xc5ec5297U, 0x85cc9217U,
 
572
    0x9fc1bc23U, 0x5fa1e1beU, 0x9dc0ba27U, 0xb1d6ce7fU,
 
573
    0x3a1d4e74U, 0xf5f402f7U, 0xc2615b99U, 0x763b9aecU,
 
574
    0x20106040U, 0xadd8ea47U, 0xd0686dbdU, 0x5da0e7baU,
 
575
    0x7fb181feU, 0x140a3c28U, 0xd2696bb9U, 0xd86c75adU,
 
576
    0x9249ab39U, 0xe9fa26cfU, 0xec7629c5U, 0x95c4a237U,
 
577
    0x219e6342U, 0x2b9b7d56U, 0xdc6e79a5U, 0x2f99715eU,
 
578
    0x99c2b62fU, 0x73b795e6U, 0x2d98775aU, 0x65bcafcaU,
 
579
    0x038f0506U, 0x1785392eU, 0x3e1f427cU, 0x75b49feaU,
 
580
    0xedf82ac7U, 0x22116644U, 0x5c2ee4b8U, 0x00000000U,
 
581
    0x4a25de94U, 0x381c4870U, 0x542afca8U, 0x7a3d8ef4U,
 
582
    0x0a051e14U, 0x9e4fbf21U, 0xf67b07f1U, 0x79b28bf2U,
 
583
    0x6432acc8U, 0x3d90477aU, 0x43afc586U, 0x32195664U,
 
584
    0x5ba3edb6U, 0xf3f708fbU, 0xe67337d1U, 0x279d694eU,
 
585
    0x2a157e54U, 0xe87425cdU, 0xc1ee5e9fU, 0x89ca860fU,
 
586
    0x239f6546U, 0x1e0f223cU, 0x361b5a6cU, 0xea7523c9U,
 
587
    0x11863322U, 0x15843f2aU, 0x259c6f4aU, 0x944aa135U,
 
588
    0x33975566U, 0x341a5c68U, 0xca654389U, 0xf1f60effU,
 
589
    0xc7ed5493U, 0x12093624U, 0x6bbbbdd6U, 0x4c26d498U,
 
590
    0x1b832d36U, 0xcbeb408bU, 0xde6f7fa1U, 0x1f81213eU,
 
591
    0x08041810U, 0xd46a61b5U, 0x86439711U, 0x02010604U,
 
592
    0x2e17725cU, 0xdfe17ca3U, 0x13873526U, 0xf7f504f3U,
 
593
    0x078d090eU, 0xdbe370abU, 0x4623ca8cU, 0x1d80273aU,
 
594
    0x8844850dU, 0x2c167458U, 0xcc664985U, 0x4221c684U,
 
595
    0xe1fe3edfU, 0xb7d5c473U, 0x6231a6c4U, 0xafd9ec43U,
 
596
    0x6a35bed4U, 0x30185060U, 0x04020c08U, 0xc864458dU,
 
597
    0xf9f216efU, 0xfff11ce3U, 0xac56e945U, 0x87cd9413U,
 
598
    0x19822b32U, 0x8dc88a07U, 0x69babbd2U, 0xfdf01ae7U,
 
599
    0xc3ef589bU, 0xcfe94c83U, 0xcde84a87U, 0xe7fd34d3U,
 
600
    0x0f89111eU, 0xb3d7c87bU, 0x93c7a83bU, 0x77b599eeU,
 
601
    0x55a4ffaaU, 0x5e2fe2bcU, 0x3795596eU, 0x26136a4cU,
 
602
    0x160b3a2cU, 0xfbf310ebU, 0xdde07aa7U, 0x6e37b2dcU,
 
603
};
 
604
 
 
605
static const ulong32 T2[256] = {
 
606
    0xa6f5a753U, 0x6bd0d3bbU, 0xbf6ee6d1U, 0xd93b71e2U,
 
607
    0x67dad0bdU, 0x8acfac45U, 0x29b34d9aU, 0xf90b79f2U,
 
608
    0xe89c3a74U, 0x038cc98fU, 0x7e41913fU, 0xd732fce5U,
 
609
    0x78441e3cU, 0x018f478eU, 0x4de554a8U, 0xcea9bd67U,
 
610
    0x0a0f8c05U, 0xaef9a557U, 0xf5017af4U, 0xcb20fbebU,
 
611
    0x915763c6U, 0xdab7b86dU, 0x53f4dda7U, 0x77c2d4b5U,
 
612
    0xb364e5d7U, 0xf68db37bU, 0x33a4c597U, 0xc2a3be61U,
 
613
    0x9ed1a94fU, 0x1a17880dU, 0x30280c18U, 0xb2eba259U,
 
614
    0xe4963972U, 0x5bf8dfa3U, 0xa4f62952U, 0x4fe6daa9U,
 
615
    0xacfa2b56U, 0x9ad7a84dU, 0x0b80cb8bU, 0x2db54c98U,
 
616
    0x31a74b96U, 0x88cc2244U, 0x92dbaa49U, 0x90d82448U,
 
617
    0x199b4182U, 0xdd3d70e0U, 0xa2f3a651U, 0xc32cf9efU,
 
618
    0x75c15ab4U, 0xaf76e2d9U, 0xfa87b07dU, 0xd8b4366cU,
 
619
    0xe9137dfaU, 0xb762e4d5U, 0xccaa3366U, 0xdb38ffe3U,
 
620
    0x9d5d60c0U, 0x80c02040U, 0x20300810U, 0x161d8b0bU,
 
621
    0x65d95ebcU, 0x96ddab4bU, 0xe11f7ffeU, 0xfd0d78f0U,
 
622
    0xed157cf8U, 0xb0e82c58U, 0x41ef57aeU, 0x6fd6d2b9U,
 
623
    0x57f2dca5U, 0xa9736ddaU, 0xe5197efcU, 0x342e0d1aU,
 
624
    0x51f753a6U, 0x6a5f9435U, 0x2bb0c39bU, 0xa0f02850U,
 
625
    0x9cd2274eU, 0x1814060cU, 0x61df5fbeU, 0x8ec9ad47U,
 
626
    0x814f67ceU, 0x6dd55cb8U, 0x49e355aaU, 0x3dad4890U,
 
627
    0x38240e1cU, 0x55f152a4U, 0x8f46eac9U, 0x15914284U,
 
628
    0x71c75bb6U, 0x69d35dbaU, 0xc0a03060U, 0x7dcd58b0U,
 
629
    0x59fb51a2U, 0x79cb59b2U, 0xf0883c78U, 0x25b94e9cU,
 
630
    0xe0903870U, 0x121b8a09U, 0xd53172e4U, 0x50781428U,
 
631
    0xbb68e7d3U, 0x3faec691U, 0x5ffedea1U, 0x5dfd50a0U,
 
632
    0x02038e01U, 0x724b9239U, 0x63dcd1bfU, 0xc12f77eeU,
 
633
    0x764d933bU, 0x0983458aU, 0x527b9a29U, 0x1f9ece81U,
 
634
    0xb4ee2d5aU, 0x0c0a0306U, 0x955162c4U, 0xe293b671U,
 
635
    0xdeb1b96fU, 0xc6a5bf63U, 0x62539631U, 0xb1676bd6U,
 
636
    0xfc823f7eU, 0x1c12070eU, 0x486c1224U, 0x82c3ae41U,
 
637
    0x1d9d4080U, 0xd0b83468U, 0x0589468cU, 0xf8843e7cU,
 
638
    0x4be0dbabU, 0x1b98cf83U, 0x9752ecc5U, 0x1792cc85U,
 
639
    0x23bcc19fU, 0xbee1a15fU, 0x27bac09dU, 0x7fced6b1U,
 
640
    0x744e1d3aU, 0xf702f4f5U, 0x995b61c2U, 0xec9a3b76U,
 
641
    0x40601020U, 0x47ead8adU, 0xbd6d68d0U, 0xbae7a05dU,
 
642
    0xfe81b17fU, 0x283c0a14U, 0xb96b69d2U, 0xad756cd8U,
 
643
    0x39ab4992U, 0xcf26fae9U, 0xc52976ecU, 0x37a2c495U,
 
644
    0x42639e21U, 0x567d9b2bU, 0xa5796edcU, 0x5e71992fU,
 
645
    0x2fb6c299U, 0xe695b773U, 0x5a77982dU, 0xcaafbc65U,
 
646
    0x06058f03U, 0x2e398517U, 0x7c421f3eU, 0xea9fb475U,
 
647
    0xc72af8edU, 0x44661122U, 0xb8e42e5cU, 0x00000000U,
 
648
    0x94de254aU, 0x70481c38U, 0xa8fc2a54U, 0xf48e3d7aU,
 
649
    0x141e050aU, 0x21bf4f9eU, 0xf1077bf6U, 0xf28bb279U,
 
650
    0xc8ac3264U, 0x7a47903dU, 0x86c5af43U, 0x64561932U,
 
651
    0xb6eda35bU, 0xfb08f7f3U, 0xd13773e6U, 0x4e699d27U,
 
652
    0x547e152aU, 0xcd2574e8U, 0x9f5eeec1U, 0x0f86ca89U,
 
653
    0x46659f23U, 0x3c220f1eU, 0x6c5a1b36U, 0xc92375eaU,
 
654
    0x22338611U, 0x2a3f8415U, 0x4a6f9c25U, 0x35a14a94U,
 
655
    0x66559733U, 0x685c1a34U, 0x894365caU, 0xff0ef6f1U,
 
656
    0x9354edc7U, 0x24360912U, 0xd6bdbb6bU, 0x98d4264cU,
 
657
    0x362d831bU, 0x8b40ebcbU, 0xa17f6fdeU, 0x3e21811fU,
 
658
    0x10180408U, 0xb5616ad4U, 0x11974386U, 0x04060102U,
 
659
    0x5c72172eU, 0xa37ce1dfU, 0x26358713U, 0xf304f5f7U,
 
660
    0x0e098d07U, 0xab70e3dbU, 0x8cca2346U, 0x3a27801dU,
 
661
    0x0d854488U, 0x5874162cU, 0x854966ccU, 0x84c62142U,
 
662
    0xdf3efee1U, 0x73c4d5b7U, 0xc4a63162U, 0x43ecd9afU,
 
663
    0xd4be356aU, 0x60501830U, 0x080c0204U, 0x8d4564c8U,
 
664
    0xef16f2f9U, 0xe31cf1ffU, 0x45e956acU, 0x1394cd87U,
 
665
    0x322b8219U, 0x078ac88dU, 0xd2bbba69U, 0xe71af0fdU,
 
666
    0x9b58efc3U, 0x834ce9cfU, 0x874ae8cdU, 0xd334fde7U,
 
667
    0x1e11890fU, 0x7bc8d7b3U, 0x3ba8c793U, 0xee99b577U,
 
668
    0xaaffa455U, 0xbce22f5eU, 0x6e599537U, 0x4c6a1326U,
 
669
    0x2c3a0b16U, 0xeb10f3fbU, 0xa77ae0ddU, 0xdcb2376eU,
 
670
};
 
671
 
 
672
static const ulong32 T3[256] = {
 
673
    0xf5a653a7U, 0xd06bbbd3U, 0x6ebfd1e6U, 0x3bd9e271U,
 
674
    0xda67bdd0U, 0xcf8a45acU, 0xb3299a4dU, 0x0bf9f279U,
 
675
    0x9ce8743aU, 0x8c038fc9U, 0x417e3f91U, 0x32d7e5fcU,
 
676
    0x44783c1eU, 0x8f018e47U, 0xe54da854U, 0xa9ce67bdU,
 
677
    0x0f0a058cU, 0xf9ae57a5U, 0x01f5f47aU, 0x20cbebfbU,
 
678
    0x5791c663U, 0xb7da6db8U, 0xf453a7ddU, 0xc277b5d4U,
 
679
    0x64b3d7e5U, 0x8df67bb3U, 0xa43397c5U, 0xa3c261beU,
 
680
    0xd19e4fa9U, 0x171a0d88U, 0x2830180cU, 0xebb259a2U,
 
681
    0x96e47239U, 0xf85ba3dfU, 0xf6a45229U, 0xe64fa9daU,
 
682
    0xfaac562bU, 0xd79a4da8U, 0x800b8bcbU, 0xb52d984cU,
 
683
    0xa731964bU, 0xcc884422U, 0xdb9249aaU, 0xd8904824U,
 
684
    0x9b198241U, 0x3ddde070U, 0xf3a251a6U, 0x2cc3eff9U,
 
685
    0xc175b45aU, 0x76afd9e2U, 0x87fa7db0U, 0xb4d86c36U,
 
686
    0x13e9fa7dU, 0x62b7d5e4U, 0xaacc6633U, 0x38dbe3ffU,
 
687
    0x5d9dc060U, 0xc0804020U, 0x30201008U, 0x1d160b8bU,
 
688
    0xd965bc5eU, 0xdd964babU, 0x1fe1fe7fU, 0x0dfdf078U,
 
689
    0x15edf87cU, 0xe8b0582cU, 0xef41ae57U, 0xd66fb9d2U,
 
690
    0xf257a5dcU, 0x73a9da6dU, 0x19e5fc7eU, 0x2e341a0dU,
 
691
    0xf751a653U, 0x5f6a3594U, 0xb02b9bc3U, 0xf0a05028U,
 
692
    0xd29c4e27U, 0x14180c06U, 0xdf61be5fU, 0xc98e47adU,
 
693
    0x4f81ce67U, 0xd56db85cU, 0xe349aa55U, 0xad3d9048U,
 
694
    0x24381c0eU, 0xf155a452U, 0x468fc9eaU, 0x91158442U,
 
695
    0xc771b65bU, 0xd369ba5dU, 0xa0c06030U, 0xcd7db058U,
 
696
    0xfb59a251U, 0xcb79b259U, 0x88f0783cU, 0xb9259c4eU,
 
697
    0x90e07038U, 0x1b12098aU, 0x31d5e472U, 0x78502814U,
 
698
    0x68bbd3e7U, 0xae3f91c6U, 0xfe5fa1deU, 0xfd5da050U,
 
699
    0x0302018eU, 0x4b723992U, 0xdc63bfd1U, 0x2fc1ee77U,
 
700
    0x4d763b93U, 0x83098a45U, 0x7b52299aU, 0x9e1f81ceU,
 
701
    0xeeb45a2dU, 0x0a0c0603U, 0x5195c462U, 0x93e271b6U,
 
702
    0xb1de6fb9U, 0xa5c663bfU, 0x53623196U, 0x67b1d66bU,
 
703
    0x82fc7e3fU, 0x121c0e07U, 0x6c482412U, 0xc38241aeU,
 
704
    0x9d1d8040U, 0xb8d06834U, 0x89058c46U, 0x84f87c3eU,
 
705
    0xe04babdbU, 0x981b83cfU, 0x5297c5ecU, 0x921785ccU,
 
706
    0xbc239fc1U, 0xe1be5fa1U, 0xba279dc0U, 0xce7fb1d6U,
 
707
    0x4e743a1dU, 0x02f7f5f4U, 0x5b99c261U, 0x9aec763bU,
 
708
    0x60402010U, 0xea47add8U, 0x6dbdd068U, 0xe7ba5da0U,
 
709
    0x81fe7fb1U, 0x3c28140aU, 0x6bb9d269U, 0x75add86cU,
 
710
    0xab399249U, 0x26cfe9faU, 0x29c5ec76U, 0xa23795c4U,
 
711
    0x6342219eU, 0x7d562b9bU, 0x79a5dc6eU, 0x715e2f99U,
 
712
    0xb62f99c2U, 0x95e673b7U, 0x775a2d98U, 0xafca65bcU,
 
713
    0x0506038fU, 0x392e1785U, 0x427c3e1fU, 0x9fea75b4U,
 
714
    0x2ac7edf8U, 0x66442211U, 0xe4b85c2eU, 0x00000000U,
 
715
    0xde944a25U, 0x4870381cU, 0xfca8542aU, 0x8ef47a3dU,
 
716
    0x1e140a05U, 0xbf219e4fU, 0x07f1f67bU, 0x8bf279b2U,
 
717
    0xacc86432U, 0x477a3d90U, 0xc58643afU, 0x56643219U,
 
718
    0xedb65ba3U, 0x08fbf3f7U, 0x37d1e673U, 0x694e279dU,
 
719
    0x7e542a15U, 0x25cde874U, 0x5e9fc1eeU, 0x860f89caU,
 
720
    0x6546239fU, 0x223c1e0fU, 0x5a6c361bU, 0x23c9ea75U,
 
721
    0x33221186U, 0x3f2a1584U, 0x6f4a259cU, 0xa135944aU,
 
722
    0x55663397U, 0x5c68341aU, 0x4389ca65U, 0x0efff1f6U,
 
723
    0x5493c7edU, 0x36241209U, 0xbdd66bbbU, 0xd4984c26U,
 
724
    0x2d361b83U, 0x408bcbebU, 0x7fa1de6fU, 0x213e1f81U,
 
725
    0x18100804U, 0x61b5d46aU, 0x97118643U, 0x06040201U,
 
726
    0x725c2e17U, 0x7ca3dfe1U, 0x35261387U, 0x04f3f7f5U,
 
727
    0x090e078dU, 0x70abdbe3U, 0xca8c4623U, 0x273a1d80U,
 
728
    0x850d8844U, 0x74582c16U, 0x4985cc66U, 0xc6844221U,
 
729
    0x3edfe1feU, 0xc473b7d5U, 0xa6c46231U, 0xec43afd9U,
 
730
    0xbed46a35U, 0x50603018U, 0x0c080402U, 0x458dc864U,
 
731
    0x16eff9f2U, 0x1ce3fff1U, 0xe945ac56U, 0x941387cdU,
 
732
    0x2b321982U, 0x8a078dc8U, 0xbbd269baU, 0x1ae7fdf0U,
 
733
    0x589bc3efU, 0x4c83cfe9U, 0x4a87cde8U, 0x34d3e7fdU,
 
734
    0x111e0f89U, 0xc87bb3d7U, 0xa83b93c7U, 0x99ee77b5U,
 
735
    0xffaa55a4U, 0xe2bc5e2fU, 0x596e3795U, 0x6a4c2613U,
 
736
    0x3a2c160bU, 0x10ebfbf3U, 0x7aa7dde0U, 0xb2dc6e37U,
 
737
};
 
738
 
 
739
static const ulong32 T4[256] = {
 
740
    0xa7a7a7a7U, 0xd3d3d3d3U, 0xe6e6e6e6U, 0x71717171U,
 
741
    0xd0d0d0d0U, 0xacacacacU, 0x4d4d4d4dU, 0x79797979U,
 
742
    0x3a3a3a3aU, 0xc9c9c9c9U, 0x91919191U, 0xfcfcfcfcU,
 
743
    0x1e1e1e1eU, 0x47474747U, 0x54545454U, 0xbdbdbdbdU,
 
744
    0x8c8c8c8cU, 0xa5a5a5a5U, 0x7a7a7a7aU, 0xfbfbfbfbU,
 
745
    0x63636363U, 0xb8b8b8b8U, 0xddddddddU, 0xd4d4d4d4U,
 
746
    0xe5e5e5e5U, 0xb3b3b3b3U, 0xc5c5c5c5U, 0xbebebebeU,
 
747
    0xa9a9a9a9U, 0x88888888U, 0x0c0c0c0cU, 0xa2a2a2a2U,
 
748
    0x39393939U, 0xdfdfdfdfU, 0x29292929U, 0xdadadadaU,
 
749
    0x2b2b2b2bU, 0xa8a8a8a8U, 0xcbcbcbcbU, 0x4c4c4c4cU,
 
750
    0x4b4b4b4bU, 0x22222222U, 0xaaaaaaaaU, 0x24242424U,
 
751
    0x41414141U, 0x70707070U, 0xa6a6a6a6U, 0xf9f9f9f9U,
 
752
    0x5a5a5a5aU, 0xe2e2e2e2U, 0xb0b0b0b0U, 0x36363636U,
 
753
    0x7d7d7d7dU, 0xe4e4e4e4U, 0x33333333U, 0xffffffffU,
 
754
    0x60606060U, 0x20202020U, 0x08080808U, 0x8b8b8b8bU,
 
755
    0x5e5e5e5eU, 0xababababU, 0x7f7f7f7fU, 0x78787878U,
 
756
    0x7c7c7c7cU, 0x2c2c2c2cU, 0x57575757U, 0xd2d2d2d2U,
 
757
    0xdcdcdcdcU, 0x6d6d6d6dU, 0x7e7e7e7eU, 0x0d0d0d0dU,
 
758
    0x53535353U, 0x94949494U, 0xc3c3c3c3U, 0x28282828U,
 
759
    0x27272727U, 0x06060606U, 0x5f5f5f5fU, 0xadadadadU,
 
760
    0x67676767U, 0x5c5c5c5cU, 0x55555555U, 0x48484848U,
 
761
    0x0e0e0e0eU, 0x52525252U, 0xeaeaeaeaU, 0x42424242U,
 
762
    0x5b5b5b5bU, 0x5d5d5d5dU, 0x30303030U, 0x58585858U,
 
763
    0x51515151U, 0x59595959U, 0x3c3c3c3cU, 0x4e4e4e4eU,
 
764
    0x38383838U, 0x8a8a8a8aU, 0x72727272U, 0x14141414U,
 
765
    0xe7e7e7e7U, 0xc6c6c6c6U, 0xdedededeU, 0x50505050U,
 
766
    0x8e8e8e8eU, 0x92929292U, 0xd1d1d1d1U, 0x77777777U,
 
767
    0x93939393U, 0x45454545U, 0x9a9a9a9aU, 0xcecececeU,
 
768
    0x2d2d2d2dU, 0x03030303U, 0x62626262U, 0xb6b6b6b6U,
 
769
    0xb9b9b9b9U, 0xbfbfbfbfU, 0x96969696U, 0x6b6b6b6bU,
 
770
    0x3f3f3f3fU, 0x07070707U, 0x12121212U, 0xaeaeaeaeU,
 
771
    0x40404040U, 0x34343434U, 0x46464646U, 0x3e3e3e3eU,
 
772
    0xdbdbdbdbU, 0xcfcfcfcfU, 0xececececU, 0xccccccccU,
 
773
    0xc1c1c1c1U, 0xa1a1a1a1U, 0xc0c0c0c0U, 0xd6d6d6d6U,
 
774
    0x1d1d1d1dU, 0xf4f4f4f4U, 0x61616161U, 0x3b3b3b3bU,
 
775
    0x10101010U, 0xd8d8d8d8U, 0x68686868U, 0xa0a0a0a0U,
 
776
    0xb1b1b1b1U, 0x0a0a0a0aU, 0x69696969U, 0x6c6c6c6cU,
 
777
    0x49494949U, 0xfafafafaU, 0x76767676U, 0xc4c4c4c4U,
 
778
    0x9e9e9e9eU, 0x9b9b9b9bU, 0x6e6e6e6eU, 0x99999999U,
 
779
    0xc2c2c2c2U, 0xb7b7b7b7U, 0x98989898U, 0xbcbcbcbcU,
 
780
    0x8f8f8f8fU, 0x85858585U, 0x1f1f1f1fU, 0xb4b4b4b4U,
 
781
    0xf8f8f8f8U, 0x11111111U, 0x2e2e2e2eU, 0x00000000U,
 
782
    0x25252525U, 0x1c1c1c1cU, 0x2a2a2a2aU, 0x3d3d3d3dU,
 
783
    0x05050505U, 0x4f4f4f4fU, 0x7b7b7b7bU, 0xb2b2b2b2U,
 
784
    0x32323232U, 0x90909090U, 0xafafafafU, 0x19191919U,
 
785
    0xa3a3a3a3U, 0xf7f7f7f7U, 0x73737373U, 0x9d9d9d9dU,
 
786
    0x15151515U, 0x74747474U, 0xeeeeeeeeU, 0xcacacacaU,
 
787
    0x9f9f9f9fU, 0x0f0f0f0fU, 0x1b1b1b1bU, 0x75757575U,
 
788
    0x86868686U, 0x84848484U, 0x9c9c9c9cU, 0x4a4a4a4aU,
 
789
    0x97979797U, 0x1a1a1a1aU, 0x65656565U, 0xf6f6f6f6U,
 
790
    0xededededU, 0x09090909U, 0xbbbbbbbbU, 0x26262626U,
 
791
    0x83838383U, 0xebebebebU, 0x6f6f6f6fU, 0x81818181U,
 
792
    0x04040404U, 0x6a6a6a6aU, 0x43434343U, 0x01010101U,
 
793
    0x17171717U, 0xe1e1e1e1U, 0x87878787U, 0xf5f5f5f5U,
 
794
    0x8d8d8d8dU, 0xe3e3e3e3U, 0x23232323U, 0x80808080U,
 
795
    0x44444444U, 0x16161616U, 0x66666666U, 0x21212121U,
 
796
    0xfefefefeU, 0xd5d5d5d5U, 0x31313131U, 0xd9d9d9d9U,
 
797
    0x35353535U, 0x18181818U, 0x02020202U, 0x64646464U,
 
798
    0xf2f2f2f2U, 0xf1f1f1f1U, 0x56565656U, 0xcdcdcdcdU,
 
799
    0x82828282U, 0xc8c8c8c8U, 0xbabababaU, 0xf0f0f0f0U,
 
800
    0xefefefefU, 0xe9e9e9e9U, 0xe8e8e8e8U, 0xfdfdfdfdU,
 
801
    0x89898989U, 0xd7d7d7d7U, 0xc7c7c7c7U, 0xb5b5b5b5U,
 
802
    0xa4a4a4a4U, 0x2f2f2f2fU, 0x95959595U, 0x13131313U,
 
803
    0x0b0b0b0bU, 0xf3f3f3f3U, 0xe0e0e0e0U, 0x37373737U,
 
804
};
 
805
 
 
806
static const ulong32 T5[256] = {
 
807
    0x00000000U, 0x01020608U, 0x02040c10U, 0x03060a18U,
 
808
    0x04081820U, 0x050a1e28U, 0x060c1430U, 0x070e1238U,
 
809
    0x08103040U, 0x09123648U, 0x0a143c50U, 0x0b163a58U,
 
810
    0x0c182860U, 0x0d1a2e68U, 0x0e1c2470U, 0x0f1e2278U,
 
811
    0x10206080U, 0x11226688U, 0x12246c90U, 0x13266a98U,
 
812
    0x142878a0U, 0x152a7ea8U, 0x162c74b0U, 0x172e72b8U,
 
813
    0x183050c0U, 0x193256c8U, 0x1a345cd0U, 0x1b365ad8U,
 
814
    0x1c3848e0U, 0x1d3a4ee8U, 0x1e3c44f0U, 0x1f3e42f8U,
 
815
    0x2040c01dU, 0x2142c615U, 0x2244cc0dU, 0x2346ca05U,
 
816
    0x2448d83dU, 0x254ade35U, 0x264cd42dU, 0x274ed225U,
 
817
    0x2850f05dU, 0x2952f655U, 0x2a54fc4dU, 0x2b56fa45U,
 
818
    0x2c58e87dU, 0x2d5aee75U, 0x2e5ce46dU, 0x2f5ee265U,
 
819
    0x3060a09dU, 0x3162a695U, 0x3264ac8dU, 0x3366aa85U,
 
820
    0x3468b8bdU, 0x356abeb5U, 0x366cb4adU, 0x376eb2a5U,
 
821
    0x387090ddU, 0x397296d5U, 0x3a749ccdU, 0x3b769ac5U,
 
822
    0x3c7888fdU, 0x3d7a8ef5U, 0x3e7c84edU, 0x3f7e82e5U,
 
823
    0x40809d3aU, 0x41829b32U, 0x4284912aU, 0x43869722U,
 
824
    0x4488851aU, 0x458a8312U, 0x468c890aU, 0x478e8f02U,
 
825
    0x4890ad7aU, 0x4992ab72U, 0x4a94a16aU, 0x4b96a762U,
 
826
    0x4c98b55aU, 0x4d9ab352U, 0x4e9cb94aU, 0x4f9ebf42U,
 
827
    0x50a0fdbaU, 0x51a2fbb2U, 0x52a4f1aaU, 0x53a6f7a2U,
 
828
    0x54a8e59aU, 0x55aae392U, 0x56ace98aU, 0x57aeef82U,
 
829
    0x58b0cdfaU, 0x59b2cbf2U, 0x5ab4c1eaU, 0x5bb6c7e2U,
 
830
    0x5cb8d5daU, 0x5dbad3d2U, 0x5ebcd9caU, 0x5fbedfc2U,
 
831
    0x60c05d27U, 0x61c25b2fU, 0x62c45137U, 0x63c6573fU,
 
832
    0x64c84507U, 0x65ca430fU, 0x66cc4917U, 0x67ce4f1fU,
 
833
    0x68d06d67U, 0x69d26b6fU, 0x6ad46177U, 0x6bd6677fU,
 
834
    0x6cd87547U, 0x6dda734fU, 0x6edc7957U, 0x6fde7f5fU,
 
835
    0x70e03da7U, 0x71e23bafU, 0x72e431b7U, 0x73e637bfU,
 
836
    0x74e82587U, 0x75ea238fU, 0x76ec2997U, 0x77ee2f9fU,
 
837
    0x78f00de7U, 0x79f20befU, 0x7af401f7U, 0x7bf607ffU,
 
838
    0x7cf815c7U, 0x7dfa13cfU, 0x7efc19d7U, 0x7ffe1fdfU,
 
839
    0x801d2774U, 0x811f217cU, 0x82192b64U, 0x831b2d6cU,
 
840
    0x84153f54U, 0x8517395cU, 0x86113344U, 0x8713354cU,
 
841
    0x880d1734U, 0x890f113cU, 0x8a091b24U, 0x8b0b1d2cU,
 
842
    0x8c050f14U, 0x8d07091cU, 0x8e010304U, 0x8f03050cU,
 
843
    0x903d47f4U, 0x913f41fcU, 0x92394be4U, 0x933b4decU,
 
844
    0x94355fd4U, 0x953759dcU, 0x963153c4U, 0x973355ccU,
 
845
    0x982d77b4U, 0x992f71bcU, 0x9a297ba4U, 0x9b2b7dacU,
 
846
    0x9c256f94U, 0x9d27699cU, 0x9e216384U, 0x9f23658cU,
 
847
    0xa05de769U, 0xa15fe161U, 0xa259eb79U, 0xa35bed71U,
 
848
    0xa455ff49U, 0xa557f941U, 0xa651f359U, 0xa753f551U,
 
849
    0xa84dd729U, 0xa94fd121U, 0xaa49db39U, 0xab4bdd31U,
 
850
    0xac45cf09U, 0xad47c901U, 0xae41c319U, 0xaf43c511U,
 
851
    0xb07d87e9U, 0xb17f81e1U, 0xb2798bf9U, 0xb37b8df1U,
 
852
    0xb4759fc9U, 0xb57799c1U, 0xb67193d9U, 0xb77395d1U,
 
853
    0xb86db7a9U, 0xb96fb1a1U, 0xba69bbb9U, 0xbb6bbdb1U,
 
854
    0xbc65af89U, 0xbd67a981U, 0xbe61a399U, 0xbf63a591U,
 
855
    0xc09dba4eU, 0xc19fbc46U, 0xc299b65eU, 0xc39bb056U,
 
856
    0xc495a26eU, 0xc597a466U, 0xc691ae7eU, 0xc793a876U,
 
857
    0xc88d8a0eU, 0xc98f8c06U, 0xca89861eU, 0xcb8b8016U,
 
858
    0xcc85922eU, 0xcd879426U, 0xce819e3eU, 0xcf839836U,
 
859
    0xd0bddaceU, 0xd1bfdcc6U, 0xd2b9d6deU, 0xd3bbd0d6U,
 
860
    0xd4b5c2eeU, 0xd5b7c4e6U, 0xd6b1cefeU, 0xd7b3c8f6U,
 
861
    0xd8adea8eU, 0xd9afec86U, 0xdaa9e69eU, 0xdbabe096U,
 
862
    0xdca5f2aeU, 0xdda7f4a6U, 0xdea1febeU, 0xdfa3f8b6U,
 
863
    0xe0dd7a53U, 0xe1df7c5bU, 0xe2d97643U, 0xe3db704bU,
 
864
    0xe4d56273U, 0xe5d7647bU, 0xe6d16e63U, 0xe7d3686bU,
 
865
    0xe8cd4a13U, 0xe9cf4c1bU, 0xeac94603U, 0xebcb400bU,
 
866
    0xecc55233U, 0xedc7543bU, 0xeec15e23U, 0xefc3582bU,
 
867
    0xf0fd1ad3U, 0xf1ff1cdbU, 0xf2f916c3U, 0xf3fb10cbU,
 
868
    0xf4f502f3U, 0xf5f704fbU, 0xf6f10ee3U, 0xf7f308ebU,
 
869
    0xf8ed2a93U, 0xf9ef2c9bU, 0xfae92683U, 0xfbeb208bU,
 
870
    0xfce532b3U, 0xfde734bbU, 0xfee13ea3U, 0xffe338abU,
 
871
};
 
872
 
 
873
/**
 
874
 * The round constants.
 
875
 */
 
876
static const ulong32 rc[] = {
 
877
   0xa7d3e671U, 0xd0ac4d79U, 0x3ac991fcU, 0x1e4754bdU,
 
878
   0x8ca57afbU, 0x63b8ddd4U, 0xe5b3c5beU, 0xa9880ca2U,
 
879
   0x39df29daU, 0x2ba8cb4cU, 0x4b22aa24U, 0x4170a6f9U,
 
880
   0x5ae2b036U, 0x7de433ffU, 0x6020088bU, 0x5eab7f78U,
 
881
   0x7c2c57d2U, 0xdc6d7e0dU, 0x5394c328U,
 
882
};
 
883
 
 
884
#endif
 
885
 
 
886
 /**
 
887
    Initialize the Anubis block cipher
 
888
    @param key The symmetric key you wish to pass
 
889
    @param keylen The key length in bytes
 
890
    @param num_rounds The number of rounds desired (0 for default)
 
891
    @param skey The key in as scheduled by this function.
 
892
    @return CRYPT_OK if successful
 
893
 */
 
894
#ifdef LTC_CLEAN_STACK
 
895
static int _anubis_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey)
 
896
#else
 
897
int  anubis_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey)
 
898
#endif
 
899
{
 
900
   int N, R, i, pos, r;
 
901
   ulong32 kappa[MAX_N];
 
902
   ulong32 inter[MAX_N];
 
903
   ulong32 v, K0, K1, K2, K3;
 
904
 
 
905
   LTC_ARGCHK(key  != NULL);
 
906
   LTC_ARGCHK(skey != NULL);
 
907
 
 
908
   /* Valid sizes (in bytes) are 16, 20, 24, 28, 32, 36, and 40. */
 
909
   if ((keylen & 3) || (keylen < 16) || (keylen > 40)) {
 
910
      return CRYPT_INVALID_KEYSIZE;
 
911
   }
 
912
   skey->anubis.keyBits = keylen*8;
 
913
 
 
914
   /*
 
915
    * determine the N length parameter:
 
916
    * (N.B. it is assumed that the key length is valid!)
 
917
    */
 
918
   N = skey->anubis.keyBits >> 5;
 
919
 
 
920
   /*
 
921
    * determine number of rounds from key size:
 
922
    */
 
923
   skey->anubis.R = R = 8 + N;
 
924
 
 
925
   if (num_rounds != 0 && num_rounds != skey->anubis.R) {
 
926
      return CRYPT_INVALID_ROUNDS;
 
927
   }
 
928
 
 
929
    /*
 
930
    * map cipher key to initial key state (mu):
 
931
    */
 
932
    for (i = 0, pos = 0; i < N; i++, pos += 4) {
 
933
      kappa[i] =
 
934
         (key[pos    ] << 24) ^
 
935
         (key[pos + 1] << 16) ^
 
936
         (key[pos + 2] <<  8) ^
 
937
         (key[pos + 3]      );
 
938
    }
 
939
 
 
940
   /*
 
941
    * generate R + 1 round keys:
 
942
    */
 
943
   for (r = 0; r <= R; r++) {
 
944
      /*
 
945
       * generate r-th round key K^r:
 
946
       */
 
947
      K0 = T4[(kappa[N - 1] >> 24) & 0xff];
 
948
      K1 = T4[(kappa[N - 1] >> 16) & 0xff];
 
949
      K2 = T4[(kappa[N - 1] >>  8) & 0xff];
 
950
      K3 = T4[(kappa[N - 1]      ) & 0xff];
 
951
      for (i = N - 2; i >= 0; i--) {
 
952
         K0 = T4[(kappa[i] >> 24)  & 0xff] ^
 
953
            (T5[(K0 >> 24) & 0xff] & 0xff000000U) ^
 
954
            (T5[(K0 >> 16) & 0xff] & 0x00ff0000U) ^
 
955
            (T5[(K0 >>  8) & 0xff] & 0x0000ff00U) ^
 
956
            (T5[(K0      ) & 0xff] & 0x000000ffU);
 
957
         K1 = T4[(kappa[i] >> 16) & 0xff] ^
 
958
            (T5[(K1 >> 24) & 0xff] & 0xff000000U) ^
 
959
            (T5[(K1 >> 16) & 0xff] & 0x00ff0000U) ^
 
960
            (T5[(K1 >>  8) & 0xff] & 0x0000ff00U) ^
 
961
            (T5[(K1      ) & 0xff] & 0x000000ffU);
 
962
         K2 = T4[(kappa[i] >>  8) & 0xff] ^
 
963
            (T5[(K2 >> 24) & 0xff] & 0xff000000U) ^
 
964
            (T5[(K2 >> 16) & 0xff] & 0x00ff0000U) ^
 
965
            (T5[(K2 >>  8) & 0xff] & 0x0000ff00U) ^
 
966
            (T5[(K2      ) & 0xff] & 0x000000ffU);
 
967
         K3 = T4[(kappa[i]      ) & 0xff] ^
 
968
            (T5[(K3 >> 24) & 0xff] & 0xff000000U) ^
 
969
            (T5[(K3 >> 16) & 0xff] & 0x00ff0000U) ^
 
970
            (T5[(K3 >>  8) & 0xff] & 0x0000ff00U) ^
 
971
            (T5[(K3      ) & 0xff] & 0x000000ffU);
 
972
      }
 
973
      /*
 
974
      -- this is the code to use with the large U tables:
 
975
      K0 = K1 = K2 = K3 = 0;
 
976
      for (i = 0; i < N; i++) {
 
977
         K0 ^= U[i][(kappa[i] >> 24) & 0xff];
 
978
         K1 ^= U[i][(kappa[i] >> 16) & 0xff];
 
979
         K2 ^= U[i][(kappa[i] >>  8) & 0xff];
 
980
         K3 ^= U[i][(kappa[i]      ) & 0xff];
 
981
      }
 
982
      */
 
983
      skey->anubis.roundKeyEnc[r][0] = K0;
 
984
      skey->anubis.roundKeyEnc[r][1] = K1;
 
985
      skey->anubis.roundKeyEnc[r][2] = K2;
 
986
      skey->anubis.roundKeyEnc[r][3] = K3;
 
987
 
 
988
      /*
 
989
       * compute kappa^{r+1} from kappa^r:
 
990
       */
 
991
      if (r == R) {
 
992
         break;
 
993
      }
 
994
      for (i = 0; i < N; i++) {
 
995
         int j = i;
 
996
         inter[i]  = T0[(kappa[j--] >> 24) & 0xff]; if (j < 0) j = N - 1;
 
997
         inter[i] ^= T1[(kappa[j--] >> 16) & 0xff]; if (j < 0) j = N - 1;
 
998
         inter[i] ^= T2[(kappa[j--] >>  8) & 0xff]; if (j < 0) j = N - 1;
 
999
         inter[i] ^= T3[(kappa[j  ]      ) & 0xff];
 
1000
      }
 
1001
      kappa[0] = inter[0] ^ rc[r];
 
1002
      for (i = 1; i < N; i++) {
 
1003
         kappa[i] = inter[i];
 
1004
      }
 
1005
   }
 
1006
 
 
1007
   /*
 
1008
    * generate inverse key schedule: K'^0 = K^R, K'^R = K^0, K'^r = theta(K^{R-r}):
 
1009
    */
 
1010
   for (i = 0; i < 4; i++) {
 
1011
      skey->anubis.roundKeyDec[0][i] = skey->anubis.roundKeyEnc[R][i];
 
1012
      skey->anubis.roundKeyDec[R][i] = skey->anubis.roundKeyEnc[0][i];
 
1013
   }
 
1014
   for (r = 1; r < R; r++) {
 
1015
      for (i = 0; i < 4; i++) {
 
1016
         v = skey->anubis.roundKeyEnc[R - r][i];
 
1017
         skey->anubis.roundKeyDec[r][i] =
 
1018
            T0[T4[(v >> 24) & 0xff] & 0xff] ^
 
1019
            T1[T4[(v >> 16) & 0xff] & 0xff] ^
 
1020
            T2[T4[(v >>  8) & 0xff] & 0xff] ^
 
1021
            T3[T4[(v      ) & 0xff] & 0xff];
 
1022
      }
 
1023
   }
 
1024
 
 
1025
   return CRYPT_OK;
 
1026
}
 
1027
 
 
1028
#ifdef LTC_CLEAN_STACK
 
1029
int  anubis_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey)
 
1030
{
 
1031
  int err;
 
1032
  err = _anubis_setup(key, keylen, num_rounds, skey);
 
1033
  burn_stack(sizeof(int) * 5 + sizeof(ulong32) * (MAX_N + MAX_N + 5));
 
1034
  return err;
 
1035
}
 
1036
#endif
 
1037
  
 
1038
 
 
1039
static void anubis_crypt(const unsigned char *plaintext, unsigned char *ciphertext,
 
1040
                         ulong32 roundKey[18 + 1][4], int R) {
 
1041
   int i, pos, r;
 
1042
   ulong32 state[4];
 
1043
   ulong32 inter[4];
 
1044
 
 
1045
    /*
 
1046
    * map plaintext block to cipher state (mu)
 
1047
    * and add initial round key (sigma[K^0]):
 
1048
    */
 
1049
    for (i = 0, pos = 0; i < 4; i++, pos += 4) {
 
1050
      state[i] =
 
1051
         (plaintext[pos    ] << 24) ^
 
1052
         (plaintext[pos + 1] << 16) ^
 
1053
         (plaintext[pos + 2] <<  8) ^
 
1054
         (plaintext[pos + 3]      ) ^
 
1055
         roundKey[0][i];
 
1056
    }
 
1057
 
 
1058
    /*
 
1059
     * R - 1 full rounds:
 
1060
     */
 
1061
    for (r = 1; r < R; r++) {
 
1062
      inter[0] =
 
1063
         T0[(state[0] >> 24) & 0xff] ^
 
1064
         T1[(state[1] >> 24) & 0xff] ^
 
1065
         T2[(state[2] >> 24) & 0xff] ^
 
1066
         T3[(state[3] >> 24) & 0xff] ^
 
1067
         roundKey[r][0];
 
1068
      inter[1] =
 
1069
         T0[(state[0] >> 16) & 0xff] ^
 
1070
         T1[(state[1] >> 16) & 0xff] ^
 
1071
         T2[(state[2] >> 16) & 0xff] ^
 
1072
         T3[(state[3] >> 16) & 0xff] ^
 
1073
         roundKey[r][1];
 
1074
      inter[2] =
 
1075
         T0[(state[0] >>  8) & 0xff] ^
 
1076
         T1[(state[1] >>  8) & 0xff] ^
 
1077
         T2[(state[2] >>  8) & 0xff] ^
 
1078
         T3[(state[3] >>  8) & 0xff] ^
 
1079
         roundKey[r][2];
 
1080
      inter[3] =
 
1081
         T0[(state[0]      ) & 0xff] ^
 
1082
         T1[(state[1]      ) & 0xff] ^
 
1083
         T2[(state[2]      ) & 0xff] ^
 
1084
         T3[(state[3]      ) & 0xff] ^
 
1085
         roundKey[r][3];
 
1086
      state[0] = inter[0];
 
1087
      state[1] = inter[1];
 
1088
      state[2] = inter[2];
 
1089
      state[3] = inter[3];
 
1090
    }
 
1091
 
 
1092
    /*
 
1093
    * last round:
 
1094
    */
 
1095
   inter[0] =
 
1096
      (T0[(state[0] >> 24) & 0xff] & 0xff000000U) ^
 
1097
      (T1[(state[1] >> 24) & 0xff] & 0x00ff0000U) ^
 
1098
      (T2[(state[2] >> 24) & 0xff] & 0x0000ff00U) ^
 
1099
      (T3[(state[3] >> 24) & 0xff] & 0x000000ffU) ^
 
1100
      roundKey[R][0];
 
1101
   inter[1] =
 
1102
      (T0[(state[0] >> 16) & 0xff] & 0xff000000U) ^
 
1103
      (T1[(state[1] >> 16) & 0xff] & 0x00ff0000U) ^
 
1104
      (T2[(state[2] >> 16) & 0xff] & 0x0000ff00U) ^
 
1105
      (T3[(state[3] >> 16) & 0xff] & 0x000000ffU) ^
 
1106
      roundKey[R][1];
 
1107
   inter[2] =
 
1108
      (T0[(state[0] >>  8) & 0xff] & 0xff000000U) ^
 
1109
      (T1[(state[1] >>  8) & 0xff] & 0x00ff0000U) ^
 
1110
      (T2[(state[2] >>  8) & 0xff] & 0x0000ff00U) ^
 
1111
      (T3[(state[3] >>  8) & 0xff] & 0x000000ffU) ^
 
1112
      roundKey[R][2];
 
1113
   inter[3] =
 
1114
      (T0[(state[0]      ) & 0xff] & 0xff000000U) ^
 
1115
      (T1[(state[1]      ) & 0xff] & 0x00ff0000U) ^
 
1116
      (T2[(state[2]      ) & 0xff] & 0x0000ff00U) ^
 
1117
      (T3[(state[3]      ) & 0xff] & 0x000000ffU) ^
 
1118
      roundKey[R][3];
 
1119
 
 
1120
   /*
 
1121
    * map cipher state to ciphertext block (mu^{-1}):
 
1122
    */
 
1123
    for (i = 0, pos = 0; i < 4; i++, pos += 4) {
 
1124
        ulong32 w = inter[i];
 
1125
        ciphertext[pos    ] = (unsigned char)(w >> 24);
 
1126
        ciphertext[pos + 1] = (unsigned char)(w >> 16);
 
1127
        ciphertext[pos + 2] = (unsigned char)(w >>  8);
 
1128
        ciphertext[pos + 3] = (unsigned char)(w      );
 
1129
    }
 
1130
}
 
1131
 
 
1132
/**
 
1133
  Encrypts a block of text with Anubis
 
1134
  @param pt The input plaintext (16 bytes)
 
1135
  @param ct The output ciphertext (16 bytes)
 
1136
  @param skey The key as scheduled
 
1137
  @return CRYPT_OK if successful
 
1138
*/
 
1139
int anubis_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey)
 
1140
{
 
1141
   LTC_ARGCHK(pt   != NULL);
 
1142
   LTC_ARGCHK(ct   != NULL);
 
1143
   LTC_ARGCHK(skey != NULL);
 
1144
   anubis_crypt(pt, ct, skey->anubis.roundKeyEnc, skey->anubis.R);
 
1145
   return CRYPT_OK;
 
1146
}
 
1147
 
 
1148
/**
 
1149
  Decrypts a block of text with Anubis
 
1150
  @param ct The input ciphertext (16 bytes)
 
1151
  @param pt The output plaintext (16 bytes)
 
1152
  @param skey The key as scheduled 
 
1153
  @return CRYPT_OK if successful
 
1154
*/
 
1155
int anubis_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey)
 
1156
{
 
1157
   LTC_ARGCHK(pt   != NULL);
 
1158
   LTC_ARGCHK(ct   != NULL);
 
1159
   LTC_ARGCHK(skey != NULL);
 
1160
   anubis_crypt(ct, pt, skey->anubis.roundKeyDec, skey->anubis.R);
 
1161
   return CRYPT_OK;
 
1162
}
 
1163
 
 
1164
/**
 
1165
  Performs a self-test of the Anubis block cipher
 
1166
  @return CRYPT_OK if functional, CRYPT_NOP if self-test has been disabled
 
1167
*/
 
1168
int anubis_test(void)
 
1169
{
 
1170
#if !defined(LTC_TEST)
 
1171
  return CRYPT_NOP;
 
1172
#else
 
1173
  static const struct test {
 
1174
     int keylen;
 
1175
     unsigned char pt[16], ct[16], key[40];
 
1176
  } tests[] = {
 
1177
#ifndef ANUBIS_TWEAK
 
1178
  /**** ORIGINAL ANUBIS ****/
 
1179
  /* 128 bit keys */
 
1180
{
 
1181
   16,
 
1182
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1183
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
 
1184
   { 0xF0, 0x68, 0x60, 0xFC, 0x67, 0x30, 0xE8, 0x18, 
 
1185
     0xF1, 0x32, 0xC7, 0x8A, 0xF4, 0x13, 0x2A, 0xFE },
 
1186
   { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1187
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
 
1188
}, {
 
1189
   16,
 
1190
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1191
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
 
1192
   { 0xA8, 0x66, 0x84, 0x80, 0x07, 0x74, 0x5C, 0x89, 
 
1193
     0xFC, 0x5E, 0xB5, 0xBA, 0xD4, 0xFE, 0x32, 0x6D },
 
1194
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1195
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }
 
1196
},
 
1197
 
 
1198
   /* 160-bit keys */
 
1199
{
 
1200
   20,
 
1201
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1202
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
 
1203
   { 0xBD, 0x5E, 0x32, 0xBE, 0x51, 0x67, 0xA8, 0xE2,
 
1204
     0x72, 0xD7, 0x95, 0x0F, 0x83, 0xC6, 0x8C, 0x31 },
 
1205
   { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1206
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1207
     0x00, 0x00, 0x00, 0x00 }
 
1208
}, {
 
1209
   20,
 
1210
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1211
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
 
1212
   { 0x4C, 0x1F, 0x86, 0x2E, 0x11, 0xEB, 0xCE, 0xEB,
 
1213
     0xFE, 0xB9, 0x73, 0xC9, 0xDF, 0xEF, 0x7A, 0xDB },
 
1214
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1215
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1216
     0x00, 0x00, 0x00, 0x01 }
 
1217
},
 
1218
 
 
1219
  /* 192-bit keys */
 
1220
{
 
1221
   24,
 
1222
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1223
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
 
1224
   { 0x17, 0xAC, 0x57, 0x44, 0x9D, 0x59, 0x61, 0x66, 
 
1225
     0xD0, 0xC7, 0x9E, 0x04, 0x7C, 0xC7, 0x58, 0xF0 },
 
1226
   { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1227
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1228
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
 
1229
}, {
 
1230
   24,
 
1231
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1232
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
 
1233
   { 0x71, 0x52, 0xB4, 0xEB, 0x1D, 0xAA, 0x36, 0xFD, 
 
1234
     0x57, 0x14, 0x5F, 0x57, 0x04, 0x9F, 0x70, 0x74 },
 
1235
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1236
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1237
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }
 
1238
},
 
1239
 
 
1240
  /* 224-bit keys */
 
1241
{
 
1242
   28,
 
1243
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1244
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
 
1245
   { 0xA2, 0xF0, 0xA6, 0xB9, 0x17, 0x93, 0x2A, 0x3B, 
 
1246
     0xEF, 0x08, 0xE8, 0x7A, 0x58, 0xD6, 0xF8, 0x53 },
 
1247
   { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1248
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1249
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1250
     0x00, 0x00, 0x00, 0x00 }
 
1251
}, {
 
1252
   28,
 
1253
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1254
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
 
1255
   { 0xF0, 0xCA, 0xFC, 0x78, 0x8B, 0x4B, 0x4E, 0x53, 
 
1256
     0x8B, 0xC4, 0x32, 0x6A, 0xF5, 0xB9, 0x1B, 0x5F },
 
1257
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1258
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1259
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1260
     0x00, 0x00, 0x00, 0x01 }
 
1261
},
 
1262
 
 
1263
  /* 256-bit keys */
 
1264
{
 
1265
   32,
 
1266
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1267
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
 
1268
   { 0xE0, 0x86, 0xAC, 0x45, 0x6B, 0x3C, 0xE5, 0x13, 
 
1269
     0xED, 0xF5, 0xDF, 0xDD, 0xD6, 0x3B, 0x71, 0x93 },
 
1270
   { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1271
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1272
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1273
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
 
1274
}, {
 
1275
   32,
 
1276
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1277
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
 
1278
   { 0x50, 0x01, 0xB9, 0xF5, 0x21, 0xC1, 0xC1, 0x29, 
 
1279
     0x00, 0xD5, 0xEC, 0x98, 0x2B, 0x9E, 0xE8, 0x21 },
 
1280
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1281
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1282
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1283
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }
 
1284
},
 
1285
 
 
1286
  /* 288-bit keys */
 
1287
{
 
1288
   36,
 
1289
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1290
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
 
1291
   { 0xE8, 0xF4, 0xAF, 0x2B, 0x21, 0xA0, 0x87, 0x9B, 
 
1292
     0x41, 0x95, 0xB9, 0x71, 0x75, 0x79, 0x04, 0x7C },
 
1293
   { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1294
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1295
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1296
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1297
     0x00, 0x00, 0x00, 0x00 }
 
1298
}, {
 
1299
   36,
 
1300
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1301
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
 
1302
   { 0xE6, 0xA6, 0xA5, 0xBC, 0x8B, 0x63, 0x6F, 0xE2, 
 
1303
     0xBD, 0xA7, 0xA7, 0x53, 0xAB, 0x40, 0x22, 0xE0 },
 
1304
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1305
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1306
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1307
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1308
     0x00, 0x00, 0x00, 0x01 }
 
1309
},
 
1310
 
 
1311
  /* 320-bit keys */
 
1312
{
 
1313
   40,
 
1314
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1315
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
 
1316
   { 0x17, 0x04, 0xD7, 0x2C, 0xC6, 0x85, 0x76, 0x02, 
 
1317
     0x4B, 0xCC, 0x39, 0x80, 0xD8, 0x22, 0xEA, 0xA4 },
 
1318
   { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1319
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1320
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1321
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1322
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
 
1323
}, {
 
1324
   40,
 
1325
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1326
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
 
1327
   { 0x7A, 0x41, 0xE6, 0x7D, 0x4F, 0xD8, 0x64, 0xF0, 
 
1328
     0x44, 0xA8, 0x3C, 0x73, 0x81, 0x7E, 0x53, 0xD8 },
 
1329
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1330
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1331
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1332
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1333
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }
 
1334
}
 
1335
#else
 
1336
  /**** Tweaked ANUBIS ****/
 
1337
  /* 128 bit keys */
 
1338
{
 
1339
   16,
 
1340
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1341
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
 
1342
   { 0xB8, 0x35, 0xBD, 0xC3, 0x34, 0x82, 0x9D, 0x83,
 
1343
     0x71, 0xBF, 0xA3, 0x71, 0xE4, 0xB3, 0xC4, 0xFD },
 
1344
   { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1345
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
 
1346
}, {
 
1347
   16,
 
1348
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1349
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
 
1350
   { 0xE6, 0x14, 0x1E, 0xAF, 0xEB, 0xE0, 0x59, 0x3C,
 
1351
     0x48, 0xE1, 0xCD, 0xF2, 0x1B, 0xBA, 0xA1, 0x89 },
 
1352
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1353
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }
 
1354
},
 
1355
 
 
1356
   /* 160-bit keys */
 
1357
{
 
1358
   20,
 
1359
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1360
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
 
1361
   { 0x97, 0x59, 0x79, 0x4B, 0x5C, 0xA0, 0x70, 0x73,
 
1362
     0x24, 0xEF, 0xB3, 0x58, 0x67, 0xCA, 0xD4, 0xB3 },
 
1363
   { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1364
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1365
     0x00, 0x00, 0x00, 0x00 }
 
1366
}, {
 
1367
   20,
 
1368
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1369
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
 
1370
   { 0xB8, 0x0D, 0xFB, 0x9B, 0xE4, 0xA1, 0x58, 0x87,
 
1371
     0xB3, 0x76, 0xD5, 0x02, 0x18, 0x95, 0xC1, 0x2E },
 
1372
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1373
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1374
     0x00, 0x00, 0x00, 0x01 }
 
1375
},
 
1376
 
 
1377
  /* 192-bit keys */
 
1378
{
 
1379
   24,
 
1380
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1381
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
 
1382
   { 0x7D, 0x62, 0x3B, 0x52, 0xC7, 0x4C, 0x64, 0xD8,
 
1383
     0xEB, 0xC7, 0x2D, 0x57, 0x97, 0x85, 0x43, 0x8F },
 
1384
   { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1385
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1386
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
 
1387
}, {
 
1388
   24,
 
1389
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1390
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
 
1391
   { 0xB1, 0x0A, 0x59, 0xDD, 0x5D, 0x5D, 0x8D, 0x67,
 
1392
     0xEC, 0xEE, 0x4A, 0xC4, 0xBE, 0x4F, 0xA8, 0x4F },
 
1393
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1394
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1395
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }
 
1396
},
 
1397
 
 
1398
  /* 224-bit keys */
 
1399
{
 
1400
   28,
 
1401
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1402
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
 
1403
   { 0x68, 0x9E, 0x05, 0x94, 0x6A, 0x94, 0x43, 0x8F,
 
1404
     0xE7, 0x8E, 0x37, 0x3D, 0x24, 0x97, 0x92, 0xF5 },
 
1405
   { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1406
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1407
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1408
     0x00, 0x00, 0x00, 0x00 }
 
1409
}, {
 
1410
   28,
 
1411
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1412
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
 
1413
   { 0xDD, 0xB7, 0xB0, 0xB4, 0xE9, 0xB4, 0x9B, 0x9C,
 
1414
     0x38, 0x20, 0x25, 0x0B, 0x47, 0xC2, 0x1F, 0x89 },
 
1415
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1416
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1417
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1418
     0x00, 0x00, 0x00, 0x01 }
 
1419
},
 
1420
 
 
1421
  /* 256-bit keys */
 
1422
{
 
1423
   32,
 
1424
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1425
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
 
1426
   { 0x96, 0x00, 0xF0, 0x76, 0x91, 0x69, 0x29, 0x87,
 
1427
     0xF5, 0xE5, 0x97, 0xDB, 0xDB, 0xAF, 0x1B, 0x0A },
 
1428
   { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1429
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1430
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1431
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
 
1432
}, {
 
1433
   32,
 
1434
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1435
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
 
1436
   { 0x69, 0x9C, 0xAF, 0xDD, 0x94, 0xC7, 0xBC, 0x60,
 
1437
     0x44, 0xFE, 0x02, 0x05, 0x8A, 0x6E, 0xEF, 0xBD },
 
1438
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1439
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1440
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1441
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }
 
1442
},
 
1443
 
 
1444
  /* 288-bit keys */
 
1445
{
 
1446
   36,
 
1447
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1448
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
 
1449
   { 0x0F, 0xC7, 0xA2, 0xC0, 0x11, 0x17, 0xAC, 0x43,
 
1450
     0x52, 0x5E, 0xDF, 0x6C, 0xF3, 0x96, 0x33, 0x6C },
 
1451
   { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1452
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1453
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1454
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1455
     0x00, 0x00, 0x00, 0x00 }
 
1456
}, {
 
1457
   36,
 
1458
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1459
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
 
1460
   { 0xAD, 0x08, 0x4F, 0xED, 0x55, 0xA6, 0x94, 0x3E,
 
1461
     0x7E, 0x5E, 0xED, 0x05, 0xA1, 0x9D, 0x41, 0xB4 },
 
1462
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1463
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1464
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1465
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1466
     0x00, 0x00, 0x00, 0x01 }
 
1467
},
 
1468
 
 
1469
  /* 320-bit keys */
 
1470
{
 
1471
   40,
 
1472
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1473
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
 
1474
   { 0xFE, 0xE2, 0x0E, 0x2A, 0x9D, 0xC5, 0x83, 0xBA,
 
1475
     0xA3, 0xA6, 0xD6, 0xA6, 0xF2, 0xE8, 0x06, 0xA5 },
 
1476
   { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1477
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1478
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1479
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1480
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
 
1481
}, {
 
1482
   40,
 
1483
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1484
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
 
1485
   { 0x86, 0x3D, 0xCC, 0x4A, 0x60, 0x34, 0x9C, 0x28,
 
1486
     0xA7, 0xDA, 0xA4, 0x3B, 0x0A, 0xD7, 0xFD, 0xC7 },
 
1487
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1488
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1489
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1490
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
1491
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }
 
1492
}
 
1493
#endif
 
1494
};
 
1495
   int x, y;
 
1496
   unsigned char buf[2][16];
 
1497
   symmetric_key skey;
 
1498
 
 
1499
   for (x = 0; x < (int)(sizeof(tests)/sizeof(tests[0])); x++) {
 
1500
       anubis_setup(tests[x].key, tests[x].keylen, 0, &skey);
 
1501
       anubis_ecb_encrypt(tests[x].pt, buf[0], &skey);
 
1502
       anubis_ecb_decrypt(buf[0], buf[1], &skey);
 
1503
       if (XMEMCMP(buf[0], tests[x].ct, 16) || XMEMCMP(buf[1], tests[x].pt, 16)) {
 
1504
          return CRYPT_FAIL_TESTVECTOR;
 
1505
       }
 
1506
 
 
1507
       for (y = 0; y < 1000; y++) anubis_ecb_encrypt(buf[0], buf[0], &skey);
 
1508
       for (y = 0; y < 1000; y++) anubis_ecb_decrypt(buf[0], buf[0], &skey);
 
1509
       if (XMEMCMP(buf[0], tests[x].ct, 16)) {
 
1510
          return CRYPT_FAIL_TESTVECTOR;
 
1511
       }
 
1512
 
 
1513
   }
 
1514
   return CRYPT_OK;
 
1515
#endif
 
1516
}
 
1517
 
 
1518
/** Terminate the context 
 
1519
   @param skey    The scheduled key
 
1520
*/
 
1521
void anubis_done(symmetric_key *skey)
 
1522
{
 
1523
}
 
1524
 
 
1525
/**
 
1526
  Gets suitable key size
 
1527
  @param keysize [in/out] The length of the recommended key (in bytes).  This function will store the suitable size back in this variable.
 
1528
  @return CRYPT_OK if the input key size is acceptable.
 
1529
*/
 
1530
int anubis_keysize(int *keysize)
 
1531
{
 
1532
   LTC_ARGCHK(keysize != NULL);
 
1533
   if (*keysize >= 40) {
 
1534
      *keysize = 40;
 
1535
   } else if (*keysize >= 36) {
 
1536
      *keysize = 36;
 
1537
   } else if (*keysize >= 32) {
 
1538
      *keysize = 32;
 
1539
   } else if (*keysize >= 28) {
 
1540
      *keysize = 28;
 
1541
   } else if (*keysize >= 24) {
 
1542
      *keysize = 24;
 
1543
   } else if (*keysize >= 20) {
 
1544
      *keysize = 20;
 
1545
   } else if (*keysize >= 16) {
 
1546
      *keysize = 16;
 
1547
   } else {
 
1548
      return CRYPT_INVALID_KEYSIZE;
 
1549
   }
 
1550
   return CRYPT_OK;
 
1551
}
 
1552
 
 
1553
#endif
 
1554
 
1551
1555
 
1552
1556
/* $Source: /cvs/libtom/libtomcrypt/src/ciphers/anubis.c,v $ */
1553
 
/* $Revision: 1.7 $ */
1554
 
/* $Date: 2005/05/05 14:35:58 $ */
 
1557
/* $Revision: 1.15 $ */
 
1558
/* $Date: 2006/11/15 12:41:28 $ */