]> git.cryptolib.org Git - avr-crypto-lib.git/blob - threefish512_enc_asm.S
big bug fixed, still some problems with flow control
[avr-crypto-lib.git] / threefish512_enc_asm.S
1 /* threefish512_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 threefish512_init(const void* key, const void* tweak, threefish512_ctx_t* ctx){
43         memcpy(ctx->k, key, 8*8);
44         memcpy(ctx->t, tweak, 2*8);
45         uint8_t i;
46         ctx->k[8] = THREEFISH_KEY_CONST;
47         for(i=0; i<8; ++i){
48                 ctx->k[8] ^= 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 threefish512_init
59 threefish512_init:
60         push_range 14, 17
61         movw r30, r20
62         movw r26, r24
63         ldi r24, 8
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_8(void* data){
173         uint64_t t;
174         t = X(0);
175         X(0) = X(2);
176         X(2) = X(4);
177         X(4) = X(6);
178         X(6) = t;
179         t = X(3);
180         X(3) = X(7);
181         X(7) = t;
182 }
183 void add_key_8(void* data, const threefish512_ctx_t* ctx, uint8_t s){
184         uint8_t i;
185         for(i=0; i<5; ++i){
186                 X(i) += ctx->k[(s+i)%9];
187         }
188         X(5) += ctx->k[(s+5)%9] + ctx->t[s%3];
189         X(6) += ctx->k[(s+6)%9] + ctx->t[(s+1)%3];
190         X(7) += ctx->k[(s+7)%9] + s;
191 }
192 void threefish512_enc(void* data, const threefish512_ctx_t* ctx){
193         uint8_t i=0,s=0;
194         uint8_t r0[8] = {38, 48, 34, 26, 33, 39, 29, 33}; 
195         uint8_t r1[8] = {30, 20, 14, 12, 49, 27, 26, 51};
196         uint8_t r2[8] = {50, 43, 15, 58,  8, 41, 11, 39};
197         uint8_t r3[8] = {53, 31, 27,  7, 42, 14,  9, 35};
198         do{
199                 if(i%4==0){
200                         add_key_8(data, ctx, s);
201                         ++s;
202                 }
203                 threefish_mix((uint8_t*)data +  0, r0[i%8]);
204                 threefish_mix((uint8_t*)data + 16, r1[i%8]);
205                 threefish_mix((uint8_t*)data + 32, r2[i%8]);
206                 threefish_mix((uint8_t*)data + 48, r3[i%8]);
207                 permute_8(data);
208                 ++i;
209         }while(i!=72);
210         add_key_8(data, ctx, s);
211 }
212
213 */
214 I     =  2
215 S     =  3
216 DATA0 =  4
217 DATA1 =  5
218 CTX0  =  6
219 CTX1  =  7
220 IDX0  =  8
221 IDX1  =  9
222 IDX2  = 10
223 IDX3  = 11
224 IDX4  = 12
225 IDX5  = 13
226 IDX6  = 14
227 IDX7  = 15
228 /*
229  * param data:  r24:r25
230  * param ctx:   r22:r23
231  */
232 .global threefish512_enc
233 threefish512_enc:
234         push r28
235         push r29
236         push_range 2, 17
237         movw DATA0, r24
238         movw CTX0, r22
239         clr I
240         clr S
241 1:      
242         mov r30,  I
243         andi r30, 0x03
244         breq 2f
245         rjmp 4f
246 2:
247         ldi r30, lo8(threefish512_slut9)
248         ldi r31, hi8(threefish512_slut9)
249         add r30, S
250         adc r31, r1
251         lpm IDX0, Z+
252         lpm IDX1, Z+
253         lpm IDX2, Z+
254         lpm IDX3, Z+
255         lpm IDX4, Z+
256         lpm IDX5, Z+
257         lpm IDX6, Z+
258         lpm IDX7, Z
259         movw r30, CTX0
260         movw r26, DATA0
261         add r30, IDX0
262         adc r31, r1
263         rcall add_z_to_x8
264         movw r30, CTX0
265         add r30, IDX1
266         adc r31, r1
267         rcall add_z_to_x8
268         movw r30, CTX0
269         add r30, IDX2
270         adc r31, r1
271         rcall add_z_to_x8
272         movw r30, CTX0
273         add r30, IDX3
274         adc r31, r1
275         rcall add_z_to_x8
276         movw r30, CTX0
277         add r30, IDX4
278         adc r31, r1
279         rcall add_z_to_x8
280         movw r30, CTX0
281         add r30, IDX5
282         adc r31, r1
283         rcall add_z_to_x8
284         movw r30, CTX0
285         add r30, IDX6
286         adc r31, r1
287         rcall add_z_to_x8
288         movw r30, CTX0
289         add r30, IDX7
290         adc r31, r1
291         rcall add_z_to_x8
292         
293         /* now the remaining key */
294         sbiw r26, 3*8
295         ldi r30, lo8(threefish512_slut3)
296         ldi r31, hi8(threefish512_slut3)
297         add r30, S
298         adc r31, r1
299         lpm IDX0, Z+
300         lpm IDX1, Z
301         movw r30, CTX0
302         adiw r30, 7*8 /* make Z pointing to (extended tweak) */
303         adiw r30, 2*8
304         movw IDX2, r30
305         add r30, IDX0
306         adc r31, r1
307         rcall add_z_to_x8
308         movw r30, IDX2
309         add r30, IDX1
310         adc r31, r1
311         rcall add_z_to_x8
312         ld r0, X
313         add r0, S
314         st X+, r0
315         ld r0, X
316         adc r0, r1
317         st X+, r0
318         ld r0, X
319         adc r0, r1
320         st X+, r0
321         ld r0, X
322         adc r0, r1
323         st X+, r0
324         ld r0, X
325         adc r0, r1
326         st X+, r0
327         ld r0, X
328         adc r0, r1
329         st X+, r0
330         ld r0, X
331         adc r0, r1
332         st X+, r0
333         ld r0, X
334         adc r0, r1
335         st X+, r0
336         inc S
337         mov r26, S
338         cpi r26, 19
339         brmi 4f
340 exit:
341         pop_range 2, 17
342         pop r29
343         pop r28
344         ret     
345 4:      
346         /* call mix */
347         ldi r30, lo8(threefish512_rc0)
348         ldi r31, hi8(threefish512_rc0)
349         mov r26, I
350         andi r26, 0x07
351         add r30, r26
352         adc r31, r1
353         lpm r22, Z
354         adiw r30, 8
355         lpm IDX0, Z
356         adiw r30, 8
357         lpm IDX1, Z
358         push IDX1
359         adiw r30, 8
360         lpm IDX1, Z
361         
362         movw r24, DATA0
363         call threefish_mix_asm /* no rcall? */
364         movw r24, DATA0
365         adiw r24, 16
366         mov r22, IDX0
367         call threefish_mix_asm /* no rcall? */
368         movw r24, DATA0
369         adiw r24, 32
370         pop r22
371         ;mov r22, IDX0
372         call threefish_mix_asm /* no rcall? */
373         movw r24, DATA0
374         adiw r24, 48
375         mov r22, IDX1
376         call threefish_mix_asm /* no rcall? */
377         /* now the permutation */
378         movw r26, DATA0
379         movw r30, DATA0
380         adiw r30, 6*8
381         rcall xchg_zx8
382         movw r26, DATA0
383         movw r30, DATA0
384         adiw r30, 2*8
385         rcall xchg_zx8
386         movw r26, DATA0
387         adiw r26, 2*8
388         movw r30, DATA0
389         adiw r30, 4*8
390         rcall xchg_zx8  
391         movw r26, DATA0
392         adiw r26, 3*8
393         movw r30, DATA0
394         adiw r30, 7*8
395         rcall xchg_zx8
396         inc I
397         rjmp 1b
398         
399 threefish512_slut9:
400         .byte 0x00, 0x08, 0x10, 0x18, 0x20, 0x28, 0x30, 0x38
401         .byte 0x40, 0x00, 0x08, 0x10, 0x18, 0x20, 0x28, 0x30
402         .byte 0x38, 0x40, 0x00, 0x08, 0x10, 0x18, 0x20, 0x28 
403         .byte 0x30, 0x38, 0x40
404 threefish512_slut3:
405         .byte 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08
406         .byte 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00 
407         .byte 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08
408
409 threefish512_rc0: .byte 0x5a, 0x60, 0x42, 0x32, 0x41, 0x59, 0x4b, 0x41 
410 threefish512_rc1: .byte 0x4a, 0x24, 0x2a, 0x14, 0x61, 0x33, 0x32, 0x63 
411 threefish512_rc2: .byte 0x62, 0x53, 0x29, 0x72, 0x10, 0x51, 0x13, 0x59 
412 threefish512_rc3: .byte 0x7b, 0x49, 0x33, 0x19, 0x52, 0x2a, 0x11, 0x43 
413
414 add_z_to_x8:
415         ld r0, Z+
416         ld r1, X
417         add r1, r0
418         st X+, r1
419         ld r0, Z+
420         ld r1, X
421         adc r1, r0
422         st X+, r1
423         ld r0, Z+
424         ld r1, X
425         adc r1, r0
426         st X+, r1
427         ld r0, Z+
428         ld r1, X
429         adc r1, r0
430         st X+, r1
431         ld r0, Z+
432         ld r1, X
433         adc r1, r0
434         st X+, r1
435         ld r0, Z+
436         ld r1, X
437         adc r1, r0
438         st X+, r1
439         ld r0, Z+
440         ld r1, X
441         adc r1, r0
442         st X+, r1
443         ld r0, Z+
444         ld r1, X
445         adc r1, r0
446         st X+, r1
447         clr r1
448         ret
449         
450 T0 = IDX0
451 T1 = 0
452 CNT = 24        
453 xchg_zx8:
454         ldi CNT, 8
455 1:      ld T0, X
456         ld T1, Z
457         st X+, T1
458         st Z+, T0       
459         dec CNT
460         brne 1b
461         ret
462
463
464