]> git.cryptolib.org Git - avr-crypto-lib.git/blob - threefish1024_enc_asm.S
threefish encrytion in 512 and 1024 bit in assembler
[avr-crypto-lib.git] / threefish1024_enc_asm.S
1 /* threefish1024_enc_asm.S */
2 /*
3     This file is part of the AVR-Crypto-Lib.
4     Copyright (C) 2009  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 /*
20  * \author  Daniel Otte
21  * \email   daniel.otte@rub.de
22  * \date    2009-03-24
23  * \license GPLv3 or later
24  */ 
25
26 #include "avr-asm-macros.S"
27
28 /******************************************************************************/
29 A0 = 14
30 A1 = 15
31 A2 = 16
32 A3 = 17
33 A4 = 18
34 A5 = 19
35 A6 = 20
36 A7 = 21
37 /*
38 #define THREEFISH_KEY_CONST 0x5555.5555.5555.5555.LL / * 2**64/3 * /
39
40 #define K(s) (((uint64_t*)key)[(s)])
41 #define T(s) (((uint64_t*)tweak)[(s)])
42 void threefish1024_init(const void* key, const void* tweak, threefish512_ctx_t* ctx){
43         memcpy(ctx->k, key, 16*8);
44         memcpy(ctx->t, tweak, 2*8);
45         uint8_t i;
46         ctx->k[16] = THREEFISH_KEY_CONST;
47         for(i=0; i<8; ++i){
48                 ctx->k[16] ^= K(i);
49         }
50         ctx->t[2] = T(0) ^ T(1);
51 }
52 */
53 /*
54  * param key:   r24:r25
55  * param tweak: r22:r23
56  * param ctx:   r20:r21
57  */
58 .global threefish1024_init
59 threefish1024_init:
60         push_range 14, 17
61         movw r30, r20
62         movw r26, r24
63         ldi r24, 16
64         ldi A7, 0x55
65         mov A6, A7
66         movw A4, A6
67         movw A2, A6
68         movw A0, A6
69 1:
70         ld r0, X+
71         st Z+, r0
72         eor A0, r0
73         ld r0, X+
74         st Z+, r0
75         eor A1, r0
76         ld r0, X+
77         st Z+, r0
78         eor A2, r0
79         ld r0, X+
80         st Z+, r0
81         eor A3, r0
82         ld r0, X+
83         st Z+, r0
84         eor A4, r0
85         ld r0, X+
86         st Z+, r0
87         eor A5, r0
88         ld r0, X+
89         st Z+, r0
90         eor A6, r0
91         ld r0, X+
92         st Z+, r0
93         eor A7, r0
94         dec r24
95         brne 1b
96         st Z+, A0
97         st Z+, A1
98         st Z+, A2
99         st Z+, A3
100         st Z+, A4
101         st Z+, A5
102         st Z+, A6
103         st Z+, A7
104         /* now the tweak */
105         movw r26, r22
106         ld A0, X+
107         ld A1, X+
108         ld A2, X+
109         ld A3, X+
110         ld A4, X+
111         ld A5, X+
112         ld A6, X+
113         ld A7, X+
114         st Z+, A0
115         st Z+, A1
116         st Z+, A2
117         st Z+, A3
118         st Z+, A4
119         st Z+, A5
120         st Z+, A6
121         st Z+, A7
122         ld r0, X+
123         eor A0, r0
124         st Z+, r0
125         ld r0, X+
126         eor A1, r0
127         st Z+, r0
128         ld r0, X+
129         eor A2, r0
130         st Z+, r0
131         ld r0, X+
132         eor A3, r0
133         st Z+, r0
134         ld r0, X+
135         eor A4, r0
136         st Z+, r0
137         ld r0, X+
138         eor A5, r0
139         st Z+, r0
140         ld r0, X+
141         eor A6, r0
142         st Z+, r0
143         ld r0, X+
144         eor A7, r0
145         st Z+, r0
146         st Z+, A0
147         st Z+, A1
148         st Z+, A2
149         st Z+, A3
150         st Z+, A4
151         st Z+, A5
152         st Z+, A6
153         st Z+, A7
154         pop_range 14, 17
155         ret
156         
157 /******************************************************************************/
158 /*
159 #define X(a) (((uint64_t*)data)[(a)])
160 void permute_16(void* data){
161         uint64_t t;
162         t = X(1);
163         X(1) = X(9);
164         X(9) = X(7);
165         X(7) = X(15);
166         X(15) = t;
167         t = X(3);
168         X(3) = X(13);
169         X(13) = X(5);
170         X(5) = X(11);
171         X(11) = t;
172         t = X(4);
173         X(4) = X(6);
174         X(6) = t;
175         t = X(8);
176         X(8) = X(10);
177         X(10) = X(12);
178         X(12) = X(14);
179         X(14) = t;
180 }
181 void add_key_16(void* data, const threefish1024_ctx_t* ctx, uint8_t s){
182         uint8_t i;
183         for(i=0; i<13; ++i){
184                 X(i) += ctx->k[(s+i)%17];
185         }
186         X(13) += ctx->k[(s+13)%17] + ctx->t[s%3];
187         X(14) += ctx->k[(s+14)%17] + ctx->t[(s+1)%3];
188         X(15) += ctx->k[(s+15)%17] + s;
189 }
190 void threefish1024_enc(void* data, const threefish1024_ctx_t* ctx){
191         uint8_t i=0,s=0;
192         uint8_t r0[8] = {55, 25, 33, 34, 28, 17, 58, 47};
193         uint8_t r1[8] = {43, 25,  8, 43,  7,  6,  7, 49};
194         uint8_t r2[8] = {37, 46, 18, 25, 47, 18, 32, 27};
195         uint8_t r3[8] = {40, 13, 57, 60, 48, 25, 45, 58};
196         uint8_t r4[8] = {16, 14, 21, 44, 51, 43, 19, 37};
197         uint8_t r5[8] = {22, 13, 12,  9,  9, 42, 18, 48};
198         uint8_t r6[8] = {38, 52, 32, 59, 35, 40,  2, 53};
199         uint8_t r7[8] = {12, 57, 54, 34, 41, 15, 56, 56};       
200         do{
201                 if(i%4==0){
202                         add_key_16(data, ctx, s);
203                         ++s;
204                 }
205                 threefish_mix((uint8_t*)data +  0, r0[i%8]);
206                 threefish_mix((uint8_t*)data + 16, r1[i%8]);
207                 threefish_mix((uint8_t*)data + 32, r2[i%8]);
208                 threefish_mix((uint8_t*)data + 48, r3[i%8]);
209                 threefish_mix((uint8_t*)data + 64, r4[i%8]);
210                 threefish_mix((uint8_t*)data + 80, r5[i%8]);
211                 threefish_mix((uint8_t*)data + 96, r6[i%8]);
212                 threefish_mix((uint8_t*)data +112, r7[i%8]);
213                 permute_16(data);
214                 ++i;
215         }while(i!=80);
216         add_key_16(data, ctx, s);
217 }
218 */
219 I     =  2
220 S     =  3
221 DATA0 =  4
222 DATA1 =  5
223 CTX0  =  6
224 CTX1  =  7
225 IDX0  =  8
226 IDX1  =  9
227 IDX2  = 10
228 IDX3  = 11
229 IDX4  = 12
230 IDX5  = 13
231 IDX6  = 14
232 IDX7  = 15
233
234 /*
235  * param data:  r24:r25
236  * param ctx:   r22:r23
237  */
238 .global threefish1024_enc
239 threefish1024_enc:
240         push r28
241         push r29
242         push_range 2, 17
243         movw DATA0, r24
244         movw CTX0, r22
245         clr I
246         clr S
247 1:      
248         mov r30,  I
249         andi r30, 0x03
250         breq 2f
251         rjmp 4f
252 2:
253         ldi r30, lo8(threefish1024_slut17)
254         ldi r31, hi8(threefish1024_slut17)
255         add r30, S
256         adc r31, r1
257         lpm IDX0, Z+
258         lpm IDX1, Z+
259         lpm IDX2, Z+
260         lpm IDX3, Z+
261         lpm IDX4, Z+
262         lpm IDX5, Z+
263         lpm IDX6, Z+
264         lpm IDX7, Z
265         movw r30, CTX0
266         movw r26, DATA0
267         add r30, IDX0
268         adc r31, r1
269         rcall add_z_to_x8
270         movw r30, CTX0
271         add r30, IDX1
272         adc r31, r1
273         rcall add_z_to_x8
274         movw r30, CTX0
275         add r30, IDX2
276         adc r31, r1
277         rcall add_z_to_x8
278         movw r30, CTX0
279         add r30, IDX3
280         adc r31, r1
281         rcall add_z_to_x8
282         movw r30, CTX0
283         add r30, IDX4
284         adc r31, r1
285         rcall add_z_to_x8
286         movw r30, CTX0
287         add r30, IDX5
288         adc r31, r1
289         rcall add_z_to_x8
290         movw r30, CTX0
291         add r30, IDX6
292         adc r31, r1
293         rcall add_z_to_x8
294         movw r30, CTX0
295         add r30, IDX7
296         adc r31, r1
297         rcall add_z_to_x8
298         /* second half */
299         ldi r30, lo8(threefish1024_slut17)
300         ldi r31, hi8(threefish1024_slut17)
301         add r30, S
302         adc r31, r1
303         adiw r30, 8
304         lpm IDX0, Z+
305         lpm IDX1, Z+
306         lpm IDX2, Z+
307         lpm IDX3, Z+
308         lpm IDX4, Z+
309         lpm IDX5, Z+
310         lpm IDX6, Z+
311         lpm IDX7, Z
312         movw r30, CTX0
313         add r30, IDX0
314         adc r31, r1
315         rcall add_z_to_x8
316         movw r30, CTX0
317         add r30, IDX1
318         adc r31, r1
319         rcall add_z_to_x8
320         movw r30, CTX0
321         add r30, IDX2
322         adc r31, r1
323         rcall add_z_to_x8
324         movw r30, CTX0
325         add r30, IDX3
326         adc r31, r1
327         rcall add_z_to_x8
328         movw r30, CTX0
329         add r30, IDX4
330         adc r31, r1
331         rcall add_z_to_x8
332         movw r30, CTX0
333         add r30, IDX5
334         adc r31, r1
335         rcall add_z_to_x8
336         movw r30, CTX0
337         add r30, IDX6
338         adc r31, r1
339         rcall add_z_to_x8
340         movw r30, CTX0
341         add r30, IDX7
342         adc r31, r1
343         rcall add_z_to_x8
344         /* now the remaining key */
345         sbiw r26, 3*8
346         ldi r30, lo8(threefish1024_slut3)
347         ldi r31, hi8(threefish1024_slut3)
348         add r30, S
349         adc r31, r1
350         lpm IDX0, Z+
351         lpm IDX1, Z
352         movw r30, CTX0
353         adiw r30, 7*8 /* make Z pointing to (extended tweak) */
354         adiw r30, 7*8
355         adiw r30, 3*8
356         movw IDX2, r30
357         add r30, IDX0
358         adc r31, r1
359         rcall add_z_to_x8
360         movw r30, IDX2
361         add r30, IDX1
362         adc r31, r1
363         rcall add_z_to_x8
364         ld r0, X
365         add r0, S
366         st X+, r0
367         ld r0, X
368         adc r0, r1
369         st X+, r0
370         ld r0, X
371         adc r0, r1
372         st X+, r0
373         ld r0, X
374         adc r0, r1
375         st X+, r0
376         ld r0, X
377         adc r0, r1
378         st X+, r0
379         ld r0, X
380         adc r0, r1
381         st X+, r0
382         ld r0, X
383         adc r0, r1
384         st X+, r0
385         ld r0, X
386         adc r0, r1
387         st X+, r0
388         inc S
389         mov r26, S
390         cpi r26, 21
391         brmi 4f
392 exit:
393         pop_range 2, 17
394         pop r29
395         pop r28
396         ret     
397 4:      
398         /* call mix */
399         ldi r30, lo8(threefish1024_rc0)
400         ldi r31, hi8(threefish1024_rc0)
401         mov r26, I
402         andi r26, 0x07
403         add r30, r26
404         adc r31, r1
405         lpm r22, Z
406         adiw r30, 8
407         lpm IDX0, Z
408         adiw r30, 8
409         lpm IDX1, Z
410         adiw r30, 8
411         lpm IDX2, Z
412         adiw r30, 8
413         lpm IDX3, Z
414         adiw r30, 8
415         lpm IDX4, Z
416         adiw r30, 8
417         lpm IDX5, Z
418         adiw r30, 8
419         lpm IDX6, Z
420         push IDX6
421         push IDX5
422         push IDX4
423         push IDX3
424         push IDX2
425         
426         movw r24, DATA0
427         call threefish_mix_asm /* no rcall? */
428         movw r24, DATA0
429         adiw r24, 16
430         mov r22, IDX0
431         call threefish_mix_asm /* no rcall? */
432         movw r24, DATA0
433         adiw r24, 32
434         mov r22, IDX1
435         call threefish_mix_asm /* no rcall? */
436         movw r24, DATA0
437         adiw r24, 48
438         pop r22
439         call threefish_mix_asm /* no rcall? */
440         movw r24, DATA0
441         adiw r24, 63
442         adiw r24,  1
443         pop r22
444         call threefish_mix_asm /* no rcall? */
445         movw r24, DATA0
446         adiw r24, 63
447         adiw r24, 17
448         pop r22
449         call threefish_mix_asm /* no rcall? */
450         movw r24, DATA0
451         adiw r24, 63
452         adiw r24, 33
453         pop r22
454         call threefish_mix_asm /* no rcall? */
455         movw r24, DATA0
456         adiw r24, 63
457         adiw r24, 49
458         pop r22
459         call threefish_mix_asm /* no rcall? */
460         /* now the permutation */
461         movw r26, DATA0  /* X1 <-> X15 */
462         adiw r26, 1*8
463         movw r30, DATA0
464         adiw r30, 7*8+4
465         adiw r30, 7*8+4
466         rcall xchg_zx8
467         movw r26, DATA0  /* X1 <-> X9 */
468         adiw r26, 1*8
469         movw r30, DATA0
470         adiw r30, 7*8
471         adiw r30, 2*8
472         rcall xchg_zx8
473         movw r26, DATA0  /* X9 <-> X7 */
474         adiw r26, 7*8
475         adiw r26, 2*8
476         movw r30, DATA0
477         adiw r30, 7*8
478         rcall xchg_zx8
479         /* --- */       
480         movw r26, DATA0  /* X3 <-> X11 */
481         adiw r26, 3*8
482         movw r30, DATA0
483         adiw r30, 7*8
484         adiw r30, 4*8
485         rcall xchg_zx8
486         movw r26, DATA0  /* X3 <-> X13 */
487         adiw r26, 3*8
488         movw r30, DATA0
489         adiw r30, 7*8
490         adiw r30, 6*8
491         rcall xchg_zx8
492         movw r26, DATA0  /* X13 <-> X5 */
493         adiw r26, 7*8
494         adiw r26, 6*8
495         movw r30, DATA0
496         adiw r30, 5*8
497         rcall xchg_zx8
498         /* --- */
499         movw r26, DATA0  /* X8 <-> X14 */
500         adiw r26, 7*8
501         adiw r26, 1*8
502         movw r30, DATA0
503         adiw r30, 7*8
504         adiw r30, 7*8
505         rcall xchg_zx8
506         movw r26, DATA0  /* X8 <-> X10 */
507         adiw r26, 7*8
508         adiw r26, 1*8
509         movw r30, DATA0
510         adiw r30, 7*8
511         adiw r30, 3*8
512         rcall xchg_zx8
513         movw r26, DATA0  /* X10 <-> X12 */
514         adiw r26, 7*8
515         adiw r26, 3*8
516         movw r30, DATA0
517         adiw r30, 7*8
518         adiw r30, 5*8
519         rcall xchg_zx8
520         /* --- */
521         movw r26, DATA0  /* X4 <-> X6 */
522         adiw r26, 4*8
523         movw r30, DATA0
524         adiw r30, 6*8
525         rcall xchg_zx8
526                 
527         inc I
528 ;       mov r26, I
529 ;       cpi r26, 5
530 ;       brne 9f
531 ;       rjmp exit
532 9:
533         rjmp 1b
534         
535 threefish1024_slut17:   
536         .byte 0x00, 0x08, 0x10, 0x18, 0x20, 0x28, 0x30, 0x38
537         .byte 0x40, 0x48, 0x50, 0x58, 0x60, 0x68, 0x70, 0x78
538         .byte 0x80, 0x00, 0x08, 0x10, 0x18, 0x20, 0x28, 0x30
539         .byte 0x38, 0x40, 0x48, 0x50, 0x58, 0x60, 0x68, 0x70
540         .byte 0x78, 0x80, 0x00, 0x08, 0x10
541 threefish1024_slut3:
542     .byte 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08
543         .byte 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00
544         .byte 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10
545         .byte 0x00
546 threefish1024_rc0: .byte 0x79, 0x31, 0x41, 0x42, 0x34, 0x21, 0x72, 0x69 
547 threefish1024_rc1: .byte 0x53, 0x31, 0x10, 0x53, 0x19, 0x1a, 0x19, 0x61 
548 threefish1024_rc2: .byte 0x5b, 0x6a, 0x22, 0x31, 0x69, 0x22, 0x40, 0x33 
549 threefish1024_rc3: .byte 0x50, 0x2b, 0x71, 0x74, 0x60, 0x31, 0x6b, 0x72 
550 threefish1024_rc4: .byte 0x20, 0x2a, 0x3b, 0x54, 0x63, 0x53, 0x23, 0x5b 
551 threefish1024_rc5: .byte 0x3a, 0x2b, 0x14, 0x11, 0x11, 0x52, 0x22, 0x60 
552 threefish1024_rc6: .byte 0x5a, 0x64, 0x40, 0x73, 0x43, 0x50, 0x02, 0x7b 
553 threefish1024_rc7: .byte 0x14, 0x71, 0x7a, 0x42, 0x51, 0x29, 0x70, 0x70 
554
555 add_z_to_x8:
556         ld r0, Z+
557         ld r1, X
558         add r1, r0
559         st X+, r1
560         ld r0, Z+
561         ld r1, X
562         adc r1, r0
563         st X+, r1
564         ld r0, Z+
565         ld r1, X
566         adc r1, r0
567         st X+, r1
568         ld r0, Z+
569         ld r1, X
570         adc r1, r0
571         st X+, r1
572         ld r0, Z+
573         ld r1, X
574         adc r1, r0
575         st X+, r1
576         ld r0, Z+
577         ld r1, X
578         adc r1, r0
579         st X+, r1
580         ld r0, Z+
581         ld r1, X
582         adc r1, r0
583         st X+, r1
584         ld r0, Z+
585         ld r1, X
586         adc r1, r0
587         st X+, r1
588         clr r1
589         ret
590         
591 T0 = IDX0
592 T1 = 0
593 CNT = 24        
594 xchg_zx8:
595         ldi CNT, 8
596 1:      ld T0, X
597         ld T1, Z
598         st X+, T1
599         st Z+, T0       
600         dec CNT
601         brne 1b
602         ret
603
604
605