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