]> git.cryptolib.org Git - avr-crypto-lib.git/blob - threefish256_enc_asm.S
7fe3471ff54c2a2c3e4ad77eaf323fb2e9a92181
[avr-crypto-lib.git] / threefish256_enc_asm.S
1 /* threefish_mix.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-16
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
43 void threefish256_init(void* key, void* tweak, threefish256_ctx_t* ctx){
44         memcpy(ctx->k, key, 4*8);
45         memcpy(ctx->t, tweak, 2*8);
46         uint8_t i;
47         ctx->k[4] = THREEFISH_KEY_CONST;
48         for(i=0; i<4; ++i){
49                 ctx->k[4] ^= K(i);
50         }
51         ctx->t[2] = T(0) ^ T(1);
52 }
53 */
54 /*
55  * param key:   r24:r25
56  * param tweak: r22:r23
57  * param ctx:   r20:r21
58  */
59 .global threefish256_init
60 threefish256_init:
61         push_range 14, 17
62         movw r30, r20
63         movw r26, r24
64         ldi r24, 4
65         ldi A7, 0x55
66         mov A6, A7
67         movw A4, A6
68         movw A2, A6
69         movw A0, A6
70 1:
71         ld r0, X+
72         st Z+, r0
73         eor A0, r0
74         ld r0, X+
75         st Z+, r0
76         eor A1, r0
77         ld r0, X+
78         st Z+, r0
79         eor A2, r0
80         ld r0, X+
81         st Z+, r0
82         eor A3, r0
83         ld r0, X+
84         st Z+, r0
85         eor A4, r0
86         ld r0, X+
87         st Z+, r0
88         eor A5, r0
89         ld r0, X+
90         st Z+, r0
91         eor A6, r0
92         ld r0, X+
93         st Z+, r0
94         eor A7, r0
95         dec r24
96         brne 1b
97         st Z+, A0
98         st Z+, A1
99         st Z+, A2
100         st Z+, A3
101         st Z+, A4
102         st Z+, A5
103         st Z+, A6
104         st Z+, A7
105         /* now the tweak */
106         movw r26, r22
107         ld A0, X+
108         ld A1, X+
109         ld A2, X+
110         ld A3, X+
111         ld A4, X+
112         ld A5, X+
113         ld A6, X+
114         ld A7, X+
115         st Z+, A0
116         st Z+, A1
117         st Z+, A2
118         st Z+, A3
119         st Z+, A4
120         st Z+, A5
121         st Z+, A6
122         st Z+, A7
123         ld r0, X+
124         eor A0, r0
125         st Z+, r0
126         ld r0, X+
127         eor A1, r0
128         st Z+, r0
129         ld r0, X+
130         eor A2, r0
131         st Z+, r0
132         ld r0, X+
133         eor A3, r0
134         st Z+, r0
135         ld r0, X+
136         eor A4, r0
137         st Z+, r0
138         ld r0, X+
139         eor A5, r0
140         st Z+, r0
141         ld r0, X+
142         eor A6, r0
143         st Z+, r0
144         ld r0, X+
145         eor A7, r0
146         st Z+, r0
147         st Z+, A0
148         st Z+, A1
149         st Z+, A2
150         st Z+, A3
151         st Z+, A4
152         st Z+, A5
153         st Z+, A6
154         st Z+, A7
155         pop_range 14, 17
156         ret
157         
158 /******************************************************************************/
159 /*
160 #define X(a) (((uint64_t*)data)[(a)])
161 void permute_4(void* data){
162         uint64_t t;
163         t = X(1);
164         X(1) = X(3);
165         X(3) = t;
166 }
167 void add_key_4(void* data, threefish256_ctx_t* ctx, uint8_t s){ /* s: 0..19 * /
168         X(0) += ctx->k[(s+0)%5];
169         X(1) += ctx->k[(s+1)%5] + ctx->t[s%3];
170         X(2) += ctx->k[(s+2)%5] + ctx->t[(s+1)%3];
171         X(3) += ctx->k[(s+3)%5] + s;
172 }
173 void threefish256_enc(void* data, threefish256_ctx_t* ctx){
174         uint8_t i=0,s=0;
175         uint8_t r0[8] = { 5, 36, 13, 58, 26, 53, 11, 59}; 
176         uint8_t r1[8] = {56, 28, 46, 44, 20, 35, 42, 50};
177         do{
178                 if(i%4==0){
179                         add_key_4(data, ctx, s);
180                         ++s;
181                 }
182                 threefish_mix(data, r0[i%8]);
183                 threefish_mix((uint8_t*)data + 16, r1[i%8]);
184                 permute_4(data);
185                 ++i;
186         }while(i!=72);
187         add_key_4(data, ctx, s);
188 }
189 */
190 I     =  2
191 S     =  3
192 DATA0 =  4
193 DATA1 =  5
194 CTX0  =  6
195 CTX1  =  7
196 IDX0  =  8
197 IDX1  =  9
198 IDX2  = 10
199 IDX3  = 11
200 /*
201  * param data:  r24:r25
202  * param ctx:   r22:r23
203  */
204 .global threefish256_enc
205 threefish256_enc:
206         push r28
207         push r29
208         push_range 2, 17
209         movw DATA0, r24
210         movw CTX0, r22
211         clr I
212         clr S
213 1:      
214         mov r30,  I
215         andi r30, 0x03
216         breq 2f
217         rjmp 4f
218 2:
219         ldi r30, lo8(threefish256_slut5)
220         ldi r31, hi8(threefish256_slut5)
221         mov r26, S
222         add r30, r26
223         adc r31, r1
224         lpm IDX0, Z+
225         lpm IDX1, Z+
226         lpm IDX2, Z+
227         lpm IDX3, Z
228         movw r30, CTX0
229         movw r26, DATA0
230         add r30, IDX0
231         adc r31, r1
232         rcall add_z_to_x8
233         movw r30, CTX0
234         add r30, IDX1
235         adc r31, r1
236         rcall add_z_to_x8
237         movw r30, CTX0
238         add r30, IDX2
239         adc r31, r1
240         rcall add_z_to_x8
241         movw r30, CTX0
242         add r30, IDX3
243         adc r31, r1
244         rcall add_z_to_x8
245         
246         /* now the remaining key */
247         sbiw r26, 3*8
248         ldi r30, lo8(threefish256_slut3)
249         ldi r31, hi8(threefish256_slut3)
250         add r30, S
251         adc r31, r1
252         lpm IDX0, Z+
253         lpm IDX1, Z
254         movw r30, CTX0
255         adiw r30, 5*8
256         movw IDX2, r30
257         add r30, IDX0
258         adc r31, r1
259         rcall add_z_to_x8
260         movw r30, IDX2
261         add r30, IDX1
262         adc r31, r1
263         rcall add_z_to_x8
264         ld r0, X
265         add r0, S
266         st X+, r0
267         ld r0, X
268         adc r0, r1
269         st X+, r0
270         ld r0, X
271         adc r0, r1
272         st X+, r0
273         ld r0, X
274         adc r0, r1
275         st X+, r0
276         ld r0, X
277         adc r0, r1
278         st X+, r0
279         ld r0, X
280         adc r0, r1
281         st X+, r0
282         ld r0, X
283         adc r0, r1
284         st X+, r0
285         ld r0, X
286         adc r0, r1
287         st X+, r0
288         inc S
289         mov r26, S
290         cpi r26, 19
291         brmi 4f
292 exit:
293         pop_range 2, 17
294         pop r29
295         pop r28
296         ret     
297 4:      
298         /* call mix */
299         ldi r30, lo8(threefish256_rc0)
300         ldi r31, hi8(threefish256_rc0)
301         mov r26, I
302         andi r26, 0x07
303         add r30, r26
304         adc r31, r1
305         lpm r22, Z
306         adiw r30, 8
307         lpm IDX0, Z
308         movw r24, DATA0
309         call threefish_mix_asm /* no rcall? */
310         movw r24, DATA0
311         adiw r24, 16
312         mov r22, IDX0
313         call threefish_mix_asm /* no rcall? */
314         /* now the permutation */
315         movw r26, DATA0
316         adiw r26, 8
317         movw r30, r26
318         adiw r30, 16
319         ld IDX0, X
320         ld IDX1, Z
321         st X+, IDX1
322         st Z+, IDX0
323         ld IDX0, X
324         ld IDX1, Z
325         st X+, IDX1
326         st Z+, IDX0
327         ld IDX0, X
328         ld IDX1, Z
329         st X+, IDX1
330         st Z+, IDX0
331         ld IDX0, X
332         ld IDX1, Z
333         st X+, IDX1
334         st Z+, IDX0
335         ld IDX0, X
336         ld IDX1, Z
337         st X+, IDX1
338         st Z+, IDX0
339         ld IDX0, X
340         ld IDX1, Z
341         st X+, IDX1
342         st Z+, IDX0
343         ld IDX0, X
344         ld IDX1, Z
345         st X+, IDX1
346         st Z+, IDX0
347         ld IDX0, X
348         ld IDX1, Z
349         st X+, IDX1
350         st Z+, IDX0
351         inc I
352         rjmp 1b
353         
354 threefish256_slut5:
355     .byte 0x00, 0x08, 0x10, 0x18, 0x20, 0x00, 0x08, 0x10 
356         .byte 0x18, 0x20, 0x00, 0x08, 0x10, 0x18, 0x20, 0x00
357         .byte 0x08, 0x10, 0x18, 0x20, 0x00, 0x08, 0x10
358 threefish256_slut3:
359         .byte 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08
360         .byte 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00 
361         .byte 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08
362 ;threefish256_rc0: .byte  5, 36, 13, 58, 26, 53, 11, 59 
363 ;threefish256_rc1: .byte 56, 28, 46, 44, 20, 35, 42, 50
364 threefish256_rc0: .byte 0x1b, 0x44, 0x2b, 0x72, 0x32, 0x7b, 0x13, 0x73
365 threefish256_rc1: .byte 0x70, 0x34, 0x6a, 0x54, 0x24, 0x43, 0x52, 0x62
366
367 add_z_to_x8:
368         ld r0, Z+
369         ld r1, X
370         add r1, r0
371         st X+, r1
372         ld r0, Z+
373         ld r1, X
374         adc r1, r0
375         st X+, r1
376         ld r0, Z+
377         ld r1, X
378         adc r1, r0
379         st X+, r1
380         ld r0, Z+
381         ld r1, X
382         adc r1, r0
383         st X+, r1
384         ld r0, Z+
385         ld r1, X
386         adc r1, r0
387         st X+, r1
388         ld r0, Z+
389         ld r1, X
390         adc r1, r0
391         st X+, r1
392         ld r0, Z+
393         ld r1, X
394         adc r1, r0
395         st X+, r1
396         ld r0, Z+
397         ld r1, X
398         adc r1, r0
399         st X+, r1
400         clr r1
401         ret
402         
403         
404         
405
406
407
408
409
410
411