]> git.cryptolib.org Git - avr-crypto-lib.git/blob - skein/threefish256_enc_small.S
introducing the tweak on skein
[avr-crypto-lib.git] / skein / threefish256_enc_small.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         tst r27
108         brne 3f
109         tst r26
110         brne 3f
111         ldi r26, 3*8
112 1:
113         st Z+, r1
114         dec r26
115         brne 1b
116         rjmp 9f
117 3:
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         st Z+, A0
159         st Z+, A1
160         st Z+, A2
161         st Z+, A3
162         st Z+, A4
163         st Z+, A5
164         st Z+, A6
165         st Z+, A7
166 9:
167         pop_range 14, 17
168         ret
169
170 /******************************************************************************/
171 /*
172 #define X(a) (((uint64_t*)data)[(a)])
173 void permute_4(void* data){
174         uint64_t t;
175         t = X(1);
176         X(1) = X(3);
177         X(3) = t;
178 }
179 void add_key_4(void* data, threefish256_ctx_t* ctx, uint8_t s){ / * s: 0..19 * /
180         X(0) += ctx->k[(s+0)%5];
181         X(1) += ctx->k[(s+1)%5] + ctx->t[s%3];
182         X(2) += ctx->k[(s+2)%5] + ctx->t[(s+1)%3];
183         X(3) += ctx->k[(s+3)%5] + s;
184 }
185 void threefish256_enc(void* data, threefish256_ctx_t* ctx){
186         uint8_t i=0,s=0;
187         uint8_t r0[8] = { 5, 36, 13, 58, 26, 53, 11, 59};
188         uint8_t r1[8] = {56, 28, 46, 44, 20, 35, 42, 50};
189         do{
190                 if(i%4==0){
191                         add_key_4(data, ctx, s);
192                         ++s;
193                 }
194                 threefish_mix(data, r0[i%8]);
195                 threefish_mix((uint8_t*)data + 16, r1[i%8]);
196                 permute_4(data);
197                 ++i;
198         }while(i!=72);
199         add_key_4(data, ctx, s);
200 }
201 */
202 I     =  2
203 S     =  3
204 DATA0 =  4
205 DATA1 =  5
206 CTX0  =  6
207 CTX1  =  7
208 IDX0  =  8
209 IDX1  =  9
210 IDX2  = 10
211 IDX3  = 11
212 /*
213  * param data:  r24:r25
214  * param ctx:   r22:r23
215  */
216 .global threefish256_enc
217 threefish256_enc:
218         push r28
219         push r29
220         push_range 2, 17
221         movw DATA0, r24
222         movw CTX0, r22
223         clr I
224         clr S
225 1:
226         mov r30,  I
227         andi r30, 0x03
228         breq 2f
229         rjmp 4f
230 2:
231         ldi r30, lo8(threefish256_slut5)
232         ldi r31, hi8(threefish256_slut5)
233         mov r26, S
234         add r30, r26
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         ldi r16, 7
280 3:
281         ld r0, X
282         adc r0, r1
283         st X+, r0
284         dec r16
285         brne 3b
286         inc S
287         mov r26, S
288         cpi r26, 19
289         brmi 4f
290 exit:
291         pop_range 2, 17
292         pop r29
293         pop r28
294         ret
295 4:
296         /* call mix */
297         ldi r30, lo8(threefish256_rc0)
298         ldi r31, hi8(threefish256_rc0)
299         mov r26, I
300         andi r26, 0x07
301         add r30, r26
302         adc r31, r1
303         lpm r22, Z
304         adiw r30, 8
305         lpm IDX0, Z
306         movw r24, DATA0
307         call threefish_mix_asm /* no rcall? */
308         movw r24, DATA0
309         adiw r24, 16
310         mov r22, IDX0
311         call threefish_mix_asm /* no rcall? */
312         /* now the permutation */
313         movw r26, DATA0
314         adiw r26, 8
315         movw r30, r26
316         adiw r30, 16
317         ldi r16, 8
318 3:      ld IDX0, X
319         ld IDX1, Z
320         st X+, IDX1
321         st Z+, IDX0
322         dec r16
323         brne 3b
324         inc I
325         rjmp 1b
326
327 threefish256_slut5:
328     .byte 0x00, 0x08, 0x10, 0x18, 0x20, 0x00, 0x08, 0x10
329         .byte 0x18, 0x20, 0x00, 0x08, 0x10, 0x18, 0x20, 0x00
330         .byte 0x08, 0x10, 0x18, 0x20, 0x00, 0x08, 0x10
331 threefish256_slut3:
332         .byte 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08
333         .byte 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00
334         .byte 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08
335 /* old round contants
336 threefish256_rc0: .byte 0x1b, 0x44, 0x2b, 0x72, 0x32, 0x7b, 0x13, 0x73
337 threefish256_rc1: .byte 0x70, 0x34, 0x6a, 0x54, 0x24, 0x43, 0x52, 0x62
338 */
339 threefish256_rc0:  .byte 0x2a, 0x64, 0x39, 0x1b, 0x31, 0x6a, 0x72, 0x40
340 threefish256_rc1:  .byte 0x20, 0x71, 0x50, 0x5b, 0x41, 0x14, 0x3a, 0x40
341
342 add_z_to_x8:
343         ld r0, Z+
344         ld r1, X
345         add r1, r0
346         st X+, r1
347         ldi r16, 7
348 1:
349         ld r0, Z+
350         ld r1, X
351         adc r1, r0
352         st X+, r1
353         dec r16
354         brne 1b
355         clr r1
356         ret
357
358
359
360
361
362
363
364
365
366