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

Archive Download this file



interactive