1 // private header for Serpent and Sosemanuk
2 
3 #ifndef CRYPTOPP_SERPENTP_H
4 #define CRYPTOPP_SERPENTP_H
5 
6 NAMESPACE_BEGIN(CryptoPP)
7 
8 // linear transformation
9 #define LT(i,a,b,c,d,e)	{\
10 	a = rotlConstant<13>(a);	\
11 	c = rotlConstant<3>(c); 	\
12 	d = rotlConstant<7>(d ^ c ^ (a << 3)); 	\
13 	b = rotlConstant<1>(b ^ a ^ c); 	\
14 	a = rotlConstant<5>(a ^ b ^ d); 		\
15 	c = rotlConstant<22>(c ^ d ^ (b << 7));}
16 
17 // inverse linear transformation
18 #define ILT(i,a,b,c,d,e)	{\
19 	c = rotrConstant<22>(c);	\
20 	a = rotrConstant<5>(a); 	\
21 	c ^= d ^ (b << 7);	\
22 	a ^= b ^ d; 		\
23 	b = rotrConstant<1>(b); 	\
24 	d = rotrConstant<7>(d) ^ c ^ (a << 3);	\
25 	b ^= a ^ c; 		\
26 	c = rotrConstant<3>(c); 	\
27 	a = rotrConstant<13>(a);}
28 
29 // order of output from S-box functions
30 #define beforeS0(f) f(0,a,b,c,d,e)
31 #define afterS0(f) f(1,b,e,c,a,d)
32 #define afterS1(f) f(2,c,b,a,e,d)
33 #define afterS2(f) f(3,a,e,b,d,c)
34 #define afterS3(f) f(4,e,b,d,c,a)
35 #define afterS4(f) f(5,b,a,e,c,d)
36 #define afterS5(f) f(6,a,c,b,e,d)
37 #define afterS6(f) f(7,a,c,d,b,e)
38 #define afterS7(f) f(8,d,e,b,a,c)
39 
40 // order of output from inverse S-box functions
41 #define beforeI7(f) f(8,a,b,c,d,e)
42 #define afterI7(f) f(7,d,a,b,e,c)
43 #define afterI6(f) f(6,a,b,c,e,d)
44 #define afterI5(f) f(5,b,d,e,c,a)
45 #define afterI4(f) f(4,b,c,e,a,d)
46 #define afterI3(f) f(3,a,b,e,c,d)
47 #define afterI2(f) f(2,b,d,e,c,a)
48 #define afterI1(f) f(1,a,b,c,e,d)
49 #define afterI0(f) f(0,a,d,b,e,c)
50 
51 // The instruction sequences for the S-box functions
52 // come from Dag Arne Osvik's paper "Speeding up Serpent".
53 
54 #define S0(i, r0, r1, r2, r3, r4) \
55        {           \
56     r3 ^= r0;   \
57     r4 = r1;   \
58     r1 &= r3;   \
59     r4 ^= r2;   \
60     r1 ^= r0;   \
61     r0 |= r3;   \
62     r0 ^= r4;   \
63     r4 ^= r3;   \
64     r3 ^= r2;   \
65     r2 |= r1;   \
66     r2 ^= r4;   \
67     r4 = ~r4;      \
68     r4 |= r1;   \
69     r1 ^= r3;   \
70     r1 ^= r4;   \
71     r3 |= r0;   \
72     r1 ^= r3;   \
73     r4 ^= r3;   \
74             }
75 
76 #define I0(i, r0, r1, r2, r3, r4) \
77        {           \
78     r2 = ~r2;      \
79     r4 = r1;   \
80     r1 |= r0;   \
81     r4 = ~r4;      \
82     r1 ^= r2;   \
83     r2 |= r4;   \
84     r1 ^= r3;   \
85     r0 ^= r4;   \
86     r2 ^= r0;   \
87     r0 &= r3;   \
88     r4 ^= r0;   \
89     r0 |= r1;   \
90     r0 ^= r2;   \
91     r3 ^= r4;   \
92     r2 ^= r1;   \
93     r3 ^= r0;   \
94     r3 ^= r1;   \
95     r2 &= r3;   \
96     r4 ^= r2;   \
97             }
98 
99 #define S1(i, r0, r1, r2, r3, r4) \
100        {           \
101     r0 = ~r0;      \
102     r2 = ~r2;      \
103     r4 = r0;   \
104     r0 &= r1;   \
105     r2 ^= r0;   \
106     r0 |= r3;   \
107     r3 ^= r2;   \
108     r1 ^= r0;   \
109     r0 ^= r4;   \
110     r4 |= r1;   \
111     r1 ^= r3;   \
112     r2 |= r0;   \
113     r2 &= r4;   \
114     r0 ^= r1;   \
115     r1 &= r2;   \
116     r1 ^= r0;   \
117     r0 &= r2;   \
118     r0 ^= r4;   \
119             }
120 
121 #define I1(i, r0, r1, r2, r3, r4) \
122        {           \
123     r4 = r1;   \
124     r1 ^= r3;   \
125     r3 &= r1;   \
126     r4 ^= r2;   \
127     r3 ^= r0;   \
128     r0 |= r1;   \
129     r2 ^= r3;   \
130     r0 ^= r4;   \
131     r0 |= r2;   \
132     r1 ^= r3;   \
133     r0 ^= r1;   \
134     r1 |= r3;   \
135     r1 ^= r0;   \
136     r4 = ~r4;      \
137     r4 ^= r1;   \
138     r1 |= r0;   \
139     r1 ^= r0;   \
140     r1 |= r4;   \
141     r3 ^= r1;   \
142             }
143 
144 #define S2(i, r0, r1, r2, r3, r4) \
145        {           \
146     r4 = r0;   \
147     r0 &= r2;   \
148     r0 ^= r3;   \
149     r2 ^= r1;   \
150     r2 ^= r0;   \
151     r3 |= r4;   \
152     r3 ^= r1;   \
153     r4 ^= r2;   \
154     r1 = r3;   \
155     r3 |= r4;   \
156     r3 ^= r0;   \
157     r0 &= r1;   \
158     r4 ^= r0;   \
159     r1 ^= r3;   \
160     r1 ^= r4;   \
161     r4 = ~r4;      \
162             }
163 
164 #define I2(i, r0, r1, r2, r3, r4) \
165        {           \
166     r2 ^= r3;   \
167     r3 ^= r0;   \
168     r4 = r3;   \
169     r3 &= r2;   \
170     r3 ^= r1;   \
171     r1 |= r2;   \
172     r1 ^= r4;   \
173     r4 &= r3;   \
174     r2 ^= r3;   \
175     r4 &= r0;   \
176     r4 ^= r2;   \
177     r2 &= r1;   \
178     r2 |= r0;   \
179     r3 = ~r3;      \
180     r2 ^= r3;   \
181     r0 ^= r3;   \
182     r0 &= r1;   \
183     r3 ^= r4;   \
184     r3 ^= r0;   \
185             }
186 
187 #define S3(i, r0, r1, r2, r3, r4) \
188        {           \
189     r4 = r0;   \
190     r0 |= r3;   \
191     r3 ^= r1;   \
192     r1 &= r4;   \
193     r4 ^= r2;   \
194     r2 ^= r3;   \
195     r3 &= r0;   \
196     r4 |= r1;   \
197     r3 ^= r4;   \
198     r0 ^= r1;   \
199     r4 &= r0;   \
200     r1 ^= r3;   \
201     r4 ^= r2;   \
202     r1 |= r0;   \
203     r1 ^= r2;   \
204     r0 ^= r3;   \
205     r2 = r1;   \
206     r1 |= r3;   \
207     r1 ^= r0;   \
208             }
209 
210 #define I3(i, r0, r1, r2, r3, r4) \
211        {           \
212     r4 = r2;   \
213     r2 ^= r1;   \
214     r1 &= r2;   \
215     r1 ^= r0;   \
216     r0 &= r4;   \
217     r4 ^= r3;   \
218     r3 |= r1;   \
219     r3 ^= r2;   \
220     r0 ^= r4;   \
221     r2 ^= r0;   \
222     r0 |= r3;   \
223     r0 ^= r1;   \
224     r4 ^= r2;   \
225     r2 &= r3;   \
226     r1 |= r3;   \
227     r1 ^= r2;   \
228     r4 ^= r0;   \
229     r2 ^= r4;   \
230             }
231 
232 #define S4(i, r0, r1, r2, r3, r4) \
233        {           \
234     r1 ^= r3;   \
235     r3 = ~r3;      \
236     r2 ^= r3;   \
237     r3 ^= r0;   \
238     r4 = r1;   \
239     r1 &= r3;   \
240     r1 ^= r2;   \
241     r4 ^= r3;   \
242     r0 ^= r4;   \
243     r2 &= r4;   \
244     r2 ^= r0;   \
245     r0 &= r1;   \
246     r3 ^= r0;   \
247     r4 |= r1;   \
248     r4 ^= r0;   \
249     r0 |= r3;   \
250     r0 ^= r2;   \
251     r2 &= r3;   \
252     r0 = ~r0;      \
253     r4 ^= r2;   \
254             }
255 
256 #define I4(i, r0, r1, r2, r3, r4) \
257        {           \
258     r4 = r2;   \
259     r2 &= r3;   \
260     r2 ^= r1;   \
261     r1 |= r3;   \
262     r1 &= r0;   \
263     r4 ^= r2;   \
264     r4 ^= r1;   \
265     r1 &= r2;   \
266     r0 = ~r0;      \
267     r3 ^= r4;   \
268     r1 ^= r3;   \
269     r3 &= r0;   \
270     r3 ^= r2;   \
271     r0 ^= r1;   \
272     r2 &= r0;   \
273     r3 ^= r0;   \
274     r2 ^= r4;   \
275     r2 |= r3;   \
276     r3 ^= r0;   \
277     r2 ^= r1;   \
278             }
279 
280 #define S5(i, r0, r1, r2, r3, r4) \
281        {           \
282     r0 ^= r1;   \
283     r1 ^= r3;   \
284     r3 = ~r3;      \
285     r4 = r1;   \
286     r1 &= r0;   \
287     r2 ^= r3;   \
288     r1 ^= r2;   \
289     r2 |= r4;   \
290     r4 ^= r3;   \
291     r3 &= r1;   \
292     r3 ^= r0;   \
293     r4 ^= r1;   \
294     r4 ^= r2;   \
295     r2 ^= r0;   \
296     r0 &= r3;   \
297     r2 = ~r2;      \
298     r0 ^= r4;   \
299     r4 |= r3;   \
300     r2 ^= r4;   \
301             }
302 
303 #define I5(i, r0, r1, r2, r3, r4) \
304        {           \
305     r1 = ~r1;      \
306     r4 = r3;   \
307     r2 ^= r1;   \
308     r3 |= r0;   \
309     r3 ^= r2;   \
310     r2 |= r1;   \
311     r2 &= r0;   \
312     r4 ^= r3;   \
313     r2 ^= r4;   \
314     r4 |= r0;   \
315     r4 ^= r1;   \
316     r1 &= r2;   \
317     r1 ^= r3;   \
318     r4 ^= r2;   \
319     r3 &= r4;   \
320     r4 ^= r1;   \
321     r3 ^= r0;   \
322     r3 ^= r4;   \
323     r4 = ~r4;      \
324             }
325 
326 #define S6(i, r0, r1, r2, r3, r4) \
327        {           \
328     r2 = ~r2;      \
329     r4 = r3;   \
330     r3 &= r0;   \
331     r0 ^= r4;   \
332     r3 ^= r2;   \
333     r2 |= r4;   \
334     r1 ^= r3;   \
335     r2 ^= r0;   \
336     r0 |= r1;   \
337     r2 ^= r1;   \
338     r4 ^= r0;   \
339     r0 |= r3;   \
340     r0 ^= r2;   \
341     r4 ^= r3;   \
342     r4 ^= r0;   \
343     r3 = ~r3;      \
344     r2 &= r4;   \
345     r2 ^= r3;   \
346             }
347 
348 #define I6(i, r0, r1, r2, r3, r4) \
349        {           \
350     r0 ^= r2;   \
351     r4 = r2;   \
352     r2 &= r0;   \
353     r4 ^= r3;   \
354     r2 = ~r2;      \
355     r3 ^= r1;   \
356     r2 ^= r3;   \
357     r4 |= r0;   \
358     r0 ^= r2;   \
359     r3 ^= r4;   \
360     r4 ^= r1;   \
361     r1 &= r3;   \
362     r1 ^= r0;   \
363     r0 ^= r3;   \
364     r0 |= r2;   \
365     r3 ^= r1;   \
366     r4 ^= r0;   \
367             }
368 
369 #define S7(i, r0, r1, r2, r3, r4) \
370        {           \
371     r4 = r2;   \
372     r2 &= r1;   \
373     r2 ^= r3;   \
374     r3 &= r1;   \
375     r4 ^= r2;   \
376     r2 ^= r1;   \
377     r1 ^= r0;   \
378     r0 |= r4;   \
379     r0 ^= r2;   \
380     r3 ^= r1;   \
381     r2 ^= r3;   \
382     r3 &= r0;   \
383     r3 ^= r4;   \
384     r4 ^= r2;   \
385     r2 &= r0;   \
386     r4 = ~r4;      \
387     r2 ^= r4;   \
388     r4 &= r0;   \
389     r1 ^= r3;   \
390     r4 ^= r1;   \
391             }
392 
393 #define I7(i, r0, r1, r2, r3, r4) \
394        {           \
395     r4 = r2;   \
396     r2 ^= r0;   \
397     r0 &= r3;   \
398     r2 = ~r2;      \
399     r4 |= r3;   \
400     r3 ^= r1;   \
401     r1 |= r0;   \
402     r0 ^= r2;   \
403     r2 &= r4;   \
404     r1 ^= r2;   \
405     r2 ^= r0;   \
406     r0 |= r2;   \
407     r3 &= r4;   \
408     r0 ^= r3;   \
409     r4 ^= r1;   \
410     r3 ^= r4;   \
411     r4 |= r0;   \
412     r3 ^= r2;   \
413     r4 ^= r2;   \
414             }
415 
416 // key xor
417 #define KX(r, a, b, c, d, e)	{\
418 	a ^= k[4 * r + 0]; \
419 	b ^= k[4 * r + 1]; \
420 	c ^= k[4 * r + 2]; \
421 	d ^= k[4 * r + 3];}
422 
423 #define LK(r, a, b, c, d, e)	{\
424 	a = k[(8-r)*4 + 0];		\
425 	b = k[(8-r)*4 + 1];		\
426 	c = k[(8-r)*4 + 2];		\
427 	d = k[(8-r)*4 + 3];}
428 
429 #define SK(r, a, b, c, d, e)	{\
430 	k[(8-r)*4 + 4] = a;		\
431 	k[(8-r)*4 + 5] = b;		\
432 	k[(8-r)*4 + 6] = c;		\
433 	k[(8-r)*4 + 7] = d;}
434 
435 void Serpent_KeySchedule(word32 *k, unsigned int rounds, const byte *userKey, size_t keylen);
436 
437 NAMESPACE_END
438 
439 #endif  // CRYPTOPP_SERPENTP_H
440