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