Botan 1.10.17
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
12namespace Botan {
13
14namespace {
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*/
472void 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*/
530void 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*/
612void 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*/
631void 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}
void encrypt_n(const byte in[], byte out[], size_t blocks) const
void decrypt_n(const byte in[], byte out[], size_t blocks) const
const SecureVector< u32bit > & get_round_keys() const
Definition serpent.h:34
void encrypt_n(const byte in[], byte out[], size_t blocks) const
Definition serpent.cpp:249
void decrypt_n(const byte in[], byte out[], size_t blocks) const
Definition serpent.cpp:301
unsigned int u32bit
Definition types.h:32
#define SBoxE7(B0, B1, B2, B3)
#define SBoxE1(B0, B1, B2, B3)
Definition serp_simd.cpp:16
#define SBoxE5(B0, B1, B2, B3)
#define SBoxD6(B0, B1, B2, B3)
#define SBoxD8(B0, B1, B2, B3)
#define SBoxD1(B0, B1, B2, B3)
#define i_transform(B0, B1, B2, B3)
#define SBoxD7(B0, B1, B2, B3)
#define SBoxE4(B0, B1, B2, B3)
Definition serp_simd.cpp:90
#define SBoxE3(B0, B1, B2, B3)
Definition serp_simd.cpp:67
#define SBoxE2(B0, B1, B2, B3)
Definition serp_simd.cpp:41
#define SBoxD5(B0, B1, B2, B3)
#define transform(B0, B1, B2, B3)
#define SBoxE6(B0, B1, B2, B3)
#define SBoxD2(B0, B1, B2, B3)
#define SBoxE8(B0, B1, B2, B3)
#define SBoxD4(B0, B1, B2, B3)
#define SBoxD3(B0, B1, B2, B3)
#define key_xor(round, B0, B1, B2, B3)
Definition serpent.cpp:240