1/*
2 * Cryptographic API.
3 *
4 * Anubis Algorithm
5 *
6 * The Anubis algorithm was developed by Paulo S. L. M. Barreto and
7 * Vincent Rijmen.
8 *
9 * See
10 *
11 *	P.S.L.M. Barreto, V. Rijmen,
12 *	``The Anubis block cipher,''
13 *	NESSIE submission, 2000.
14 *
15 * This software implements the "tweaked" version of Anubis.
16 * Only the S-box and (consequently) the rounds constants have been
17 * changed.
18 *
19 * The original authors have disclaimed all copyright interest in this
20 * code and thus put it in the public domain. The subsequent authors
21 * have put this under the GNU General Public License.
22 *
23 * By Aaron Grothe ajgrothe@yahoo.com, October 28, 2004
24 *
25 * This program is free software; you can redistribute it and/or modify
26 * it under the terms of the GNU General Public License as published by
27 * the Free Software Foundation; either version 2 of the License, or
28 * (at your option) any later version.
29 *
30 */
31
32#include <linux/init.h>
33#include <linux/module.h>
34#include <linux/mm.h>
35#include <asm/byteorder.h>
36#include <linux/crypto.h>
37#include <linux/types.h>
38
39#define ANUBIS_MIN_KEY_SIZE	16
40#define ANUBIS_MAX_KEY_SIZE	40
41#define ANUBIS_BLOCK_SIZE	16
42#define ANUBIS_MAX_N		10
43#define ANUBIS_MAX_ROUNDS	(8 + ANUBIS_MAX_N)
44
45struct anubis_ctx {
46	int key_len; // in bits
47	int R;
48	u32 E[ANUBIS_MAX_ROUNDS + 1][4];
49	u32 D[ANUBIS_MAX_ROUNDS + 1][4];
50};
51
52static const u32 T0[256] = {
53	0xba69d2bbU, 0x54a84de5U, 0x2f5ebce2U, 0x74e8cd25U,
54	0x53a651f7U, 0xd3bb6bd0U, 0xd2b96fd6U, 0x4d9a29b3U,
55	0x50a05dfdU, 0xac458acfU, 0x8d070e09U, 0xbf63c6a5U,
56	0x70e0dd3dU, 0x52a455f1U, 0x9a29527bU, 0x4c982db5U,
57	0xeac98f46U, 0xd5b773c4U, 0x97336655U, 0xd1bf63dcU,
58	0x3366ccaaU, 0x51a259fbU, 0x5bb671c7U, 0xa651a2f3U,
59	0xdea15ffeU, 0x48903dadU, 0xa84d9ad7U, 0x992f5e71U,
60	0xdbab4be0U, 0x3264c8acU, 0xb773e695U, 0xfce5d732U,
61	0xe3dbab70U, 0x9e214263U, 0x913f7e41U, 0x9b2b567dU,
62	0xe2d9af76U, 0xbb6bd6bdU, 0x4182199bU, 0x6edca579U,
63	0xa557aef9U, 0xcb8b0b80U, 0x6bd6b167U, 0x95376e59U,
64	0xa15fbee1U, 0xf3fbeb10U, 0xb17ffe81U, 0x0204080cU,
65	0xcc851792U, 0xc49537a2U, 0x1d3a744eU, 0x14285078U,
66	0xc39b2bb0U, 0x63c69157U, 0xdaa94fe6U, 0x5dba69d3U,
67	0x5fbe61dfU, 0xdca557f2U, 0x7dfae913U, 0xcd871394U,
68	0x7ffee11fU, 0x5ab475c1U, 0x6cd8ad75U, 0x5cb86dd5U,
69	0xf7f3fb08U, 0x264c98d4U, 0xffe3db38U, 0xedc79354U,
70	0xe8cd874aU, 0x9d274e69U, 0x6fdea17fU, 0x8e010203U,
71	0x19326456U, 0xa05dbae7U, 0xf0fde71aU, 0x890f1e11U,
72	0x0f1e3c22U, 0x070e1c12U, 0xaf4386c5U, 0xfbebcb20U,
73	0x08102030U, 0x152a547eU, 0x0d1a342eU, 0x04081018U,
74	0x01020406U, 0x64c88d45U, 0xdfa35bf8U, 0x76ecc529U,
75	0x79f2f90bU, 0xdda753f4U, 0x3d7af48eU, 0x162c5874U,
76	0x3f7efc82U, 0x376edcb2U, 0x6ddaa973U, 0x3870e090U,
77	0xb96fdeb1U, 0x73e6d137U, 0xe9cf834cU, 0x356ad4beU,
78	0x55aa49e3U, 0x71e2d93bU, 0x7bf6f107U, 0x8c050a0fU,
79	0x72e4d531U, 0x880d1a17U, 0xf6f1ff0eU, 0x2a54a8fcU,
80	0x3e7cf884U, 0x5ebc65d9U, 0x274e9cd2U, 0x468c0589U,
81	0x0c183028U, 0x65ca8943U, 0x68d0bd6dU, 0x61c2995bU,
82	0x03060c0aU, 0xc19f23bcU, 0x57ae41efU, 0xd6b17fceU,
83	0xd9af43ecU, 0x58b07dcdU, 0xd8ad47eaU, 0x66cc8549U,
84	0xd7b37bc8U, 0x3a74e89cU, 0xc88d078aU, 0x3c78f088U,
85	0xfae9cf26U, 0x96316253U, 0xa753a6f5U, 0x982d5a77U,
86	0xecc59752U, 0xb86ddab7U, 0xc7933ba8U, 0xae4182c3U,
87	0x69d2b96bU, 0x4b9631a7U, 0xab4b96ddU, 0xa94f9ed1U,
88	0x67ce814fU, 0x0a14283cU, 0x478e018fU, 0xf2f9ef16U,
89	0xb577ee99U, 0x224488ccU, 0xe5d7b364U, 0xeec19f5eU,
90	0xbe61c2a3U, 0x2b56acfaU, 0x811f3e21U, 0x1224486cU,
91	0x831b362dU, 0x1b366c5aU, 0x0e1c3824U, 0x23468ccaU,
92	0xf5f7f304U, 0x458a0983U, 0x214284c6U, 0xce811f9eU,
93	0x499239abU, 0x2c58b0e8U, 0xf9efc32cU, 0xe6d1bf6eU,
94	0xb671e293U, 0x2850a0f0U, 0x172e5c72U, 0x8219322bU,
95	0x1a34685cU, 0x8b0b161dU, 0xfee1df3eU, 0x8a09121bU,
96	0x09122436U, 0xc98f038cU, 0x87132635U, 0x4e9c25b9U,
97	0xe1dfa37cU, 0x2e5cb8e4U, 0xe4d5b762U, 0xe0dda77aU,
98	0xebcb8b40U, 0x903d7a47U, 0xa455aaffU, 0x1e3c7844U,
99	0x85172e39U, 0x60c09d5dU, 0x00000000U, 0x254a94deU,
100	0xf4f5f702U, 0xf1ffe31cU, 0x94356a5fU, 0x0b162c3aU,
101	0xe7d3bb68U, 0x75eac923U, 0xefc39b58U, 0x3468d0b8U,
102	0x3162c4a6U, 0xd4b577c2U, 0xd0bd67daU, 0x86112233U,
103	0x7efce519U, 0xad478ec9U, 0xfde7d334U, 0x2952a4f6U,
104	0x3060c0a0U, 0x3b76ec9aU, 0x9f234665U, 0xf8edc72aU,
105	0xc6913faeU, 0x13264c6aU, 0x060c1814U, 0x050a141eU,
106	0xc59733a4U, 0x11224466U, 0x77eec12fU, 0x7cf8ed15U,
107	0x7af4f501U, 0x78f0fd0dU, 0x366cd8b4U, 0x1c387048U,
108	0x3972e496U, 0x59b279cbU, 0x18306050U, 0x56ac45e9U,
109	0xb37bf68dU, 0xb07dfa87U, 0x244890d8U, 0x204080c0U,
110	0xb279f28bU, 0x9239724bU, 0xa35bb6edU, 0xc09d27baU,
111	0x44880d85U, 0x62c49551U, 0x10204060U, 0xb475ea9fU,
112	0x84152a3fU, 0x43861197U, 0x933b764dU, 0xc2992fb6U,
113	0x4a9435a1U, 0xbd67cea9U, 0x8f030605U, 0x2d5ab4eeU,
114	0xbc65caafU, 0x9c254a6fU, 0x6ad4b561U, 0x40801d9dU,
115	0xcf831b98U, 0xa259b2ebU, 0x801d3a27U, 0x4f9e21bfU,
116	0x1f3e7c42U, 0xca890f86U, 0xaa4992dbU, 0x42841591U,
117};
118
119static const u32 T1[256] = {
120	0x69babbd2U, 0xa854e54dU, 0x5e2fe2bcU, 0xe87425cdU,
121	0xa653f751U, 0xbbd3d06bU, 0xb9d2d66fU, 0x9a4db329U,
122	0xa050fd5dU, 0x45accf8aU, 0x078d090eU, 0x63bfa5c6U,
123	0xe0703dddU, 0xa452f155U, 0x299a7b52U, 0x984cb52dU,
124	0xc9ea468fU, 0xb7d5c473U, 0x33975566U, 0xbfd1dc63U,
125	0x6633aaccU, 0xa251fb59U, 0xb65bc771U, 0x51a6f3a2U,
126	0xa1defe5fU, 0x9048ad3dU, 0x4da8d79aU, 0x2f99715eU,
127	0xabdbe04bU, 0x6432acc8U, 0x73b795e6U, 0xe5fc32d7U,
128	0xdbe370abU, 0x219e6342U, 0x3f91417eU, 0x2b9b7d56U,
129	0xd9e276afU, 0x6bbbbdd6U, 0x82419b19U, 0xdc6e79a5U,
130	0x57a5f9aeU, 0x8bcb800bU, 0xd66b67b1U, 0x3795596eU,
131	0x5fa1e1beU, 0xfbf310ebU, 0x7fb181feU, 0x04020c08U,
132	0x85cc9217U, 0x95c4a237U, 0x3a1d4e74U, 0x28147850U,
133	0x9bc3b02bU, 0xc6635791U, 0xa9dae64fU, 0xba5dd369U,
134	0xbe5fdf61U, 0xa5dcf257U, 0xfa7d13e9U, 0x87cd9413U,
135	0xfe7f1fe1U, 0xb45ac175U, 0xd86c75adU, 0xb85cd56dU,
136	0xf3f708fbU, 0x4c26d498U, 0xe3ff38dbU, 0xc7ed5493U,
137	0xcde84a87U, 0x279d694eU, 0xde6f7fa1U, 0x018e0302U,
138	0x32195664U, 0x5da0e7baU, 0xfdf01ae7U, 0x0f89111eU,
139	0x1e0f223cU, 0x0e07121cU, 0x43afc586U, 0xebfb20cbU,
140	0x10083020U, 0x2a157e54U, 0x1a0d2e34U, 0x08041810U,
141	0x02010604U, 0xc864458dU, 0xa3dff85bU, 0xec7629c5U,
142	0xf2790bf9U, 0xa7ddf453U, 0x7a3d8ef4U, 0x2c167458U,
143	0x7e3f82fcU, 0x6e37b2dcU, 0xda6d73a9U, 0x703890e0U,
144	0x6fb9b1deU, 0xe67337d1U, 0xcfe94c83U, 0x6a35bed4U,
145	0xaa55e349U, 0xe2713bd9U, 0xf67b07f1U, 0x058c0f0aU,
146	0xe47231d5U, 0x0d88171aU, 0xf1f60effU, 0x542afca8U,
147	0x7c3e84f8U, 0xbc5ed965U, 0x4e27d29cU, 0x8c468905U,
148	0x180c2830U, 0xca654389U, 0xd0686dbdU, 0xc2615b99U,
149	0x06030a0cU, 0x9fc1bc23U, 0xae57ef41U, 0xb1d6ce7fU,
150	0xafd9ec43U, 0xb058cd7dU, 0xadd8ea47U, 0xcc664985U,
151	0xb3d7c87bU, 0x743a9ce8U, 0x8dc88a07U, 0x783c88f0U,
152	0xe9fa26cfU, 0x31965362U, 0x53a7f5a6U, 0x2d98775aU,
153	0xc5ec5297U, 0x6db8b7daU, 0x93c7a83bU, 0x41aec382U,
154	0xd2696bb9U, 0x964ba731U, 0x4babdd96U, 0x4fa9d19eU,
155	0xce674f81U, 0x140a3c28U, 0x8e478f01U, 0xf9f216efU,
156	0x77b599eeU, 0x4422cc88U, 0xd7e564b3U, 0xc1ee5e9fU,
157	0x61bea3c2U, 0x562bfaacU, 0x1f81213eU, 0x24126c48U,
158	0x1b832d36U, 0x361b5a6cU, 0x1c0e2438U, 0x4623ca8cU,
159	0xf7f504f3U, 0x8a458309U, 0x4221c684U, 0x81ce9e1fU,
160	0x9249ab39U, 0x582ce8b0U, 0xeff92cc3U, 0xd1e66ebfU,
161	0x71b693e2U, 0x5028f0a0U, 0x2e17725cU, 0x19822b32U,
162	0x341a5c68U, 0x0b8b1d16U, 0xe1fe3edfU, 0x098a1b12U,
163	0x12093624U, 0x8fc98c03U, 0x13873526U, 0x9c4eb925U,
164	0xdfe17ca3U, 0x5c2ee4b8U, 0xd5e462b7U, 0xdde07aa7U,
165	0xcbeb408bU, 0x3d90477aU, 0x55a4ffaaU, 0x3c1e4478U,
166	0x1785392eU, 0xc0605d9dU, 0x00000000U, 0x4a25de94U,
167	0xf5f402f7U, 0xfff11ce3U, 0x35945f6aU, 0x160b3a2cU,
168	0xd3e768bbU, 0xea7523c9U, 0xc3ef589bU, 0x6834b8d0U,
169	0x6231a6c4U, 0xb5d4c277U, 0xbdd0da67U, 0x11863322U,
170	0xfc7e19e5U, 0x47adc98eU, 0xe7fd34d3U, 0x5229f6a4U,
171	0x6030a0c0U, 0x763b9aecU, 0x239f6546U, 0xedf82ac7U,
172	0x91c6ae3fU, 0x26136a4cU, 0x0c061418U, 0x0a051e14U,
173	0x97c5a433U, 0x22116644U, 0xee772fc1U, 0xf87c15edU,
174	0xf47a01f5U, 0xf0780dfdU, 0x6c36b4d8U, 0x381c4870U,
175	0x723996e4U, 0xb259cb79U, 0x30185060U, 0xac56e945U,
176	0x7bb38df6U, 0x7db087faU, 0x4824d890U, 0x4020c080U,
177	0x79b28bf2U, 0x39924b72U, 0x5ba3edb6U, 0x9dc0ba27U,
178	0x8844850dU, 0xc4625195U, 0x20106040U, 0x75b49feaU,
179	0x15843f2aU, 0x86439711U, 0x3b934d76U, 0x99c2b62fU,
180	0x944aa135U, 0x67bda9ceU, 0x038f0506U, 0x5a2deeb4U,
181	0x65bcafcaU, 0x259c6f4aU, 0xd46a61b5U, 0x80409d1dU,
182	0x83cf981bU, 0x59a2ebb2U, 0x1d80273aU, 0x9e4fbf21U,
183	0x3e1f427cU, 0x89ca860fU, 0x49aadb92U, 0x84429115U,
184};
185
186static const u32 T2[256] = {
187	0xd2bbba69U, 0x4de554a8U, 0xbce22f5eU, 0xcd2574e8U,
188	0x51f753a6U, 0x6bd0d3bbU, 0x6fd6d2b9U, 0x29b34d9aU,
189	0x5dfd50a0U, 0x8acfac45U, 0x0e098d07U, 0xc6a5bf63U,
190	0xdd3d70e0U, 0x55f152a4U, 0x527b9a29U, 0x2db54c98U,
191	0x8f46eac9U, 0x73c4d5b7U, 0x66559733U, 0x63dcd1bfU,
192	0xccaa3366U, 0x59fb51a2U, 0x71c75bb6U, 0xa2f3a651U,
193	0x5ffedea1U, 0x3dad4890U, 0x9ad7a84dU, 0x5e71992fU,
194	0x4be0dbabU, 0xc8ac3264U, 0xe695b773U, 0xd732fce5U,
195	0xab70e3dbU, 0x42639e21U, 0x7e41913fU, 0x567d9b2bU,
196	0xaf76e2d9U, 0xd6bdbb6bU, 0x199b4182U, 0xa5796edcU,
197	0xaef9a557U, 0x0b80cb8bU, 0xb1676bd6U, 0x6e599537U,
198	0xbee1a15fU, 0xeb10f3fbU, 0xfe81b17fU, 0x080c0204U,
199	0x1792cc85U, 0x37a2c495U, 0x744e1d3aU, 0x50781428U,
200	0x2bb0c39bU, 0x915763c6U, 0x4fe6daa9U, 0x69d35dbaU,
201	0x61df5fbeU, 0x57f2dca5U, 0xe9137dfaU, 0x1394cd87U,
202	0xe11f7ffeU, 0x75c15ab4U, 0xad756cd8U, 0x6dd55cb8U,
203	0xfb08f7f3U, 0x98d4264cU, 0xdb38ffe3U, 0x9354edc7U,
204	0x874ae8cdU, 0x4e699d27U, 0xa17f6fdeU, 0x02038e01U,
205	0x64561932U, 0xbae7a05dU, 0xe71af0fdU, 0x1e11890fU,
206	0x3c220f1eU, 0x1c12070eU, 0x86c5af43U, 0xcb20fbebU,
207	0x20300810U, 0x547e152aU, 0x342e0d1aU, 0x10180408U,
208	0x04060102U, 0x8d4564c8U, 0x5bf8dfa3U, 0xc52976ecU,
209	0xf90b79f2U, 0x53f4dda7U, 0xf48e3d7aU, 0x5874162cU,
210	0xfc823f7eU, 0xdcb2376eU, 0xa9736ddaU, 0xe0903870U,
211	0xdeb1b96fU, 0xd13773e6U, 0x834ce9cfU, 0xd4be356aU,
212	0x49e355aaU, 0xd93b71e2U, 0xf1077bf6U, 0x0a0f8c05U,
213	0xd53172e4U, 0x1a17880dU, 0xff0ef6f1U, 0xa8fc2a54U,
214	0xf8843e7cU, 0x65d95ebcU, 0x9cd2274eU, 0x0589468cU,
215	0x30280c18U, 0x894365caU, 0xbd6d68d0U, 0x995b61c2U,
216	0x0c0a0306U, 0x23bcc19fU, 0x41ef57aeU, 0x7fced6b1U,
217	0x43ecd9afU, 0x7dcd58b0U, 0x47ead8adU, 0x854966ccU,
218	0x7bc8d7b3U, 0xe89c3a74U, 0x078ac88dU, 0xf0883c78U,
219	0xcf26fae9U, 0x62539631U, 0xa6f5a753U, 0x5a77982dU,
220	0x9752ecc5U, 0xdab7b86dU, 0x3ba8c793U, 0x82c3ae41U,
221	0xb96b69d2U, 0x31a74b96U, 0x96ddab4bU, 0x9ed1a94fU,
222	0x814f67ceU, 0x283c0a14U, 0x018f478eU, 0xef16f2f9U,
223	0xee99b577U, 0x88cc2244U, 0xb364e5d7U, 0x9f5eeec1U,
224	0xc2a3be61U, 0xacfa2b56U, 0x3e21811fU, 0x486c1224U,
225	0x362d831bU, 0x6c5a1b36U, 0x38240e1cU, 0x8cca2346U,
226	0xf304f5f7U, 0x0983458aU, 0x84c62142U, 0x1f9ece81U,
227	0x39ab4992U, 0xb0e82c58U, 0xc32cf9efU, 0xbf6ee6d1U,
228	0xe293b671U, 0xa0f02850U, 0x5c72172eU, 0x322b8219U,
229	0x685c1a34U, 0x161d8b0bU, 0xdf3efee1U, 0x121b8a09U,
230	0x24360912U, 0x038cc98fU, 0x26358713U, 0x25b94e9cU,
231	0xa37ce1dfU, 0xb8e42e5cU, 0xb762e4d5U, 0xa77ae0ddU,
232	0x8b40ebcbU, 0x7a47903dU, 0xaaffa455U, 0x78441e3cU,
233	0x2e398517U, 0x9d5d60c0U, 0x00000000U, 0x94de254aU,
234	0xf702f4f5U, 0xe31cf1ffU, 0x6a5f9435U, 0x2c3a0b16U,
235	0xbb68e7d3U, 0xc92375eaU, 0x9b58efc3U, 0xd0b83468U,
236	0xc4a63162U, 0x77c2d4b5U, 0x67dad0bdU, 0x22338611U,
237	0xe5197efcU, 0x8ec9ad47U, 0xd334fde7U, 0xa4f62952U,
238	0xc0a03060U, 0xec9a3b76U, 0x46659f23U, 0xc72af8edU,
239	0x3faec691U, 0x4c6a1326U, 0x1814060cU, 0x141e050aU,
240	0x33a4c597U, 0x44661122U, 0xc12f77eeU, 0xed157cf8U,
241	0xf5017af4U, 0xfd0d78f0U, 0xd8b4366cU, 0x70481c38U,
242	0xe4963972U, 0x79cb59b2U, 0x60501830U, 0x45e956acU,
243	0xf68db37bU, 0xfa87b07dU, 0x90d82448U, 0x80c02040U,
244	0xf28bb279U, 0x724b9239U, 0xb6eda35bU, 0x27bac09dU,
245	0x0d854488U, 0x955162c4U, 0x40601020U, 0xea9fb475U,
246	0x2a3f8415U, 0x11974386U, 0x764d933bU, 0x2fb6c299U,
247	0x35a14a94U, 0xcea9bd67U, 0x06058f03U, 0xb4ee2d5aU,
248	0xcaafbc65U, 0x4a6f9c25U, 0xb5616ad4U, 0x1d9d4080U,
249	0x1b98cf83U, 0xb2eba259U, 0x3a27801dU, 0x21bf4f9eU,
250	0x7c421f3eU, 0x0f86ca89U, 0x92dbaa49U, 0x15914284U,
251};
252
253static const u32 T3[256] = {
254	0xbbd269baU, 0xe54da854U, 0xe2bc5e2fU, 0x25cde874U,
255	0xf751a653U, 0xd06bbbd3U, 0xd66fb9d2U, 0xb3299a4dU,
256	0xfd5da050U, 0xcf8a45acU, 0x090e078dU, 0xa5c663bfU,
257	0x3ddde070U, 0xf155a452U, 0x7b52299aU, 0xb52d984cU,
258	0x468fc9eaU, 0xc473b7d5U, 0x55663397U, 0xdc63bfd1U,
259	0xaacc6633U, 0xfb59a251U, 0xc771b65bU, 0xf3a251a6U,
260	0xfe5fa1deU, 0xad3d9048U, 0xd79a4da8U, 0x715e2f99U,
261	0xe04babdbU, 0xacc86432U, 0x95e673b7U, 0x32d7e5fcU,
262	0x70abdbe3U, 0x6342219eU, 0x417e3f91U, 0x7d562b9bU,
263	0x76afd9e2U, 0xbdd66bbbU, 0x9b198241U, 0x79a5dc6eU,
264	0xf9ae57a5U, 0x800b8bcbU, 0x67b1d66bU, 0x596e3795U,
265	0xe1be5fa1U, 0x10ebfbf3U, 0x81fe7fb1U, 0x0c080402U,
266	0x921785ccU, 0xa23795c4U, 0x4e743a1dU, 0x78502814U,
267	0xb02b9bc3U, 0x5791c663U, 0xe64fa9daU, 0xd369ba5dU,
268	0xdf61be5fU, 0xf257a5dcU, 0x13e9fa7dU, 0x941387cdU,
269	0x1fe1fe7fU, 0xc175b45aU, 0x75add86cU, 0xd56db85cU,
270	0x08fbf3f7U, 0xd4984c26U, 0x38dbe3ffU, 0x5493c7edU,
271	0x4a87cde8U, 0x694e279dU, 0x7fa1de6fU, 0x0302018eU,
272	0x56643219U, 0xe7ba5da0U, 0x1ae7fdf0U, 0x111e0f89U,
273	0x223c1e0fU, 0x121c0e07U, 0xc58643afU, 0x20cbebfbU,
274	0x30201008U, 0x7e542a15U, 0x2e341a0dU, 0x18100804U,
275	0x06040201U, 0x458dc864U, 0xf85ba3dfU, 0x29c5ec76U,
276	0x0bf9f279U, 0xf453a7ddU, 0x8ef47a3dU, 0x74582c16U,
277	0x82fc7e3fU, 0xb2dc6e37U, 0x73a9da6dU, 0x90e07038U,
278	0xb1de6fb9U, 0x37d1e673U, 0x4c83cfe9U, 0xbed46a35U,
279	0xe349aa55U, 0x3bd9e271U, 0x07f1f67bU, 0x0f0a058cU,
280	0x31d5e472U, 0x171a0d88U, 0x0efff1f6U, 0xfca8542aU,
281	0x84f87c3eU, 0xd965bc5eU, 0xd29c4e27U, 0x89058c46U,
282	0x2830180cU, 0x4389ca65U, 0x6dbdd068U, 0x5b99c261U,
283	0x0a0c0603U, 0xbc239fc1U, 0xef41ae57U, 0xce7fb1d6U,
284	0xec43afd9U, 0xcd7db058U, 0xea47add8U, 0x4985cc66U,
285	0xc87bb3d7U, 0x9ce8743aU, 0x8a078dc8U, 0x88f0783cU,
286	0x26cfe9faU, 0x53623196U, 0xf5a653a7U, 0x775a2d98U,
287	0x5297c5ecU, 0xb7da6db8U, 0xa83b93c7U, 0xc38241aeU,
288	0x6bb9d269U, 0xa731964bU, 0xdd964babU, 0xd19e4fa9U,
289	0x4f81ce67U, 0x3c28140aU, 0x8f018e47U, 0x16eff9f2U,
290	0x99ee77b5U, 0xcc884422U, 0x64b3d7e5U, 0x5e9fc1eeU,
291	0xa3c261beU, 0xfaac562bU, 0x213e1f81U, 0x6c482412U,
292	0x2d361b83U, 0x5a6c361bU, 0x24381c0eU, 0xca8c4623U,
293	0x04f3f7f5U, 0x83098a45U, 0xc6844221U, 0x9e1f81ceU,
294	0xab399249U, 0xe8b0582cU, 0x2cc3eff9U, 0x6ebfd1e6U,
295	0x93e271b6U, 0xf0a05028U, 0x725c2e17U, 0x2b321982U,
296	0x5c68341aU, 0x1d160b8bU, 0x3edfe1feU, 0x1b12098aU,
297	0x36241209U, 0x8c038fc9U, 0x35261387U, 0xb9259c4eU,
298	0x7ca3dfe1U, 0xe4b85c2eU, 0x62b7d5e4U, 0x7aa7dde0U,
299	0x408bcbebU, 0x477a3d90U, 0xffaa55a4U, 0x44783c1eU,
300	0x392e1785U, 0x5d9dc060U, 0x00000000U, 0xde944a25U,
301	0x02f7f5f4U, 0x1ce3fff1U, 0x5f6a3594U, 0x3a2c160bU,
302	0x68bbd3e7U, 0x23c9ea75U, 0x589bc3efU, 0xb8d06834U,
303	0xa6c46231U, 0xc277b5d4U, 0xda67bdd0U, 0x33221186U,
304	0x19e5fc7eU, 0xc98e47adU, 0x34d3e7fdU, 0xf6a45229U,
305	0xa0c06030U, 0x9aec763bU, 0x6546239fU, 0x2ac7edf8U,
306	0xae3f91c6U, 0x6a4c2613U, 0x14180c06U, 0x1e140a05U,
307	0xa43397c5U, 0x66442211U, 0x2fc1ee77U, 0x15edf87cU,
308	0x01f5f47aU, 0x0dfdf078U, 0xb4d86c36U, 0x4870381cU,
309	0x96e47239U, 0xcb79b259U, 0x50603018U, 0xe945ac56U,
310	0x8df67bb3U, 0x87fa7db0U, 0xd8904824U, 0xc0804020U,
311	0x8bf279b2U, 0x4b723992U, 0xedb65ba3U, 0xba279dc0U,
312	0x850d8844U, 0x5195c462U, 0x60402010U, 0x9fea75b4U,
313	0x3f2a1584U, 0x97118643U, 0x4d763b93U, 0xb62f99c2U,
314	0xa135944aU, 0xa9ce67bdU, 0x0506038fU, 0xeeb45a2dU,
315	0xafca65bcU, 0x6f4a259cU, 0x61b5d46aU, 0x9d1d8040U,
316	0x981b83cfU, 0xebb259a2U, 0x273a1d80U, 0xbf219e4fU,
317	0x427c3e1fU, 0x860f89caU, 0xdb9249aaU, 0x91158442U,
318};
319
320static const u32 T4[256] = {
321	0xbabababaU, 0x54545454U, 0x2f2f2f2fU, 0x74747474U,
322	0x53535353U, 0xd3d3d3d3U, 0xd2d2d2d2U, 0x4d4d4d4dU,
323	0x50505050U, 0xacacacacU, 0x8d8d8d8dU, 0xbfbfbfbfU,
324	0x70707070U, 0x52525252U, 0x9a9a9a9aU, 0x4c4c4c4cU,
325	0xeaeaeaeaU, 0xd5d5d5d5U, 0x97979797U, 0xd1d1d1d1U,
326	0x33333333U, 0x51515151U, 0x5b5b5b5bU, 0xa6a6a6a6U,
327	0xdedededeU, 0x48484848U, 0xa8a8a8a8U, 0x99999999U,
328	0xdbdbdbdbU, 0x32323232U, 0xb7b7b7b7U, 0xfcfcfcfcU,
329	0xe3e3e3e3U, 0x9e9e9e9eU, 0x91919191U, 0x9b9b9b9bU,
330	0xe2e2e2e2U, 0xbbbbbbbbU, 0x41414141U, 0x6e6e6e6eU,
331	0xa5a5a5a5U, 0xcbcbcbcbU, 0x6b6b6b6bU, 0x95959595U,
332	0xa1a1a1a1U, 0xf3f3f3f3U, 0xb1b1b1b1U, 0x02020202U,
333	0xccccccccU, 0xc4c4c4c4U, 0x1d1d1d1dU, 0x14141414U,
334	0xc3c3c3c3U, 0x63636363U, 0xdadadadaU, 0x5d5d5d5dU,
335	0x5f5f5f5fU, 0xdcdcdcdcU, 0x7d7d7d7dU, 0xcdcdcdcdU,
336	0x7f7f7f7fU, 0x5a5a5a5aU, 0x6c6c6c6cU, 0x5c5c5c5cU,
337	0xf7f7f7f7U, 0x26262626U, 0xffffffffU, 0xededededU,
338	0xe8e8e8e8U, 0x9d9d9d9dU, 0x6f6f6f6fU, 0x8e8e8e8eU,
339	0x19191919U, 0xa0a0a0a0U, 0xf0f0f0f0U, 0x89898989U,
340	0x0f0f0f0fU, 0x07070707U, 0xafafafafU, 0xfbfbfbfbU,
341	0x08080808U, 0x15151515U, 0x0d0d0d0dU, 0x04040404U,
342	0x01010101U, 0x64646464U, 0xdfdfdfdfU, 0x76767676U,
343	0x79797979U, 0xddddddddU, 0x3d3d3d3dU, 0x16161616U,
344	0x3f3f3f3fU, 0x37373737U, 0x6d6d6d6dU, 0x38383838U,
345	0xb9b9b9b9U, 0x73737373U, 0xe9e9e9e9U, 0x35353535U,
346	0x55555555U, 0x71717171U, 0x7b7b7b7bU, 0x8c8c8c8cU,
347	0x72727272U, 0x88888888U, 0xf6f6f6f6U, 0x2a2a2a2aU,
348	0x3e3e3e3eU, 0x5e5e5e5eU, 0x27272727U, 0x46464646U,
349	0x0c0c0c0cU, 0x65656565U, 0x68686868U, 0x61616161U,
350	0x03030303U, 0xc1c1c1c1U, 0x57575757U, 0xd6d6d6d6U,
351	0xd9d9d9d9U, 0x58585858U, 0xd8d8d8d8U, 0x66666666U,
352	0xd7d7d7d7U, 0x3a3a3a3aU, 0xc8c8c8c8U, 0x3c3c3c3cU,
353	0xfafafafaU, 0x96969696U, 0xa7a7a7a7U, 0x98989898U,
354	0xececececU, 0xb8b8b8b8U, 0xc7c7c7c7U, 0xaeaeaeaeU,
355	0x69696969U, 0x4b4b4b4bU, 0xababababU, 0xa9a9a9a9U,
356	0x67676767U, 0x0a0a0a0aU, 0x47474747U, 0xf2f2f2f2U,
357	0xb5b5b5b5U, 0x22222222U, 0xe5e5e5e5U, 0xeeeeeeeeU,
358	0xbebebebeU, 0x2b2b2b2bU, 0x81818181U, 0x12121212U,
359	0x83838383U, 0x1b1b1b1bU, 0x0e0e0e0eU, 0x23232323U,
360	0xf5f5f5f5U, 0x45454545U, 0x21212121U, 0xcecececeU,
361	0x49494949U, 0x2c2c2c2cU, 0xf9f9f9f9U, 0xe6e6e6e6U,
362	0xb6b6b6b6U, 0x28282828U, 0x17171717U, 0x82828282U,
363	0x1a1a1a1aU, 0x8b8b8b8bU, 0xfefefefeU, 0x8a8a8a8aU,
364	0x09090909U, 0xc9c9c9c9U, 0x87878787U, 0x4e4e4e4eU,
365	0xe1e1e1e1U, 0x2e2e2e2eU, 0xe4e4e4e4U, 0xe0e0e0e0U,
366	0xebebebebU, 0x90909090U, 0xa4a4a4a4U, 0x1e1e1e1eU,
367	0x85858585U, 0x60606060U, 0x00000000U, 0x25252525U,
368	0xf4f4f4f4U, 0xf1f1f1f1U, 0x94949494U, 0x0b0b0b0bU,
369	0xe7e7e7e7U, 0x75757575U, 0xefefefefU, 0x34343434U,
370	0x31313131U, 0xd4d4d4d4U, 0xd0d0d0d0U, 0x86868686U,
371	0x7e7e7e7eU, 0xadadadadU, 0xfdfdfdfdU, 0x29292929U,
372	0x30303030U, 0x3b3b3b3bU, 0x9f9f9f9fU, 0xf8f8f8f8U,
373	0xc6c6c6c6U, 0x13131313U, 0x06060606U, 0x05050505U,
374	0xc5c5c5c5U, 0x11111111U, 0x77777777U, 0x7c7c7c7cU,
375	0x7a7a7a7aU, 0x78787878U, 0x36363636U, 0x1c1c1c1cU,
376	0x39393939U, 0x59595959U, 0x18181818U, 0x56565656U,
377	0xb3b3b3b3U, 0xb0b0b0b0U, 0x24242424U, 0x20202020U,
378	0xb2b2b2b2U, 0x92929292U, 0xa3a3a3a3U, 0xc0c0c0c0U,
379	0x44444444U, 0x62626262U, 0x10101010U, 0xb4b4b4b4U,
380	0x84848484U, 0x43434343U, 0x93939393U, 0xc2c2c2c2U,
381	0x4a4a4a4aU, 0xbdbdbdbdU, 0x8f8f8f8fU, 0x2d2d2d2dU,
382	0xbcbcbcbcU, 0x9c9c9c9cU, 0x6a6a6a6aU, 0x40404040U,
383	0xcfcfcfcfU, 0xa2a2a2a2U, 0x80808080U, 0x4f4f4f4fU,
384	0x1f1f1f1fU, 0xcacacacaU, 0xaaaaaaaaU, 0x42424242U,
385};
386
387static const u32 T5[256] = {
388	0x00000000U, 0x01020608U, 0x02040c10U, 0x03060a18U,
389	0x04081820U, 0x050a1e28U, 0x060c1430U, 0x070e1238U,
390	0x08103040U, 0x09123648U, 0x0a143c50U, 0x0b163a58U,
391	0x0c182860U, 0x0d1a2e68U, 0x0e1c2470U, 0x0f1e2278U,
392	0x10206080U, 0x11226688U, 0x12246c90U, 0x13266a98U,
393	0x142878a0U, 0x152a7ea8U, 0x162c74b0U, 0x172e72b8U,
394	0x183050c0U, 0x193256c8U, 0x1a345cd0U, 0x1b365ad8U,
395	0x1c3848e0U, 0x1d3a4ee8U, 0x1e3c44f0U, 0x1f3e42f8U,
396	0x2040c01dU, 0x2142c615U, 0x2244cc0dU, 0x2346ca05U,
397	0x2448d83dU, 0x254ade35U, 0x264cd42dU, 0x274ed225U,
398	0x2850f05dU, 0x2952f655U, 0x2a54fc4dU, 0x2b56fa45U,
399	0x2c58e87dU, 0x2d5aee75U, 0x2e5ce46dU, 0x2f5ee265U,
400	0x3060a09dU, 0x3162a695U, 0x3264ac8dU, 0x3366aa85U,
401	0x3468b8bdU, 0x356abeb5U, 0x366cb4adU, 0x376eb2a5U,
402	0x387090ddU, 0x397296d5U, 0x3a749ccdU, 0x3b769ac5U,
403	0x3c7888fdU, 0x3d7a8ef5U, 0x3e7c84edU, 0x3f7e82e5U,
404	0x40809d3aU, 0x41829b32U, 0x4284912aU, 0x43869722U,
405	0x4488851aU, 0x458a8312U, 0x468c890aU, 0x478e8f02U,
406	0x4890ad7aU, 0x4992ab72U, 0x4a94a16aU, 0x4b96a762U,
407	0x4c98b55aU, 0x4d9ab352U, 0x4e9cb94aU, 0x4f9ebf42U,
408	0x50a0fdbaU, 0x51a2fbb2U, 0x52a4f1aaU, 0x53a6f7a2U,
409	0x54a8e59aU, 0x55aae392U, 0x56ace98aU, 0x57aeef82U,
410	0x58b0cdfaU, 0x59b2cbf2U, 0x5ab4c1eaU, 0x5bb6c7e2U,
411	0x5cb8d5daU, 0x5dbad3d2U, 0x5ebcd9caU, 0x5fbedfc2U,
412	0x60c05d27U, 0x61c25b2fU, 0x62c45137U, 0x63c6573fU,
413	0x64c84507U, 0x65ca430fU, 0x66cc4917U, 0x67ce4f1fU,
414	0x68d06d67U, 0x69d26b6fU, 0x6ad46177U, 0x6bd6677fU,
415	0x6cd87547U, 0x6dda734fU, 0x6edc7957U, 0x6fde7f5fU,
416	0x70e03da7U, 0x71e23bafU, 0x72e431b7U, 0x73e637bfU,
417	0x74e82587U, 0x75ea238fU, 0x76ec2997U, 0x77ee2f9fU,
418	0x78f00de7U, 0x79f20befU, 0x7af401f7U, 0x7bf607ffU,
419	0x7cf815c7U, 0x7dfa13cfU, 0x7efc19d7U, 0x7ffe1fdfU,
420	0x801d2774U, 0x811f217cU, 0x82192b64U, 0x831b2d6cU,
421	0x84153f54U, 0x8517395cU, 0x86113344U, 0x8713354cU,
422	0x880d1734U, 0x890f113cU, 0x8a091b24U, 0x8b0b1d2cU,
423	0x8c050f14U, 0x8d07091cU, 0x8e010304U, 0x8f03050cU,
424	0x903d47f4U, 0x913f41fcU, 0x92394be4U, 0x933b4decU,
425	0x94355fd4U, 0x953759dcU, 0x963153c4U, 0x973355ccU,
426	0x982d77b4U, 0x992f71bcU, 0x9a297ba4U, 0x9b2b7dacU,
427	0x9c256f94U, 0x9d27699cU, 0x9e216384U, 0x9f23658cU,
428	0xa05de769U, 0xa15fe161U, 0xa259eb79U, 0xa35bed71U,
429	0xa455ff49U, 0xa557f941U, 0xa651f359U, 0xa753f551U,
430	0xa84dd729U, 0xa94fd121U, 0xaa49db39U, 0xab4bdd31U,
431	0xac45cf09U, 0xad47c901U, 0xae41c319U, 0xaf43c511U,
432	0xb07d87e9U, 0xb17f81e1U, 0xb2798bf9U, 0xb37b8df1U,
433	0xb4759fc9U, 0xb57799c1U, 0xb67193d9U, 0xb77395d1U,
434	0xb86db7a9U, 0xb96fb1a1U, 0xba69bbb9U, 0xbb6bbdb1U,
435	0xbc65af89U, 0xbd67a981U, 0xbe61a399U, 0xbf63a591U,
436	0xc09dba4eU, 0xc19fbc46U, 0xc299b65eU, 0xc39bb056U,
437	0xc495a26eU, 0xc597a466U, 0xc691ae7eU, 0xc793a876U,
438	0xc88d8a0eU, 0xc98f8c06U, 0xca89861eU, 0xcb8b8016U,
439	0xcc85922eU, 0xcd879426U, 0xce819e3eU, 0xcf839836U,
440	0xd0bddaceU, 0xd1bfdcc6U, 0xd2b9d6deU, 0xd3bbd0d6U,
441	0xd4b5c2eeU, 0xd5b7c4e6U, 0xd6b1cefeU, 0xd7b3c8f6U,
442	0xd8adea8eU, 0xd9afec86U, 0xdaa9e69eU, 0xdbabe096U,
443	0xdca5f2aeU, 0xdda7f4a6U, 0xdea1febeU, 0xdfa3f8b6U,
444	0xe0dd7a53U, 0xe1df7c5bU, 0xe2d97643U, 0xe3db704bU,
445	0xe4d56273U, 0xe5d7647bU, 0xe6d16e63U, 0xe7d3686bU,
446	0xe8cd4a13U, 0xe9cf4c1bU, 0xeac94603U, 0xebcb400bU,
447	0xecc55233U, 0xedc7543bU, 0xeec15e23U, 0xefc3582bU,
448	0xf0fd1ad3U, 0xf1ff1cdbU, 0xf2f916c3U, 0xf3fb10cbU,
449	0xf4f502f3U, 0xf5f704fbU, 0xf6f10ee3U, 0xf7f308ebU,
450	0xf8ed2a93U, 0xf9ef2c9bU, 0xfae92683U, 0xfbeb208bU,
451	0xfce532b3U, 0xfde734bbU, 0xfee13ea3U, 0xffe338abU,
452};
453
454static const u32 rc[] = {
455	0xba542f74U, 0x53d3d24dU, 0x50ac8dbfU, 0x70529a4cU,
456	0xead597d1U, 0x33515ba6U, 0xde48a899U, 0xdb32b7fcU,
457	0xe39e919bU, 0xe2bb416eU, 0xa5cb6b95U, 0xa1f3b102U,
458	0xccc41d14U, 0xc363da5dU, 0x5fdc7dcdU, 0x7f5a6c5cU,
459	0xf726ffedU, 0xe89d6f8eU, 0x19a0f089U,
460};
461
462static int anubis_setkey(struct crypto_tfm *tfm, const u8 *in_key,
463			 unsigned int key_len)
464{
465	struct anubis_ctx *ctx = crypto_tfm_ctx(tfm);
466	const __be32 *key = (const __be32 *)in_key;
467	u32 *flags = &tfm->crt_flags;
468	int N, R, i, r;
469	u32 kappa[ANUBIS_MAX_N];
470	u32 inter[ANUBIS_MAX_N];
471
472	switch (key_len) {
473		case 16: case 20: case 24: case 28:
474		case 32: case 36: case 40:
475			break;
476		default:
477			*flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
478			return -EINVAL;
479	}
480
481	ctx->key_len = key_len * 8;
482	N = ctx->key_len >> 5;
483	ctx->R = R = 8 + N;
484
485	/* * map cipher key to initial key state (mu): */
486	for (i = 0; i < N; i++)
487		kappa[i] = be32_to_cpu(key[i]);
488
489	/*
490	 * generate R + 1 round keys:
491	 */
492	for (r = 0; r <= R; r++) {
493		u32 K0, K1, K2, K3;
494		/*
495		 * generate r-th round key K^r:
496		 */
497		K0 = T4[(kappa[N - 1] >> 24)       ];
498		K1 = T4[(kappa[N - 1] >> 16) & 0xff];
499		K2 = T4[(kappa[N - 1] >>  8) & 0xff];
500		K3 = T4[(kappa[N - 1]      ) & 0xff];
501		for (i = N - 2; i >= 0; i--) {
502			K0 = T4[(kappa[i] >> 24)       ] ^
503				(T5[(K0 >> 24)       ] & 0xff000000U) ^
504				(T5[(K0 >> 16) & 0xff] & 0x00ff0000U) ^
505				(T5[(K0 >>  8) & 0xff] & 0x0000ff00U) ^
506				(T5[(K0      ) & 0xff] & 0x000000ffU);
507			K1 = T4[(kappa[i] >> 16) & 0xff] ^
508				(T5[(K1 >> 24)       ] & 0xff000000U) ^
509				(T5[(K1 >> 16) & 0xff] & 0x00ff0000U) ^
510				(T5[(K1 >>  8) & 0xff] & 0x0000ff00U) ^
511				(T5[(K1      ) & 0xff] & 0x000000ffU);
512			K2 = T4[(kappa[i] >>  8) & 0xff] ^
513				(T5[(K2 >> 24)       ] & 0xff000000U) ^
514				(T5[(K2 >> 16) & 0xff] & 0x00ff0000U) ^
515				(T5[(K2 >>  8) & 0xff] & 0x0000ff00U) ^
516				(T5[(K2      ) & 0xff] & 0x000000ffU);
517			K3 = T4[(kappa[i]      ) & 0xff] ^
518				(T5[(K3 >> 24)       ] & 0xff000000U) ^
519				(T5[(K3 >> 16) & 0xff] & 0x00ff0000U) ^
520				(T5[(K3 >>  8) & 0xff] & 0x0000ff00U) ^
521				(T5[(K3      ) & 0xff] & 0x000000ffU);
522		}
523
524		ctx->E[r][0] = K0;
525		ctx->E[r][1] = K1;
526		ctx->E[r][2] = K2;
527		ctx->E[r][3] = K3;
528
529		/*
530		 * compute kappa^{r+1} from kappa^r:
531		 */
532		if (r == R)
533			break;
534		for (i = 0; i < N; i++) {
535			int j = i;
536			inter[i]  = T0[(kappa[j--] >> 24)       ];
537			if (j < 0)
538				j = N - 1;
539			inter[i] ^= T1[(kappa[j--] >> 16) & 0xff];
540			if (j < 0)
541				j = N - 1;
542			inter[i] ^= T2[(kappa[j--] >>  8) & 0xff];
543			if (j < 0)
544				j = N - 1;
545			inter[i] ^= T3[(kappa[j  ]      ) & 0xff];
546		}
547		kappa[0] = inter[0] ^ rc[r];
548		for (i = 1; i < N; i++)
549			kappa[i] = inter[i];
550	}
551
552	/*
553	 * generate inverse key schedule: K'^0 = K^R, K'^R =
554	 * 				  K^0, K'^r = theta(K^{R-r}):
555	 */
556	for (i = 0; i < 4; i++) {
557		ctx->D[0][i] = ctx->E[R][i];
558		ctx->D[R][i] = ctx->E[0][i];
559	}
560	for (r = 1; r < R; r++) {
561		for (i = 0; i < 4; i++) {
562			u32 v = ctx->E[R - r][i];
563			ctx->D[r][i] =
564				T0[T4[(v >> 24)       ] & 0xff] ^
565				T1[T4[(v >> 16) & 0xff] & 0xff] ^
566				T2[T4[(v >>  8) & 0xff] & 0xff] ^
567				T3[T4[(v      ) & 0xff] & 0xff];
568		}
569	}
570
571	return 0;
572}
573
574static void anubis_crypt(u32 roundKey[ANUBIS_MAX_ROUNDS + 1][4],
575		u8 *ciphertext, const u8 *plaintext, const int R)
576{
577	const __be32 *src = (const __be32 *)plaintext;
578	__be32 *dst = (__be32 *)ciphertext;
579	int i, r;
580	u32 state[4];
581	u32 inter[4];
582
583	/*
584	 * map plaintext block to cipher state (mu)
585	 * and add initial round key (sigma[K^0]):
586	 */
587	for (i = 0; i < 4; i++)
588		state[i] = be32_to_cpu(src[i]) ^ roundKey[0][i];
589
590	/*
591	 * R - 1 full rounds:
592	 */
593
594	for (r = 1; r < R; r++) {
595		inter[0] =
596			T0[(state[0] >> 24)       ] ^
597			T1[(state[1] >> 24)       ] ^
598			T2[(state[2] >> 24)       ] ^
599			T3[(state[3] >> 24)       ] ^
600			roundKey[r][0];
601		inter[1] =
602			T0[(state[0] >> 16) & 0xff] ^
603			T1[(state[1] >> 16) & 0xff] ^
604			T2[(state[2] >> 16) & 0xff] ^
605			T3[(state[3] >> 16) & 0xff] ^
606			roundKey[r][1];
607		inter[2] =
608			T0[(state[0] >>  8) & 0xff] ^
609			T1[(state[1] >>  8) & 0xff] ^
610			T2[(state[2] >>  8) & 0xff] ^
611			T3[(state[3] >>  8) & 0xff] ^
612			roundKey[r][2];
613		inter[3] =
614			T0[(state[0]      ) & 0xff] ^
615			T1[(state[1]      ) & 0xff] ^
616			T2[(state[2]      ) & 0xff] ^
617			T3[(state[3]      ) & 0xff] ^
618			roundKey[r][3];
619		state[0] = inter[0];
620		state[1] = inter[1];
621		state[2] = inter[2];
622		state[3] = inter[3];
623	}
624
625	/*
626	 * last round:
627	 */
628
629	inter[0] =
630		(T0[(state[0] >> 24)       ] & 0xff000000U) ^
631		(T1[(state[1] >> 24)       ] & 0x00ff0000U) ^
632		(T2[(state[2] >> 24)       ] & 0x0000ff00U) ^
633		(T3[(state[3] >> 24)       ] & 0x000000ffU) ^
634		roundKey[R][0];
635	inter[1] =
636		(T0[(state[0] >> 16) & 0xff] & 0xff000000U) ^
637		(T1[(state[1] >> 16) & 0xff] & 0x00ff0000U) ^
638		(T2[(state[2] >> 16) & 0xff] & 0x0000ff00U) ^
639		(T3[(state[3] >> 16) & 0xff] & 0x000000ffU) ^
640		roundKey[R][1];
641	inter[2] =
642		(T0[(state[0] >>  8) & 0xff] & 0xff000000U) ^
643		(T1[(state[1] >>  8) & 0xff] & 0x00ff0000U) ^
644		(T2[(state[2] >>  8) & 0xff] & 0x0000ff00U) ^
645		(T3[(state[3] >>  8) & 0xff] & 0x000000ffU) ^
646		roundKey[R][2];
647	inter[3] =
648		(T0[(state[0]      ) & 0xff] & 0xff000000U) ^
649		(T1[(state[1]      ) & 0xff] & 0x00ff0000U) ^
650		(T2[(state[2]      ) & 0xff] & 0x0000ff00U) ^
651		(T3[(state[3]      ) & 0xff] & 0x000000ffU) ^
652		roundKey[R][3];
653
654	/*
655	 * map cipher state to ciphertext block (mu^{-1}):
656	 */
657
658	for (i = 0; i < 4; i++)
659		dst[i] = cpu_to_be32(inter[i]);
660}
661
662static void anubis_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
663{
664	struct anubis_ctx *ctx = crypto_tfm_ctx(tfm);
665	anubis_crypt(ctx->E, dst, src, ctx->R);
666}
667
668static void anubis_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
669{
670	struct anubis_ctx *ctx = crypto_tfm_ctx(tfm);
671	anubis_crypt(ctx->D, dst, src, ctx->R);
672}
673
674static struct crypto_alg anubis_alg = {
675	.cra_name		=	"anubis",
676	.cra_flags		=	CRYPTO_ALG_TYPE_CIPHER,
677	.cra_blocksize		=	ANUBIS_BLOCK_SIZE,
678	.cra_ctxsize		=	sizeof (struct anubis_ctx),
679	.cra_alignmask		=	3,
680	.cra_module		=	THIS_MODULE,
681	.cra_u			=	{ .cipher = {
682	.cia_min_keysize	=	ANUBIS_MIN_KEY_SIZE,
683	.cia_max_keysize	=	ANUBIS_MAX_KEY_SIZE,
684	.cia_setkey		= 	anubis_setkey,
685	.cia_encrypt		=	anubis_encrypt,
686	.cia_decrypt		=	anubis_decrypt } }
687};
688
689static int __init anubis_mod_init(void)
690{
691	int ret = 0;
692
693	ret = crypto_register_alg(&anubis_alg);
694	return ret;
695}
696
697static void __exit anubis_mod_fini(void)
698{
699	crypto_unregister_alg(&anubis_alg);
700}
701
702module_init(anubis_mod_init);
703module_exit(anubis_mod_fini);
704
705MODULE_LICENSE("GPL");
706MODULE_DESCRIPTION("Anubis Cryptographic Algorithm");
707MODULE_ALIAS_CRYPTO("anubis");
708