OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [crypto/] [anubis.c] - Blame information for rev 86

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/*
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 init(void)
691
{
692
        int ret = 0;
693
 
694
        ret = crypto_register_alg(&anubis_alg);
695
        return ret;
696
}
697
 
698
static void __exit fini(void)
699
{
700
        crypto_unregister_alg(&anubis_alg);
701
}
702
 
703
module_init(init);
704
module_exit(fini);
705
 
706
MODULE_LICENSE("GPL");
707
MODULE_DESCRIPTION("Anubis Cryptographic Algorithm");

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.