]> git.cryptolib.org Git - avr-crypto-lib.git/blob - skein/threefish512_enc_asm.S
introducing the tweak on skein
[avr-crypto-lib.git] / skein / 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 /* old round constants
410 threefish512_rc0: .byte 0x5a, 0x60, 0x42, 0x32, 0x41, 0x59, 0x4b, 0x41
411 threefish512_rc1: .byte 0x4a, 0x24, 0x2a, 0x14, 0x61, 0x33, 0x32, 0x63
412 threefish512_rc2: .byte 0x62, 0x53, 0x29, 0x72, 0x10, 0x51, 0x13, 0x59
413 threefish512_rc3: .byte 0x7b, 0x49, 0x33, 0x19, 0x52, 0x2a, 0x11, 0x43
414 */
415 threefish512_rc0:  .byte 0x6a, 0x41, 0x21, 0x54, 0x59, 0x2b, 0x31, 0x10
416 threefish512_rc1:  .byte 0x44, 0x33, 0x61, 0x11, 0x4a, 0x62, 0x4b, 0x43
417 threefish512_rc2:  .byte 0x23, 0x2a, 0x44, 0x7a, 0x42, 0x12, 0x59, 0x70
418 threefish512_rc3:  .byte 0x5b, 0x52, 0x59, 0x70, 0x30, 0x21, 0x53, 0x3a
419 add_z_to_x8:
420         ld r0, Z+
421         ld r1, X
422         add r1, r0
423         st X+, r1
424         ld r0, Z+
425         ld r1, X
426         adc r1, r0
427         st X+, r1
428         ld r0, Z+
429         ld r1, X
430         adc r1, r0
431         st X+, r1
432         ld r0, Z+
433         ld r1, X
434         adc r1, r0
435         st X+, r1
436         ld r0, Z+
437         ld r1, X
438         adc r1, r0
439         st X+, r1
440         ld r0, Z+
441         ld r1, X
442         adc r1, r0
443         st X+, r1
444         ld r0, Z+
445         ld r1, X
446         adc r1, r0
447         st X+, r1
448         ld r0, Z+
449         ld r1, X
450         adc r1, r0
451         st X+, r1
452         clr r1
453         ret
454
455 T0 = IDX0
456 T1 = 0
457 CNT = 24
458 xchg_zx8:
459         ldi CNT, 8
460 1:      ld T0, X
461         ld T1, Z
462         st X+, T1
463         st Z+, T0
464         dec CNT
465         brne 1b
466         ret
467
468
469