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