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