]> git.cryptolib.org Git - avr-crypto-lib.git/blob - serpent/serpent-sboxes-bitslice-asm.S
fixing style, typos and uart
[avr-crypto-lib.git] / serpent / serpent-sboxes-bitslice-asm.S
1 /* serpent-sboxes-bitslice.c */
2 /*
3     This file is part of the AVR-Crypto-Lib.
4     Copyright (C) 2008  Daniel Otte (daniel.otte@rub.de)
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:  daniel.otte@rub.de
23  * license: GPLv3
24  */
25
26 #include "avr-asm-macros.S"
27 IN0  = 22
28 IN1  = 23
29 IN2  = 24
30 IN3  = 25
31 OUT0 = 18
32 OUT1 = 19
33 OUT2 = 20
34 OUT3 = 21
35 T00 =  2
36 T00 =  3
37 T01 =  4
38 T02 =  5
39 T03 =  6
40 T04 =  7
41 T05 =  8
42 T06 =  9
43 T07 = 10
44 T08 = 11
45 T09 = 12
46 T10 = 13
47 T11 = 14
48 T12 = 15
49 T13 = 16
50 T14 = 17
51 T15 = 26
52 T16 = 27
53 T17 =  0
54
55 /* S0:   3  8 15  1 10  6  5 11 14 13  4  2  7  0  9 12 */
56
57 /* depth = 5,7,4,2, Total gates=18 */
58 sb0:
59     mov T00, IN1
60     eor T00, IN2
61     mov T01, IN0
62     or  T01, IN3
63     mov T02, IN0
64     eor T02, IN1
65     mov OUT3, T01
66     eor OUT3, T00
67     mov T04, IN2
68     or  T04, OUT3
69     mov T05, IN0
70     eor T05, IN3
71     mov T06, IN1
72     or  T06, IN2
73     mov T07, IN3
74     and T07, T04
75     mov T08, T02
76     and T08, T06
77     mov OUT2, T08
78     eor OUT2, T07
79     mov T10, T08
80     and T10, OUT2
81     mov T11, IN2
82     eor T11, IN3
83     mov T12, T06
84     eor T12, T10
85     mov T13, IN1
86     and T13, T05
87     mov T14, T05
88     eor T14, T12
89         mov OUT0, T14
90         com OUT0
91         mov T16, OUT0
92     eor T16, T13
93     mov OUT1, T11
94     eor OUT1, T16
95         ret
96
97         
98 /* InvS0:  13  3 11  0 10  6  5 12  1 14  4  7 15  9  8  2 */
99
100 /* depth = 8,4,3,6, Total gates=19 */
101 sb0_inv:
102     mov T00, IN2
103     eor T00, IN3
104     mov T01, IN0
105     or  T01, IN1
106     mov T02, IN1
107     or  T02, IN2
108     mov T03, IN2
109     and T03, T00
110     mov T04, T01
111     eor T04, T00
112     mov T05, IN0
113     or  T05, T03
114         mov OUT2, T04
115         com OUT2
116     mov T07, IN1
117     eor T07, IN3
118     mov T08, T02
119     and T08, T07
120     mov T09, IN3
121     or  T09, OUT2
122     mov OUT1, T08
123     eor OUT1, T05
124     mov T11, IN0
125     or  T11, T04
126     mov T12, OUT1
127     eor T12, T11
128     mov T13, T02
129     eor T13, T09
130     mov T14, IN0
131     eor T14, IN2
132     mov OUT3, T13
133     eor OUT3, T12
134     mov T16, T04
135     and T16, T12
136     mov T17, T13
137     or  T17, T16
138     mov OUT0, T14
139     eor OUT0, T17
140         ret
141
142
143 /* S1:  15 12  2  7  9  0  5 10  1 11 14  8  6 13  3  4 */
144
145 /* depth = 10,7,3,5, Total gates=18 */
146 sb1:
147     mov T00, IN0
148     or  T00, IN3
149     mov T01, IN2
150     eor T01, IN3
151         mov T02, IN1
152         com T02
153     mov T03, IN0
154     eor T03, IN2
155     mov T04, IN0
156     or  T04, T02
157     mov T05, IN3
158     and T05, T03
159     mov T06, T00
160     and T06, T01
161     mov T07, IN1
162     or  T07, T05
163     mov OUT2, T01
164     eor OUT2, T04
165     mov T09, T06
166     eor T09, T07
167     mov T10, T00
168     eor T10, T09
169     mov T11, OUT2
170     eor T11, T10
171     mov T12, IN1
172     and T12, IN3
173         mov OUT3, T09
174         com OUT3
175     mov OUT1, T12
176     eor OUT1, T11
177     mov T15, T09
178     or  T15, OUT1
179     mov T16, T04
180     and T16, T15
181     mov OUT0, IN2
182     eor OUT0, T16
183         ret
184
185
186 /* InvS1:   5  8  2 14 15  6 12  3 11  4  7  9  1 13 10  0 */
187
188 /* depth = 7,4,5,3, Total gates=18 */
189 sb1_inv:
190     mov T00, IN0
191     eor T00, IN1
192     mov T01, IN1
193     or  T01, IN3
194     mov T02, IN0
195     and T02, IN2
196     mov T03, IN2
197     eor T03, T01
198     mov T04, IN0
199     or  T04, T03
200     mov T05, T00
201     and T05, T04
202     mov T06, IN3
203     or  T06, T02
204     mov T07, IN1
205     eor T07, T05
206     mov T08, T06
207     eor T08, T05
208     mov T09, T03
209     or  T09, T02
210     mov T10, IN3
211     and T10, T07
212     mov OUT2, T08
213     com OUT2
214         mov OUT1, T09
215     eor OUT1, T10
216     mov T13, IN0
217     or  T13, OUT2
218     mov T14, T05
219     eor T14, OUT1
220     mov OUT3, T00
221     eor OUT3, T03
222     mov T16, IN2
223     eor T16, T14
224     mov OUT0, T13
225     eor OUT0, T16
226         ret
227
228 /* S2:   8  6  7  9  3 12 10 15 13  1 14  4  0 11  5  2 */
229
230 /* depth = 3,8,11,7, Total gates=16 */
231 sb2:
232     mov T00, IN0
233     or  T00, IN2
234     mov T01, IN0
235     eor T01, IN1
236     mov T02, IN3
237     eor T02, T00
238     mov OUT0, T01
239     eor OUT0, T02
240     mov T04, IN2
241     eor T04, OUT0
242     mov T05, IN1
243     eor T05, T04
244     mov T06, IN1
245     or  T06, T04
246     mov T07, T00
247     and T07, T05
248     mov T08, T02
249     eor T08, T06
250     mov T09, T01
251     or  T09, T08
252     mov OUT1, T09
253     eor OUT1, T07
254     mov T11, IN0
255     or  T11, IN3
256     mov T12, T08
257     eor T12, OUT1
258     mov T13, IN1
259     eor T13, T12
260         mov OUT3, T08
261         com OUT3
262     mov OUT2, T11
263     eor OUT2, T13
264         ret
265
266 /* InvS2:  12  9 15  4 11 14  1  2  0  3  6 13  5  8 10  7 */
267
268 /* depth = 3,6,8,3, Total gates=18 */
269 sb2_inv:
270     mov T00, IN0
271     eor T00, IN3
272     mov T01, IN2
273     eor T01, IN3
274     mov T02, IN0
275     and T02, IN2
276     mov T03, IN1
277     or  T03, T01
278     mov OUT0, T00
279     eor OUT0, T03
280     mov T05, IN0
281     or  T05, IN2
282     mov T06, IN3
283     or  T06, OUT0
284         mov T07, IN3
285         com T07
286     mov T08, IN1
287     and T08, T05
288     mov T09, T07
289     or  T09, T02
290     mov T10, IN1
291     and T10, T06
292     mov T11, T05
293     and T11, T01
294     mov OUT3, T08
295     eor OUT3, T09
296     mov OUT1, T11
297     eor OUT1, T10
298     mov T14, IN2
299     and T14, OUT3
300     mov T15, OUT0
301     eor T15, OUT1
302     mov T16, T09
303     eor T16, T14
304     mov OUT2, T15
305     eor OUT2, T16
306         ret
307
308 /* S3:   0 15 11  8 12  9  6  3 13  1  2  4 10  7  5 14 */
309
310 /* depth = 8,3,5,5, Total gates=18 */
311 sb3:
312     mov T00, IN0
313     eor T00, IN2
314     mov T01, IN0
315     or  T01, IN3
316     mov T02, IN0
317     and T02, IN3
318     mov T03, T00
319     and T03, T01
320     mov T04, IN1
321     or  T04, T02
322     mov T05, IN0
323     and T05, IN1
324     mov T06, IN3
325     eor T06, T03
326     mov T07, IN2
327     or  T07, T05
328     mov T08, IN1
329     eor T08, T06
330     mov T09, IN3
331     and T09, T04
332     mov T10, T01
333     eor T10, T09
334     mov OUT3, T07
335     eor OUT3, T08
336     mov T12, IN3
337     or  T12, OUT3
338     mov T13, IN0
339     or  T13, T06
340     mov T14, IN1
341     and T14, T12
342     mov OUT2, T07
343     eor OUT2, T10
344     mov OUT0, T13
345     eor OUT0, T14
346     mov OUT1, T04
347     eor OUT1, T03
348         ret
349
350 /* InvS3:   0  9 10  7 11 14  6 13  3  5 12  2  4  8 15  1 */
351
352 /* depth = 3,6,4,4, Total gates=17 */
353 sb3_inv:
354     mov T00, IN2
355     or  T00, IN3
356     mov T01, IN0
357     or  T01, IN3
358     mov T02, IN2
359     eor T02, T01
360     mov T03, IN1
361     eor T03, T01
362     mov T04, IN0
363     eor T04, IN3
364     mov T05, T03
365     and T05, T02
366     mov T06, IN1
367     and T06, T00
368     mov OUT2, T04
369     eor OUT2, T05
370     mov T08, IN0
371     eor T08, T02
372     mov OUT0, T06
373     eor OUT0, T02
374     mov T10, OUT0
375     or  T10, T04
376     mov T11, T08
377     and T11, T10
378     mov T12, IN0
379     and T12, OUT2
380     mov T13, T00
381     eor T13, T04
382     mov OUT1, IN1
383     eor OUT1, T11
384     mov T15, IN1
385     or  T15, T12
386     mov OUT3, T13
387     eor OUT3, T15
388         ret
389
390 /* S4:   1 15  8  3 12  0 11  6  2  5  4 10  9 14  7 13 */
391
392 /* depth = 6,7,5,3, Total gates=19 */
393 sb4:
394     mov T00, IN0
395     or  T00, IN1
396     mov T01, IN1
397     or  T01, IN2
398     mov T02, IN0
399     eor T02, T01
400     mov T03, IN1
401     eor T03, IN3
402     mov T04, IN3
403     or  T04, T02
404     mov T05, IN3
405     and T05, T00
406     mov OUT3, T02
407     eor OUT3, T05
408     mov T07, OUT3
409     and T07, T03
410     mov T08, T03
411     and T08, T04
412     mov T09, IN2
413     eor T09, T05
414     mov T10, IN1
415     and T10, IN2
416     mov T11, T03
417     eor T11, T07
418     mov T12, T10
419     or  T12, T02
420     mov T13, T09
421     eor T13, T08
422     mov T14, IN0
423     and T14, T04
424     mov T15, T10
425     or  T15, T11
426     mov OUT2, T12
427     eor OUT2, T07
428     mov OUT1, T14
429     eor OUT1, T15
430         mov OUT0, T13
431         com OUT0
432         ret
433
434 /* InvS4:   5  0  8  3 10  9  7 14  2 12 11  6  4 15 13  1 */
435
436 /* depth = 6,4,7,3, Total gates=17 */
437 sb4_inv:
438     mov T00, IN1
439     or  T00, IN3
440     mov T01, IN2
441     or  T01, IN3
442     mov T02, IN0
443     and T02, T00
444     mov T03, IN1
445     eor T03, T01
446     mov T04, IN2
447     eor T04, IN3
448         mov T05, T02
449         com T05
450     mov T06, IN0
451     and T06, T03
452     mov OUT1, T04
453     eor OUT1, T06
454     mov T08, OUT1
455     or  T08, T05
456     mov T09, IN0
457     eor T09, T06
458     mov T10, T00
459     eor T10, T08
460     mov T11, IN3
461     eor T11, T03
462     mov T12, IN2
463     or  T12, T09
464     mov OUT3, T02
465     eor OUT3, T11
466     mov T14, IN0
467     eor T14, T03
468     mov OUT2, T10
469     eor OUT2, T12
470     mov OUT0, T14
471     eor OUT0, T08
472         ret
473
474 /* S5:  15  5  2 11  4 10  9 12  0  3 14  8 13  6  7  1 */
475
476 /* depth = 4,6,8,6, Total gates=17 */
477 sb5:
478     mov T00, IN1
479     eor T00, IN3
480     mov T01, IN1
481     or  T01, IN3
482     mov T02, IN0
483     and T02, T00
484     mov T03, IN2
485     eor T03, T01
486     mov T04, T02
487     eor T04, T03
488         mov OUT0, T04
489         com OUT0
490     mov T06, IN0
491     eor T06, T00
492     mov T07, IN3
493     or  T07, OUT0
494     mov T08, IN1
495     or  T08, T04
496     mov T09, IN3
497     eor T09, T07
498     mov T10, IN1
499     or  T10, T06
500     mov T11, T02
501     or  T11, OUT0
502     mov T12, T06
503     or  T12, T09
504     mov T13, T00
505     eor T13, T10
506     mov OUT2, T08
507     eor OUT2, T12
508     mov OUT1, T06
509     eor OUT1, T07
510     mov OUT3, T11
511     eor OUT3, T13
512         ret
513
514 /* InvS5:   8 15  2  9  4  1 13 14 11  6  5  3  7 12 10  0 */
515
516 /* depth = 4,6,9,7, Total gates=17 */
517 sb5_inv:
518     mov T00, IN0
519     and T00, IN3
520     mov T01, IN2
521     eor T01, T00
522     mov T02, IN0
523     eor T02, IN3
524     mov T03, IN1
525     and T03, T01
526     mov T04, IN0
527     and T04, IN2
528     mov OUT0, T02
529     eor OUT0, T03
530     mov T06, IN0
531     and T06, OUT0
532     mov T07, T00
533     eor T07, OUT0
534     mov T08, IN1
535     or  T08, T04
536         mov T09, IN1
537         com T09
538     mov OUT1, T07
539     eor OUT1, T08
540     mov T11, T09
541     or  T11, T06
542     mov T12, OUT0
543     or  T12, OUT1
544     mov OUT3, T01
545     eor OUT3, T11
546     mov T14, T01
547     eor T14, T12
548     mov T15, IN1
549     eor T15, IN3
550     mov OUT2, T15
551     eor OUT2, T14
552         ret
553
554 /* S6:   7  2 12  5  8  4  6 11 14  9  1 15 13  3 10  0 */
555
556 /* depth = 8,3,6,3, Total gates=19 */
557 sb6:
558     mov T00, IN0
559     and T00, IN3
560     mov T01, IN1
561     eor T01, IN2
562     mov T02, IN0
563     eor T02, IN3
564     mov T03, T00
565     eor T03, T01
566     mov T04, IN1
567     or  T04, IN2
568         mov OUT1, T03
569         com OUT1
570     mov T06, T02
571     and T06, T04
572     mov T07, IN1
573     and T07, OUT1
574     mov T08, IN0
575     or  T08, IN2
576     mov T09, T06
577     eor T09, T07
578     mov T10, IN1
579     or  T10, IN3
580     mov T11, IN2
581     eor T11, T10
582     mov T12, T08
583     eor T12, T09
584         mov OUT2, T12
585         com OUT2
586     mov T14, OUT1
587     and T14, T02
588     mov OUT3, T11
589     eor OUT3, T06
590     mov T16, IN0
591     eor T16, IN1
592     mov T17, OUT2
593     eor T17, T14
594     mov OUT0, T16
595     eor OUT0, T17
596         ret
597
598 /* InvS6:  15 10  1 13  5  3  6  0  4  9 14  7  2 12  8 11 */
599
600 /* depth = 5,3,8,6, Total gates=19 */
601 sb6_inv:
602     mov T00, IN0
603     eor T00, IN2
604         mov T01, IN2
605         com T01
606     mov T02, IN1
607     and T02, T00
608     mov T03, IN1
609     or  T03, T01
610     mov T04, IN3
611     or  T04, T02
612     mov T05, IN1
613     eor T05, IN3
614     mov T06, IN0
615     and T06, T03
616     mov T07, IN0
617     or  T07, T01
618     mov T08, T06
619     eor T08, T04
620     mov OUT1, T05
621     eor OUT1, T07
622         mov OUT0, T08
623         com OUT0
624     mov T11, IN1
625     and T11, OUT0
626     mov T12, T00
627     and T12, T04
628     mov T13, T00
629     eor T13, T11
630     mov T14, T06
631     eor T14, T12
632     mov T15, IN3
633     or  T15, T01
634     mov T16, IN0
635     eor T16, OUT1
636     mov OUT3, T16
637     eor OUT3, T14
638     mov OUT2, T15
639     eor OUT2, T13
640         ret
641
642 /* S7:   1 13 15  0 14  8  2 11  7  4 12 10  9  3  5  6 */
643
644 /* depth = 10,7,10,4, Total gates=19 */
645 sb7:
646     mov T00, IN0
647     and T00, IN2
648         mov T01, IN3
649         com T01
650     mov T02, IN0
651     and T02, T01
652     mov T03, IN1
653     or  T03, T00
654     mov T04, IN0
655     and T04, IN1
656     mov T05, IN2
657     eor T05, T03
658     mov OUT3, T02
659     eor OUT3, T05
660     mov T07, IN2
661     or  T07, OUT3
662     mov T08, IN3
663     or  T08, T04
664     mov T09, IN0
665     eor T09, T07
666     mov T10, T03
667     and T10, OUT3
668     mov OUT1, T08
669     eor OUT1, T09
670     mov T12, IN1
671     eor T12, OUT1
672     mov T13, T00
673     eor T13, OUT1
674     mov T14, IN2
675     eor T14, T04
676     mov T15, T10
677     or  T15, T12
678     mov T16, T01
679     or  T16, T13
680     mov OUT0, T14
681     eor OUT0, T16
682     mov OUT2, IN0
683     eor OUT2, T15
684         ret
685
686 /* InvS7:   3  0  6 13  9 14 15  8  5 12 11  7 10  1  4  2 */
687
688 /* depth = 9,7,3,3, Total gates=18 */
689 sb7_inv:
690     mov T00, IN0
691     and T00, IN1
692     mov T01, IN0
693     or  T01, IN1
694     mov T02, IN2
695     or  T02, T00
696     mov T03, IN3
697     and T03, T01
698     mov OUT3, T02
699     eor OUT3, T03
700     mov T05, IN1
701     eor T05, T03
702     mov T06, IN3
703     eor T06, OUT3
704     mov T07, T06
705     com T07
706     mov T08, T05
707     or  T08, T07
708     mov T09, IN1
709     eor T09, IN3
710     mov T10, IN0
711     or  T10, IN3
712     mov OUT1, IN0
713     eor OUT1, T08
714     mov T12, IN2
715     eor T12, T05
716     mov T13, IN2
717     and T13, T10
718     mov T14, IN3
719     or  T14, OUT1
720     mov T15, T00
721     or  T15, T09
722     mov OUT0, T12
723     eor OUT0, T14
724     mov OUT2, T13
725     eor OUT2, T15
726         ret
727
728 sf_tab:
729 .word sb0, sb1, sb2, sb3
730 .word sb4, sb5, sb6, sb7
731
732 sinvf_tab:
733 .word sb0_inv, sb1_inv, sb2_inv, sb3_inv
734 .word sb4_inv, sb5_inv, sb6_inv, sb7_inv
735
736 /*
737 .byte pm_lo8(sb0), pm_hi8(sb0)
738 .byte pm_lo8(sb1), pm_hi8(sb1)
739 .byte pm_lo8(sb2), pm_hi8(sb2)
740 .byte pm_lo8(sb3), pm_hi8(sb3)
741 .byte pm_lo8(sb4), pm_hi8(sb4)
742 .byte pm_lo8(sb5), pm_hi8(sb5)
743 .byte pm_lo8(sb6), pm_hi8(sb6)
744 .byte pm_lo8(sb7), pm_hi8(sb7)
745
746
747 sinvf_tab:
748 .byte pm_lo8(sb0_inv), pm_hi8(sb0_inv)
749 .byte pm_lo8(sb1_inv), pm_hi8(sb1_inv)
750 .byte pm_lo8(sb2_inv), pm_hi8(sb2_inv)
751 .byte pm_lo8(sb3_inv), pm_hi8(sb3_inv)
752 .byte pm_lo8(sb4_inv), pm_hi8(sb4_inv)
753 .byte pm_lo8(sb5_inv), pm_hi8(sb5_inv)
754 .byte pm_lo8(sb6_inv), pm_hi8(sb6_inv)
755 .byte pm_lo8(sb7_inv), pm_hi8(sb7_inv)
756 */
757 /*
758 void sbox128(void * w, uint8_t box){
759         uint8_t i, buffer[16];
760         box &= 0x7;
761         
762         sb_fpt fp;
763         fp = (sb_fpt)pgm_read_word(&(sf_tab[box]));
764         for(i=0; i<4; ++i){
765                 fp(buffer+i, (uint8_t*)w+i);
766         }
767         memcpy(w, buffer, 16);
768 }
769 */
770 .global sbox128
771 sbox128:
772         ldi r30, lo8(sf_tab)
773         ldi r31, hi8(sf_tab)
774 1:
775 ;       clr r1
776         andi r22, 0x07
777         lsl r22
778         add r30, r22
779         adc r31, r1
780         lpm r26, Z+
781         lpm r27, Z
782         lsr r27
783         ror r26
784         push r28
785         push r29
786         movw r30, r26
787         movw r28, r24
788         push_range 2, 17
789         ldd IN0, Y+0
790         ldd IN1, Y+4
791         ldd IN2, Y+8
792         ldd IN3, Y+12
793         icall 
794         std Y+0, OUT0
795         std Y+4, OUT1
796         std Y+8, OUT2
797         std Y+12, OUT3
798         ldd IN0, Y+0+1
799         ldd IN1, Y+4+1
800         ldd IN2, Y+8+1
801         ldd IN3, Y+12+1
802         icall
803         std Y+0+1, OUT0
804         std Y+4+1, OUT1
805         std Y+8+1, OUT2
806         std Y+12+1, OUT3
807         ldd IN0, Y+0+2
808         ldd IN1, Y+4+2
809         ldd IN2, Y+8+2
810         ldd IN3, Y+12+2
811         icall
812         std Y+0+2, OUT0
813         std Y+4+2, OUT1
814         std Y+8+2, OUT2
815         std Y+12+2, OUT3
816         ldd IN0, Y+0+3
817         ldd IN1, Y+4+3
818         ldd IN2, Y+8+3
819         ldd IN3, Y+12+3
820         icall
821         std Y+0+3, OUT0
822         std Y+4+3, OUT1
823         std Y+8+3, OUT2
824         std Y+12+3, OUT3
825         pop_range 2, 17
826         pop r29
827         pop r28
828         ret
829         
830 .global inv_sbox128
831 inv_sbox128:
832         ldi r30, lo8(sinvf_tab)
833         ldi r31, hi8(sinvf_tab)
834         rjmp 1b 
835 /*      
836 void inv_sbox128(void * w, uint8_t box){
837         uint8_t i, buffer[16];
838         box &= 0x7;
839         
840         sb_fpt fp;
841         fp = (sb_fpt)pgm_read_word(&(sinvf_tab[box]));
842         for(i=0; i<4; ++i){
843                 fp(buffer+i, (uint8_t*)w+i);
844         }
845         memcpy(w, buffer, 16);
846 }
847 */
848
849
850
851
852
853
854