]> git.cryptolib.org Git - avr-crypto-lib.git/blob - threefish256_enc_asm.S
adding mickey-v2 128
[avr-crypto-lib.git] / threefish256_enc_asm.S
1 /* threefish256_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-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         add r30, S
222         adc r31, r1
223         lpm IDX0, Z+
224         lpm IDX1, Z+
225         lpm IDX2, Z+
226         lpm IDX3, Z
227         movw r30, CTX0
228         movw r26, DATA0
229         add r30, IDX0
230         adc r31, r1
231         rcall add_z_to_x8
232         movw r30, CTX0
233         add r30, IDX1
234         adc r31, r1
235         rcall add_z_to_x8
236         movw r30, CTX0
237         add r30, IDX2
238         adc r31, r1
239         rcall add_z_to_x8
240         movw r30, CTX0
241         add r30, IDX3
242         adc r31, r1
243         rcall add_z_to_x8
244         
245         /* now the remaining key */
246         sbiw r26, 3*8
247         ldi r30, lo8(threefish256_slut3)
248         ldi r31, hi8(threefish256_slut3)
249         add r30, S
250         adc r31, r1
251         lpm IDX0, Z+
252         lpm IDX1, Z
253         movw r30, CTX0
254         adiw r30, 5*8
255         movw IDX2, r30
256         add r30, IDX0
257         adc r31, r1
258         rcall add_z_to_x8
259         movw r30, IDX2
260         add r30, IDX1
261         adc r31, r1
262         rcall add_z_to_x8
263         ld r0, X
264         add r0, S
265         st X+, r0
266         ld r0, X
267         adc r0, r1
268         st X+, r0
269         ld r0, X
270         adc r0, r1
271         st X+, r0
272         ld r0, X
273         adc r0, r1
274         st X+, r0
275         ld r0, X
276         adc r0, r1
277         st X+, r0
278         ld r0, X
279         adc r0, r1
280         st X+, r0
281         ld r0, X
282         adc r0, r1
283         st X+, r0
284         ld r0, X
285         adc r0, r1
286         st X+, r0
287         inc S
288         mov r26, S
289         cpi r26, 19
290         brmi 4f
291 exit:
292         pop_range 2, 17
293         pop r29
294         pop r28
295         ret     
296 4:      
297         /* call mix */
298         ldi r30, lo8(threefish256_rc0)
299         ldi r31, hi8(threefish256_rc0)
300         mov r26, I
301         andi r26, 0x07
302         add r30, r26
303         adc r31, r1
304         lpm r22, Z
305         adiw r30, 8
306         lpm IDX0, Z
307         movw r24, DATA0
308         call threefish_mix_asm /* no rcall? */
309         movw r24, DATA0
310         adiw r24, 16
311         mov r22, IDX0
312         call threefish_mix_asm /* no rcall? */
313         /* now the permutation */
314         movw r26, DATA0
315         adiw r26, 8
316         movw r30, r26
317         adiw r30, 16
318         ld IDX0, X
319         ld IDX1, Z
320         st X+, IDX1
321         st Z+, IDX0
322         ld IDX0, X
323         ld IDX1, Z
324         st X+, IDX1
325         st Z+, IDX0
326         ld IDX0, X
327         ld IDX1, Z
328         st X+, IDX1
329         st Z+, IDX0
330         ld IDX0, X
331         ld IDX1, Z
332         st X+, IDX1
333         st Z+, IDX0
334         ld IDX0, X
335         ld IDX1, Z
336         st X+, IDX1
337         st Z+, IDX0
338         ld IDX0, X
339         ld IDX1, Z
340         st X+, IDX1
341         st Z+, IDX0
342         ld IDX0, X
343         ld IDX1, Z
344         st X+, IDX1
345         st Z+, IDX0
346         ld IDX0, X
347         ld IDX1, Z
348         st X+, IDX1
349         st Z+, IDX0
350         inc I
351         rjmp 1b
352         
353 threefish256_slut5:
354     .byte 0x00, 0x08, 0x10, 0x18, 0x20, 0x00, 0x08, 0x10 
355         .byte 0x18, 0x20, 0x00, 0x08, 0x10, 0x18, 0x20, 0x00
356         .byte 0x08, 0x10, 0x18, 0x20, 0x00, 0x08, 0x10
357 threefish256_slut3:
358         .byte 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08
359         .byte 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00 
360         .byte 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08
361 ;threefish256_rc0: .byte  5, 36, 13, 58, 26, 53, 11, 59 
362 ;threefish256_rc1: .byte 56, 28, 46, 44, 20, 35, 42, 50
363 threefish256_rc0: .byte 0x1b, 0x44, 0x2b, 0x72, 0x32, 0x7b, 0x13, 0x73
364 threefish256_rc1: .byte 0x70, 0x34, 0x6a, 0x54, 0x24, 0x43, 0x52, 0x62
365
366 add_z_to_x8:
367         ld r0, Z+
368         ld r1, X
369         add r1, r0
370         st X+, r1
371         ld r0, Z+
372         ld r1, X
373         adc r1, r0
374         st X+, r1
375         ld r0, Z+
376         ld r1, X
377         adc r1, r0
378         st X+, r1
379         ld r0, Z+
380         ld r1, X
381         adc r1, r0
382         st X+, r1
383         ld r0, Z+
384         ld r1, X
385         adc r1, r0
386         st X+, r1
387         ld r0, Z+
388         ld r1, X
389         adc r1, r0
390         st X+, r1
391         ld r0, Z+
392         ld r1, X
393         adc r1, r0
394         st X+, r1
395         ld r0, Z+
396         ld r1, X
397         adc r1, r0
398         st X+, r1
399         clr r1
400         ret
401         
402         
403         
404
405
406
407
408
409
410