]> git.cryptolib.org Git - avr-crypto-lib.git/blob - skein/threefish_mix.S
new and more compact aes
[avr-crypto-lib.git] / skein / threefish_mix.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 #define B0 (((uint64_t*)data)[0])
30 #define B1 (((uint64_t*)data)[1])
31 static
32 void mix(void *data, uint8_t rot){
33         uint64_t x;
34         x = B1;
35         B0 += x;
36         B1 = ((x<<rot)|(x>>(64-rot))) ^ B0;
37 }
38 */
39 A0 = 10
40 A1 = 11
41 A2 = 12
42 A3 = 13
43 A4 = 14
44 A5 = 15
45 A6 = 16
46 A7 = 17
47
48 B0 = 18
49 B1 = 19
50 B2 = 20
51 B3 = 21
52 B4 = 22
53 B5 = 23
54 B6 = 24
55 B7 = 25
56 vROT = 27
57 /*
58  * param data:  r24:r25
59  * param rot:   r22
60  */
61
62 .global threefish_mix_asm
63 threefish_mix_asm:
64         movw r28, r24
65         mov vROT,r22
66         ldd A0, Y+ 0
67         ldd A1, Y+ 1
68         ldd A2, Y+ 2
69         ldd A3, Y+ 3
70         ldd A4, Y+ 4
71         ldd A5, Y+ 5
72         ldd A6, Y+ 6
73         ldd A7, Y+ 7
74         ldd B0, Y+ 8
75         ldd B1, Y+ 9
76         ldd B2, Y+10
77         ldd B3, Y+11
78         ldd B4, Y+12
79         ldd B5, Y+13
80         ldd B6, Y+14
81         ldd B7, Y+15
82         add A0, B0
83         adc A1, B1
84         adc A2, B2
85         adc A3, B3
86         adc A4, B4
87         adc A5, B5
88         adc A6, B6
89         adc A7, B7
90
91         mov r26, vROT
92         swap r26
93         andi r26, 0x07
94         ldi r30, pm_lo8(byte_rot_jmptable)
95         ldi r31, pm_hi8(byte_rot_jmptable)
96         add r30, r26
97         adc r31, r1
98         ijmp
99 post_byterot:
100         bst vROT, 3
101         andi vROT, 0x07
102         brts 1f
103         rjmp bit_rotl
104 1:      rjmp bit_rotr
105 post_bitrot:    
106         eor B0, A0
107         eor B1, A1
108         eor B2, A2
109         eor B3, A3
110         eor B4, A4
111         eor B5, A5
112         eor B6, A6
113         eor B7, A7
114
115         std Y+ 0, A0
116         std Y+ 1, A1
117         std Y+ 2, A2
118         std Y+ 3, A3
119         std Y+ 4, A4
120         std Y+ 5, A5
121         std Y+ 6, A6
122         std Y+ 7, A7
123         std Y+ 8, B0
124         std Y+ 9, B1
125         std Y+10, B2
126         std Y+11, B3
127         std Y+12, B4
128         std Y+13, B5
129         std Y+14, B6
130         std Y+15, B7
131 exit:
132         ret
133
134
135 byte_rot_jmptable:
136         rjmp  post_byterot;ret; rjmp  byte_rotr_0
137         rjmp  byte_rotr_7
138         rjmp  byte_rotr_6
139         rjmp  byte_rotr_5
140         rjmp  byte_rotr_4
141         rjmp  byte_rotr_3
142         rjmp  byte_rotr_2
143         rjmp  byte_rotr_1
144         rjmp  post_byterot;ret; rjmp  byte_rotr_0
145         
146 ; 0 1 2 3 4 5 6 7
147 ; 1 2 3 4 5 6 7 0
148 ;.global byte_rotr_1
149 ;.global byte_rotr_0
150 byte_rotr_1: /* 10 words */
151         mov r0, B0
152         mov B0, B1
153         mov B1, B2
154         mov B2, B3
155         mov B3, B4
156         mov B4, B5
157         mov B5, B6
158         mov B6, B7
159         mov B7, r0
160 byte_rotr_0:    
161         rjmp post_byterot
162
163 ; 0 1 2 3 4 5 6 7       
164 ; 2 3 4 5 6 7 0 1
165 ;.global byte_rotr_2    
166 byte_rotr_2: /* 11 words */
167         mov r0, B0
168         mov B0, B2
169         mov B2, B4
170         mov B4, B6
171         mov B6, r0
172         mov r0, B1
173         mov B1, B3
174         mov B3, B5
175         mov B5, B7
176         mov B7, r0
177         rjmp post_byterot
178
179 ; 0 1 2 3 4 5 6 7
180 ; 3 4 5 6 7 0 1 2
181 ;.global byte_rotr_3
182 byte_rotr_3: /* 10 words */
183         mov r0, B0
184         mov B0, B3
185         mov B3, B6
186         mov B6, B1
187         mov B1, B4
188         mov B4, B7
189         mov B7, B2
190         mov B2, B5
191         mov B5, r0
192         rjmp post_byterot
193
194 ; 0 1 2 3 4 5 6 7
195 ; 4 5 6 7 0 1 2 3
196 ;.global byte_rotr_4
197 byte_rotr_4: /* 13 words */
198         mov r0, B0
199         mov B0, B4
200         mov B4, r0
201         
202         mov r0, B1
203         mov B1, B5
204         mov B5, r0
205         
206         mov r0, B2
207         mov B2, B6
208         mov B6, r0
209         
210         mov r0, B3
211         mov B3, B7
212         mov B7, r0
213         rjmp post_byterot
214
215 ; 0 1 2 3 4 5 6 7
216 ; 5 6 7 0 1 2 3 4
217 ;.global byte_rotr_5
218 byte_rotr_5: /* 10 words */
219         mov r0, B0
220         mov B0, B5
221         mov B5, B2
222         mov B2, B7
223         mov B7, B4
224         mov B4, B1
225         mov B1, B6
226         mov B6, B3
227         mov B3, r0
228         rjmp post_byterot
229         
230 ; 0 1 2 3 4 5 6 7
231 ; 6 7 0 1 2 3 4 5
232 ;.global byte_rotr_6
233 byte_rotr_6: /* 11 words */
234         mov r0, B0
235         mov B0, B6
236         mov B6, B4
237         mov B4, B2
238         mov B2, r0
239         
240         mov r0, B1
241         mov B1, B7
242         mov B7, B5
243         mov B5, B3
244         mov B3, r0
245         rjmp post_byterot
246
247 ; 0 1 2 3 4 5 6 7
248 ; 7 0 1 2 3 4 5 6
249 ;.global byte_rotr_7
250 byte_rotr_7: /* 10 words */
251         mov r0, B7
252         mov B7, B6
253         mov B6, B5
254         mov B5, B4
255         mov B4, B3
256         mov B3, B2
257         mov B2, B1
258         mov B1, B0
259         mov B0, r0
260         rjmp post_byterot
261
262 ;.global bit_rotl
263 bit_rotl:
264         tst vROT
265         brne 1f
266         rjmp post_bitrot
267 1:      mov r0, B7
268         rol r0
269         rol B0
270         rol B1
271         rol B2
272         rol B3
273         rol B4
274         rol B5
275         rol B6
276         rol B7
277         dec vROT
278         rjmp bit_rotl
279         
280 ;.global bit_rotr
281 bit_rotr:
282         tst vROT
283         brne 1f
284         rjmp post_bitrot
285 1:      mov r0, B0
286         ror r0
287         ror B7
288         ror B6
289         ror B5
290         ror B4
291         ror B3
292         ror B2
293         ror B1
294         ror B0
295         dec vROT
296         rjmp bit_rotr
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311