]> git.cryptolib.org Git - avr-crypto-lib.git/blob - threefish256_dec_asm.S
2cb5b2f86ceefce73ff04ac40287e49baf895bd3
[avr-crypto-lib.git] / threefish256_dec_asm.S
1 /* threefish256_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-16
23  * \license GPLv3 or later
24  */
25
26 #include "avr-asm-macros.S"
27
28 /******************************************************************************/
29 /*
30 void permute_4(void *data){
31         uint64_t t;
32         t = X(1);
33         X(1) = X(3);
34         X(3) = t;
35 }
36 void add_key_4(void *data, const threefish256_ctx_t *ctx, uint8_t s){
37         X(0) -= ctx->k[(s+0)%5];
38         X(1) -= ctx->k[(s+1)%5] + ctx->t[s%3];
39         X(2) -= ctx->k[(s+2)%5] + ctx->t[(s+1)%3];
40         X(3) -= ctx->k[(s+3)%5] + s;
41 }
42 void threefish256_dec(void *data, const threefish256_ctx_t *ctx){
43         uint8_t i=0,s=18;
44         uint8_t r0[8] = {0x73, 0x13, 0x7b, 0x32, 0x72, 0x2b, 0x44, 0x1b};
45         uint8_t r1[8] = {0x62, 0x52, 0x43, 0x24, 0x54, 0x6a, 0x34, 0x70};
46         do{
47                 if(i%4==0){
48                         add_key_4(data, ctx, s);
49                         --s;
50                 }
51                 permute_4(data);
52                 threefish_invmix(data, r0[i%8]);
53                 threefish_invmix((uint8_t*)data + 16, r1[i%8]);
54                 ++i;
55         }while(i!=72);
56         add_key_4(data, ctx, s);
57 }
58 */
59 I     =  2
60 S     =  3
61 DATA0 =  4
62 DATA1 =  5
63 CTX0  =  6
64 CTX1  =  7
65 IDX0  =  8
66 IDX1  =  9
67 IDX2  = 10
68 IDX3  = 11
69 /*
70  * param data:  r24:r25
71  * param ctx:   r22:r23
72  */
73 .global threefish256_dec
74 threefish256_dec:
75         push r28
76         push r29
77         push_range 2, 17
78         movw DATA0, r24
79         movw CTX0, r22
80         clr I
81         ldi r26, 18
82         mov S, r26
83 1:
84         mov r30,  I
85         andi r30, 0x03
86         breq 2f
87         rjmp 4f
88 2:
89         ldi r30, lo8(threefish256_slut5)
90         ldi r31, hi8(threefish256_slut5)
91         add r30, S
92         adc r31, r1
93         lpm IDX0, Z+
94         lpm IDX1, Z+
95         lpm IDX2, Z+
96         lpm IDX3, Z
97         movw r30, CTX0
98         movw r26, DATA0
99         add r30, IDX0
100         adc r31, r1
101         rcall sub_z_from_x8
102         movw r30, CTX0
103         add r30, IDX1
104         adc r31, r1
105         rcall sub_z_from_x8
106         movw r30, CTX0
107         add r30, IDX2
108         adc r31, r1
109         rcall sub_z_from_x8
110         movw r30, CTX0
111         add r30, IDX3
112         adc r31, r1
113         rcall sub_z_from_x8
114
115         /* now the remaining key */
116         sbiw r26, 3*8
117         ldi r30, lo8(threefish256_slut3)
118         ldi r31, hi8(threefish256_slut3)
119         add r30, S
120         adc r31, r1
121         lpm IDX0, Z+
122         lpm IDX1, Z
123         movw r30, CTX0
124         adiw r30, 5*8
125         movw IDX2, r30
126         add r30, IDX0
127         adc r31, r1
128         rcall sub_z_from_x8
129         movw r30, IDX2
130         add r30, IDX1
131         adc r31, r1
132         rcall sub_z_from_x8
133         ld r0, X
134         sub r0, S
135         st X+, r0
136         ld r0, X
137         sbc r0, r1
138         st X+, r0
139         ld r0, X
140         sbc r0, r1
141         st X+, r0
142         ld r0, X
143         sbc r0, r1
144         st X+, r0
145         ld r0, X
146         sbc r0, r1
147         st X+, r0
148         ld r0, X
149         sbc r0, r1
150         st X+, r0
151         ld r0, X
152         sbc r0, r1
153         st X+, r0
154         ld r0, X
155         sbc r0, r1
156         st X+, r0
157         tst S
158         brne 3f
159 exit:
160         pop_range 2, 17
161         pop r29
162         pop r28
163         ret
164 3:
165         dec S
166 4:
167         /* now the permutation */
168         movw r26, DATA0
169         adiw r26, 8
170         movw r30, r26
171         adiw r30, 16
172         ld IDX0, X
173         ld IDX1, Z
174         st X+, IDX1
175         st Z+, IDX0
176         ld IDX0, X
177         ld IDX1, Z
178         st X+, IDX1
179         st Z+, IDX0
180         ld IDX0, X
181         ld IDX1, Z
182         st X+, IDX1
183         st Z+, IDX0
184         ld IDX0, X
185         ld IDX1, Z
186         st X+, IDX1
187         st Z+, IDX0
188         ld IDX0, X
189         ld IDX1, Z
190         st X+, IDX1
191         st Z+, IDX0
192         ld IDX0, X
193         ld IDX1, Z
194         st X+, IDX1
195         st Z+, IDX0
196         ld IDX0, X
197         ld IDX1, Z
198         st X+, IDX1
199         st Z+, IDX0
200         ld IDX0, X
201         ld IDX1, Z
202         st X+, IDX1
203         st Z+, IDX0
204         /* call mix */
205         ldi r30, lo8(threefish256_rc0)
206         ldi r31, hi8(threefish256_rc0)
207         mov r26, I
208         andi r26, 0x07
209         add r30, r26
210         adc r31, r1
211         lpm r22, Z
212         adiw r30, 8
213         lpm IDX0, Z
214         movw r24, DATA0
215         call threefish_invmix_asm /* no rcall? */
216         movw r24, DATA0
217         adiw r24, 16
218         mov r22, IDX0
219         call threefish_invmix_asm /* no rcall? */
220         inc I
221         rjmp 1b
222
223 threefish256_slut5:
224     .byte 0x00, 0x08, 0x10, 0x18, 0x20, 0x00, 0x08, 0x10
225         .byte 0x18, 0x20, 0x00, 0x08, 0x10, 0x18, 0x20, 0x00
226         .byte 0x08, 0x10, 0x18, 0x20, 0x00, 0x08, 0x10
227 threefish256_slut3:
228         .byte 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08
229         .byte 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00
230         .byte 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08
231 /* old round constants
232 threefish256_rc0: .byte 0x73, 0x13, 0x7b, 0x32, 0x72, 0x2b, 0x44, 0x1b
233 threefish256_rc1: .byte 0x62, 0x52, 0x43, 0x24, 0x54, 0x6a, 0x34, 0x70
234 */
235 threefish256_rc0:  .byte 0x40, 0x72, 0x6a, 0x31, 0x1b, 0x39, 0x64, 0x2a
236 threefish256_rc1:  .byte 0x40, 0x3a, 0x14, 0x41, 0x5b, 0x50, 0x71, 0x20
237
238
239 sub_z_from_x8:
240         ld r0, Z+
241         ld r1, X
242         sub r1, r0
243         st X+, r1
244         ld r0, Z+
245         ld r1, X
246         sbc r1, r0
247         st X+, r1
248         ld r0, Z+
249         ld r1, X
250         sbc r1, r0
251         st X+, r1
252         ld r0, Z+
253         ld r1, X
254         sbc r1, r0
255         st X+, r1
256         ld r0, Z+
257         ld r1, X
258         sbc r1, r0
259         st X+, r1
260         ld r0, Z+
261         ld r1, X
262         sbc r1, r0
263         st X+, r1
264         ld r0, Z+
265         ld r1, X
266         sbc r1, r0
267         st X+, r1
268         ld r0, Z+
269         ld r1, X
270         sbc r1, r0
271         st X+, r1
272         clr r1
273         ret
274
275
276
277
278
279
280
281
282
283