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