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