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