Botan  1.10.9
serp_simd.cpp
Go to the documentation of this file.
1 /*
2 * Serpent (SIMD)
3 * (C) 2009 Jack Lloyd
4 *
5 * Distributed under the terms of the Botan license
6 */
7 
8 #include <botan/serp_simd.h>
9 #include <botan/internal/simd_32.h>
10 #include <botan/loadstor.h>
11 
12 namespace Botan {
13 
14 namespace {
15 
16 #define SBoxE1(B0, B1, B2, B3) \
17  do { \
18  B3 ^= B0; \
19  SIMD_32 B4 = B1; \
20  B1 &= B3; \
21  B4 ^= B2; \
22  B1 ^= B0; \
23  B0 |= B3; \
24  B0 ^= B4; \
25  B4 ^= B3; \
26  B3 ^= B2; \
27  B2 |= B1; \
28  B2 ^= B4; \
29  B4 = ~B4; \
30  B4 |= B1; \
31  B1 ^= B3; \
32  B1 ^= B4; \
33  B3 |= B0; \
34  B1 ^= B3; \
35  B4 ^= B3; \
36  B3 = B0; \
37  B0 = B1; \
38  B1 = B4; \
39  } while(0);
40 
41 #define SBoxE2(B0, B1, B2, B3) \
42  do { \
43  B0 = ~B0; \
44  B2 = ~B2; \
45  SIMD_32 B4 = B0; \
46  B0 &= B1; \
47  B2 ^= B0; \
48  B0 |= B3; \
49  B3 ^= B2; \
50  B1 ^= B0; \
51  B0 ^= B4; \
52  B4 |= B1; \
53  B1 ^= B3; \
54  B2 |= B0; \
55  B2 &= B4; \
56  B0 ^= B1; \
57  B1 &= B2; \
58  B1 ^= B0; \
59  B0 &= B2; \
60  B4 ^= B0; \
61  B0 = B2; \
62  B2 = B3; \
63  B3 = B1; \
64  B1 = B4; \
65  } while(0);
66 
67 #define SBoxE3(B0, B1, B2, B3) \
68  do { \
69  SIMD_32 B4 = B0; \
70  B0 &= B2; \
71  B0 ^= B3; \
72  B2 ^= B1; \
73  B2 ^= B0; \
74  B3 |= B4; \
75  B3 ^= B1; \
76  B4 ^= B2; \
77  B1 = B3; \
78  B3 |= B4; \
79  B3 ^= B0; \
80  B0 &= B1; \
81  B4 ^= B0; \
82  B1 ^= B3; \
83  B1 ^= B4; \
84  B0 = B2; \
85  B2 = B1; \
86  B1 = B3; \
87  B3 = ~B4; \
88  } while(0);
89 
90 #define SBoxE4(B0, B1, B2, B3) \
91  do { \
92  SIMD_32 B4 = B0; \
93  B0 |= B3; \
94  B3 ^= B1; \
95  B1 &= B4; \
96  B4 ^= B2; \
97  B2 ^= B3; \
98  B3 &= B0; \
99  B4 |= B1; \
100  B3 ^= B4; \
101  B0 ^= B1; \
102  B4 &= B0; \
103  B1 ^= B3; \
104  B4 ^= B2; \
105  B1 |= B0; \
106  B1 ^= B2; \
107  B0 ^= B3; \
108  B2 = B1; \
109  B1 |= B3; \
110  B0 ^= B1; \
111  B1 = B2; \
112  B2 = B3; \
113  B3 = B4; \
114  } while(0);
115 
116 #define SBoxE5(B0, B1, B2, B3) \
117  do { \
118  B1 ^= B3; \
119  B3 = ~B3; \
120  B2 ^= B3; \
121  B3 ^= B0; \
122  SIMD_32 B4 = B1; \
123  B1 &= B3; \
124  B1 ^= B2; \
125  B4 ^= B3; \
126  B0 ^= B4; \
127  B2 &= B4; \
128  B2 ^= B0; \
129  B0 &= B1; \
130  B3 ^= B0; \
131  B4 |= B1; \
132  B4 ^= B0; \
133  B0 |= B3; \
134  B0 ^= B2; \
135  B2 &= B3; \
136  B0 = ~B0; \
137  B4 ^= B2; \
138  B2 = B0; \
139  B0 = B1; \
140  B1 = B4; \
141  } while(0);
142 
143 #define SBoxE6(B0, B1, B2, B3) \
144  do { \
145  B0 ^= B1; \
146  B1 ^= B3; \
147  B3 = ~B3; \
148  SIMD_32 B4 = B1; \
149  B1 &= B0; \
150  B2 ^= B3; \
151  B1 ^= B2; \
152  B2 |= B4; \
153  B4 ^= B3; \
154  B3 &= B1; \
155  B3 ^= B0; \
156  B4 ^= B1; \
157  B4 ^= B2; \
158  B2 ^= B0; \
159  B0 &= B3; \
160  B2 = ~B2; \
161  B0 ^= B4; \
162  B4 |= B3; \
163  B4 ^= B2; \
164  B2 = B0; \
165  B0 = B1; \
166  B1 = B3; \
167  B3 = B4; \
168  } while(0);
169 
170 #define SBoxE7(B0, B1, B2, B3) \
171  do { \
172  B2 = ~B2; \
173  SIMD_32 B4 = B3; \
174  B3 &= B0; \
175  B0 ^= B4; \
176  B3 ^= B2; \
177  B2 |= B4; \
178  B1 ^= B3; \
179  B2 ^= B0; \
180  B0 |= B1; \
181  B2 ^= B1; \
182  B4 ^= B0; \
183  B0 |= B3; \
184  B0 ^= B2; \
185  B4 ^= B3; \
186  B4 ^= B0; \
187  B3 = ~B3; \
188  B2 &= B4; \
189  B3 ^= B2; \
190  B2 = B4; \
191  } while(0);
192 
193 #define SBoxE8(B0, B1, B2, B3) \
194  do { \
195  SIMD_32 B4 = B1; \
196  B1 |= B2; \
197  B1 ^= B3; \
198  B4 ^= B2; \
199  B2 ^= B1; \
200  B3 |= B4; \
201  B3 &= B0; \
202  B4 ^= B2; \
203  B3 ^= B1; \
204  B1 |= B4; \
205  B1 ^= B0; \
206  B0 |= B4; \
207  B0 ^= B2; \
208  B1 ^= B4; \
209  B2 ^= B1; \
210  B1 &= B0; \
211  B1 ^= B4; \
212  B2 = ~B2; \
213  B2 |= B0; \
214  B4 ^= B2; \
215  B2 = B1; \
216  B1 = B3; \
217  B3 = B0; \
218  B0 = B4; \
219  } while(0);
220 
221 #define SBoxD1(B0, B1, B2, B3) \
222  do { \
223  B2 = ~B2; \
224  SIMD_32 B4 = B1; \
225  B1 |= B0; \
226  B4 = ~B4; \
227  B1 ^= B2; \
228  B2 |= B4; \
229  B1 ^= B3; \
230  B0 ^= B4; \
231  B2 ^= B0; \
232  B0 &= B3; \
233  B4 ^= B0; \
234  B0 |= B1; \
235  B0 ^= B2; \
236  B3 ^= B4; \
237  B2 ^= B1; \
238  B3 ^= B0; \
239  B3 ^= B1; \
240  B2 &= B3; \
241  B4 ^= B2; \
242  B2 = B1; \
243  B1 = B4; \
244  } while(0);
245 
246 #define SBoxD2(B0, B1, B2, B3) \
247  do { \
248  SIMD_32 B4 = B1; \
249  B1 ^= B3; \
250  B3 &= B1; \
251  B4 ^= B2; \
252  B3 ^= B0; \
253  B0 |= B1; \
254  B2 ^= B3; \
255  B0 ^= B4; \
256  B0 |= B2; \
257  B1 ^= B3; \
258  B0 ^= B1; \
259  B1 |= B3; \
260  B1 ^= B0; \
261  B4 = ~B4; \
262  B4 ^= B1; \
263  B1 |= B0; \
264  B1 ^= B0; \
265  B1 |= B4; \
266  B3 ^= B1; \
267  B1 = B0; \
268  B0 = B4; \
269  B4 = B2; \
270  B2 = B3; \
271  B3 = B4; \
272  } while(0);
273 
274 #define SBoxD3(B0, B1, B2, B3) \
275  do { \
276  B2 ^= B3; \
277  B3 ^= B0; \
278  SIMD_32 B4 = B3; \
279  B3 &= B2; \
280  B3 ^= B1; \
281  B1 |= B2; \
282  B1 ^= B4; \
283  B4 &= B3; \
284  B2 ^= B3; \
285  B4 &= B0; \
286  B4 ^= B2; \
287  B2 &= B1; \
288  B2 |= B0; \
289  B3 = ~B3; \
290  B2 ^= B3; \
291  B0 ^= B3; \
292  B0 &= B1; \
293  B3 ^= B4; \
294  B3 ^= B0; \
295  B0 = B1; \
296  B1 = B4; \
297  } while(0);
298 
299 #define SBoxD4(B0, B1, B2, B3) \
300  do { \
301  SIMD_32 B4 = B2; \
302  B2 ^= B1; \
303  B0 ^= B2; \
304  B4 &= B2; \
305  B4 ^= B0; \
306  B0 &= B1; \
307  B1 ^= B3; \
308  B3 |= B4; \
309  B2 ^= B3; \
310  B0 ^= B3; \
311  B1 ^= B4; \
312  B3 &= B2; \
313  B3 ^= B1; \
314  B1 ^= B0; \
315  B1 |= B2; \
316  B0 ^= B3; \
317  B1 ^= B4; \
318  B0 ^= B1; \
319  B4 = B0; \
320  B0 = B2; \
321  B2 = B3; \
322  B3 = B4; \
323  } while(0);
324 
325 #define SBoxD5(B0, B1, B2, B3) \
326  do { \
327  SIMD_32 B4 = B2; \
328  B2 &= B3; \
329  B2 ^= B1; \
330  B1 |= B3; \
331  B1 &= B0; \
332  B4 ^= B2; \
333  B4 ^= B1; \
334  B1 &= B2; \
335  B0 = ~B0; \
336  B3 ^= B4; \
337  B1 ^= B3; \
338  B3 &= B0; \
339  B3 ^= B2; \
340  B0 ^= B1; \
341  B2 &= B0; \
342  B3 ^= B0; \
343  B2 ^= B4; \
344  B2 |= B3; \
345  B3 ^= B0; \
346  B2 ^= B1; \
347  B1 = B3; \
348  B3 = B4; \
349  } while(0);
350 
351 #define SBoxD6(B0, B1, B2, B3) \
352  do { \
353  B1 = ~B1; \
354  SIMD_32 B4 = B3; \
355  B2 ^= B1; \
356  B3 |= B0; \
357  B3 ^= B2; \
358  B2 |= B1; \
359  B2 &= B0; \
360  B4 ^= B3; \
361  B2 ^= B4; \
362  B4 |= B0; \
363  B4 ^= B1; \
364  B1 &= B2; \
365  B1 ^= B3; \
366  B4 ^= B2; \
367  B3 &= B4; \
368  B4 ^= B1; \
369  B3 ^= B4; \
370  B4 = ~B4; \
371  B3 ^= B0; \
372  B0 = B1; \
373  B1 = B4; \
374  B4 = B3; \
375  B3 = B2; \
376  B2 = B4; \
377  } while(0);
378 
379 #define SBoxD7(B0, B1, B2, B3) \
380  do { \
381  B0 ^= B2; \
382  SIMD_32 B4 = B2; \
383  B2 &= B0; \
384  B4 ^= B3; \
385  B2 = ~B2; \
386  B3 ^= B1; \
387  B2 ^= B3; \
388  B4 |= B0; \
389  B0 ^= B2; \
390  B3 ^= B4; \
391  B4 ^= B1; \
392  B1 &= B3; \
393  B1 ^= B0; \
394  B0 ^= B3; \
395  B0 |= B2; \
396  B3 ^= B1; \
397  B4 ^= B0; \
398  B0 = B1; \
399  B1 = B2; \
400  B2 = B4; \
401  } while(0);
402 
403 #define SBoxD8(B0, B1, B2, B3) \
404  do { \
405  SIMD_32 B4 = B2; \
406  B2 ^= B0; \
407  B0 &= B3; \
408  B4 |= B3; \
409  B2 = ~B2; \
410  B3 ^= B1; \
411  B1 |= B0; \
412  B0 ^= B2; \
413  B2 &= B4; \
414  B3 &= B4; \
415  B1 ^= B2; \
416  B2 ^= B0; \
417  B0 |= B2; \
418  B4 ^= B1; \
419  B0 ^= B3; \
420  B3 ^= B4; \
421  B4 |= B0; \
422  B3 ^= B2; \
423  B4 ^= B2; \
424  B2 = B1; \
425  B1 = B0; \
426  B0 = B3; \
427  B3 = B4; \
428  } while(0);
429 
430 #define key_xor(round, B0, B1, B2, B3) \
431  do { \
432  B0 ^= SIMD_32(keys[4*round ]); \
433  B1 ^= SIMD_32(keys[4*round+1]); \
434  B2 ^= SIMD_32(keys[4*round+2]); \
435  B3 ^= SIMD_32(keys[4*round+3]); \
436  } while(0);
437 
438 /*
439 * Serpent's linear transformations
440 */
441 #define transform(B0, B1, B2, B3) \
442  do { \
443  B0.rotate_left(13); \
444  B2.rotate_left(3); \
445  B1 ^= B0 ^ B2; \
446  B3 ^= B2 ^ (B0 << 3); \
447  B1.rotate_left(1); \
448  B3.rotate_left(7); \
449  B0 ^= B1 ^ B3; \
450  B2 ^= B3 ^ (B1 << 7); \
451  B0.rotate_left(5); \
452  B2.rotate_left(22); \
453  } while(0);
454 
455 #define i_transform(B0, B1, B2, B3) \
456  do { \
457  B2.rotate_right(22); \
458  B0.rotate_right(5); \
459  B2 ^= B3 ^ (B1 << 7); \
460  B0 ^= B1 ^ B3; \
461  B3.rotate_right(7); \
462  B1.rotate_right(1); \
463  B3 ^= B2 ^ (B0 << 3); \
464  B1 ^= B0 ^ B2; \
465  B2.rotate_right(3); \
466  B0.rotate_right(13); \
467  } while(0);
468 
469 /*
470 * SIMD Serpent Encryption of 4 blocks in parallel
471 */
472 void serpent_encrypt_4(const byte in[64],
473  byte out[64],
474  const u32bit keys[132])
475  {
476  SIMD_32 B0 = SIMD_32::load_le(in);
477  SIMD_32 B1 = SIMD_32::load_le(in + 16);
478  SIMD_32 B2 = SIMD_32::load_le(in + 32);
479  SIMD_32 B3 = SIMD_32::load_le(in + 48);
480 
481  SIMD_32::transpose(B0, B1, B2, B3);
482 
483  key_xor( 0,B0,B1,B2,B3); SBoxE1(B0,B1,B2,B3); transform(B0,B1,B2,B3);
484  key_xor( 1,B0,B1,B2,B3); SBoxE2(B0,B1,B2,B3); transform(B0,B1,B2,B3);
485  key_xor( 2,B0,B1,B2,B3); SBoxE3(B0,B1,B2,B3); transform(B0,B1,B2,B3);
486  key_xor( 3,B0,B1,B2,B3); SBoxE4(B0,B1,B2,B3); transform(B0,B1,B2,B3);
487  key_xor( 4,B0,B1,B2,B3); SBoxE5(B0,B1,B2,B3); transform(B0,B1,B2,B3);
488  key_xor( 5,B0,B1,B2,B3); SBoxE6(B0,B1,B2,B3); transform(B0,B1,B2,B3);
489  key_xor( 6,B0,B1,B2,B3); SBoxE7(B0,B1,B2,B3); transform(B0,B1,B2,B3);
490  key_xor( 7,B0,B1,B2,B3); SBoxE8(B0,B1,B2,B3); transform(B0,B1,B2,B3);
491 
492  key_xor( 8,B0,B1,B2,B3); SBoxE1(B0,B1,B2,B3); transform(B0,B1,B2,B3);
493  key_xor( 9,B0,B1,B2,B3); SBoxE2(B0,B1,B2,B3); transform(B0,B1,B2,B3);
494  key_xor(10,B0,B1,B2,B3); SBoxE3(B0,B1,B2,B3); transform(B0,B1,B2,B3);
495  key_xor(11,B0,B1,B2,B3); SBoxE4(B0,B1,B2,B3); transform(B0,B1,B2,B3);
496  key_xor(12,B0,B1,B2,B3); SBoxE5(B0,B1,B2,B3); transform(B0,B1,B2,B3);
497  key_xor(13,B0,B1,B2,B3); SBoxE6(B0,B1,B2,B3); transform(B0,B1,B2,B3);
498  key_xor(14,B0,B1,B2,B3); SBoxE7(B0,B1,B2,B3); transform(B0,B1,B2,B3);
499  key_xor(15,B0,B1,B2,B3); SBoxE8(B0,B1,B2,B3); transform(B0,B1,B2,B3);
500 
501  key_xor(16,B0,B1,B2,B3); SBoxE1(B0,B1,B2,B3); transform(B0,B1,B2,B3);
502  key_xor(17,B0,B1,B2,B3); SBoxE2(B0,B1,B2,B3); transform(B0,B1,B2,B3);
503  key_xor(18,B0,B1,B2,B3); SBoxE3(B0,B1,B2,B3); transform(B0,B1,B2,B3);
504  key_xor(19,B0,B1,B2,B3); SBoxE4(B0,B1,B2,B3); transform(B0,B1,B2,B3);
505  key_xor(20,B0,B1,B2,B3); SBoxE5(B0,B1,B2,B3); transform(B0,B1,B2,B3);
506  key_xor(21,B0,B1,B2,B3); SBoxE6(B0,B1,B2,B3); transform(B0,B1,B2,B3);
507  key_xor(22,B0,B1,B2,B3); SBoxE7(B0,B1,B2,B3); transform(B0,B1,B2,B3);
508  key_xor(23,B0,B1,B2,B3); SBoxE8(B0,B1,B2,B3); transform(B0,B1,B2,B3);
509 
510  key_xor(24,B0,B1,B2,B3); SBoxE1(B0,B1,B2,B3); transform(B0,B1,B2,B3);
511  key_xor(25,B0,B1,B2,B3); SBoxE2(B0,B1,B2,B3); transform(B0,B1,B2,B3);
512  key_xor(26,B0,B1,B2,B3); SBoxE3(B0,B1,B2,B3); transform(B0,B1,B2,B3);
513  key_xor(27,B0,B1,B2,B3); SBoxE4(B0,B1,B2,B3); transform(B0,B1,B2,B3);
514  key_xor(28,B0,B1,B2,B3); SBoxE5(B0,B1,B2,B3); transform(B0,B1,B2,B3);
515  key_xor(29,B0,B1,B2,B3); SBoxE6(B0,B1,B2,B3); transform(B0,B1,B2,B3);
516  key_xor(30,B0,B1,B2,B3); SBoxE7(B0,B1,B2,B3); transform(B0,B1,B2,B3);
517  key_xor(31,B0,B1,B2,B3); SBoxE8(B0,B1,B2,B3); key_xor(32,B0,B1,B2,B3);
518 
519  SIMD_32::transpose(B0, B1, B2, B3);
520 
521  B0.store_le(out);
522  B1.store_le(out + 16);
523  B2.store_le(out + 32);
524  B3.store_le(out + 48);
525  }
526 
527 /*
528 * SIMD Serpent Decryption of 4 blocks in parallel
529 */
530 void serpent_decrypt_4(const byte in[64],
531  byte out[64],
532  const u32bit keys[132])
533  {
534  SIMD_32 B0 = SIMD_32::load_le(in);
535  SIMD_32 B1 = SIMD_32::load_le(in + 16);
536  SIMD_32 B2 = SIMD_32::load_le(in + 32);
537  SIMD_32 B3 = SIMD_32::load_le(in + 48);
538 
539  SIMD_32::transpose(B0, B1, B2, B3);
540 
541  key_xor(32,B0,B1,B2,B3); SBoxD8(B0,B1,B2,B3); key_xor(31,B0,B1,B2,B3);
542  i_transform(B0,B1,B2,B3); SBoxD7(B0,B1,B2,B3); key_xor(30,B0,B1,B2,B3);
543  i_transform(B0,B1,B2,B3); SBoxD6(B0,B1,B2,B3); key_xor(29,B0,B1,B2,B3);
544  i_transform(B0,B1,B2,B3); SBoxD5(B0,B1,B2,B3); key_xor(28,B0,B1,B2,B3);
545  i_transform(B0,B1,B2,B3); SBoxD4(B0,B1,B2,B3); key_xor(27,B0,B1,B2,B3);
546  i_transform(B0,B1,B2,B3); SBoxD3(B0,B1,B2,B3); key_xor(26,B0,B1,B2,B3);
547  i_transform(B0,B1,B2,B3); SBoxD2(B0,B1,B2,B3); key_xor(25,B0,B1,B2,B3);
548  i_transform(B0,B1,B2,B3); SBoxD1(B0,B1,B2,B3); key_xor(24,B0,B1,B2,B3);
549 
550  i_transform(B0,B1,B2,B3); SBoxD8(B0,B1,B2,B3); key_xor(23,B0,B1,B2,B3);
551  i_transform(B0,B1,B2,B3); SBoxD7(B0,B1,B2,B3); key_xor(22,B0,B1,B2,B3);
552  i_transform(B0,B1,B2,B3); SBoxD6(B0,B1,B2,B3); key_xor(21,B0,B1,B2,B3);
553  i_transform(B0,B1,B2,B3); SBoxD5(B0,B1,B2,B3); key_xor(20,B0,B1,B2,B3);
554  i_transform(B0,B1,B2,B3); SBoxD4(B0,B1,B2,B3); key_xor(19,B0,B1,B2,B3);
555  i_transform(B0,B1,B2,B3); SBoxD3(B0,B1,B2,B3); key_xor(18,B0,B1,B2,B3);
556  i_transform(B0,B1,B2,B3); SBoxD2(B0,B1,B2,B3); key_xor(17,B0,B1,B2,B3);
557  i_transform(B0,B1,B2,B3); SBoxD1(B0,B1,B2,B3); key_xor(16,B0,B1,B2,B3);
558 
559  i_transform(B0,B1,B2,B3); SBoxD8(B0,B1,B2,B3); key_xor(15,B0,B1,B2,B3);
560  i_transform(B0,B1,B2,B3); SBoxD7(B0,B1,B2,B3); key_xor(14,B0,B1,B2,B3);
561  i_transform(B0,B1,B2,B3); SBoxD6(B0,B1,B2,B3); key_xor(13,B0,B1,B2,B3);
562  i_transform(B0,B1,B2,B3); SBoxD5(B0,B1,B2,B3); key_xor(12,B0,B1,B2,B3);
563  i_transform(B0,B1,B2,B3); SBoxD4(B0,B1,B2,B3); key_xor(11,B0,B1,B2,B3);
564  i_transform(B0,B1,B2,B3); SBoxD3(B0,B1,B2,B3); key_xor(10,B0,B1,B2,B3);
565  i_transform(B0,B1,B2,B3); SBoxD2(B0,B1,B2,B3); key_xor( 9,B0,B1,B2,B3);
566  i_transform(B0,B1,B2,B3); SBoxD1(B0,B1,B2,B3); key_xor( 8,B0,B1,B2,B3);
567 
568  i_transform(B0,B1,B2,B3); SBoxD8(B0,B1,B2,B3); key_xor( 7,B0,B1,B2,B3);
569  i_transform(B0,B1,B2,B3); SBoxD7(B0,B1,B2,B3); key_xor( 6,B0,B1,B2,B3);
570  i_transform(B0,B1,B2,B3); SBoxD6(B0,B1,B2,B3); key_xor( 5,B0,B1,B2,B3);
571  i_transform(B0,B1,B2,B3); SBoxD5(B0,B1,B2,B3); key_xor( 4,B0,B1,B2,B3);
572  i_transform(B0,B1,B2,B3); SBoxD4(B0,B1,B2,B3); key_xor( 3,B0,B1,B2,B3);
573  i_transform(B0,B1,B2,B3); SBoxD3(B0,B1,B2,B3); key_xor( 2,B0,B1,B2,B3);
574  i_transform(B0,B1,B2,B3); SBoxD2(B0,B1,B2,B3); key_xor( 1,B0,B1,B2,B3);
575  i_transform(B0,B1,B2,B3); SBoxD1(B0,B1,B2,B3); key_xor( 0,B0,B1,B2,B3);
576 
577  SIMD_32::transpose(B0, B1, B2, B3);
578 
579  B0.store_le(out);
580  B1.store_le(out + 16);
581  B2.store_le(out + 32);
582  B3.store_le(out + 48);
583  }
584 
585 }
586 
587 #undef key_xor
588 #undef transform
589 #undef i_transform
590 
591 #undef SBoxE1
592 #undef SBoxE2
593 #undef SBoxE3
594 #undef SBoxE4
595 #undef SBoxE5
596 #undef SBoxE6
597 #undef SBoxE7
598 #undef SBoxE8
599 
600 #undef SBoxD1
601 #undef SBoxD2
602 #undef SBoxD3
603 #undef SBoxD4
604 #undef SBoxD5
605 #undef SBoxD6
606 #undef SBoxD7
607 #undef SBoxD8
608 
609 /*
610 * Serpent Encryption
611 */
612 void Serpent_SIMD::encrypt_n(const byte in[], byte out[], size_t blocks) const
613  {
614  const u32bit* KS = &(this->get_round_keys()[0]);
615 
616  while(blocks >= 4)
617  {
618  serpent_encrypt_4(in, out, KS);
619  in += 4 * BLOCK_SIZE;
620  out += 4 * BLOCK_SIZE;
621  blocks -= 4;
622  }
623 
624  if(blocks)
625  Serpent::encrypt_n(in, out, blocks);
626  }
627 
628 /*
629 * Serpent Decryption
630 */
631 void Serpent_SIMD::decrypt_n(const byte in[], byte out[], size_t blocks) const
632  {
633  const u32bit* KS = &(this->get_round_keys()[0]);
634 
635  while(blocks >= 4)
636  {
637  serpent_decrypt_4(in, out, KS);
638  in += 4 * BLOCK_SIZE;
639  out += 4 * BLOCK_SIZE;
640  blocks -= 4;
641  }
642 
643  if(blocks)
644  Serpent::decrypt_n(in, out, blocks);
645  }
646 
647 }
#define SBoxE5(B0, B1, B2, B3)
Definition: serp_simd.cpp:116
#define transform(B0, B1, B2, B3)
Definition: serp_simd.cpp:441
#define SBoxE6(B0, B1, B2, B3)
Definition: serp_simd.cpp:143
#define SBoxD5(B0, B1, B2, B3)
Definition: serp_simd.cpp:325
#define SBoxE4(B0, B1, B2, B3)
Definition: serp_simd.cpp:90
#define SBoxE7(B0, B1, B2, B3)
Definition: serp_simd.cpp:170
#define SBoxD4(B0, B1, B2, B3)
Definition: serp_simd.cpp:299
void encrypt_n(const byte in[], byte out[], size_t blocks) const
Definition: serpent.cpp:249
T load_le(const byte in[], size_t off)
Definition: loadstor.h:116
#define SBoxE3(B0, B1, B2, B3)
Definition: serp_simd.cpp:67
#define SBoxE8(B0, B1, B2, B3)
Definition: serp_simd.cpp:193
#define SBoxD7(B0, B1, B2, B3)
Definition: serp_simd.cpp:379
#define SBoxE2(B0, B1, B2, B3)
Definition: serp_simd.cpp:41
void decrypt_n(const byte in[], byte out[], size_t blocks) const
Definition: serp_simd.cpp:631
unsigned char byte
Definition: types.h:22
#define SBoxE1(B0, B1, B2, B3)
Definition: serp_simd.cpp:16
#define SBoxD1(B0, B1, B2, B3)
Definition: serp_simd.cpp:221
#define key_xor(round, B0, B1, B2, B3)
Definition: serp_simd.cpp:430
#define SBoxD8(B0, B1, B2, B3)
Definition: serp_simd.cpp:403
#define SBoxD2(B0, B1, B2, B3)
Definition: serp_simd.cpp:246
const SecureVector< u32bit > & get_round_keys() const
Definition: serpent.h:34
void decrypt_n(const byte in[], byte out[], size_t blocks) const
Definition: serpent.cpp:301
#define SBoxD3(B0, B1, B2, B3)
Definition: serp_simd.cpp:274
#define i_transform(B0, B1, B2, B3)
Definition: serp_simd.cpp:455
void encrypt_n(const byte in[], byte out[], size_t blocks) const
Definition: serp_simd.cpp:612
unsigned int u32bit
Definition: types.h:32
#define SBoxD6(B0, B1, B2, B3)
Definition: serp_simd.cpp:351