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