Blame view

crypto/serpent_generic.c 21.4 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
  /*
   * Cryptographic API.
   *
   * Serpent Cipher Algorithm.
   *
   * Copyright (C) 2002 Dag Arne Osvik <osvik@ii.uib.no>
   *               2003 Herbert Valerio Riedel <hvr@gnu.org>
   *
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
9
10
11
   * Added tnepres support:
   *		Ruben Jesus Garcia Hernandez <ruben@ugr.es>, 18.10.2004
   *              Based on code by hvr
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
12
13
14
15
16
17
18
19
20
21
22
23
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
   * the Free Software Foundation; either version 2 of the License, or
   * (at your option) any later version.
   */
  
  #include <linux/init.h>
  #include <linux/module.h>
  #include <linux/errno.h>
  #include <asm/byteorder.h>
  #include <linux/crypto.h>
06ace7a9b   Herbert Xu   [CRYPTO] Use stan...
24
  #include <linux/types.h>
bc83b8299   Jussi Kivilinna   crypto: serpent -...
25
  #include <crypto/serpent.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
26
27
28
29
  
  /* Key is padded to the maximum of 256 bits before round key generation.
   * Any key length <= 256 bits (32 bytes) is allowed by the algorithm.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
30
  #define PHI 0x9e3779b9UL
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
31
32
  #define keyiter(a, b, c, d, i, j) \
  	({ b ^= d; b ^= c; b ^= a; b ^= PHI ^ i; b = rol32(b, 11); k[j] = b; })
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
33

7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
34
35
  #define loadkeys(x0, x1, x2, x3, i) \
  	({ x0 = k[i]; x1 = k[i+1]; x2 = k[i+2]; x3 = k[i+3]; })
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
36

7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
37
38
  #define storekeys(x0, x1, x2, x3, i) \
  	({ k[i] = x0; k[i+1] = x1; k[i+2] = x2; k[i+3] = x3; })
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
39

7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
40
41
42
43
  #define store_and_load_keys(x0, x1, x2, x3, s, l) \
  	({ storekeys(x0, x1, x2, x3, s); loadkeys(x0, x1, x2, x3, l); })
  
  #define K(x0, x1, x2, x3, i) ({				\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
44
  	x3 ^= k[4*(i)+3];        x2 ^= k[4*(i)+2];	\
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
  	x1 ^= k[4*(i)+1];        x0 ^= k[4*(i)+0];	\
  	})
  
  #define LK(x0, x1, x2, x3, x4, i) ({					   \
  							x0 = rol32(x0, 13);\
  	x2 = rol32(x2, 3);	x1 ^= x0;		x4  = x0 << 3;	   \
  	x3 ^= x2;		x1 ^= x2;				   \
  	x1 = rol32(x1, 1);	x3 ^= x4;				   \
  	x3 = rol32(x3, 7);	x4  = x1;				   \
  	x0 ^= x1;		x4 <<= 7;		x2 ^= x3;	   \
  	x0 ^= x3;		x2 ^= x4;		x3 ^= k[4*i+3];	   \
  	x1 ^= k[4*i+1];		x0 = rol32(x0, 5);	x2 = rol32(x2, 22);\
  	x0 ^= k[4*i+0];		x2 ^= k[4*i+2];				   \
  	})
  
  #define KL(x0, x1, x2, x3, x4, i) ({					   \
  	x0 ^= k[4*i+0];		x1 ^= k[4*i+1];		x2 ^= k[4*i+2];	   \
  	x3 ^= k[4*i+3];		x0 = ror32(x0, 5);	x2 = ror32(x2, 22);\
  	x4 =  x1;		x2 ^= x3;		x0 ^= x3;	   \
  	x4 <<= 7;		x0 ^= x1;		x1 = ror32(x1, 1); \
  	x2 ^= x4;		x3 = ror32(x3, 7);	x4 = x0 << 3;	   \
  	x1 ^= x0;		x3 ^= x4;		x0 = ror32(x0, 13);\
  	x1 ^= x2;		x3 ^= x2;		x2 = ror32(x2, 3); \
  	})
  
  #define S0(x0, x1, x2, x3, x4) ({			\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
71
72
  					x4  = x3;	\
  	x3 |= x0;	x0 ^= x4;	x4 ^= x2;	\
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
73
  	x4 = ~x4;	x3 ^= x1;	x1 &= x0;	\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
74
75
  	x1 ^= x4;	x2 ^= x0;	x0 ^= x3;	\
  	x4 |= x0;	x0 ^= x2;	x2 &= x1;	\
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
76
77
78
  	x3 ^= x2;	x1 = ~x1;	x2 ^= x4;	\
  	x1 ^= x2;					\
  	})
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
79

7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
80
  #define S1(x0, x1, x2, x3, x4) ({			\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
81
  					x4  = x1;	\
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
82
  	x1 ^= x0;	x0 ^= x3;	x3 = ~x3;	\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
83
84
85
  	x4 &= x1;	x0 |= x1;	x3 ^= x2;	\
  	x0 ^= x3;	x1 ^= x3;	x3 ^= x4;	\
  	x1 |= x4;	x4 ^= x2;	x2 &= x0;	\
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
86
87
88
  	x2 ^= x1;	x1 |= x0;	x0 = ~x0;	\
  	x0 ^= x2;	x4 ^= x1;			\
  	})
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
89

7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
90
91
  #define S2(x0, x1, x2, x3, x4) ({			\
  					x3 = ~x3;	\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
92
93
94
  	x1 ^= x0;	x4  = x0;	x0 &= x2;	\
  	x0 ^= x3;	x3 |= x4;	x2 ^= x1;	\
  	x3 ^= x1;	x1 &= x0;	x0 ^= x2;	\
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
95
  	x2 &= x3;	x3 |= x1;	x0 = ~x0;	\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
96
  	x3 ^= x0;	x4 ^= x0;	x0 ^= x2;	\
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
97
98
  	x1 |= x2;					\
  	})
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
99

7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
100
  #define S3(x0, x1, x2, x3, x4) ({			\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
101
102
103
104
105
106
  					x4  = x1;	\
  	x1 ^= x3;	x3 |= x0;	x4 &= x0;	\
  	x0 ^= x2;	x2 ^= x1;	x1 &= x3;	\
  	x2 ^= x3;	x0 |= x4;	x4 ^= x3;	\
  	x1 ^= x0;	x0 &= x3;	x3 &= x4;	\
  	x3 ^= x2;	x4 |= x1;	x2 &= x1;	\
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
107
108
  	x4 ^= x3;	x0 ^= x3;	x3 ^= x2;	\
  	})
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
109

7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
110
  #define S4(x0, x1, x2, x3, x4) ({			\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
111
112
113
114
115
116
  					x4  = x3;	\
  	x3 &= x0;	x0 ^= x4;			\
  	x3 ^= x2;	x2 |= x4;	x0 ^= x1;	\
  	x4 ^= x3;	x2 |= x0;			\
  	x2 ^= x1;	x1 &= x0;			\
  	x1 ^= x4;	x4 &= x2;	x2 ^= x3;	\
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
117
118
119
  	x4 ^= x0;	x3 |= x1;	x1 = ~x1;	\
  	x3 ^= x0;					\
  	})
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
120

7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
121
  #define S5(x0, x1, x2, x3, x4) ({			\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
122
  	x4  = x1;	x1 |= x0;			\
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
123
  	x2 ^= x1;	x3 = ~x3;	x4 ^= x0;	\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
124
125
126
127
  	x0 ^= x2;	x1 &= x4;	x4 |= x3;	\
  	x4 ^= x0;	x0 &= x3;	x1 ^= x3;	\
  	x3 ^= x2;	x0 ^= x1;	x2 &= x4;	\
  	x1 ^= x2;	x2 &= x0;			\
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
128
129
  	x3 ^= x2;					\
  	})
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
130

7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
131
  #define S6(x0, x1, x2, x3, x4) ({			\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
132
133
  					x4  = x1;	\
  	x3 ^= x0;	x1 ^= x2;	x2 ^= x0;	\
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
134
  	x0 &= x3;	x1 |= x3;	x4 = ~x4;	\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
135
136
137
  	x0 ^= x1;	x1 ^= x2;			\
  	x3 ^= x4;	x4 ^= x0;	x2 &= x0;	\
  	x4 ^= x1;	x2 ^= x3;	x3 &= x1;	\
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
138
139
  	x3 ^= x0;	x1 ^= x2;			\
  	})
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
140

7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
141
142
143
  #define S7(x0, x1, x2, x3, x4) ({			\
  					x1 = ~x1;	\
  	x4  = x1;	x0 = ~x0;	x1 &= x2;	\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
144
145
146
147
148
  	x1 ^= x3;	x3 |= x4;	x4 ^= x2;	\
  	x2 ^= x3;	x3 ^= x0;	x0 |= x1;	\
  	x2 &= x0;	x0 ^= x4;	x4 ^= x3;	\
  	x3 &= x0;	x4 ^= x1;			\
  	x2 ^= x4;	x3 ^= x1;	x4 |= x0;	\
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
149
150
  	x4 ^= x1;					\
  	})
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
151

7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
152
  #define SI0(x0, x1, x2, x3, x4) ({			\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
153
  			x4  = x3;	x1 ^= x0;	\
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
154
  	x3 |= x1;	x4 ^= x1;	x0 = ~x0;	\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
155
156
157
  	x2 ^= x3;	x3 ^= x0;	x0 &= x1;	\
  	x0 ^= x2;	x2 &= x3;	x3 ^= x4;	\
  	x2 ^= x3;	x1 ^= x3;	x3 &= x0;	\
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
158
159
  	x1 ^= x0;	x0 ^= x2;	x4 ^= x3;	\
  	})
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
160

7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
161
  #define SI1(x0, x1, x2, x3, x4) ({			\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
162
  	x1 ^= x3;	x4  = x0;			\
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
163
  	x0 ^= x2;	x2 = ~x2;	x4 |= x1;	\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
164
165
166
167
  	x4 ^= x3;	x3 &= x1;	x1 ^= x2;	\
  	x2 &= x4;	x4 ^= x1;	x1 |= x3;	\
  	x3 ^= x0;	x2 ^= x0;	x0 |= x4;	\
  	x2 ^= x4;	x1 ^= x0;			\
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
168
169
  	x4 ^= x1;					\
  	})
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
170

7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
171
172
  #define SI2(x0, x1, x2, x3, x4) ({			\
  	x2 ^= x1;	x4  = x3;	x3 = ~x3;	\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
173
174
175
176
  	x3 |= x2;	x2 ^= x4;	x4 ^= x0;	\
  	x3 ^= x1;	x1 |= x2;	x2 ^= x0;	\
  	x1 ^= x4;	x4 |= x3;	x2 ^= x3;	\
  	x4 ^= x2;	x2 &= x1;			\
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
177
178
  	x2 ^= x3;	x3 ^= x4;	x4 ^= x0;	\
  	})
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
179

7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
180
  #define SI3(x0, x1, x2, x3, x4) ({			\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
181
182
183
184
185
186
  					x2 ^= x1;	\
  	x4  = x1;	x1 &= x2;			\
  	x1 ^= x0;	x0 |= x4;	x4 ^= x3;	\
  	x0 ^= x3;	x3 |= x1;	x1 ^= x2;	\
  	x1 ^= x3;	x0 ^= x2;	x2 ^= x3;	\
  	x3 &= x1;	x1 ^= x0;	x0 &= x2;	\
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
187
188
  	x4 ^= x3;	x3 ^= x0;	x0 ^= x1;	\
  	})
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
189

7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
190
  #define SI4(x0, x1, x2, x3, x4) ({			\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
191
  	x2 ^= x3;	x4  = x0;	x0 &= x1;	\
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
192
  	x0 ^= x2;	x2 |= x3;	x4 = ~x4;	\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
193
194
195
196
  	x1 ^= x0;	x0 ^= x2;	x2 &= x4;	\
  	x2 ^= x0;	x0 |= x4;			\
  	x0 ^= x3;	x3 &= x2;			\
  	x4 ^= x3;	x3 ^= x1;	x1 &= x0;	\
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
197
198
  	x4 ^= x1;	x0 ^= x3;			\
  	})
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
199

7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
200
  #define SI5(x0, x1, x2, x3, x4) ({			\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
201
202
  			x4  = x1;	x1 |= x2;	\
  	x2 ^= x4;	x1 ^= x3;	x3 &= x4;	\
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
203
  	x2 ^= x3;	x3 |= x0;	x0 = ~x0;	\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
204
205
206
  	x3 ^= x2;	x2 |= x0;	x4 ^= x1;	\
  	x2 ^= x4;	x4 &= x0;	x0 ^= x1;	\
  	x1 ^= x3;	x0 &= x2;	x2 ^= x3;	\
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
207
208
  	x0 ^= x2;	x2 ^= x4;	x4 ^= x3;	\
  	})
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
209

7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
210
  #define SI6(x0, x1, x2, x3, x4) ({			\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
211
212
213
  			x0 ^= x2;			\
  	x4  = x0;	x0 &= x3;	x2 ^= x3;	\
  	x0 ^= x2;	x3 ^= x1;	x2 |= x4;	\
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
214
  	x2 ^= x3;	x3 &= x0;	x0 = ~x0;	\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
215
216
  	x3 ^= x1;	x1 &= x2;	x4 ^= x0;	\
  	x3 ^= x4;	x4 ^= x2;	x0 ^= x1;	\
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
217
218
  	x2 ^= x0;					\
  	})
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
219

7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
220
  #define SI7(x0, x1, x2, x3, x4) ({			\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
221
  	x4  = x3;	x3 &= x0;	x0 ^= x2;	\
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
222
  	x2 |= x4;	x4 ^= x1;	x0 = ~x0;	\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
223
224
225
226
  	x1 |= x3;	x4 ^= x0;	x0 &= x2;	\
  	x0 ^= x1;	x1 &= x2;	x3 ^= x2;	\
  	x4 ^= x3;	x2 &= x3;	x3 |= x0;	\
  	x1 ^= x4;	x3 ^= x4;	x4 &= x0;	\
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
227
228
  	x4 ^= x2;					\
  	})
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
229

c871c10e4   Arnd Bergmann   crypto: serpent -...
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
  static void __serpent_setkey_sbox(u32 r0, u32 r1, u32 r2, u32 r3, u32 r4, u32 *k)
  {
  	k += 100;
  	S3(r3, r4, r0, r1, r2); store_and_load_keys(r1, r2, r4, r3, 28, 24);
  	S4(r1, r2, r4, r3, r0); store_and_load_keys(r2, r4, r3, r0, 24, 20);
  	S5(r2, r4, r3, r0, r1); store_and_load_keys(r1, r2, r4, r0, 20, 16);
  	S6(r1, r2, r4, r0, r3); store_and_load_keys(r4, r3, r2, r0, 16, 12);
  	S7(r4, r3, r2, r0, r1); store_and_load_keys(r1, r2, r0, r4, 12, 8);
  	S0(r1, r2, r0, r4, r3); store_and_load_keys(r0, r2, r4, r1, 8, 4);
  	S1(r0, r2, r4, r1, r3); store_and_load_keys(r3, r4, r1, r0, 4, 0);
  	S2(r3, r4, r1, r0, r2); store_and_load_keys(r2, r4, r3, r0, 0, -4);
  	S3(r2, r4, r3, r0, r1); store_and_load_keys(r0, r1, r4, r2, -4, -8);
  	S4(r0, r1, r4, r2, r3); store_and_load_keys(r1, r4, r2, r3, -8, -12);
  	S5(r1, r4, r2, r3, r0); store_and_load_keys(r0, r1, r4, r3, -12, -16);
  	S6(r0, r1, r4, r3, r2); store_and_load_keys(r4, r2, r1, r3, -16, -20);
  	S7(r4, r2, r1, r3, r0); store_and_load_keys(r0, r1, r3, r4, -20, -24);
  	S0(r0, r1, r3, r4, r2); store_and_load_keys(r3, r1, r4, r0, -24, -28);
  	k -= 50;
  	S1(r3, r1, r4, r0, r2); store_and_load_keys(r2, r4, r0, r3, 22, 18);
  	S2(r2, r4, r0, r3, r1); store_and_load_keys(r1, r4, r2, r3, 18, 14);
  	S3(r1, r4, r2, r3, r0); store_and_load_keys(r3, r0, r4, r1, 14, 10);
  	S4(r3, r0, r4, r1, r2); store_and_load_keys(r0, r4, r1, r2, 10, 6);
  	S5(r0, r4, r1, r2, r3); store_and_load_keys(r3, r0, r4, r2, 6, 2);
  	S6(r3, r0, r4, r2, r1); store_and_load_keys(r4, r1, r0, r2, 2, -2);
  	S7(r4, r1, r0, r2, r3); store_and_load_keys(r3, r0, r2, r4, -2, -6);
  	S0(r3, r0, r2, r4, r1); store_and_load_keys(r2, r0, r4, r3, -6, -10);
  	S1(r2, r0, r4, r3, r1); store_and_load_keys(r1, r4, r3, r2, -10, -14);
  	S2(r1, r4, r3, r2, r0); store_and_load_keys(r0, r4, r1, r2, -14, -18);
  	S3(r0, r4, r1, r2, r3); store_and_load_keys(r2, r3, r4, r0, -18, -22);
  	k -= 50;
  	S4(r2, r3, r4, r0, r1); store_and_load_keys(r3, r4, r0, r1, 28, 24);
  	S5(r3, r4, r0, r1, r2); store_and_load_keys(r2, r3, r4, r1, 24, 20);
  	S6(r2, r3, r4, r1, r0); store_and_load_keys(r4, r0, r3, r1, 20, 16);
  	S7(r4, r0, r3, r1, r2); store_and_load_keys(r2, r3, r1, r4, 16, 12);
  	S0(r2, r3, r1, r4, r0); store_and_load_keys(r1, r3, r4, r2, 12, 8);
  	S1(r1, r3, r4, r2, r0); store_and_load_keys(r0, r4, r2, r1, 8, 4);
  	S2(r0, r4, r2, r1, r3); store_and_load_keys(r3, r4, r0, r1, 4, 0);
  	S3(r3, r4, r0, r1, r2); storekeys(r1, r2, r4, r3, 0);
  }
18482053f   Jussi Kivilinna   crypto: serpent-s...
269
270
  int __serpent_setkey(struct serpent_ctx *ctx, const u8 *key,
  		     unsigned int keylen)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
271
  {
6c2bb98bc   Herbert Xu   [CRYPTO] all: Pas...
272
  	u32 *k = ctx->expkey;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
273
  	u8  *k8 = (u8 *)k;
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
274
  	u32 r0, r1, r2, r3, r4;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
275
  	int i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
  	/* Copy key, add padding */
  
  	for (i = 0; i < keylen; ++i)
  		k8[i] = key[i];
  	if (i < SERPENT_MAX_KEY_SIZE)
  		k8[i++] = 1;
  	while (i < SERPENT_MAX_KEY_SIZE)
  		k8[i++] = 0;
  
  	/* Expand key using polynomial */
  
  	r0 = le32_to_cpu(k[3]);
  	r1 = le32_to_cpu(k[4]);
  	r2 = le32_to_cpu(k[5]);
  	r3 = le32_to_cpu(k[6]);
  	r4 = le32_to_cpu(k[7]);
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
  	keyiter(le32_to_cpu(k[0]), r0, r4, r2, 0, 0);
  	keyiter(le32_to_cpu(k[1]), r1, r0, r3, 1, 1);
  	keyiter(le32_to_cpu(k[2]), r2, r1, r4, 2, 2);
  	keyiter(le32_to_cpu(k[3]), r3, r2, r0, 3, 3);
  	keyiter(le32_to_cpu(k[4]), r4, r3, r1, 4, 4);
  	keyiter(le32_to_cpu(k[5]), r0, r4, r2, 5, 5);
  	keyiter(le32_to_cpu(k[6]), r1, r0, r3, 6, 6);
  	keyiter(le32_to_cpu(k[7]), r2, r1, r4, 7, 7);
  
  	keyiter(k[0], r3, r2, r0, 8, 8);
  	keyiter(k[1], r4, r3, r1, 9, 9);
  	keyiter(k[2], r0, r4, r2, 10, 10);
  	keyiter(k[3], r1, r0, r3, 11, 11);
  	keyiter(k[4], r2, r1, r4, 12, 12);
  	keyiter(k[5], r3, r2, r0, 13, 13);
  	keyiter(k[6], r4, r3, r1, 14, 14);
  	keyiter(k[7], r0, r4, r2, 15, 15);
  	keyiter(k[8], r1, r0, r3, 16, 16);
  	keyiter(k[9], r2, r1, r4, 17, 17);
  	keyiter(k[10], r3, r2, r0, 18, 18);
  	keyiter(k[11], r4, r3, r1, 19, 19);
  	keyiter(k[12], r0, r4, r2, 20, 20);
  	keyiter(k[13], r1, r0, r3, 21, 21);
  	keyiter(k[14], r2, r1, r4, 22, 22);
  	keyiter(k[15], r3, r2, r0, 23, 23);
  	keyiter(k[16], r4, r3, r1, 24, 24);
  	keyiter(k[17], r0, r4, r2, 25, 25);
  	keyiter(k[18], r1, r0, r3, 26, 26);
  	keyiter(k[19], r2, r1, r4, 27, 27);
  	keyiter(k[20], r3, r2, r0, 28, 28);
  	keyiter(k[21], r4, r3, r1, 29, 29);
  	keyiter(k[22], r0, r4, r2, 30, 30);
  	keyiter(k[23], r1, r0, r3, 31, 31);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
325
326
  
  	k += 50;
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
  	keyiter(k[-26], r2, r1, r4, 32, -18);
  	keyiter(k[-25], r3, r2, r0, 33, -17);
  	keyiter(k[-24], r4, r3, r1, 34, -16);
  	keyiter(k[-23], r0, r4, r2, 35, -15);
  	keyiter(k[-22], r1, r0, r3, 36, -14);
  	keyiter(k[-21], r2, r1, r4, 37, -13);
  	keyiter(k[-20], r3, r2, r0, 38, -12);
  	keyiter(k[-19], r4, r3, r1, 39, -11);
  	keyiter(k[-18], r0, r4, r2, 40, -10);
  	keyiter(k[-17], r1, r0, r3, 41, -9);
  	keyiter(k[-16], r2, r1, r4, 42, -8);
  	keyiter(k[-15], r3, r2, r0, 43, -7);
  	keyiter(k[-14], r4, r3, r1, 44, -6);
  	keyiter(k[-13], r0, r4, r2, 45, -5);
  	keyiter(k[-12], r1, r0, r3, 46, -4);
  	keyiter(k[-11], r2, r1, r4, 47, -3);
  	keyiter(k[-10], r3, r2, r0, 48, -2);
  	keyiter(k[-9], r4, r3, r1, 49, -1);
  	keyiter(k[-8], r0, r4, r2, 50, 0);
  	keyiter(k[-7], r1, r0, r3, 51, 1);
  	keyiter(k[-6], r2, r1, r4, 52, 2);
  	keyiter(k[-5], r3, r2, r0, 53, 3);
  	keyiter(k[-4], r4, r3, r1, 54, 4);
  	keyiter(k[-3], r0, r4, r2, 55, 5);
  	keyiter(k[-2], r1, r0, r3, 56, 6);
  	keyiter(k[-1], r2, r1, r4, 57, 7);
  	keyiter(k[0], r3, r2, r0, 58, 8);
  	keyiter(k[1], r4, r3, r1, 59, 9);
  	keyiter(k[2], r0, r4, r2, 60, 10);
  	keyiter(k[3], r1, r0, r3, 61, 11);
  	keyiter(k[4], r2, r1, r4, 62, 12);
  	keyiter(k[5], r3, r2, r0, 63, 13);
  	keyiter(k[6], r4, r3, r1, 64, 14);
  	keyiter(k[7], r0, r4, r2, 65, 15);
  	keyiter(k[8], r1, r0, r3, 66, 16);
  	keyiter(k[9], r2, r1, r4, 67, 17);
  	keyiter(k[10], r3, r2, r0, 68, 18);
  	keyiter(k[11], r4, r3, r1, 69, 19);
  	keyiter(k[12], r0, r4, r2, 70, 20);
  	keyiter(k[13], r1, r0, r3, 71, 21);
  	keyiter(k[14], r2, r1, r4, 72, 22);
  	keyiter(k[15], r3, r2, r0, 73, 23);
  	keyiter(k[16], r4, r3, r1, 74, 24);
  	keyiter(k[17], r0, r4, r2, 75, 25);
  	keyiter(k[18], r1, r0, r3, 76, 26);
  	keyiter(k[19], r2, r1, r4, 77, 27);
  	keyiter(k[20], r3, r2, r0, 78, 28);
  	keyiter(k[21], r4, r3, r1, 79, 29);
  	keyiter(k[22], r0, r4, r2, 80, 30);
  	keyiter(k[23], r1, r0, r3, 81, 31);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
377
378
  
  	k += 50;
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
  	keyiter(k[-26], r2, r1, r4, 82, -18);
  	keyiter(k[-25], r3, r2, r0, 83, -17);
  	keyiter(k[-24], r4, r3, r1, 84, -16);
  	keyiter(k[-23], r0, r4, r2, 85, -15);
  	keyiter(k[-22], r1, r0, r3, 86, -14);
  	keyiter(k[-21], r2, r1, r4, 87, -13);
  	keyiter(k[-20], r3, r2, r0, 88, -12);
  	keyiter(k[-19], r4, r3, r1, 89, -11);
  	keyiter(k[-18], r0, r4, r2, 90, -10);
  	keyiter(k[-17], r1, r0, r3, 91, -9);
  	keyiter(k[-16], r2, r1, r4, 92, -8);
  	keyiter(k[-15], r3, r2, r0, 93, -7);
  	keyiter(k[-14], r4, r3, r1, 94, -6);
  	keyiter(k[-13], r0, r4, r2, 95, -5);
  	keyiter(k[-12], r1, r0, r3, 96, -4);
  	keyiter(k[-11], r2, r1, r4, 97, -3);
  	keyiter(k[-10], r3, r2, r0, 98, -2);
  	keyiter(k[-9], r4, r3, r1, 99, -1);
  	keyiter(k[-8], r0, r4, r2, 100, 0);
  	keyiter(k[-7], r1, r0, r3, 101, 1);
  	keyiter(k[-6], r2, r1, r4, 102, 2);
  	keyiter(k[-5], r3, r2, r0, 103, 3);
  	keyiter(k[-4], r4, r3, r1, 104, 4);
  	keyiter(k[-3], r0, r4, r2, 105, 5);
  	keyiter(k[-2], r1, r0, r3, 106, 6);
  	keyiter(k[-1], r2, r1, r4, 107, 7);
  	keyiter(k[0], r3, r2, r0, 108, 8);
  	keyiter(k[1], r4, r3, r1, 109, 9);
  	keyiter(k[2], r0, r4, r2, 110, 10);
  	keyiter(k[3], r1, r0, r3, 111, 11);
  	keyiter(k[4], r2, r1, r4, 112, 12);
  	keyiter(k[5], r3, r2, r0, 113, 13);
  	keyiter(k[6], r4, r3, r1, 114, 14);
  	keyiter(k[7], r0, r4, r2, 115, 15);
  	keyiter(k[8], r1, r0, r3, 116, 16);
  	keyiter(k[9], r2, r1, r4, 117, 17);
  	keyiter(k[10], r3, r2, r0, 118, 18);
  	keyiter(k[11], r4, r3, r1, 119, 19);
  	keyiter(k[12], r0, r4, r2, 120, 20);
  	keyiter(k[13], r1, r0, r3, 121, 21);
  	keyiter(k[14], r2, r1, r4, 122, 22);
  	keyiter(k[15], r3, r2, r0, 123, 23);
  	keyiter(k[16], r4, r3, r1, 124, 24);
  	keyiter(k[17], r0, r4, r2, 125, 25);
  	keyiter(k[18], r1, r0, r3, 126, 26);
  	keyiter(k[19], r2, r1, r4, 127, 27);
  	keyiter(k[20], r3, r2, r0, 128, 28);
  	keyiter(k[21], r4, r3, r1, 129, 29);
  	keyiter(k[22], r0, r4, r2, 130, 30);
  	keyiter(k[23], r1, r0, r3, 131, 31);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
429
430
  
  	/* Apply S-boxes */
c871c10e4   Arnd Bergmann   crypto: serpent -...
431
  	__serpent_setkey_sbox(r0, r1, r2, r3, r4, ctx->expkey);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
432
433
434
  
  	return 0;
  }
18482053f   Jussi Kivilinna   crypto: serpent-s...
435
436
437
438
439
440
  EXPORT_SYMBOL_GPL(__serpent_setkey);
  
  int serpent_setkey(struct crypto_tfm *tfm, const u8 *key, unsigned int keylen)
  {
  	return __serpent_setkey(crypto_tfm_ctx(tfm), key, keylen);
  }
bc83b8299   Jussi Kivilinna   crypto: serpent -...
441
  EXPORT_SYMBOL_GPL(serpent_setkey);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
442

bc83b8299   Jussi Kivilinna   crypto: serpent -...
443
  void __serpent_encrypt(struct serpent_ctx *ctx, u8 *dst, const u8 *src)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
444
  {
bc83b8299   Jussi Kivilinna   crypto: serpent -...
445
  	const u32 *k = ctx->expkey;
d08f74e58   Alexey Dobriyan   [PATCH] serpent: ...
446
447
448
  	const __le32 *s = (const __le32 *)src;
  	__le32	*d = (__le32 *)dst;
  	u32	r0, r1, r2, r3, r4;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
449
450
451
452
453
454
455
456
457
458
  
  /*
   * Note: The conversions between u8* and u32* might cause trouble
   * on architectures with stricter alignment rules than x86
   */
  
  	r0 = le32_to_cpu(s[0]);
  	r1 = le32_to_cpu(s[1]);
  	r2 = le32_to_cpu(s[2]);
  	r3 = le32_to_cpu(s[3]);
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
  					K(r0, r1, r2, r3, 0);
  	S0(r0, r1, r2, r3, r4);		LK(r2, r1, r3, r0, r4, 1);
  	S1(r2, r1, r3, r0, r4);		LK(r4, r3, r0, r2, r1, 2);
  	S2(r4, r3, r0, r2, r1);		LK(r1, r3, r4, r2, r0, 3);
  	S3(r1, r3, r4, r2, r0);		LK(r2, r0, r3, r1, r4, 4);
  	S4(r2, r0, r3, r1, r4);		LK(r0, r3, r1, r4, r2, 5);
  	S5(r0, r3, r1, r4, r2);		LK(r2, r0, r3, r4, r1, 6);
  	S6(r2, r0, r3, r4, r1);		LK(r3, r1, r0, r4, r2, 7);
  	S7(r3, r1, r0, r4, r2);		LK(r2, r0, r4, r3, r1, 8);
  	S0(r2, r0, r4, r3, r1);		LK(r4, r0, r3, r2, r1, 9);
  	S1(r4, r0, r3, r2, r1);		LK(r1, r3, r2, r4, r0, 10);
  	S2(r1, r3, r2, r4, r0);		LK(r0, r3, r1, r4, r2, 11);
  	S3(r0, r3, r1, r4, r2);		LK(r4, r2, r3, r0, r1, 12);
  	S4(r4, r2, r3, r0, r1);		LK(r2, r3, r0, r1, r4, 13);
  	S5(r2, r3, r0, r1, r4);		LK(r4, r2, r3, r1, r0, 14);
  	S6(r4, r2, r3, r1, r0);		LK(r3, r0, r2, r1, r4, 15);
  	S7(r3, r0, r2, r1, r4);		LK(r4, r2, r1, r3, r0, 16);
  	S0(r4, r2, r1, r3, r0);		LK(r1, r2, r3, r4, r0, 17);
  	S1(r1, r2, r3, r4, r0);		LK(r0, r3, r4, r1, r2, 18);
  	S2(r0, r3, r4, r1, r2);		LK(r2, r3, r0, r1, r4, 19);
  	S3(r2, r3, r0, r1, r4);		LK(r1, r4, r3, r2, r0, 20);
  	S4(r1, r4, r3, r2, r0);		LK(r4, r3, r2, r0, r1, 21);
  	S5(r4, r3, r2, r0, r1);		LK(r1, r4, r3, r0, r2, 22);
  	S6(r1, r4, r3, r0, r2);		LK(r3, r2, r4, r0, r1, 23);
  	S7(r3, r2, r4, r0, r1);		LK(r1, r4, r0, r3, r2, 24);
  	S0(r1, r4, r0, r3, r2);		LK(r0, r4, r3, r1, r2, 25);
  	S1(r0, r4, r3, r1, r2);		LK(r2, r3, r1, r0, r4, 26);
  	S2(r2, r3, r1, r0, r4);		LK(r4, r3, r2, r0, r1, 27);
  	S3(r4, r3, r2, r0, r1);		LK(r0, r1, r3, r4, r2, 28);
  	S4(r0, r1, r3, r4, r2);		LK(r1, r3, r4, r2, r0, 29);
  	S5(r1, r3, r4, r2, r0);		LK(r0, r1, r3, r2, r4, 30);
  	S6(r0, r1, r3, r2, r4);		LK(r3, r4, r1, r2, r0, 31);
  	S7(r3, r4, r1, r2, r0);		K(r0, r1, r2, r3, 32);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
492
493
494
495
496
497
  
  	d[0] = cpu_to_le32(r0);
  	d[1] = cpu_to_le32(r1);
  	d[2] = cpu_to_le32(r2);
  	d[3] = cpu_to_le32(r3);
  }
bc83b8299   Jussi Kivilinna   crypto: serpent -...
498
  EXPORT_SYMBOL_GPL(__serpent_encrypt);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
499

bc83b8299   Jussi Kivilinna   crypto: serpent -...
500
  static void serpent_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
501
  {
6c2bb98bc   Herbert Xu   [CRYPTO] all: Pas...
502
  	struct serpent_ctx *ctx = crypto_tfm_ctx(tfm);
bc83b8299   Jussi Kivilinna   crypto: serpent -...
503
504
505
506
507
508
509
  
  	__serpent_encrypt(ctx, dst, src);
  }
  
  void __serpent_decrypt(struct serpent_ctx *ctx, u8 *dst, const u8 *src)
  {
  	const u32 *k = ctx->expkey;
d08f74e58   Alexey Dobriyan   [PATCH] serpent: ...
510
511
512
  	const __le32 *s = (const __le32 *)src;
  	__le32	*d = (__le32 *)dst;
  	u32	r0, r1, r2, r3, r4;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
513
514
515
516
517
  
  	r0 = le32_to_cpu(s[0]);
  	r1 = le32_to_cpu(s[1]);
  	r2 = le32_to_cpu(s[2]);
  	r3 = le32_to_cpu(s[3]);
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
  					K(r0, r1, r2, r3, 32);
  	SI7(r0, r1, r2, r3, r4);	KL(r1, r3, r0, r4, r2, 31);
  	SI6(r1, r3, r0, r4, r2);	KL(r0, r2, r4, r1, r3, 30);
  	SI5(r0, r2, r4, r1, r3);	KL(r2, r3, r0, r4, r1, 29);
  	SI4(r2, r3, r0, r4, r1);	KL(r2, r0, r1, r4, r3, 28);
  	SI3(r2, r0, r1, r4, r3);	KL(r1, r2, r3, r4, r0, 27);
  	SI2(r1, r2, r3, r4, r0);	KL(r2, r0, r4, r3, r1, 26);
  	SI1(r2, r0, r4, r3, r1);	KL(r1, r0, r4, r3, r2, 25);
  	SI0(r1, r0, r4, r3, r2);	KL(r4, r2, r0, r1, r3, 24);
  	SI7(r4, r2, r0, r1, r3);	KL(r2, r1, r4, r3, r0, 23);
  	SI6(r2, r1, r4, r3, r0);	KL(r4, r0, r3, r2, r1, 22);
  	SI5(r4, r0, r3, r2, r1);	KL(r0, r1, r4, r3, r2, 21);
  	SI4(r0, r1, r4, r3, r2);	KL(r0, r4, r2, r3, r1, 20);
  	SI3(r0, r4, r2, r3, r1);	KL(r2, r0, r1, r3, r4, 19);
  	SI2(r2, r0, r1, r3, r4);	KL(r0, r4, r3, r1, r2, 18);
  	SI1(r0, r4, r3, r1, r2);	KL(r2, r4, r3, r1, r0, 17);
  	SI0(r2, r4, r3, r1, r0);	KL(r3, r0, r4, r2, r1, 16);
  	SI7(r3, r0, r4, r2, r1);	KL(r0, r2, r3, r1, r4, 15);
  	SI6(r0, r2, r3, r1, r4);	KL(r3, r4, r1, r0, r2, 14);
  	SI5(r3, r4, r1, r0, r2);	KL(r4, r2, r3, r1, r0, 13);
  	SI4(r4, r2, r3, r1, r0);	KL(r4, r3, r0, r1, r2, 12);
  	SI3(r4, r3, r0, r1, r2);	KL(r0, r4, r2, r1, r3, 11);
  	SI2(r0, r4, r2, r1, r3);	KL(r4, r3, r1, r2, r0, 10);
  	SI1(r4, r3, r1, r2, r0);	KL(r0, r3, r1, r2, r4, 9);
  	SI0(r0, r3, r1, r2, r4);	KL(r1, r4, r3, r0, r2, 8);
  	SI7(r1, r4, r3, r0, r2);	KL(r4, r0, r1, r2, r3, 7);
  	SI6(r4, r0, r1, r2, r3);	KL(r1, r3, r2, r4, r0, 6);
  	SI5(r1, r3, r2, r4, r0);	KL(r3, r0, r1, r2, r4, 5);
  	SI4(r3, r0, r1, r2, r4);	KL(r3, r1, r4, r2, r0, 4);
  	SI3(r3, r1, r4, r2, r0);	KL(r4, r3, r0, r2, r1, 3);
  	SI2(r4, r3, r0, r2, r1);	KL(r3, r1, r2, r0, r4, 2);
  	SI1(r3, r1, r2, r0, r4);	KL(r4, r1, r2, r0, r3, 1);
  	SI0(r4, r1, r2, r0, r3);	K(r2, r3, r1, r4, 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
551
552
553
554
555
556
  
  	d[0] = cpu_to_le32(r2);
  	d[1] = cpu_to_le32(r3);
  	d[2] = cpu_to_le32(r1);
  	d[3] = cpu_to_le32(r4);
  }
bc83b8299   Jussi Kivilinna   crypto: serpent -...
557
558
559
560
561
562
563
564
  EXPORT_SYMBOL_GPL(__serpent_decrypt);
  
  static void serpent_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
  {
  	struct serpent_ctx *ctx = crypto_tfm_ctx(tfm);
  
  	__serpent_decrypt(ctx, dst, src);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
565

6c2bb98bc   Herbert Xu   [CRYPTO] all: Pas...
566
  static int tnepres_setkey(struct crypto_tfm *tfm, const u8 *key,
560c06ae1   Herbert Xu   [CRYPTO] api: Get...
567
  			  unsigned int keylen)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
568
569
570
  {
  	u8 rev_key[SERPENT_MAX_KEY_SIZE];
  	int i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
571
572
  	for (i = 0; i < keylen; ++i)
  		rev_key[keylen - i - 1] = key[i];
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
573

560c06ae1   Herbert Xu   [CRYPTO] api: Get...
574
  	return serpent_setkey(tfm, rev_key, keylen);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
575
  }
6c2bb98bc   Herbert Xu   [CRYPTO] all: Pas...
576
  static void tnepres_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
577
578
579
580
581
582
583
584
585
586
  {
  	const u32 * const s = (const u32 * const)src;
  	u32 * const d = (u32 * const)dst;
  
  	u32 rs[4], rd[4];
  
  	rs[0] = swab32(s[3]);
  	rs[1] = swab32(s[2]);
  	rs[2] = swab32(s[1]);
  	rs[3] = swab32(s[0]);
6c2bb98bc   Herbert Xu   [CRYPTO] all: Pas...
587
  	serpent_encrypt(tfm, (u8 *)rd, (u8 *)rs);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
588
589
590
591
592
593
  
  	d[0] = swab32(rd[3]);
  	d[1] = swab32(rd[2]);
  	d[2] = swab32(rd[1]);
  	d[3] = swab32(rd[0]);
  }
6c2bb98bc   Herbert Xu   [CRYPTO] all: Pas...
594
  static void tnepres_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
595
596
597
598
599
600
601
602
603
604
  {
  	const u32 * const s = (const u32 * const)src;
  	u32 * const d = (u32 * const)dst;
  
  	u32 rs[4], rd[4];
  
  	rs[0] = swab32(s[3]);
  	rs[1] = swab32(s[2]);
  	rs[2] = swab32(s[1]);
  	rs[3] = swab32(s[0]);
6c2bb98bc   Herbert Xu   [CRYPTO] all: Pas...
605
  	serpent_decrypt(tfm, (u8 *)rd, (u8 *)rs);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
606
607
608
609
610
611
  
  	d[0] = swab32(rd[3]);
  	d[1] = swab32(rd[2]);
  	d[2] = swab32(rd[1]);
  	d[3] = swab32(rd[0]);
  }
bbc406b9d   Jussi Kivilinna   crypto: serpent -...
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
  static struct crypto_alg srp_algs[2] = { {
  	.cra_name		=	"serpent",
  	.cra_driver_name	=	"serpent-generic",
  	.cra_priority		=	100,
  	.cra_flags		=	CRYPTO_ALG_TYPE_CIPHER,
  	.cra_blocksize		=	SERPENT_BLOCK_SIZE,
  	.cra_ctxsize		=	sizeof(struct serpent_ctx),
  	.cra_alignmask		=	3,
  	.cra_module		=	THIS_MODULE,
  	.cra_u			=	{ .cipher = {
  	.cia_min_keysize	=	SERPENT_MIN_KEY_SIZE,
  	.cia_max_keysize	=	SERPENT_MAX_KEY_SIZE,
  	.cia_setkey		=	serpent_setkey,
  	.cia_encrypt		=	serpent_encrypt,
  	.cia_decrypt		=	serpent_decrypt } }
  }, {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
628
629
630
631
  	.cra_name		=	"tnepres",
  	.cra_flags		=	CRYPTO_ALG_TYPE_CIPHER,
  	.cra_blocksize		=	SERPENT_BLOCK_SIZE,
  	.cra_ctxsize		=	sizeof(struct serpent_ctx),
a429d2609   Herbert Xu   [CRYPTO] cipher: ...
632
  	.cra_alignmask		=	3,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
633
  	.cra_module		=	THIS_MODULE,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
634
635
636
  	.cra_u			=	{ .cipher = {
  	.cia_min_keysize	=	SERPENT_MIN_KEY_SIZE,
  	.cia_max_keysize	=	SERPENT_MAX_KEY_SIZE,
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
637
638
639
  	.cia_setkey		=	tnepres_setkey,
  	.cia_encrypt		=	tnepres_encrypt,
  	.cia_decrypt		=	tnepres_decrypt } }
bbc406b9d   Jussi Kivilinna   crypto: serpent -...
640
  } };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
641

3af5b90bd   Kamalesh Babulal   [CRYPTO] all: Cle...
642
  static int __init serpent_mod_init(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
643
  {
bbc406b9d   Jussi Kivilinna   crypto: serpent -...
644
  	return crypto_register_algs(srp_algs, ARRAY_SIZE(srp_algs));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
645
  }
3af5b90bd   Kamalesh Babulal   [CRYPTO] all: Cle...
646
  static void __exit serpent_mod_fini(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
647
  {
bbc406b9d   Jussi Kivilinna   crypto: serpent -...
648
  	crypto_unregister_algs(srp_algs, ARRAY_SIZE(srp_algs));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
649
  }
3af5b90bd   Kamalesh Babulal   [CRYPTO] all: Cle...
650
651
  module_init(serpent_mod_init);
  module_exit(serpent_mod_fini);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
652
653
654
655
  
  MODULE_LICENSE("GPL");
  MODULE_DESCRIPTION("Serpent and tnepres (kerneli compatible serpent reversed) Cipher Algorithm");
  MODULE_AUTHOR("Dag Arne Osvik <osvik@ii.uib.no>");
5d26a105b   Kees Cook   crypto: prefix mo...
656
657
  MODULE_ALIAS_CRYPTO("tnepres");
  MODULE_ALIAS_CRYPTO("serpent");
3e14dcf7c   Mathias Krause   crypto: add missi...
658
  MODULE_ALIAS_CRYPTO("serpent-generic");