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