blob: 5da0241ef453c89557decd0f1cddefd137165047 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
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>
Herbert Xu06ace7a2005-10-30 21:25:15 +110035#include <asm/byteorder.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070036#include <linux/crypto.h>
Herbert Xu06ace7a2005-10-30 21:25:15 +110037#include <linux/types.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070038
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
Herbert Xu6c2bb982006-05-16 22:09:29 +1000462static int anubis_setkey(struct crypto_tfm *tfm, const u8 *in_key,
Herbert Xu560c06a2006-08-13 14:16:39 +1000463 unsigned int key_len)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700464{
Herbert Xu6c2bb982006-05-16 22:09:29 +1000465 struct anubis_ctx *ctx = crypto_tfm_ctx(tfm);
Herbert Xu06ace7a2005-10-30 21:25:15 +1100466 const __be32 *key = (const __be32 *)in_key;
467 int N, R, i, r;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700468 u32 kappa[ANUBIS_MAX_N];
469 u32 inter[ANUBIS_MAX_N];
470
Richard Hartmann189bd4b2010-02-16 20:25:39 +0800471 switch (key_len) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700472 case 16: case 20: case 24: case 28:
473 case 32: case 36: case 40:
474 break;
475 default:
Richard Hartmann189bd4b2010-02-16 20:25:39 +0800476 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700477 }
478
479 ctx->key_len = key_len * 8;
480 N = ctx->key_len >> 5;
481 ctx->R = R = 8 + N;
482
483 /* * map cipher key to initial key state (mu): */
Herbert Xu06ace7a2005-10-30 21:25:15 +1100484 for (i = 0; i < N; i++)
485 kappa[i] = be32_to_cpu(key[i]);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700486
487 /*
488 * generate R + 1 round keys:
489 */
490 for (r = 0; r <= R; r++) {
491 u32 K0, K1, K2, K3;
492 /*
493 * generate r-th round key K^r:
494 */
495 K0 = T4[(kappa[N - 1] >> 24) ];
496 K1 = T4[(kappa[N - 1] >> 16) & 0xff];
497 K2 = T4[(kappa[N - 1] >> 8) & 0xff];
498 K3 = T4[(kappa[N - 1] ) & 0xff];
499 for (i = N - 2; i >= 0; i--) {
500 K0 = T4[(kappa[i] >> 24) ] ^
501 (T5[(K0 >> 24) ] & 0xff000000U) ^
502 (T5[(K0 >> 16) & 0xff] & 0x00ff0000U) ^
503 (T5[(K0 >> 8) & 0xff] & 0x0000ff00U) ^
504 (T5[(K0 ) & 0xff] & 0x000000ffU);
505 K1 = T4[(kappa[i] >> 16) & 0xff] ^
506 (T5[(K1 >> 24) ] & 0xff000000U) ^
507 (T5[(K1 >> 16) & 0xff] & 0x00ff0000U) ^
508 (T5[(K1 >> 8) & 0xff] & 0x0000ff00U) ^
509 (T5[(K1 ) & 0xff] & 0x000000ffU);
510 K2 = T4[(kappa[i] >> 8) & 0xff] ^
511 (T5[(K2 >> 24) ] & 0xff000000U) ^
512 (T5[(K2 >> 16) & 0xff] & 0x00ff0000U) ^
513 (T5[(K2 >> 8) & 0xff] & 0x0000ff00U) ^
514 (T5[(K2 ) & 0xff] & 0x000000ffU);
515 K3 = T4[(kappa[i] ) & 0xff] ^
516 (T5[(K3 >> 24) ] & 0xff000000U) ^
517 (T5[(K3 >> 16) & 0xff] & 0x00ff0000U) ^
518 (T5[(K3 >> 8) & 0xff] & 0x0000ff00U) ^
519 (T5[(K3 ) & 0xff] & 0x000000ffU);
520 }
521
522 ctx->E[r][0] = K0;
523 ctx->E[r][1] = K1;
524 ctx->E[r][2] = K2;
525 ctx->E[r][3] = K3;
526
527 /*
528 * compute kappa^{r+1} from kappa^r:
529 */
Richard Hartmann189bd4b2010-02-16 20:25:39 +0800530 if (r == R)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700531 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700532 for (i = 0; i < N; i++) {
533 int j = i;
534 inter[i] = T0[(kappa[j--] >> 24) ];
Richard Hartmann189bd4b2010-02-16 20:25:39 +0800535 if (j < 0)
536 j = N - 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700537 inter[i] ^= T1[(kappa[j--] >> 16) & 0xff];
Richard Hartmann189bd4b2010-02-16 20:25:39 +0800538 if (j < 0)
539 j = N - 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700540 inter[i] ^= T2[(kappa[j--] >> 8) & 0xff];
Richard Hartmann189bd4b2010-02-16 20:25:39 +0800541 if (j < 0)
542 j = N - 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700543 inter[i] ^= T3[(kappa[j ] ) & 0xff];
544 }
545 kappa[0] = inter[0] ^ rc[r];
Richard Hartmann189bd4b2010-02-16 20:25:39 +0800546 for (i = 1; i < N; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700547 kappa[i] = inter[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700548 }
549
550 /*
551 * generate inverse key schedule: K'^0 = K^R, K'^R =
552 * K^0, K'^r = theta(K^{R-r}):
553 */
554 for (i = 0; i < 4; i++) {
555 ctx->D[0][i] = ctx->E[R][i];
556 ctx->D[R][i] = ctx->E[0][i];
557 }
558 for (r = 1; r < R; r++) {
559 for (i = 0; i < 4; i++) {
560 u32 v = ctx->E[R - r][i];
561 ctx->D[r][i] =
562 T0[T4[(v >> 24) ] & 0xff] ^
563 T1[T4[(v >> 16) & 0xff] & 0xff] ^
564 T2[T4[(v >> 8) & 0xff] & 0xff] ^
565 T3[T4[(v ) & 0xff] & 0xff];
566 }
567 }
568
569 return 0;
570}
571
572static void anubis_crypt(u32 roundKey[ANUBIS_MAX_ROUNDS + 1][4],
573 u8 *ciphertext, const u8 *plaintext, const int R)
574{
Herbert Xu06ace7a2005-10-30 21:25:15 +1100575 const __be32 *src = (const __be32 *)plaintext;
576 __be32 *dst = (__be32 *)ciphertext;
577 int i, r;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700578 u32 state[4];
579 u32 inter[4];
580
581 /*
582 * map plaintext block to cipher state (mu)
583 * and add initial round key (sigma[K^0]):
584 */
Herbert Xu06ace7a2005-10-30 21:25:15 +1100585 for (i = 0; i < 4; i++)
586 state[i] = be32_to_cpu(src[i]) ^ roundKey[0][i];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700587
588 /*
589 * R - 1 full rounds:
590 */
591
592 for (r = 1; r < R; r++) {
593 inter[0] =
594 T0[(state[0] >> 24) ] ^
595 T1[(state[1] >> 24) ] ^
596 T2[(state[2] >> 24) ] ^
597 T3[(state[3] >> 24) ] ^
598 roundKey[r][0];
599 inter[1] =
600 T0[(state[0] >> 16) & 0xff] ^
601 T1[(state[1] >> 16) & 0xff] ^
602 T2[(state[2] >> 16) & 0xff] ^
603 T3[(state[3] >> 16) & 0xff] ^
604 roundKey[r][1];
605 inter[2] =
606 T0[(state[0] >> 8) & 0xff] ^
607 T1[(state[1] >> 8) & 0xff] ^
608 T2[(state[2] >> 8) & 0xff] ^
609 T3[(state[3] >> 8) & 0xff] ^
610 roundKey[r][2];
611 inter[3] =
612 T0[(state[0] ) & 0xff] ^
613 T1[(state[1] ) & 0xff] ^
614 T2[(state[2] ) & 0xff] ^
615 T3[(state[3] ) & 0xff] ^
616 roundKey[r][3];
617 state[0] = inter[0];
618 state[1] = inter[1];
619 state[2] = inter[2];
620 state[3] = inter[3];
621 }
622
623 /*
624 * last round:
625 */
626
627 inter[0] =
628 (T0[(state[0] >> 24) ] & 0xff000000U) ^
629 (T1[(state[1] >> 24) ] & 0x00ff0000U) ^
630 (T2[(state[2] >> 24) ] & 0x0000ff00U) ^
631 (T3[(state[3] >> 24) ] & 0x000000ffU) ^
632 roundKey[R][0];
633 inter[1] =
634 (T0[(state[0] >> 16) & 0xff] & 0xff000000U) ^
635 (T1[(state[1] >> 16) & 0xff] & 0x00ff0000U) ^
636 (T2[(state[2] >> 16) & 0xff] & 0x0000ff00U) ^
637 (T3[(state[3] >> 16) & 0xff] & 0x000000ffU) ^
638 roundKey[R][1];
639 inter[2] =
640 (T0[(state[0] >> 8) & 0xff] & 0xff000000U) ^
641 (T1[(state[1] >> 8) & 0xff] & 0x00ff0000U) ^
642 (T2[(state[2] >> 8) & 0xff] & 0x0000ff00U) ^
643 (T3[(state[3] >> 8) & 0xff] & 0x000000ffU) ^
644 roundKey[R][2];
645 inter[3] =
646 (T0[(state[0] ) & 0xff] & 0xff000000U) ^
647 (T1[(state[1] ) & 0xff] & 0x00ff0000U) ^
648 (T2[(state[2] ) & 0xff] & 0x0000ff00U) ^
649 (T3[(state[3] ) & 0xff] & 0x000000ffU) ^
650 roundKey[R][3];
651
652 /*
653 * map cipher state to ciphertext block (mu^{-1}):
654 */
655
Herbert Xu06ace7a2005-10-30 21:25:15 +1100656 for (i = 0; i < 4; i++)
657 dst[i] = cpu_to_be32(inter[i]);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700658}
659
Herbert Xu6c2bb982006-05-16 22:09:29 +1000660static void anubis_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700661{
Herbert Xu6c2bb982006-05-16 22:09:29 +1000662 struct anubis_ctx *ctx = crypto_tfm_ctx(tfm);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700663 anubis_crypt(ctx->E, dst, src, ctx->R);
664}
665
Herbert Xu6c2bb982006-05-16 22:09:29 +1000666static void anubis_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700667{
Herbert Xu6c2bb982006-05-16 22:09:29 +1000668 struct anubis_ctx *ctx = crypto_tfm_ctx(tfm);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700669 anubis_crypt(ctx->D, dst, src, ctx->R);
670}
671
672static struct crypto_alg anubis_alg = {
673 .cra_name = "anubis",
Eric Biggersd6ebf522019-06-02 22:40:57 -0700674 .cra_driver_name = "anubis-generic",
Linus Torvalds1da177e2005-04-16 15:20:36 -0700675 .cra_flags = CRYPTO_ALG_TYPE_CIPHER,
676 .cra_blocksize = ANUBIS_BLOCK_SIZE,
677 .cra_ctxsize = sizeof (struct anubis_ctx),
Herbert Xua429d262006-01-07 16:38:15 +1100678 .cra_alignmask = 3,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700679 .cra_module = THIS_MODULE,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700680 .cra_u = { .cipher = {
681 .cia_min_keysize = ANUBIS_MIN_KEY_SIZE,
682 .cia_max_keysize = ANUBIS_MAX_KEY_SIZE,
683 .cia_setkey = anubis_setkey,
684 .cia_encrypt = anubis_encrypt,
685 .cia_decrypt = anubis_decrypt } }
686};
687
Kamalesh Babulal3af5b902008-04-05 21:00:57 +0800688static int __init anubis_mod_init(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700689{
690 int ret = 0;
Richard Hartmann189bd4b2010-02-16 20:25:39 +0800691
Linus Torvalds1da177e2005-04-16 15:20:36 -0700692 ret = crypto_register_alg(&anubis_alg);
693 return ret;
694}
695
Kamalesh Babulal3af5b902008-04-05 21:00:57 +0800696static void __exit anubis_mod_fini(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700697{
698 crypto_unregister_alg(&anubis_alg);
699}
700
Eric Biggersc4741b22019-04-11 21:57:42 -0700701subsys_initcall(anubis_mod_init);
Kamalesh Babulal3af5b902008-04-05 21:00:57 +0800702module_exit(anubis_mod_fini);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700703
704MODULE_LICENSE("GPL");
705MODULE_DESCRIPTION("Anubis Cryptographic Algorithm");
Kees Cook5d26a102014-11-20 17:05:53 -0800706MODULE_ALIAS_CRYPTO("anubis");