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