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