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
22const 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
53static 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
120static 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
187static 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
254static 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
321static 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
388static 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 */
458static 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
471static 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
538static 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
605static 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
672static 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
739static 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
806static 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 */
876static 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
895static int _anubis_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey)
896#else
897int  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
1029int  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
1039static 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*/
1139int 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*/
1155int 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*/
1168int 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*/
1521void 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*/
1530int 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
1555
1556/* $Source: /cvs/libtom/libtomcrypt/src/ciphers/anubis.c,v $ */
1557/* $Revision: 1.15 $ */
1558/* $Date: 2006/11/15 12:41:28 $ */
1559