]> git.cryptolib.org Git - avr-crypto-lib.git/blob - skein/threefish256_enc_asm.S
introducing the tweak on skein
[avr-crypto-lib.git] / skein / 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         tst r23
107         brne 3f
108         tst r22
109         brne 3f
110         ldi r26, 3*8
111 2:
112         st Z+, r1
113         dec r26
114         brne 2b
115         rjmp 9f
116 3:
117         movw r26, r22
118         ld A0, X+
119         ld A1, X+
120         ld A2, X+
121         ld A3, X+
122         ld A4, X+
123         ld A5, X+
124         ld A6, X+
125         ld A7, X+
126         st Z+, A0
127         st Z+, A1
128         st Z+, A2
129         st Z+, A3
130         st Z+, A4
131         st Z+, A5
132         st Z+, A6
133         st Z+, A7
134         ld r0, X+
135         eor A0, r0
136         st Z+, r0
137         ld r0, X+
138         eor A1, r0
139         st Z+, r0
140         ld r0, X+
141         eor A2, r0
142         st Z+, r0
143         ld r0, X+
144         eor A3, r0
145         st Z+, r0
146         ld r0, X+
147         eor A4, r0
148         st Z+, r0
149         ld r0, X+
150         eor A5, r0
151         st Z+, r0
152         ld r0, X+
153         eor A6, r0
154         st Z+, r0
155         ld r0, X+
156         eor A7, r0
157         st Z+, r0
158
159         st Z+, A0
160         st Z+, A1
161         st Z+, A2
162         st Z+, A3
163         st Z+, A4
164         st Z+, A5
165         st Z+, A6
166         st Z+, A7
167 9:
168         pop_range 14, 17
169         ret
170
171 /******************************************************************************/
172 /*
173 #define X(a) (((uint64_t*)data)[(a)])
174 void permute_4(void* data){
175         uint64_t t;
176         t = X(1);
177         X(1) = X(3);
178         X(3) = t;
179 }
180 void add_key_4(void* data, threefish256_ctx_t* ctx, uint8_t s){ / * s: 0..19 * /
181         X(0) += ctx->k[(s+0)%5];
182         X(1) += ctx->k[(s+1)%5] + ctx->t[s%3];
183         X(2) += ctx->k[(s+2)%5] + ctx->t[(s+1)%3];
184         X(3) += ctx->k[(s+3)%5] + s;
185 }
186 void threefish256_enc(void* data, threefish256_ctx_t* ctx){
187         uint8_t i=0,s=0;
188         uint8_t r0[8] = { 5, 36, 13, 58, 26, 53, 11, 59};
189         uint8_t r1[8] = {56, 28, 46, 44, 20, 35, 42, 50};
190         do{
191                 if(i%4==0){
192                         add_key_4(data, ctx, s);
193                         ++s;
194                 }
195                 threefish_mix(data, r0[i%8]);
196                 threefish_mix((uint8_t*)data + 16, r1[i%8]);
197                 permute_4(data);
198                 ++i;
199         }while(i!=72);
200         add_key_4(data, ctx, s);
201 }
202 */
203 I     =  2
204 S     =  3
205 DATA0 =  4
206 DATA1 =  5
207 CTX0  =  6
208 CTX1  =  7
209 IDX0  =  8
210 IDX1  =  9
211 IDX2  = 10
212 IDX3  = 11
213 /*
214  * param data:  r24:r25
215  * param ctx:   r22:r23
216  */
217 .global threefish256_enc
218 threefish256_enc:
219         push r28
220         push r29
221         push_range 2, 17
222         movw DATA0, r24
223         movw CTX0, r22
224         clr I
225         clr S
226 1:
227         mov r30,  I
228         andi r30, 0x03
229         breq 2f
230         rjmp 4f
231 2:
232         ldi r30, lo8(threefish256_slut5)
233         ldi r31, hi8(threefish256_slut5)
234         add r30, S
235         adc r31, r1
236         lpm IDX0, Z+
237         lpm IDX1, Z+
238         lpm IDX2, Z+
239         lpm IDX3, Z
240         movw r30, CTX0
241         movw r26, DATA0
242         add r30, IDX0
243         adc r31, r1
244         rcall add_z_to_x8
245         movw r30, CTX0
246         add r30, IDX1
247         adc r31, r1
248         rcall add_z_to_x8
249         movw r30, CTX0
250         add r30, IDX2
251         adc r31, r1
252         rcall add_z_to_x8
253         movw r30, CTX0
254         add r30, IDX3
255         adc r31, r1
256         rcall add_z_to_x8
257
258         /* now the remaining key */
259         sbiw r26, 3*8
260         ldi r30, lo8(threefish256_slut3)
261         ldi r31, hi8(threefish256_slut3)
262         add r30, S
263         adc r31, r1
264         lpm IDX0, Z+
265         lpm IDX1, Z
266         movw r30, CTX0
267         adiw r30, 5*8
268         movw IDX2, r30
269         add r30, IDX0
270         adc r31, r1
271         rcall add_z_to_x8
272         movw r30, IDX2
273         add r30, IDX1
274         adc r31, r1
275         rcall add_z_to_x8
276         ld r0, X
277         add r0, S
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         ld r0, X
289         adc r0, r1
290         st X+, r0
291         ld r0, X
292         adc r0, r1
293         st X+, r0
294         ld r0, X
295         adc r0, r1
296         st X+, r0
297         ld r0, X
298         adc r0, r1
299         st X+, r0
300         inc S
301         mov r26, S
302         cpi r26, 19
303         brmi 4f
304 exit:
305         pop_range 2, 17
306         pop r29
307         pop r28
308         ret
309 4:
310         /* call mix */
311         ldi r30, lo8(threefish256_rc0)
312         ldi r31, hi8(threefish256_rc0)
313         mov r26, I
314         andi r26, 0x07
315         add r30, r26
316         adc r31, r1
317         lpm r22, Z
318         adiw r30, 8
319         lpm IDX0, Z
320         movw r24, DATA0
321         call threefish_mix_asm /* no rcall? */
322         movw r24, DATA0
323         adiw r24, 16
324         mov r22, IDX0
325         call threefish_mix_asm /* no rcall? */
326         /* now the permutation */
327         movw r26, DATA0
328         adiw r26, 8
329         movw r30, r26
330         adiw r30, 16
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         ld IDX0, X
352         ld IDX1, Z
353         st X+, IDX1
354         st Z+, IDX0
355         ld IDX0, X
356         ld IDX1, Z
357         st X+, IDX1
358         st Z+, IDX0
359         ld IDX0, X
360         ld IDX1, Z
361         st X+, IDX1
362         st Z+, IDX0
363         inc I
364         rjmp 1b
365
366 threefish256_slut5:
367     .byte 0x00, 0x08, 0x10, 0x18, 0x20, 0x00, 0x08, 0x10
368         .byte 0x18, 0x20, 0x00, 0x08, 0x10, 0x18, 0x20, 0x00
369         .byte 0x08, 0x10, 0x18, 0x20, 0x00, 0x08, 0x10
370 threefish256_slut3:
371         .byte 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08
372         .byte 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00
373         .byte 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08
374 ;threefish256_rc0: .byte  5, 36, 13, 58, 26, 53, 11, 59
375 ;threefish256_rc1: .byte 56, 28, 46, 44, 20, 35, 42, 50
376 /* old round constants
377 threefish256_rc0: .byte 0x1b, 0x44, 0x2b, 0x72, 0x32, 0x7b, 0x13, 0x73
378 threefish256_rc1: .byte 0x70, 0x34, 0x6a, 0x54, 0x24, 0x43, 0x52, 0x62
379 */
380 threefish256_rc0:  .byte 0x2a, 0x64, 0x39, 0x1b, 0x31, 0x6a, 0x72, 0x40
381 threefish256_rc1:  .byte 0x20, 0x71, 0x50, 0x5b, 0x41, 0x14, 0x3a, 0x40
382
383 add_z_to_x8:
384         ld r0, Z+
385         ld r1, X
386         add 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         ld r0, Z+
401         ld r1, X
402         adc r1, r0
403         st X+, r1
404         ld r0, Z+
405         ld r1, X
406         adc r1, r0
407         st X+, r1
408         ld r0, Z+
409         ld r1, X
410         adc r1, r0
411         st X+, r1
412         ld r0, Z+
413         ld r1, X
414         adc r1, r0
415         st X+, r1
416         clr r1
417         ret
418
419
420
421
422
423
424
425
426
427