Botan 2.19.2
Crypto and TLS for C&
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#include <botan/build.h>
15
16template<typename T>
17BOTAN_FORCE_INLINE void SBoxE0(T& a, T& b, T& c, T& d)
18 {
19 d ^= a;
20 T t0 = b;
21 b &= d;
22 t0 ^= c;
23 b ^= a;
24 a |= d;
25 a ^= t0;
26 t0 ^= d;
27 d ^= c;
28 c |= b;
29 c ^= t0;
30 t0 = ~t0;
31 t0 |= b;
32 b ^= d;
33 b ^= t0;
34 d |= a;
35 b ^= d;
36 t0 ^= d;
37 d = a;
38 a = b;
39 b = t0;
40 }
41
42template<typename T>
43BOTAN_FORCE_INLINE void SBoxE1(T& a, T& b, T& c, T& d)
44 {
45 a = ~a;
46 c = ~c;
47 T t0 = a;
48 a &= b;
49 c ^= a;
50 a |= d;
51 d ^= c;
52 b ^= a;
53 a ^= t0;
54 t0 |= b;
55 b ^= d;
56 c |= a;
57 c &= t0;
58 a ^= b;
59 b &= c;
60 b ^= a;
61 a &= c;
62 t0 ^= a;
63 a = c;
64 c = d;
65 d = b;
66 b = t0;
67 }
68
69template<typename T>
70BOTAN_FORCE_INLINE void SBoxE2(T& a, T& b, T& c, T& d)
71 {
72 T t0 = a;
73 a &= c;
74 a ^= d;
75 c ^= b;
76 c ^= a;
77 d |= t0;
78 d ^= b;
79 t0 ^= c;
80 b = d;
81 d |= t0;
82 d ^= a;
83 a &= b;
84 t0 ^= a;
85 b ^= d;
86 b ^= t0;
87 a = c;
88 c = b;
89 b = d;
90 d = ~t0;
91 }
92
93template<typename T>
94BOTAN_FORCE_INLINE void SBoxE3(T& a, T& b, T& c, T& d)
95 {
96 T t0 = a;
97 a |= d;
98 d ^= b;
99 b &= t0;
100 t0 ^= c;
101 c ^= d;
102 d &= a;
103 t0 |= b;
104 d ^= t0;
105 a ^= b;
106 t0 &= a;
107 b ^= d;
108 t0 ^= c;
109 b |= a;
110 b ^= c;
111 a ^= d;
112 c = b;
113 b |= d;
114 a ^= b;
115 b = c;
116 c = d;
117 d = t0;
118 }
119
120template<typename T>
121BOTAN_FORCE_INLINE void SBoxE4(T& a, T& b, T& c, T& d)
122 {
123 b ^= d;
124 d = ~d;
125 c ^= d;
126 d ^= a;
127 T t0 = b;
128 b &= d;
129 b ^= c;
130 t0 ^= d;
131 a ^= t0;
132 c &= t0;
133 c ^= a;
134 a &= b;
135 d ^= a;
136 t0 |= b;
137 t0 ^= a;
138 a |= d;
139 a ^= c;
140 c &= d;
141 a = ~a;
142 t0 ^= c;
143 c = a;
144 a = b;
145 b = t0;
146 }
147
148template<typename T>
149BOTAN_FORCE_INLINE void SBoxE5(T& a, T& b, T& c, T& d)
150 {
151 a ^= b;
152 b ^= d;
153 d = ~d;
154 T t0 = b;
155 b &= a;
156 c ^= d;
157 b ^= c;
158 c |= t0;
159 t0 ^= d;
160 d &= b;
161 d ^= a;
162 t0 ^= b;
163 t0 ^= c;
164 c ^= a;
165 a &= d;
166 c = ~c;
167 a ^= t0;
168 t0 |= d;
169 t0 ^= c;
170 c = a;
171 a = b;
172 b = d;
173 d = t0;
174 }
175
176template<typename T>
177BOTAN_FORCE_INLINE void SBoxE6(T& a, T& b, T& c, T& d)
178 {
179 c = ~c;
180 T t0 = d;
181 d &= a;
182 a ^= t0;
183 d ^= c;
184 c |= t0;
185 b ^= d;
186 c ^= a;
187 a |= b;
188 c ^= b;
189 t0 ^= a;
190 a |= d;
191 a ^= c;
192 t0 ^= d;
193 t0 ^= a;
194 d = ~d;
195 c &= t0;
196 d ^= c;
197 c = t0;
198 }
199
200template<typename T>
201BOTAN_FORCE_INLINE void SBoxE7(T& a, T& b, T& c, T& d)
202 {
203 T t0 = b;
204 b |= c;
205 b ^= d;
206 t0 ^= c;
207 c ^= b;
208 d |= t0;
209 d &= a;
210 t0 ^= c;
211 d ^= b;
212 b |= t0;
213 b ^= a;
214 a |= t0;
215 a ^= c;
216 b ^= t0;
217 c ^= b;
218 b &= a;
219 b ^= t0;
220 c = ~c;
221 c |= a;
222 t0 ^= c;
223 c = b;
224 b = d;
225 d = a;
226 a = t0;
227 }
228
229template<typename T>
230BOTAN_FORCE_INLINE void SBoxD0(T& a, T& b, T& c, T& d)
231 {
232 c = ~c;
233 T t0 = b;
234 b |= a;
235 t0 = ~t0;
236 b ^= c;
237 c |= t0;
238 b ^= d;
239 a ^= t0;
240 c ^= a;
241 a &= d;
242 t0 ^= a;
243 a |= b;
244 a ^= c;
245 d ^= t0;
246 c ^= b;
247 d ^= a;
248 d ^= b;
249 c &= d;
250 t0 ^= c;
251 c = b;
252 b = t0;
253 }
254
255template<typename T>
256BOTAN_FORCE_INLINE void SBoxD1(T& a, T& b, T& c, T& d)
257 {
258 T t0 = b;
259 b ^= d;
260 d &= b;
261 t0 ^= c;
262 d ^= a;
263 a |= b;
264 c ^= d;
265 a ^= t0;
266 a |= c;
267 b ^= d;
268 a ^= b;
269 b |= d;
270 b ^= a;
271 t0 = ~t0;
272 t0 ^= b;
273 b |= a;
274 b ^= a;
275 b |= t0;
276 d ^= b;
277 b = a;
278 a = t0;
279 t0 = c;
280 c = d;
281 d = t0;
282 }
283
284template<typename T>
285BOTAN_FORCE_INLINE void SBoxD2(T& a, T& b, T& c, T& d)
286 {
287 c ^= d;
288 d ^= a;
289 T t0 = d;
290 d &= c;
291 d ^= b;
292 b |= c;
293 b ^= t0;
294 t0 &= d;
295 c ^= d;
296 t0 &= a;
297 t0 ^= c;
298 c &= b;
299 c |= a;
300 d = ~d;
301 c ^= d;
302 a ^= d;
303 a &= b;
304 d ^= t0;
305 d ^= a;
306 a = b;
307 b = t0;
308 }
309
310template<typename T>
311BOTAN_FORCE_INLINE void SBoxD3(T& a, T& b, T& c, T& d)
312 {
313 T t0 = c;
314 c ^= b;
315 a ^= c;
316 t0 &= c;
317 t0 ^= a;
318 a &= b;
319 b ^= d;
320 d |= t0;
321 c ^= d;
322 a ^= d;
323 b ^= t0;
324 d &= c;
325 d ^= b;
326 b ^= a;
327 b |= c;
328 a ^= d;
329 b ^= t0;
330 a ^= b;
331 t0 = a;
332 a = c;
333 c = d;
334 d = t0;
335 }
336
337template<typename T>
338BOTAN_FORCE_INLINE void SBoxD4(T& a, T& b, T& c, T& d)
339 {
340 T t0 = c;
341 c &= d;
342 c ^= b;
343 b |= d;
344 b &= a;
345 t0 ^= c;
346 t0 ^= b;
347 b &= c;
348 a = ~a;
349 d ^= t0;
350 b ^= d;
351 d &= a;
352 d ^= c;
353 a ^= b;
354 c &= a;
355 d ^= a;
356 c ^= t0;
357 c |= d;
358 d ^= a;
359 c ^= b;
360 b = d;
361 d = t0;
362 }
363
364template<typename T>
365BOTAN_FORCE_INLINE void SBoxD5(T& a, T& b, T& c, T& d)
366 {
367 b = ~b;
368 T t0 = d;
369 c ^= b;
370 d |= a;
371 d ^= c;
372 c |= b;
373 c &= a;
374 t0 ^= d;
375 c ^= t0;
376 t0 |= a;
377 t0 ^= b;
378 b &= c;
379 b ^= d;
380 t0 ^= c;
381 d &= t0;
382 t0 ^= b;
383 d ^= t0;
384 t0 = ~t0;
385 d ^= a;
386 a = b;
387 b = t0;
388 t0 = d;
389 d = c;
390 c = t0;
391 }
392
393template<typename T>
394BOTAN_FORCE_INLINE void SBoxD6(T& a, T& b, T& c, T& d)
395 {
396 a ^= c;
397 T t0 = c;
398 c &= a;
399 t0 ^= d;
400 c = ~c;
401 d ^= b;
402 c ^= d;
403 t0 |= a;
404 a ^= c;
405 d ^= t0;
406 t0 ^= b;
407 b &= d;
408 b ^= a;
409 a ^= d;
410 a |= c;
411 d ^= b;
412 t0 ^= a;
413 a = b;
414 b = c;
415 c = t0;
416 }
417
418template<typename T>
419BOTAN_FORCE_INLINE void SBoxD7(T& a, T& b, T& c, T& d)
420 {
421 T t0 = c;
422 c ^= a;
423 a &= d;
424 t0 |= d;
425 c = ~c;
426 d ^= b;
427 b |= a;
428 a ^= c;
429 c &= t0;
430 d &= t0;
431 b ^= c;
432 c ^= a;
433 a |= c;
434 t0 ^= b;
435 a ^= d;
436 d ^= t0;
437 t0 |= a;
438 d ^= c;
439 t0 ^= c;
440 c = b;
441 b = a;
442 a = d;
443 d = t0;
444 }
445
446#endif
#define BOTAN_FORCE_INLINE
Definition: compiler.h:205
fe T
Definition: ge.cpp:37
BOTAN_FORCE_INLINE void SBoxE6(T &a, T &b, T &c, T &d)
Definition: serpent_sbox.h:177
BOTAN_FORCE_INLINE void SBoxE1(T &a, T &b, T &c, T &d)
Definition: serpent_sbox.h:43
BOTAN_FORCE_INLINE void SBoxD6(T &a, T &b, T &c, T &d)
Definition: serpent_sbox.h:394
BOTAN_FORCE_INLINE void SBoxE7(T &a, T &b, T &c, T &d)
Definition: serpent_sbox.h:201
BOTAN_FORCE_INLINE void SBoxD1(T &a, T &b, T &c, T &d)
Definition: serpent_sbox.h:256
BOTAN_FORCE_INLINE void SBoxD3(T &a, T &b, T &c, T &d)
Definition: serpent_sbox.h:311
BOTAN_FORCE_INLINE void SBoxE3(T &a, T &b, T &c, T &d)
Definition: serpent_sbox.h:94
BOTAN_FORCE_INLINE void SBoxD2(T &a, T &b, T &c, T &d)
Definition: serpent_sbox.h:285
BOTAN_FORCE_INLINE void SBoxE4(T &a, T &b, T &c, T &d)
Definition: serpent_sbox.h:121
BOTAN_FORCE_INLINE void SBoxE5(T &a, T &b, T &c, T &d)
Definition: serpent_sbox.h:149
BOTAN_FORCE_INLINE void SBoxD4(T &a, T &b, T &c, T &d)
Definition: serpent_sbox.h:338
BOTAN_FORCE_INLINE void SBoxD5(T &a, T &b, T &c, T &d)
Definition: serpent_sbox.h:365
BOTAN_FORCE_INLINE void SBoxD0(T &a, T &b, T &c, T &d)
Definition: serpent_sbox.h:230
BOTAN_FORCE_INLINE void SBoxE2(T &a, T &b, T &c, T &d)
Definition: serpent_sbox.h:70
BOTAN_FORCE_INLINE void SBoxD7(T &a, T &b, T &c, T &d)
Definition: serpent_sbox.h:419
BOTAN_FORCE_INLINE void SBoxE0(T &a, T &b, T &c, T &d)
Definition: serpent_sbox.h:17