Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
anubis.c
Go to the documentation of this file.
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 [email protected], 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;
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];
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 
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_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 
689 static int __init anubis_mod_init(void)
690 {
691  int ret = 0;
692 
693  ret = crypto_register_alg(&anubis_alg);
694  return ret;
695 }
696 
697 static void __exit anubis_mod_fini(void)
698 {
699  crypto_unregister_alg(&anubis_alg);
700 }
701 
702 module_init(anubis_mod_init);
703 module_exit(anubis_mod_fini);
704 
705 MODULE_LICENSE("GPL");
706 MODULE_DESCRIPTION("Anubis Cryptographic Algorithm");