]> git.cryptolib.org Git - avr-crypto-lib.git/blob - serpent/serpent-sboxes-bitslice.c
fixing E-Mail-Address & Copyright
[avr-crypto-lib.git] / serpent / serpent-sboxes-bitslice.c
1 /* serpent-sboxes-bitslice.c */
2 /*
3     This file is part of the AVR-Crypto-Lib.
4     Copyright (C) 2006-2015 Daniel Otte (bg@nerilex.org)
5
6     This program is free software: you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation, either version 3 of the License, or
9     (at your option) any later version.
10
11     This program is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with this program.  If not, see <http://www.gnu.org/licenses/>.
18 */
19 /* serpent-sboxes.c
20  * a bitsliced implementation of the serpent sboxes
21  * author: Daniel Otte 
22  * email:  bg@nerilex.org
23  * license: GPLv3
24  */
25
26 #include <stdint.h>
27 #include <string.h>
28 #include <avr/pgmspace.h>
29 #include "serpent-sboxes.h"
30
31
32
33
34 /* S0:   3  8 15  1 10  6  5 11 14 13  4  2  7  0  9 12 */
35
36 /* depth = 5,7,4,2, Total gates=18 */
37 static
38 void sb0(uint8_t *out, const uint8_t *in){
39 // (a,b,c,d,w,x,y,z) 
40         uint8_t t01, t02, t03, t05, t06, t07, t08, t09, t11, t12, t13, t14, t15, t17;
41         t01          = in[4*1]  ^ in[4*2]; 
42         t02          = in[4*0]  | in[4*3]; 
43         t03          = in[4*0]  ^ in[4*1]; 
44         out[4*3]   = t02        ^ t01; 
45         t05          = in[4*2]  | out[4*3]; 
46         t06          = in[4*0]  ^ in[4*3]; 
47         t07          = in[4*1]  | in[4*2]; 
48         t08          = in[4*3]  & t05; 
49         t09          = t03        & t07; 
50         out[4*2]   = t09        ^ t08; 
51         t11          = t09        & out[4*2]; 
52         t12          = in[4*2]  ^ in[4*3]; 
53         t13          = t07        ^ t11; 
54         t14          = in[4*1]  & t06; 
55         t15          = t06        ^ t13; 
56         out[4*0]   =     ~ t15; 
57         t17          = out[4*0] ^ t14; 
58         out[4*1]   = t12        ^ t17; 
59 }
60
61 /* InvS0:  13  3 11  0 10  6  5 12  1 14  4  7 15  9  8  2 */
62
63 /* depth = 8,4,3,6, Total gates=19 */
64 static
65 void sb0_inv(uint8_t *out, const uint8_t *in){
66         uint8_t t02, t03, t04, t05, t06, t08, t09, t10, t12, t13, t14, t15, t17, t18, t01;
67         t01          = in[4*2] ^ in[4*3];
68         t02          = in[4*0] | in[4*1];
69         t03          = in[4*1] | in[4*2];
70         t04          = in[4*2] & t01;
71         t05          = t02       ^ t01;
72         t06          = in[4*0] | t04;
73         out[4*2]   =     ~ t05;
74         t08          = in[4*1]   ^ in[4*3];
75         t09          = t03       & t08;
76         t10          = in[4*3]   | out[4*2];
77         out[4*1]   = t09       ^ t06;
78         t12          = in[4*0]   | t05;
79         t13          = out[4*1]   ^ t12;
80         t14          = t03       ^ t10;
81         t15          = in[4*0]   ^ in[4*2];
82         out[4*3]   = t14       ^ t13;
83         t17          = t05       & t13;
84         t18          = t14       | t17;
85         out[4*0]   = t15       ^ t18; 
86 }
87
88 /* S1:  15 12  2  7  9  0  5 10  1 11 14  8  6 13  3  4 */
89
90 /* depth = 10,7,3,5, Total gates=18 */
91 static 
92 void sb1(uint8_t *out, const uint8_t *in){
93         uint8_t t02, t03, t04, t05, t06, t07, t08, t10, t11, t12, t13, t16, t17, t01;
94         t01          = in[4*0]   | in[4*3];
95         t02          = in[4*2]   ^ in[4*3];
96         t03          =     ~ in[4*1];
97         t04          = in[4*0]   ^ in[4*2];
98         t05          = in[4*0]   | t03;
99         t06          = in[4*3]   & t04;
100         t07          = t01       & t02;
101         t08          = in[4*1]   | t06;
102         out[4*2]   = t02       ^ t05;
103         t10          = t07       ^ t08;
104         t11          = t01       ^ t10;
105         t12          = out[4*2]   ^ t11;
106         t13          = in[4*1]   & in[4*3];
107         out[4*3]   =     ~ t10;
108         out[4*1]   = t13       ^ t12;
109         t16          = t10       | out[4*1];
110         t17          = t05       & t16;
111         out[4*0]   = in[4*2]   ^ t17; 
112 }
113
114 /* InvS1:   5  8  2 14 15  6 12  3 11  4  7  9  1 13 10  0 */
115
116 /* depth = 7,4,5,3, Total gates=18 */
117 static void sb1_inv(uint8_t *out, const uint8_t *in){
118         uint8_t t02, t03, t04, t05, t06, t07, t08, t09, t10, t11, t14, t15, t17, t01;
119         t01          = in[4*0]   ^ in[4*1];
120         t02          = in[4*1]   | in[4*3];
121         t03          = in[4*0]   & in[4*2];
122         t04          = in[4*2]   ^ t02;
123         t05          = in[4*0]   | t04;
124         t06          = t01       & t05;
125         t07          = in[4*3]   | t03;
126         t08          = in[4*1]   ^ t06;
127         t09          = t07       ^ t06;
128         t10          = t04       | t03;
129         t11          = in[4*3]   & t08;
130         out[4*2]   =     ~ t09;
131         out[4*1]   = t10       ^ t11;
132         t14          = in[4*0]   | out[4*2];
133         t15          = t06       ^ out[4*1];
134         out[4*3]   = t01       ^ t04;
135         t17          = in[4*2]   ^ t15;
136         out[4*0]   = t14       ^ t17; 
137 }
138
139 /* S2:   8  6  7  9  3 12 10 15 13  1 14  4  0 11  5  2 */
140
141 /* depth = 3,8,11,7, Total gates=16 */
142 static void sb2(uint8_t *out, const uint8_t *in){
143         uint8_t t02, t03, t05, t06, t07, t08, t09, t10, t12, t13, t14, t01;
144         t01          = in[4*0]   | in[4*2];
145         t02          = in[4*0]   ^ in[4*1];
146         t03          = in[4*3]   ^ t01;
147         out[4*0]   = t02       ^ t03;
148         t05          = in[4*2]   ^ out[4*0];
149         t06          = in[4*1]   ^ t05;
150         t07          = in[4*1]   | t05;
151         t08          = t01       & t06;
152         t09          = t03       ^ t07;
153         t10          = t02       | t09;
154         out[4*1]   = t10       ^ t08;
155         t12          = in[4*0]   | in[4*3];
156         t13          = t09       ^ out[4*1];
157         t14          = in[4*1]   ^ t13;
158         out[4*3]   =     ~ t09;
159         out[4*2]   = t12       ^ t14; 
160 }
161
162 /* InvS2:  12  9 15  4 11 14  1  2  0  3  6 13  5  8 10  7 */
163
164 /* depth = 3,6,8,3, Total gates=18 */
165 static void sb2_inv(uint8_t *out, const uint8_t *in){
166         uint8_t t02, t03, t04, t06, t07, t08, t09, t10, t11, t12, t15, t16, t17, t01;
167         t01          = in[4*0]   ^ in[4*3];
168         t02          = in[4*2]   ^ in[4*3];
169         t03          = in[4*0]   & in[4*2];
170         t04          = in[4*1]   | t02;
171         out[4*0]   = t01       ^ t04;
172         t06          = in[4*0]   | in[4*2];
173         t07          = in[4*3]   | out[4*0];
174         t08          =     ~ in[4*3];
175         t09          = in[4*1]   & t06;
176         t10          = t08       | t03;
177         t11          = in[4*1]   & t07;
178         t12          = t06       & t02;
179         out[4*3]   = t09       ^ t10;
180         out[4*1]   = t12       ^ t11;
181         t15          = in[4*2]   & out[4*3];
182         t16          = out[4*0]   ^ out[4*1];
183         t17          = t10       ^ t15;
184         out[4*2]   = t16       ^ t17; 
185 }
186
187 /* S3:   0 15 11  8 12  9  6  3 13  1  2  4 10  7  5 14 */
188
189 /* depth = 8,3,5,5, Total gates=18 */
190 static void sb3(uint8_t *out, const uint8_t *in){
191         uint8_t t02, t03, t04, t05, t06, t07, t08, t09, t10, t11, t13, t14, t15, t01;
192         t01          = in[4*0]   ^ in[4*2];
193         t02          = in[4*0]   | in[4*3];
194         t03          = in[4*0]   & in[4*3];
195         t04          = t01       & t02;
196         t05          = in[4*1]   | t03;
197         t06          = in[4*0]   & in[4*1];
198         t07          = in[4*3]   ^ t04;
199         t08          = in[4*2]   | t06;
200         t09          = in[4*1]   ^ t07;
201         t10          = in[4*3]   & t05;
202         t11          = t02       ^ t10;
203         out[4*3]   = t08       ^ t09;
204         t13          = in[4*3]   | out[4*3];
205         t14          = in[4*0]   | t07;
206         t15          = in[4*1]   & t13;
207         out[4*2]   = t08       ^ t11;
208         out[4*0]   = t14       ^ t15;
209         out[4*1]   = t05       ^ t04; 
210 }
211
212 /* InvS3:   0  9 10  7 11 14  6 13  3  5 12  2  4  8 15  1 */
213
214 /* depth = 3,6,4,4, Total gates=17 */
215 static void sb3_inv(uint8_t *out, const uint8_t *in){
216         uint8_t t02, t03, t04, t05, t06, t07, t09, t11, t12, t13, t14, t16, t01;
217         t01          = in[4*2]   | in[4*3];
218         t02          = in[4*0]   | in[4*3];
219         t03          = in[4*2]   ^ t02;
220         t04          = in[4*1]   ^ t02;
221         t05          = in[4*0]   ^ in[4*3];
222         t06          = t04       & t03;
223         t07          = in[4*1]   & t01;
224         out[4*2]   = t05       ^ t06;
225         t09          = in[4*0]   ^ t03;
226         out[4*0]   = t07       ^ t03;
227         t11          = out[4*0]   | t05;
228         t12          = t09       & t11;
229         t13          = in[4*0]   & out[4*2];
230         t14          = t01       ^ t05;
231         out[4*1]   = in[4*1]   ^ t12;
232         t16          = in[4*1]   | t13;
233         out[4*3]   = t14       ^ t16; 
234 }
235
236 /* S4:   1 15  8  3 12  0 11  6  2  5  4 10  9 14  7 13 */
237
238 /* depth = 6,7,5,3, Total gates=19 */
239 static void sb4(uint8_t *out, const uint8_t *in){
240         uint8_t t02, t03, t04, t05, t06, t08, t09, t10, t11, t12, t13, t14, t15, t16, t01;
241         t01          = in[4*0]   | in[4*1];
242         t02          = in[4*1]   | in[4*2];
243         t03          = in[4*0]   ^ t02;
244         t04          = in[4*1]   ^ in[4*3];
245         t05          = in[4*3]   | t03;
246         t06          = in[4*3]   & t01;
247         out[4*3]   = t03       ^ t06;
248         t08          = out[4*3]   & t04;
249         t09          = t04       & t05;
250         t10          = in[4*2]   ^ t06;
251         t11          = in[4*1]   & in[4*2];
252         t12          = t04       ^ t08;
253         t13          = t11       | t03;
254         t14          = t10       ^ t09;
255         t15          = in[4*0]   & t05;
256         t16          = t11       | t12;
257         out[4*2]   = t13       ^ t08;
258         out[4*1]   = t15       ^ t16;
259         out[4*0]   =     ~ t14; 
260 }
261
262 /* InvS4:   5  0  8  3 10  9  7 14  2 12 11  6  4 15 13  1 */
263
264 /* depth = 6,4,7,3, Total gates=17 */
265 static void sb4_inv(uint8_t *out, const uint8_t *in){
266         uint8_t t02, t03, t04, t05, t06, t07, t09, t10, t11, t12, t13, t15, t01;
267         t01          = in[4*1]   | in[4*3];
268         t02          = in[4*2]   | in[4*3];
269         t03          = in[4*0]   & t01;
270         t04          = in[4*1]   ^ t02;
271         t05          = in[4*2]   ^ in[4*3];
272         t06          =     ~ t03;
273         t07          = in[4*0]   & t04;
274         out[4*1]   = t05       ^ t07;
275         t09          = out[4*1]   | t06;
276         t10          = in[4*0]   ^ t07;
277         t11          = t01       ^ t09;
278         t12          = in[4*3]   ^ t04;
279         t13          = in[4*2]   | t10;
280         out[4*3]   = t03       ^ t12;
281         t15          = in[4*0]   ^ t04;
282         out[4*2]   = t11       ^ t13;
283         out[4*0]   = t15       ^ t09; 
284 }
285
286 /* S5:  15  5  2 11  4 10  9 12  0  3 14  8 13  6  7  1 */
287
288 /* depth = 4,6,8,6, Total gates=17 */
289 static void sb5(uint8_t *out, const uint8_t *in){
290         uint8_t t02, t03, t04, t05, t07, t08, t09, t10, t11, t12, t13, t14, t01;
291         t01          = in[4*1]   ^ in[4*3];
292         t02          = in[4*1]   | in[4*3];
293         t03          = in[4*0]   & t01;
294         t04          = in[4*2]   ^ t02;
295         t05          = t03       ^ t04;
296         out[4*0]   =     ~ t05;
297         t07          = in[4*0]   ^ t01;
298         t08          = in[4*3]   | out[4*0];
299         t09          = in[4*1]   | t05;
300         t10          = in[4*3]   ^ t08;
301         t11          = in[4*1]   | t07;
302         t12          = t03       | out[4*0];
303         t13          = t07       | t10;
304         t14          = t01       ^ t11;
305         out[4*2]   = t09       ^ t13;
306         out[4*1]   = t07       ^ t08;
307         out[4*3]   = t12       ^ t14; 
308 }
309
310 /* InvS5:   8 15  2  9  4  1 13 14 11  6  5  3  7 12 10  0 */
311
312 /* depth = 4,6,9,7, Total gates=17 */
313 static void sb5_inv(uint8_t *out, const uint8_t *in){
314         uint8_t t02, t03, t04, t05, t07, t08, t09, t10, t12, t13, t15, t16, t01;
315         t01          = in[4*0]   & in[4*3];
316         t02          = in[4*2]   ^ t01;
317         t03          = in[4*0]   ^ in[4*3];
318         t04          = in[4*1]   & t02;
319         t05          = in[4*0]   & in[4*2];
320         out[4*0]   = t03       ^ t04;
321         t07          = in[4*0]   & out[4*0];
322         t08          = t01       ^ out[4*0];
323         t09          = in[4*1]   | t05;
324         t10          =     ~ in[4*1];
325         out[4*1]   = t08       ^ t09;
326         t12          = t10       | t07;
327         t13          = out[4*0]   | out[4*1];
328         out[4*3]   = t02       ^ t12;
329         t15          = t02       ^ t13;
330         t16          = in[4*1]   ^ in[4*3];
331         out[4*2]   = t16       ^ t15; 
332 }
333
334 /* S6:   7  2 12  5  8  4  6 11 14  9  1 15 13  3 10  0 */
335
336 /* depth = 8,3,6,3, Total gates=19 */
337 static void sb6(uint8_t *out, const uint8_t *in){
338         uint8_t t02, t03, t04, t05, t07, t08, t09, t10, t11, t12, t13, t15, t17, t18, t01;
339         t01          = in[4*0]   & in[4*3];
340         t02          = in[4*1]   ^ in[4*2];
341         t03          = in[4*0]   ^ in[4*3];
342         t04          = t01       ^ t02;
343         t05          = in[4*1]   | in[4*2];
344         out[4*1]   =     ~ t04;
345         t07          = t03       & t05;
346         t08          = in[4*1]   & out[4*1];
347         t09          = in[4*0]   | in[4*2];
348         t10          = t07       ^ t08;
349         t11          = in[4*1]   | in[4*3];
350         t12          = in[4*2]   ^ t11;
351         t13          = t09       ^ t10;
352         out[4*2]   =     ~ t13;
353         t15          = out[4*1]   & t03;
354         out[4*3]   = t12       ^ t07;
355         t17          = in[4*0]   ^ in[4*1];
356         t18          = out[4*2]   ^ t15;
357         out[4*0]   = t17       ^ t18; 
358 }
359
360 /* InvS6:  15 10  1 13  5  3  6  0  4  9 14  7  2 12  8 11 */
361
362 /* depth = 5,3,8,6, Total gates=19 */
363 static void sb6_inv(uint8_t *out, const uint8_t *in){
364         uint8_t t02, t03, t04, t05, t06, t07, t08, t09, t12, t13, t14, t15, t16, t17, t01;
365         t01          = in[4*0]   ^ in[4*2];
366         t02          =     ~ in[4*2];
367         t03          = in[4*1]   & t01;
368         t04          = in[4*1]   | t02;
369         t05          = in[4*3]   | t03;
370         t06          = in[4*1]   ^ in[4*3];
371         t07          = in[4*0]   & t04;
372         t08          = in[4*0]   | t02;
373         t09          = t07       ^ t05;
374         out[4*1]   = t06       ^ t08;
375         out[4*0]   =     ~ t09;
376         t12          = in[4*1]   & out[4*0];
377         t13          = t01       & t05;
378         t14          = t01       ^ t12;
379         t15          = t07       ^ t13;
380         t16          = in[4*3]   | t02;
381         t17          = in[4*0]   ^ out[4*1];
382         out[4*3]   = t17       ^ t15;
383         out[4*2]   = t16       ^ t14; 
384 }
385
386 /* S7:   1 13 15  0 14  8  2 11  7  4 12 10  9  3  5  6 */
387
388 /* depth = 10,7,10,4, Total gates=19 */
389 static void sb7(uint8_t *out, const uint8_t *in){
390         uint8_t t02, t03, t04, t05, t06, t08, t09, t10, t11, t13, t14, t15, t16, t17, t01;
391         t01          = in[4*0]   & in[4*2];
392         t02          =     ~ in[4*3];
393         t03          = in[4*0]   & t02;
394         t04          = in[4*1]   | t01;
395         t05          = in[4*0]   & in[4*1];
396         t06          = in[4*2]   ^ t04;
397         out[4*3]   = t03       ^ t06;
398         t08          = in[4*2]   | out[4*3];
399         t09          = in[4*3]   | t05;
400         t10          = in[4*0]   ^ t08;
401         t11          = t04       & out[4*3];
402         out[4*1]   = t09       ^ t10;
403         t13          = in[4*1]   ^ out[4*1];
404         t14          = t01       ^ out[4*1];
405         t15          = in[4*2]   ^ t05;
406         t16          = t11       | t13;
407         t17          = t02       | t14;
408         out[4*0]   = t15       ^ t17;
409         out[4*2]   = in[4*0]   ^ t16; 
410 }
411
412 /* InvS7:   3  0  6 13  9 14 15  8  5 12 11  7 10  1  4  2 */
413
414 /* depth = 9,7,3,3, Total gates=18 */
415 static void sb7_inv(uint8_t *out, const uint8_t *in){
416         uint8_t t02, t03, t04, t06, t07, t08, t09, t10, t11, t13, t14, t15, t16, t01;
417         t01          = in[4*0]   & in[4*1];
418         t02          = in[4*0]   | in[4*1];
419         t03          = in[4*2]   | t01;
420         t04          = in[4*3]   & t02;
421         out[4*3]   = t03       ^ t04;
422         t06          = in[4*1]   ^ t04;
423         t07          = in[4*3]   ^ out[4*3];
424         t08          =     ~ t07;
425         t09          = t06       | t08;
426         t10          = in[4*1]   ^ in[4*3];
427         t11          = in[4*0]   | in[4*3];
428         out[4*1]   = in[4*0]   ^ t09;
429         t13          = in[4*2]   ^ t06;
430         t14          = in[4*2]   & t11;
431         t15          = in[4*3]   | out[4*1];
432         t16          = t01       | t10;
433         out[4*0]   = t13       ^ t15;
434         out[4*2]   = t14       ^ t16; 
435 }
436
437 typedef void(*sb_fpt)(uint8_t*, const uint8_t*);
438
439 sb_fpt sf_tab[] PROGMEM = {
440         sb0, sb1, sb2, sb3, 
441         sb4, sb5, sb6, sb7
442 };
443
444 sb_fpt sinvf_tab[] PROGMEM = {
445         sb0_inv, sb1_inv, sb2_inv, sb3_inv, 
446         sb4_inv, sb5_inv, sb6_inv, sb7_inv
447 };
448
449 void sbox128(void * w, uint8_t box){
450         uint8_t i, buffer[16];
451         box &= 0x7;
452         
453         sb_fpt fp;
454         fp = (sb_fpt)pgm_read_word(&(sf_tab[box]));
455         for(i=0; i<4; ++i){
456                 fp(buffer+i, (uint8_t*)w+i);
457         }
458         memcpy(w, buffer, 16);
459 }
460
461 void inv_sbox128(void * w, uint8_t box){
462         uint8_t i, buffer[16];
463         box &= 0x7;
464         
465         sb_fpt fp;
466         fp = (sb_fpt)pgm_read_word(&(sinvf_tab[box]));
467         for(i=0; i<4; ++i){
468                 fp(buffer+i, (uint8_t*)w+i);
469         }
470         memcpy(w, buffer, 16);
471 }
472
473
474
475
476
477
478
479