]> git.cryptolib.org Git - avr-crypto-lib.git/blob - threefish1024_dec_asm.S
a733094e8bfff899cebf091c6670d5c360b8a5cb
[avr-crypto-lib.git] / threefish1024_dec_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 /*
30 void permute_inv16(void *data){
31         uint64_t t;
32         t = X(15);
33         X(15) = X(7);
34         X(7) = X(9);
35         X(9) = X(1);
36         X(1) = t;
37         t = X(11);
38         X(11) = X(5);
39         X(5) = X(13);
40         X(13) = X(3);
41         X(3) = t;
42         t = X(4);
43         X(4) = X(6);
44         X(6) = t;
45         t = X(14);
46         X(14) = X(12);
47         X(12) = X(10);
48         X(10) = X(8);
49         X(8) = t;
50 }
51 void add_key_16(void *data, const threefish1024_ctx_t *ctx, uint8_t s){
52         uint8_t i;
53         for(i=0; i<13; ++i){
54                 X(i) -= ctx->k[(s+i)%17];
55         }
56         X(13) -= ctx->k[(s+13)%17] + ctx->t[s%3];
57         X(14) -= ctx->k[(s+14)%17] + ctx->t[(s+1)%3];
58         X(15) -= ctx->k[(s+15)%17] + s;
59 }
60 void threefish1024_dec(void *data, const threefish1024_ctx_t *ctx){
61         uint8_t i=0,s=20;
62         uint8_t r0[8] = {0x69, 0x72, 0x21, 0x34, 0x42, 0x41, 0x31, 0x79};
63         uint8_t r1[8] = {0x61, 0x19, 0x1a, 0x19, 0x53, 0x10, 0x31, 0x53};
64         uint8_t r2[8] = {0x33, 0x40, 0x22, 0x69, 0x31, 0x22, 0x6a, 0x5b};
65         uint8_t r3[8] = {0x72, 0x6b, 0x31, 0x60, 0x74, 0x71, 0x2b, 0x50};
66         uint8_t r4[8] = {0x5b, 0x23, 0x53, 0x63, 0x54, 0x3b, 0x2a, 0x20};
67         uint8_t r5[8] = {0x60, 0x22, 0x52, 0x11, 0x11, 0x14, 0x2b, 0x3a};
68         uint8_t r6[8] = {0x7b, 0x02, 0x50, 0x43, 0x73, 0x40, 0x64, 0x5a};
69         uint8_t r7[8] = {0x70, 0x70, 0x29, 0x51, 0x42, 0x7a, 0x71, 0x14};
70
71         do{
72                 if(i%4==0){
73                         add_key_16(data, ctx, s);
74                         --s;
75                 }
76                 permute_inv16(data);
77                 threefish_invmix((uint8_t*)data +  0, r0[i%8]);
78                 threefish_invmix((uint8_t*)data + 16, r1[i%8]);
79                 threefish_invmix((uint8_t*)data + 32, r2[i%8]);
80                 threefish_invmix((uint8_t*)data + 48, r3[i%8]);
81                 threefish_invmix((uint8_t*)data + 64, r4[i%8]);
82                 threefish_invmix((uint8_t*)data + 80, r5[i%8]);
83                 threefish_invmix((uint8_t*)data + 96, r6[i%8]);
84                 threefish_invmix((uint8_t*)data +112, r7[i%8]);
85                 ++i;
86         }while(i!=80);
87         add_key_16(data, ctx, s);
88 }
89 */
90 I     =  2
91 S     =  3
92 DATA0 =  4
93 DATA1 =  5
94 CTX0  =  6
95 CTX1  =  7
96 IDX0  =  8
97 IDX1  =  9
98 IDX2  = 10
99 IDX3  = 11
100 IDX4  = 12
101 IDX5  = 13
102 IDX6  = 14
103 IDX7  = 15
104
105 /*
106  * param data:  r24:r25
107  * param ctx:   r22:r23
108  */
109 .global threefish1024_dec
110 threefish1024_dec:
111         push r28
112         push r29
113         push_range 2, 17
114         movw DATA0, r24
115         movw CTX0, r22
116         clr I
117         ldi r26, 20
118         mov S, r26
119 1:
120         mov r30,  I
121         andi r30, 0x03
122         breq 2f
123         rjmp 4f
124 2:
125         ldi r30, lo8(threefish1024_slut17)
126         ldi r31, hi8(threefish1024_slut17)
127         add r30, S
128         adc r31, r1
129         lpm IDX0, Z+
130         lpm IDX1, Z+
131         lpm IDX2, Z+
132         lpm IDX3, Z+
133         lpm IDX4, Z+
134         lpm IDX5, Z+
135         lpm IDX6, Z+
136         lpm IDX7, Z
137         movw r30, CTX0
138         movw r26, DATA0
139         add r30, IDX0
140         adc r31, r1
141         rcall sub_z_from_x8
142         movw r30, CTX0
143         add r30, IDX1
144         adc r31, r1
145         rcall sub_z_from_x8
146         movw r30, CTX0
147         add r30, IDX2
148         adc r31, r1
149         rcall sub_z_from_x8
150         movw r30, CTX0
151         add r30, IDX3
152         adc r31, r1
153         rcall sub_z_from_x8
154         movw r30, CTX0
155         add r30, IDX4
156         adc r31, r1
157         rcall sub_z_from_x8
158         movw r30, CTX0
159         add r30, IDX5
160         adc r31, r1
161         rcall sub_z_from_x8
162         movw r30, CTX0
163         add r30, IDX6
164         adc r31, r1
165         rcall sub_z_from_x8
166         movw r30, CTX0
167         add r30, IDX7
168         adc r31, r1
169         rcall sub_z_from_x8
170         /* second half */
171         ldi r30, lo8(threefish1024_slut17)
172         ldi r31, hi8(threefish1024_slut17)
173         add r30, S
174         adc r31, r1
175         adiw r30, 8
176         lpm IDX0, Z+
177         lpm IDX1, Z+
178         lpm IDX2, Z+
179         lpm IDX3, Z+
180         lpm IDX4, Z+
181         lpm IDX5, Z+
182         lpm IDX6, Z+
183         lpm IDX7, Z
184         movw r30, CTX0
185         add r30, IDX0
186         adc r31, r1
187         rcall sub_z_from_x8
188         movw r30, CTX0
189         add r30, IDX1
190         adc r31, r1
191         rcall sub_z_from_x8
192         movw r30, CTX0
193         add r30, IDX2
194         adc r31, r1
195         rcall sub_z_from_x8
196         movw r30, CTX0
197         add r30, IDX3
198         adc r31, r1
199         rcall sub_z_from_x8
200         movw r30, CTX0
201         add r30, IDX4
202         adc r31, r1
203         rcall sub_z_from_x8
204         movw r30, CTX0
205         add r30, IDX5
206         adc r31, r1
207         rcall sub_z_from_x8
208         movw r30, CTX0
209         add r30, IDX6
210         adc r31, r1
211         rcall sub_z_from_x8
212         movw r30, CTX0
213         add r30, IDX7
214         adc r31, r1
215         rcall sub_z_from_x8
216         /* now the remaining key */
217         sbiw r26, 3*8
218         ldi r30, lo8(threefish1024_slut3)
219         ldi r31, hi8(threefish1024_slut3)
220         add r30, S
221         adc r31, r1
222         lpm IDX0, Z+
223         lpm IDX1, Z
224         movw r30, CTX0
225         adiw r30, 7*8 /* make Z pointing to (extended tweak) */
226         adiw r30, 7*8
227         adiw r30, 3*8
228         movw IDX2, r30
229         add r30, IDX0
230         adc r31, r1
231         rcall sub_z_from_x8
232         movw r30, IDX2
233         add r30, IDX1
234         adc r31, r1
235         rcall sub_z_from_x8
236         ld r0, X
237         sub r0, S
238         st X+, r0
239         ld r0, X
240         sbc r0, r1
241         st X+, r0
242         ld r0, X
243         sbc r0, r1
244         st X+, r0
245         ld r0, X
246         sbc r0, r1
247         st X+, r0
248         ld r0, X
249         sbc r0, r1
250         st X+, r0
251         ld r0, X
252         sbc r0, r1
253         st X+, r0
254         ld r0, X
255         sbc r0, r1
256         st X+, r0
257         ld r0, X
258         sbc r0, r1
259         st X+, r0
260         tst S
261         brne 3f
262 exit:
263         pop_range 2, 17
264         pop r29
265         pop r28
266         ret
267 3:
268         dec S
269 4:
270         /* now the permutation */
271         movw r26, DATA0  /* X1 <-> X15 */
272         adiw r26, 1*8
273         movw r30, DATA0
274         adiw r30, 7*8+4
275         adiw r30, 7*8+4
276         rcall xchg_zx8
277         movw r26, DATA0  /* X15 <-> X7 */
278         adiw r26, 7*8+4
279         adiw r26, 7*8+4
280         movw r30, DATA0
281         adiw r30, 7*8
282         rcall xchg_zx8
283         movw r26, DATA0  /* X9 <-> X7 */
284         adiw r26, 7*8
285         adiw r26, 2*8
286         movw r30, DATA0
287         adiw r30, 7*8
288         rcall xchg_zx8
289         /* --- */
290         movw r26, DATA0  /* X3 <-> X11 */
291         adiw r26, 3*8
292         movw r30, DATA0
293         adiw r30, 7*8
294         adiw r30, 4*8
295         rcall xchg_zx8
296         movw r26, DATA0  /* X11 <-> X5 */
297         adiw r26, 7*8
298         adiw r26, 4*8
299         movw r30, DATA0
300         adiw r30, 5*8
301         rcall xchg_zx8
302         movw r26, DATA0  /* X13 <-> X5 */
303         adiw r26, 7*8
304         adiw r26, 6*8
305         movw r30, DATA0
306         adiw r30, 5*8
307         rcall xchg_zx8
308         /* --- */
309         movw r26, DATA0  /* X8 <-> X14 */
310         adiw r26, 7*8
311         adiw r26, 1*8
312         movw r30, DATA0
313         adiw r30, 7*8
314         adiw r30, 7*8
315         rcall xchg_zx8
316         movw r26, DATA0  /* X14 <-> X12 */
317         adiw r26, 7*8
318         adiw r26, 7*8
319         movw r30, DATA0
320         adiw r30, 7*8
321         adiw r30, 5*8
322         rcall xchg_zx8
323         movw r26, DATA0  /* X10 <-> X12 */
324         adiw r26, 7*8
325         adiw r26, 3*8
326         movw r30, DATA0
327         adiw r30, 7*8
328         adiw r30, 5*8
329         rcall xchg_zx8
330         /* --- */
331         movw r26, DATA0  /* X4 <-> X6 */
332         adiw r26, 4*8
333         movw r30, DATA0
334         adiw r30, 6*8
335         rcall xchg_zx8
336
337         /* call mix */
338         ldi r30, lo8(threefish1024_rc0)
339         ldi r31, hi8(threefish1024_rc0)
340         mov r26, I
341         andi r26, 0x07
342         add r30, r26
343         adc r31, r1
344         lpm r22, Z
345         adiw r30, 8
346         lpm IDX0, Z
347         adiw r30, 8
348         lpm IDX1, Z
349         adiw r30, 8
350         lpm IDX2, Z
351         adiw r30, 8
352         lpm IDX3, Z
353         adiw r30, 8
354         lpm IDX4, Z
355         adiw r30, 8
356         lpm IDX5, Z
357         adiw r30, 8
358         lpm IDX6, Z
359         push IDX6
360         push IDX5
361         push IDX4
362         push IDX3
363         push IDX2
364
365         movw r24, DATA0
366         call threefish_invmix_asm /* no rcall? */
367         movw r24, DATA0
368         adiw r24, 16
369         mov r22, IDX0
370         call threefish_invmix_asm /* no rcall? */
371         movw r24, DATA0
372         adiw r24, 32
373         mov r22, IDX1
374         call threefish_invmix_asm /* no rcall? */
375         movw r24, DATA0
376         adiw r24, 48
377         pop r22
378         call threefish_invmix_asm /* no rcall? */
379         movw r24, DATA0
380         adiw r24, 63
381         adiw r24,  1
382         pop r22
383         call threefish_invmix_asm /* no rcall? */
384         movw r24, DATA0
385         adiw r24, 63
386         adiw r24, 17
387         pop r22
388         call threefish_invmix_asm /* no rcall? */
389         movw r24, DATA0
390         adiw r24, 63
391         adiw r24, 33
392         pop r22
393         call threefish_invmix_asm /* no rcall? */
394         movw r24, DATA0
395         adiw r24, 63
396         adiw r24, 49
397         pop r22
398         call threefish_invmix_asm /* no rcall? */
399         inc I
400 9:
401         rjmp 1b
402
403 threefish1024_slut17:
404         .byte 0x00, 0x08, 0x10, 0x18, 0x20, 0x28, 0x30, 0x38
405         .byte 0x40, 0x48, 0x50, 0x58, 0x60, 0x68, 0x70, 0x78
406         .byte 0x80, 0x00, 0x08, 0x10, 0x18, 0x20, 0x28, 0x30
407         .byte 0x38, 0x40, 0x48, 0x50, 0x58, 0x60, 0x68, 0x70
408         .byte 0x78, 0x80, 0x00, 0x08, 0x10
409 threefish1024_slut3:
410     .byte 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08
411         .byte 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00
412         .byte 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10
413         .byte 0x00
414
415 /* old round constants
416 threefish1024_rc0: .byte 0x69, 0x72, 0x21, 0x34, 0x42, 0x41, 0x31, 0x79
417 threefish1024_rc1: .byte 0x61, 0x19, 0x1a, 0x19, 0x53, 0x10, 0x31, 0x53
418 threefish1024_rc2: .byte 0x33, 0x40, 0x22, 0x69, 0x31, 0x22, 0x6a, 0x5b
419 threefish1024_rc3: .byte 0x72, 0x6b, 0x31, 0x60, 0x74, 0x71, 0x2b, 0x50
420 threefish1024_rc4: .byte 0x5b, 0x23, 0x53, 0x63, 0x54, 0x3b, 0x2a, 0x20
421 threefish1024_rc5: .byte 0x60, 0x22, 0x52, 0x11, 0x11, 0x14, 0x2b, 0x3a
422 threefish1024_rc6: .byte 0x7b, 0x02, 0x50, 0x43, 0x73, 0x40, 0x64, 0x5a
423 threefish1024_rc7: .byte 0x70, 0x70, 0x29, 0x51, 0x42, 0x7a, 0x71, 0x14
424 */
425 threefish1024_rc0:  .byte 0x11, 0x49, 0x20, 0x51, 0x1b, 0x41, 0x5a, 0x30
426 threefish1024_rc1:  .byte 0x60, 0x54, 0x42, 0x11, 0x24, 0x04, 0x23, 0x2b
427 threefish1024_rc2:  .byte 0x43, 0x69, 0x70, 0x5b, 0x60, 0x63, 0x12, 0x10
428 threefish1024_rc3:  .byte 0x64, 0x6a, 0x63, 0x49, 0x51, 0x2b, 0x79, 0x69
429 threefish1024_rc4:  .byte 0x39, 0x23, 0x04, 0x14, 0x69, 0x42, 0x61, 0x10
430 threefish1024_rc5:  .byte 0x49, 0x52, 0x7b, 0x69, 0x34, 0x51, 0x22, 0x21
431 threefish1024_rc6:  .byte 0x5b, 0x54, 0x52, 0x54, 0x20, 0x73, 0x39, 0x3a
432 threefish1024_rc7:  .byte 0x24, 0x31, 0x51, 0x4a, 0x31, 0x21, 0x64, 0x5b
433
434 sub_z_from_x8:
435         ld r0, Z+
436         ld r1, X
437         sub r1, r0
438         st X+, r1
439         ld r0, Z+
440         ld r1, X
441         sbc r1, r0
442         st X+, r1
443         ld r0, Z+
444         ld r1, X
445         sbc r1, r0
446         st X+, r1
447         ld r0, Z+
448         ld r1, X
449         sbc r1, r0
450         st X+, r1
451         ld r0, Z+
452         ld r1, X
453         sbc r1, r0
454         st X+, r1
455         ld r0, Z+
456         ld r1, X
457         sbc r1, r0
458         st X+, r1
459         ld r0, Z+
460         ld r1, X
461         sbc r1, r0
462         st X+, r1
463         ld r0, Z+
464         ld r1, X
465         sbc r1, r0
466         st X+, r1
467         clr r1
468         ret
469
470 T0 = IDX0
471 T1 = 0
472 CNT = 24
473 xchg_zx8:
474         ldi CNT, 8
475 1:      ld T0, X
476         ld T1, Z
477         st X+, T1
478         st Z+, T0
479         dec CNT
480         brne 1b
481         ret
482
483
484