Botan  2.6.0
Crypto and TLS for C++11
serpent_sbox.h
Go to the documentation of this file.
1 /*
2 * Serpent SBox Expressions
3 * (C) 1999-2007,2013 Jack Lloyd
4 *
5 * The sbox expressions used here were discovered by Dag Arne Osvik and
6 * are described in his paper "Speeding Up Serpent".
7 *
8 * Botan is released under the Simplified BSD License (see license.txt)
9 */
10 
11 #ifndef BOTAN_SERPENT_SBOX_H_
12 #define BOTAN_SERPENT_SBOX_H_
13 
14 #define SBoxE1(B0, B1, B2, B3) \
15  do { \
16  B3 ^= B0; \
17  auto B4 = B1; \
18  B1 &= B3; \
19  B4 ^= B2; \
20  B1 ^= B0; \
21  B0 |= B3; \
22  B0 ^= B4; \
23  B4 ^= B3; \
24  B3 ^= B2; \
25  B2 |= B1; \
26  B2 ^= B4; \
27  B4 = ~B4; \
28  B4 |= B1; \
29  B1 ^= B3; \
30  B1 ^= B4; \
31  B3 |= B0; \
32  B1 ^= B3; \
33  B4 ^= B3; \
34  B3 = B0; \
35  B0 = B1; \
36  B1 = B4; \
37  } while(0)
38 
39 #define SBoxE2(B0, B1, B2, B3) \
40  do { \
41  B0 = ~B0; \
42  B2 = ~B2; \
43  auto B4 = B0; \
44  B0 &= B1; \
45  B2 ^= B0; \
46  B0 |= B3; \
47  B3 ^= B2; \
48  B1 ^= B0; \
49  B0 ^= B4; \
50  B4 |= B1; \
51  B1 ^= B3; \
52  B2 |= B0; \
53  B2 &= B4; \
54  B0 ^= B1; \
55  B1 &= B2; \
56  B1 ^= B0; \
57  B0 &= B2; \
58  B4 ^= B0; \
59  B0 = B2; \
60  B2 = B3; \
61  B3 = B1; \
62  B1 = B4; \
63  } while(0)
64 
65 #define SBoxE3(B0, B1, B2, B3) \
66  do { \
67  auto B4 = B0; \
68  B0 &= B2; \
69  B0 ^= B3; \
70  B2 ^= B1; \
71  B2 ^= B0; \
72  B3 |= B4; \
73  B3 ^= B1; \
74  B4 ^= B2; \
75  B1 = B3; \
76  B3 |= B4; \
77  B3 ^= B0; \
78  B0 &= B1; \
79  B4 ^= B0; \
80  B1 ^= B3; \
81  B1 ^= B4; \
82  B0 = B2; \
83  B2 = B1; \
84  B1 = B3; \
85  B3 = ~B4; \
86  } while(0)
87 
88 #define SBoxE4(B0, B1, B2, B3) \
89  do { \
90  auto B4 = B0; \
91  B0 |= B3; \
92  B3 ^= B1; \
93  B1 &= B4; \
94  B4 ^= B2; \
95  B2 ^= B3; \
96  B3 &= B0; \
97  B4 |= B1; \
98  B3 ^= B4; \
99  B0 ^= B1; \
100  B4 &= B0; \
101  B1 ^= B3; \
102  B4 ^= B2; \
103  B1 |= B0; \
104  B1 ^= B2; \
105  B0 ^= B3; \
106  B2 = B1; \
107  B1 |= B3; \
108  B0 ^= B1; \
109  B1 = B2; \
110  B2 = B3; \
111  B3 = B4; \
112  } while(0)
113 
114 #define SBoxE5(B0, B1, B2, B3) \
115  do { \
116  B1 ^= B3; \
117  B3 = ~B3; \
118  B2 ^= B3; \
119  B3 ^= B0; \
120  auto B4 = B1; \
121  B1 &= B3; \
122  B1 ^= B2; \
123  B4 ^= B3; \
124  B0 ^= B4; \
125  B2 &= B4; \
126  B2 ^= B0; \
127  B0 &= B1; \
128  B3 ^= B0; \
129  B4 |= B1; \
130  B4 ^= B0; \
131  B0 |= B3; \
132  B0 ^= B2; \
133  B2 &= B3; \
134  B0 = ~B0; \
135  B4 ^= B2; \
136  B2 = B0; \
137  B0 = B1; \
138  B1 = B4; \
139  } while(0)
140 
141 #define SBoxE6(B0, B1, B2, B3) \
142  do { \
143  B0 ^= B1; \
144  B1 ^= B3; \
145  B3 = ~B3; \
146  auto B4 = B1; \
147  B1 &= B0; \
148  B2 ^= B3; \
149  B1 ^= B2; \
150  B2 |= B4; \
151  B4 ^= B3; \
152  B3 &= B1; \
153  B3 ^= B0; \
154  B4 ^= B1; \
155  B4 ^= B2; \
156  B2 ^= B0; \
157  B0 &= B3; \
158  B2 = ~B2; \
159  B0 ^= B4; \
160  B4 |= B3; \
161  B4 ^= B2; \
162  B2 = B0; \
163  B0 = B1; \
164  B1 = B3; \
165  B3 = B4; \
166  } while(0)
167 
168 #define SBoxE7(B0, B1, B2, B3) \
169  do { \
170  B2 = ~B2; \
171  auto B4 = B3; \
172  B3 &= B0; \
173  B0 ^= B4; \
174  B3 ^= B2; \
175  B2 |= B4; \
176  B1 ^= B3; \
177  B2 ^= B0; \
178  B0 |= B1; \
179  B2 ^= B1; \
180  B4 ^= B0; \
181  B0 |= B3; \
182  B0 ^= B2; \
183  B4 ^= B3; \
184  B4 ^= B0; \
185  B3 = ~B3; \
186  B2 &= B4; \
187  B3 ^= B2; \
188  B2 = B4; \
189  } while(0)
190 
191 #define SBoxE8(B0, B1, B2, B3) \
192  do { \
193  auto B4 = B1; \
194  B1 |= B2; \
195  B1 ^= B3; \
196  B4 ^= B2; \
197  B2 ^= B1; \
198  B3 |= B4; \
199  B3 &= B0; \
200  B4 ^= B2; \
201  B3 ^= B1; \
202  B1 |= B4; \
203  B1 ^= B0; \
204  B0 |= B4; \
205  B0 ^= B2; \
206  B1 ^= B4; \
207  B2 ^= B1; \
208  B1 &= B0; \
209  B1 ^= B4; \
210  B2 = ~B2; \
211  B2 |= B0; \
212  B4 ^= B2; \
213  B2 = B1; \
214  B1 = B3; \
215  B3 = B0; \
216  B0 = B4; \
217  } while(0)
218 
219 #define SBoxD1(B0, B1, B2, B3) \
220  do { \
221  B2 = ~B2; \
222  auto B4 = B1; \
223  B1 |= B0; \
224  B4 = ~B4; \
225  B1 ^= B2; \
226  B2 |= B4; \
227  B1 ^= B3; \
228  B0 ^= B4; \
229  B2 ^= B0; \
230  B0 &= B3; \
231  B4 ^= B0; \
232  B0 |= B1; \
233  B0 ^= B2; \
234  B3 ^= B4; \
235  B2 ^= B1; \
236  B3 ^= B0; \
237  B3 ^= B1; \
238  B2 &= B3; \
239  B4 ^= B2; \
240  B2 = B1; \
241  B1 = B4; \
242  } while(0)
243 
244 #define SBoxD2(B0, B1, B2, B3) \
245  do { \
246  auto B4 = B1; \
247  B1 ^= B3; \
248  B3 &= B1; \
249  B4 ^= B2; \
250  B3 ^= B0; \
251  B0 |= B1; \
252  B2 ^= B3; \
253  B0 ^= B4; \
254  B0 |= B2; \
255  B1 ^= B3; \
256  B0 ^= B1; \
257  B1 |= B3; \
258  B1 ^= B0; \
259  B4 = ~B4; \
260  B4 ^= B1; \
261  B1 |= B0; \
262  B1 ^= B0; \
263  B1 |= B4; \
264  B3 ^= B1; \
265  B1 = B0; \
266  B0 = B4; \
267  B4 = B2; \
268  B2 = B3; \
269  B3 = B4; \
270  } while(0)
271 
272 #define SBoxD3(B0, B1, B2, B3) \
273  do { \
274  B2 ^= B3; \
275  B3 ^= B0; \
276  auto B4 = B3; \
277  B3 &= B2; \
278  B3 ^= B1; \
279  B1 |= B2; \
280  B1 ^= B4; \
281  B4 &= B3; \
282  B2 ^= B3; \
283  B4 &= B0; \
284  B4 ^= B2; \
285  B2 &= B1; \
286  B2 |= B0; \
287  B3 = ~B3; \
288  B2 ^= B3; \
289  B0 ^= B3; \
290  B0 &= B1; \
291  B3 ^= B4; \
292  B3 ^= B0; \
293  B0 = B1; \
294  B1 = B4; \
295  } while(0)
296 
297 #define SBoxD4(B0, B1, B2, B3) \
298  do { \
299  auto B4 = B2; \
300  B2 ^= B1; \
301  B0 ^= B2; \
302  B4 &= B2; \
303  B4 ^= B0; \
304  B0 &= B1; \
305  B1 ^= B3; \
306  B3 |= B4; \
307  B2 ^= B3; \
308  B0 ^= B3; \
309  B1 ^= B4; \
310  B3 &= B2; \
311  B3 ^= B1; \
312  B1 ^= B0; \
313  B1 |= B2; \
314  B0 ^= B3; \
315  B1 ^= B4; \
316  B0 ^= B1; \
317  B4 = B0; \
318  B0 = B2; \
319  B2 = B3; \
320  B3 = B4; \
321  } while(0)
322 
323 #define SBoxD5(B0, B1, B2, B3) \
324  do { \
325  auto B4 = B2; \
326  B2 &= B3; \
327  B2 ^= B1; \
328  B1 |= B3; \
329  B1 &= B0; \
330  B4 ^= B2; \
331  B4 ^= B1; \
332  B1 &= B2; \
333  B0 = ~B0; \
334  B3 ^= B4; \
335  B1 ^= B3; \
336  B3 &= B0; \
337  B3 ^= B2; \
338  B0 ^= B1; \
339  B2 &= B0; \
340  B3 ^= B0; \
341  B2 ^= B4; \
342  B2 |= B3; \
343  B3 ^= B0; \
344  B2 ^= B1; \
345  B1 = B3; \
346  B3 = B4; \
347  } while(0)
348 
349 #define SBoxD6(B0, B1, B2, B3) \
350  do { \
351  B1 = ~B1; \
352  auto B4 = B3; \
353  B2 ^= B1; \
354  B3 |= B0; \
355  B3 ^= B2; \
356  B2 |= B1; \
357  B2 &= B0; \
358  B4 ^= B3; \
359  B2 ^= B4; \
360  B4 |= B0; \
361  B4 ^= B1; \
362  B1 &= B2; \
363  B1 ^= B3; \
364  B4 ^= B2; \
365  B3 &= B4; \
366  B4 ^= B1; \
367  B3 ^= B4; \
368  B4 = ~B4; \
369  B3 ^= B0; \
370  B0 = B1; \
371  B1 = B4; \
372  B4 = B3; \
373  B3 = B2; \
374  B2 = B4; \
375  } while(0)
376 
377 #define SBoxD7(B0, B1, B2, B3) \
378  do { \
379  B0 ^= B2; \
380  auto B4 = B2; \
381  B2 &= B0; \
382  B4 ^= B3; \
383  B2 = ~B2; \
384  B3 ^= B1; \
385  B2 ^= B3; \
386  B4 |= B0; \
387  B0 ^= B2; \
388  B3 ^= B4; \
389  B4 ^= B1; \
390  B1 &= B3; \
391  B1 ^= B0; \
392  B0 ^= B3; \
393  B0 |= B2; \
394  B3 ^= B1; \
395  B4 ^= B0; \
396  B0 = B1; \
397  B1 = B2; \
398  B2 = B4; \
399  } while(0)
400 
401 #define SBoxD8(B0, B1, B2, B3) \
402  do { \
403  auto B4 = B2; \
404  B2 ^= B0; \
405  B0 &= B3; \
406  B4 |= B3; \
407  B2 = ~B2; \
408  B3 ^= B1; \
409  B1 |= B0; \
410  B0 ^= B2; \
411  B2 &= B4; \
412  B3 &= B4; \
413  B1 ^= B2; \
414  B2 ^= B0; \
415  B0 |= B2; \
416  B4 ^= B1; \
417  B0 ^= B3; \
418  B3 ^= B4; \
419  B4 |= B0; \
420  B3 ^= B2; \
421  B4 ^= B2; \
422  B2 = B1; \
423  B1 = B0; \
424  B0 = B3; \
425  B3 = B4; \
426  } while(0)
427 
428 #endif