]> git.cryptolib.org Git - avr-crypto-lib.git/blob - threefish256_enc_small.S
+threefis256 asm +ubi256 asm + skein256 asm
[avr-crypto-lib.git] / 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         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         mov r26, S
222         add r30, r26
223         adc r31, r1
224         lpm IDX0, Z+
225         lpm IDX1, Z+
226         lpm IDX2, Z+
227         lpm IDX3, Z
228         movw r30, CTX0
229         movw r26, DATA0
230         add r30, IDX0
231         adc r31, r1
232         rcall add_z_to_x8
233         movw r30, CTX0
234         add r30, IDX1
235         adc r31, r1
236         rcall add_z_to_x8
237         movw r30, CTX0
238         add r30, IDX2
239         adc r31, r1
240         rcall add_z_to_x8
241         movw r30, CTX0
242         add r30, IDX3
243         adc r31, r1
244         rcall add_z_to_x8
245         
246         /* now the remaining key */
247         sbiw r26, 3*8
248         ldi r30, lo8(threefish256_slut3)
249         ldi r31, hi8(threefish256_slut3)
250         add r30, S
251         adc r31, r1
252         lpm IDX0, Z+
253         lpm IDX1, Z
254         movw r30, CTX0
255         adiw r30, 5*8
256         movw IDX2, r30
257         add r30, IDX0
258         adc r31, r1
259         rcall add_z_to_x8
260         movw r30, IDX2
261         add r30, IDX1
262         adc r31, r1
263         rcall add_z_to_x8
264         ld r0, X
265         add r0, S
266         st X+, r0
267         ldi r16, 7
268 3:      
269         ld r0, X
270         adc r0, r1
271         st X+, r0
272         dec r16
273         brne 3b
274         inc S
275         mov r26, S
276         cpi r26, 19
277         brmi 4f
278 exit:
279         pop_range 2, 17
280         pop r29
281         pop r28
282         ret     
283 4:      
284         /* call mix */
285         ldi r30, lo8(threefish256_rc0)
286         ldi r31, hi8(threefish256_rc0)
287         mov r26, I
288         andi r26, 0x07
289         add r30, r26
290         adc r31, r1
291         lpm r22, Z
292         adiw r30, 8
293         lpm IDX0, Z
294         movw r24, DATA0
295         call threefish_mix_asm /* no rcall? */
296         movw r24, DATA0
297         adiw r24, 16
298         mov r22, IDX0
299         call threefish_mix_asm /* no rcall? */
300         /* now the permutation */
301         movw r26, DATA0
302         adiw r26, 8
303         movw r30, r26
304         adiw r30, 16
305         ldi r16, 8
306 3:      ld IDX0, X
307         ld IDX1, Z
308         st X+, IDX1
309         st Z+, IDX0
310         dec r16
311         brne 3b
312         inc I
313         rjmp 1b
314         
315 threefish256_slut5:
316     .byte 0x00, 0x08, 0x10, 0x18, 0x20, 0x00, 0x08, 0x10 
317         .byte 0x18, 0x20, 0x00, 0x08, 0x10, 0x18, 0x20, 0x00
318         .byte 0x08, 0x10, 0x18, 0x20, 0x00, 0x08, 0x10
319 threefish256_slut3:
320         .byte 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08
321         .byte 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00 
322         .byte 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08
323 threefish256_rc0: .byte 0x1b, 0x44, 0x2b, 0x72, 0x32, 0x7b, 0x13, 0x73
324 threefish256_rc1: .byte 0x70, 0x34, 0x6a, 0x54, 0x24, 0x43, 0x52, 0x62
325
326 add_z_to_x8:
327         ld r0, Z+
328         ld r1, X
329         add r1, r0
330         st X+, r1
331         ldi r16, 7
332 1:
333         ld r0, Z+
334         ld r1, X
335         adc r1, r0
336         st X+, r1
337         dec r16
338         brne 1b
339         clr r1
340         ret
341         
342         
343         
344
345
346
347
348
349
350