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