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