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

18482053f   Jussi Kivilinna   crypto: serpent-s...
230
231
  int __serpent_setkey(struct serpent_ctx *ctx, const u8 *key,
  		     unsigned int keylen)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
232
  {
6c2bb98bc   Herbert Xu   [CRYPTO] all: Pas...
233
  	u32 *k = ctx->expkey;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
234
  	u8  *k8 = (u8 *)k;
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
235
  	u32 r0, r1, r2, r3, r4;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
236
  	int i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
  	/* 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 -...
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
  	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
286
287
  
  	k += 50;
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
288
289
290
291
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
325
326
327
328
329
330
331
332
333
334
335
336
337
  	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
338
339
  
  	k += 50;
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
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
377
378
379
380
381
382
383
384
385
386
387
388
389
  	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
390
391
  
  	/* Apply S-boxes */
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
392
393
394
395
396
397
398
399
400
401
402
403
404
405
  	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);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
406
  	k -= 50;
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
407
408
409
410
411
412
413
414
415
416
417
  	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);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
418
  	k -= 50;
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
419
420
421
422
423
424
425
426
  	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);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
427
428
429
  
  	return 0;
  }
18482053f   Jussi Kivilinna   crypto: serpent-s...
430
431
432
433
434
435
  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 -...
436
  EXPORT_SYMBOL_GPL(serpent_setkey);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
437

bc83b8299   Jussi Kivilinna   crypto: serpent -...
438
  void __serpent_encrypt(struct serpent_ctx *ctx, u8 *dst, const u8 *src)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
439
  {
bc83b8299   Jussi Kivilinna   crypto: serpent -...
440
  	const u32 *k = ctx->expkey;
d08f74e58   Alexey Dobriyan   [PATCH] serpent: ...
441
442
443
  	const __le32 *s = (const __le32 *)src;
  	__le32	*d = (__le32 *)dst;
  	u32	r0, r1, r2, r3, r4;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
444
445
446
447
448
449
450
451
452
453
  
  /*
   * 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 -...
454
455
456
457
458
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
  					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
487
488
489
490
491
492
  
  	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 -...
493
  EXPORT_SYMBOL_GPL(__serpent_encrypt);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
494

bc83b8299   Jussi Kivilinna   crypto: serpent -...
495
  static void serpent_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
496
  {
6c2bb98bc   Herbert Xu   [CRYPTO] all: Pas...
497
  	struct serpent_ctx *ctx = crypto_tfm_ctx(tfm);
bc83b8299   Jussi Kivilinna   crypto: serpent -...
498
499
500
501
502
503
504
  
  	__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: ...
505
506
507
  	const __le32 *s = (const __le32 *)src;
  	__le32	*d = (__le32 *)dst;
  	u32	r0, r1, r2, r3, r4;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
508
509
510
511
512
  
  	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 -...
513
514
515
516
517
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
  					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
546
547
548
549
550
551
  
  	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 -...
552
553
554
555
556
557
558
559
  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
560
561
562
  
  static struct crypto_alg serpent_alg = {
  	.cra_name		=	"serpent",
dd6eec242   Jussi Kivilinna   crypto: serpent -...
563
564
  	.cra_driver_name	=	"serpent-generic",
  	.cra_priority		=	100,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
565
566
567
  	.cra_flags		=	CRYPTO_ALG_TYPE_CIPHER,
  	.cra_blocksize		=	SERPENT_BLOCK_SIZE,
  	.cra_ctxsize		=	sizeof(struct serpent_ctx),
20ea34048   Atsushi Nemoto   [CRYPTO] all: Add...
568
  	.cra_alignmask		=	3,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
569
570
571
572
573
  	.cra_module		=	THIS_MODULE,
  	.cra_list		=	LIST_HEAD_INIT(serpent_alg.cra_list),
  	.cra_u			=	{ .cipher = {
  	.cia_min_keysize	=	SERPENT_MIN_KEY_SIZE,
  	.cia_max_keysize	=	SERPENT_MAX_KEY_SIZE,
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
574
575
576
  	.cia_setkey		=	serpent_setkey,
  	.cia_encrypt		=	serpent_encrypt,
  	.cia_decrypt		=	serpent_decrypt } }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
577
  };
6c2bb98bc   Herbert Xu   [CRYPTO] all: Pas...
578
  static int tnepres_setkey(struct crypto_tfm *tfm, const u8 *key,
560c06ae1   Herbert Xu   [CRYPTO] api: Get...
579
  			  unsigned int keylen)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
580
581
582
  {
  	u8 rev_key[SERPENT_MAX_KEY_SIZE];
  	int i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
583
584
  	for (i = 0; i < keylen; ++i)
  		rev_key[keylen - i - 1] = key[i];
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
585

560c06ae1   Herbert Xu   [CRYPTO] api: Get...
586
  	return serpent_setkey(tfm, rev_key, keylen);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
587
  }
6c2bb98bc   Herbert Xu   [CRYPTO] all: Pas...
588
  static void tnepres_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
589
590
591
592
593
594
595
596
597
598
  {
  	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...
599
  	serpent_encrypt(tfm, (u8 *)rd, (u8 *)rs);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
600
601
602
603
604
605
  
  	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...
606
  static void tnepres_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
607
608
609
610
611
612
613
614
615
616
  {
  	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...
617
  	serpent_decrypt(tfm, (u8 *)rd, (u8 *)rs);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
618
619
620
621
622
623
624
625
626
627
628
629
  
  	d[0] = swab32(rd[3]);
  	d[1] = swab32(rd[2]);
  	d[2] = swab32(rd[1]);
  	d[3] = swab32(rd[0]);
  }
  
  static struct crypto_alg tnepres_alg = {
  	.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: ...
630
  	.cra_alignmask		=	3,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
631
632
633
634
635
  	.cra_module		=	THIS_MODULE,
  	.cra_list		=	LIST_HEAD_INIT(serpent_alg.cra_list),
  	.cra_u			=	{ .cipher = {
  	.cia_min_keysize	=	SERPENT_MIN_KEY_SIZE,
  	.cia_max_keysize	=	SERPENT_MAX_KEY_SIZE,
7f4e3e3fa   Jussi Kivilinna   crypto: serpent -...
636
637
638
  	.cia_setkey		=	tnepres_setkey,
  	.cia_encrypt		=	tnepres_encrypt,
  	.cia_decrypt		=	tnepres_decrypt } }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
639
  };
3af5b90bd   Kamalesh Babulal   [CRYPTO] all: Cle...
640
  static int __init serpent_mod_init(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
641
642
643
644
645
646
647
648
649
650
651
652
653
  {
  	int ret = crypto_register_alg(&serpent_alg);
  
  	if (ret)
  		return ret;
  
  	ret = crypto_register_alg(&tnepres_alg);
  
  	if (ret)
  		crypto_unregister_alg(&serpent_alg);
  
  	return ret;
  }
3af5b90bd   Kamalesh Babulal   [CRYPTO] all: Cle...
654
  static void __exit serpent_mod_fini(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
655
656
657
658
  {
  	crypto_unregister_alg(&tnepres_alg);
  	crypto_unregister_alg(&serpent_alg);
  }
3af5b90bd   Kamalesh Babulal   [CRYPTO] all: Cle...
659
660
  module_init(serpent_mod_init);
  module_exit(serpent_mod_fini);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
661
662
663
664
665
  
  MODULE_LICENSE("GPL");
  MODULE_DESCRIPTION("Serpent and tnepres (kerneli compatible serpent reversed) Cipher Algorithm");
  MODULE_AUTHOR("Dag Arne Osvik <osvik@ii.uib.no>");
  MODULE_ALIAS("tnepres");
dd6eec242   Jussi Kivilinna   crypto: serpent -...
666
  MODULE_ALIAS("serpent");