USB: Driver for Freescale QUICC Engine USB Host Controller
[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 <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
45 struct 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
52 static 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
119 static 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
186 static 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
253 static 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
320 static 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
387 static 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
454 static 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
462 static 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         {
474                 case 16: case 20: case 24: case 28:
475                 case 32: case 36: case 40:
476                         break;
477                 default:
478                         *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
479                         return - EINVAL;
480         }
481
482         ctx->key_len = key_len * 8;
483         N = ctx->key_len >> 5;
484         ctx->R = R = 8 + N;
485
486         /* * map cipher key to initial key state (mu): */
487         for (i = 0; i < N; i++)
488                 kappa[i] = be32_to_cpu(key[i]);
489
490         /*
491          * generate R + 1 round keys:
492          */
493         for (r = 0; r <= R; r++) {
494                 u32 K0, K1, K2, K3;
495                 /*
496                  * generate r-th round key K^r:
497                  */
498                 K0 = T4[(kappa[N - 1] >> 24)       ];
499                 K1 = T4[(kappa[N - 1] >> 16) & 0xff];
500                 K2 = T4[(kappa[N - 1] >>  8) & 0xff];
501                 K3 = T4[(kappa[N - 1]      ) & 0xff];
502                 for (i = N - 2; i >= 0; i--) {
503                         K0 = T4[(kappa[i] >> 24)       ] ^
504                                 (T5[(K0 >> 24)       ] & 0xff000000U) ^
505                                 (T5[(K0 >> 16) & 0xff] & 0x00ff0000U) ^
506                                 (T5[(K0 >>  8) & 0xff] & 0x0000ff00U) ^
507                                 (T5[(K0      ) & 0xff] & 0x000000ffU);
508                         K1 = T4[(kappa[i] >> 16) & 0xff] ^
509                                 (T5[(K1 >> 24)       ] & 0xff000000U) ^
510                                 (T5[(K1 >> 16) & 0xff] & 0x00ff0000U) ^
511                                 (T5[(K1 >>  8) & 0xff] & 0x0000ff00U) ^
512                                 (T5[(K1      ) & 0xff] & 0x000000ffU);
513                         K2 = T4[(kappa[i] >>  8) & 0xff] ^
514                                 (T5[(K2 >> 24)       ] & 0xff000000U) ^
515                                 (T5[(K2 >> 16) & 0xff] & 0x00ff0000U) ^
516                                 (T5[(K2 >>  8) & 0xff] & 0x0000ff00U) ^
517                                 (T5[(K2      ) & 0xff] & 0x000000ffU);
518                         K3 = T4[(kappa[i]      ) & 0xff] ^
519                                 (T5[(K3 >> 24)       ] & 0xff000000U) ^
520                                 (T5[(K3 >> 16) & 0xff] & 0x00ff0000U) ^
521                                 (T5[(K3 >>  8) & 0xff] & 0x0000ff00U) ^
522                                 (T5[(K3      ) & 0xff] & 0x000000ffU);
523                 }
524
525                 ctx->E[r][0] = K0;
526                 ctx->E[r][1] = K1;
527                 ctx->E[r][2] = K2;
528                 ctx->E[r][3] = K3;
529
530                 /*
531                  * compute kappa^{r+1} from kappa^r:
532                  */
533                 if (r == R) {
534                         break;
535                 }
536                 for (i = 0; i < N; i++) {
537                         int j = i;
538                         inter[i]  = T0[(kappa[j--] >> 24)       ];
539                         if (j < 0) j = N - 1;
540                         inter[i] ^= T1[(kappa[j--] >> 16) & 0xff];
541                         if (j < 0) j = N - 1;
542                         inter[i] ^= T2[(kappa[j--] >>  8) & 0xff];
543                         if (j < 0) j = N - 1;
544                         inter[i] ^= T3[(kappa[j  ]      ) & 0xff];
545                 }
546                 kappa[0] = inter[0] ^ rc[r];
547                 for (i = 1; i < N; i++) {
548                         kappa[i] = inter[i];
549                 }
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
574 static 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
662 static 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
668 static 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
674 static 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_list               =       LIST_HEAD_INIT(anubis_alg.cra_list),
682         .cra_u                  =       { .cipher = {
683         .cia_min_keysize        =       ANUBIS_MIN_KEY_SIZE,
684         .cia_max_keysize        =       ANUBIS_MAX_KEY_SIZE,
685         .cia_setkey             =       anubis_setkey,
686         .cia_encrypt            =       anubis_encrypt,
687         .cia_decrypt            =       anubis_decrypt } }
688 };
689
690 static int __init anubis_mod_init(void)
691 {
692         int ret = 0;
693         
694         ret = crypto_register_alg(&anubis_alg);
695         return ret;
696 }
697
698 static void __exit anubis_mod_fini(void)
699 {
700         crypto_unregister_alg(&anubis_alg);
701 }
702
703 module_init(anubis_mod_init);
704 module_exit(anubis_mod_fini);
705
706 MODULE_LICENSE("GPL");
707 MODULE_DESCRIPTION("Anubis Cryptographic Algorithm");