Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/crypto/anubis.c
26131 views
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 <crypto/algapi.h>
33
#include <linux/init.h>
34
#include <linux/module.h>
35
#include <linux/mm.h>
36
#include <linux/unaligned.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
int N, R, i, r;
467
u32 kappa[ANUBIS_MAX_N];
468
u32 inter[ANUBIS_MAX_N];
469
470
switch (key_len) {
471
case 16: case 20: case 24: case 28:
472
case 32: case 36: case 40:
473
break;
474
default:
475
return -EINVAL;
476
}
477
478
ctx->key_len = key_len * 8;
479
N = ctx->key_len >> 5;
480
ctx->R = R = 8 + N;
481
482
/* * map cipher key to initial key state (mu): */
483
for (i = 0; i < N; i++)
484
kappa[i] = get_unaligned_be32(&in_key[4 * i]);
485
486
/*
487
* generate R + 1 round keys:
488
*/
489
for (r = 0; r <= R; r++) {
490
u32 K0, K1, K2, K3;
491
/*
492
* generate r-th round key K^r:
493
*/
494
K0 = T4[(kappa[N - 1] >> 24) ];
495
K1 = T4[(kappa[N - 1] >> 16) & 0xff];
496
K2 = T4[(kappa[N - 1] >> 8) & 0xff];
497
K3 = T4[(kappa[N - 1] ) & 0xff];
498
for (i = N - 2; i >= 0; i--) {
499
K0 = T4[(kappa[i] >> 24) ] ^
500
(T5[(K0 >> 24) ] & 0xff000000U) ^
501
(T5[(K0 >> 16) & 0xff] & 0x00ff0000U) ^
502
(T5[(K0 >> 8) & 0xff] & 0x0000ff00U) ^
503
(T5[(K0 ) & 0xff] & 0x000000ffU);
504
K1 = T4[(kappa[i] >> 16) & 0xff] ^
505
(T5[(K1 >> 24) ] & 0xff000000U) ^
506
(T5[(K1 >> 16) & 0xff] & 0x00ff0000U) ^
507
(T5[(K1 >> 8) & 0xff] & 0x0000ff00U) ^
508
(T5[(K1 ) & 0xff] & 0x000000ffU);
509
K2 = T4[(kappa[i] >> 8) & 0xff] ^
510
(T5[(K2 >> 24) ] & 0xff000000U) ^
511
(T5[(K2 >> 16) & 0xff] & 0x00ff0000U) ^
512
(T5[(K2 >> 8) & 0xff] & 0x0000ff00U) ^
513
(T5[(K2 ) & 0xff] & 0x000000ffU);
514
K3 = T4[(kappa[i] ) & 0xff] ^
515
(T5[(K3 >> 24) ] & 0xff000000U) ^
516
(T5[(K3 >> 16) & 0xff] & 0x00ff0000U) ^
517
(T5[(K3 >> 8) & 0xff] & 0x0000ff00U) ^
518
(T5[(K3 ) & 0xff] & 0x000000ffU);
519
}
520
521
ctx->E[r][0] = K0;
522
ctx->E[r][1] = K1;
523
ctx->E[r][2] = K2;
524
ctx->E[r][3] = K3;
525
526
/*
527
* compute kappa^{r+1} from kappa^r:
528
*/
529
if (r == R)
530
break;
531
for (i = 0; i < N; i++) {
532
int j = i;
533
inter[i] = T0[(kappa[j--] >> 24) ];
534
if (j < 0)
535
j = N - 1;
536
inter[i] ^= T1[(kappa[j--] >> 16) & 0xff];
537
if (j < 0)
538
j = N - 1;
539
inter[i] ^= T2[(kappa[j--] >> 8) & 0xff];
540
if (j < 0)
541
j = N - 1;
542
inter[i] ^= T3[(kappa[j ] ) & 0xff];
543
}
544
kappa[0] = inter[0] ^ rc[r];
545
for (i = 1; i < N; i++)
546
kappa[i] = inter[i];
547
}
548
549
/*
550
* generate inverse key schedule: K'^0 = K^R, K'^R =
551
* K^0, K'^r = theta(K^{R-r}):
552
*/
553
for (i = 0; i < 4; i++) {
554
ctx->D[0][i] = ctx->E[R][i];
555
ctx->D[R][i] = ctx->E[0][i];
556
}
557
for (r = 1; r < R; r++) {
558
for (i = 0; i < 4; i++) {
559
u32 v = ctx->E[R - r][i];
560
ctx->D[r][i] =
561
T0[T4[(v >> 24) ] & 0xff] ^
562
T1[T4[(v >> 16) & 0xff] & 0xff] ^
563
T2[T4[(v >> 8) & 0xff] & 0xff] ^
564
T3[T4[(v ) & 0xff] & 0xff];
565
}
566
}
567
568
return 0;
569
}
570
571
static void anubis_crypt(u32 roundKey[ANUBIS_MAX_ROUNDS + 1][4],
572
u8 *dst, const u8 *src, const int R)
573
{
574
int i, r;
575
u32 state[4];
576
u32 inter[4];
577
578
/*
579
* map plaintext block to cipher state (mu)
580
* and add initial round key (sigma[K^0]):
581
*/
582
for (i = 0; i < 4; i++)
583
state[i] = get_unaligned_be32(&src[4 * i]) ^ roundKey[0][i];
584
585
/*
586
* R - 1 full rounds:
587
*/
588
589
for (r = 1; r < R; r++) {
590
inter[0] =
591
T0[(state[0] >> 24) ] ^
592
T1[(state[1] >> 24) ] ^
593
T2[(state[2] >> 24) ] ^
594
T3[(state[3] >> 24) ] ^
595
roundKey[r][0];
596
inter[1] =
597
T0[(state[0] >> 16) & 0xff] ^
598
T1[(state[1] >> 16) & 0xff] ^
599
T2[(state[2] >> 16) & 0xff] ^
600
T3[(state[3] >> 16) & 0xff] ^
601
roundKey[r][1];
602
inter[2] =
603
T0[(state[0] >> 8) & 0xff] ^
604
T1[(state[1] >> 8) & 0xff] ^
605
T2[(state[2] >> 8) & 0xff] ^
606
T3[(state[3] >> 8) & 0xff] ^
607
roundKey[r][2];
608
inter[3] =
609
T0[(state[0] ) & 0xff] ^
610
T1[(state[1] ) & 0xff] ^
611
T2[(state[2] ) & 0xff] ^
612
T3[(state[3] ) & 0xff] ^
613
roundKey[r][3];
614
state[0] = inter[0];
615
state[1] = inter[1];
616
state[2] = inter[2];
617
state[3] = inter[3];
618
}
619
620
/*
621
* last round:
622
*/
623
624
inter[0] =
625
(T0[(state[0] >> 24) ] & 0xff000000U) ^
626
(T1[(state[1] >> 24) ] & 0x00ff0000U) ^
627
(T2[(state[2] >> 24) ] & 0x0000ff00U) ^
628
(T3[(state[3] >> 24) ] & 0x000000ffU) ^
629
roundKey[R][0];
630
inter[1] =
631
(T0[(state[0] >> 16) & 0xff] & 0xff000000U) ^
632
(T1[(state[1] >> 16) & 0xff] & 0x00ff0000U) ^
633
(T2[(state[2] >> 16) & 0xff] & 0x0000ff00U) ^
634
(T3[(state[3] >> 16) & 0xff] & 0x000000ffU) ^
635
roundKey[R][1];
636
inter[2] =
637
(T0[(state[0] >> 8) & 0xff] & 0xff000000U) ^
638
(T1[(state[1] >> 8) & 0xff] & 0x00ff0000U) ^
639
(T2[(state[2] >> 8) & 0xff] & 0x0000ff00U) ^
640
(T3[(state[3] >> 8) & 0xff] & 0x000000ffU) ^
641
roundKey[R][2];
642
inter[3] =
643
(T0[(state[0] ) & 0xff] & 0xff000000U) ^
644
(T1[(state[1] ) & 0xff] & 0x00ff0000U) ^
645
(T2[(state[2] ) & 0xff] & 0x0000ff00U) ^
646
(T3[(state[3] ) & 0xff] & 0x000000ffU) ^
647
roundKey[R][3];
648
649
/*
650
* map cipher state to ciphertext block (mu^{-1}):
651
*/
652
653
for (i = 0; i < 4; i++)
654
put_unaligned_be32(inter[i], &dst[4 * i]);
655
}
656
657
static void anubis_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
658
{
659
struct anubis_ctx *ctx = crypto_tfm_ctx(tfm);
660
anubis_crypt(ctx->E, dst, src, ctx->R);
661
}
662
663
static void anubis_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
664
{
665
struct anubis_ctx *ctx = crypto_tfm_ctx(tfm);
666
anubis_crypt(ctx->D, dst, src, ctx->R);
667
}
668
669
static struct crypto_alg anubis_alg = {
670
.cra_name = "anubis",
671
.cra_driver_name = "anubis-generic",
672
.cra_flags = CRYPTO_ALG_TYPE_CIPHER,
673
.cra_blocksize = ANUBIS_BLOCK_SIZE,
674
.cra_ctxsize = sizeof (struct anubis_ctx),
675
.cra_module = THIS_MODULE,
676
.cra_u = { .cipher = {
677
.cia_min_keysize = ANUBIS_MIN_KEY_SIZE,
678
.cia_max_keysize = ANUBIS_MAX_KEY_SIZE,
679
.cia_setkey = anubis_setkey,
680
.cia_encrypt = anubis_encrypt,
681
.cia_decrypt = anubis_decrypt } }
682
};
683
684
static int __init anubis_mod_init(void)
685
{
686
int ret = 0;
687
688
ret = crypto_register_alg(&anubis_alg);
689
return ret;
690
}
691
692
static void __exit anubis_mod_fini(void)
693
{
694
crypto_unregister_alg(&anubis_alg);
695
}
696
697
module_init(anubis_mod_init);
698
module_exit(anubis_mod_fini);
699
700
MODULE_LICENSE("GPL");
701
MODULE_DESCRIPTION("Anubis Cryptographic Algorithm");
702
MODULE_ALIAS_CRYPTO("anubis");
703
704