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