]> git.cryptolib.org Git - avr-crypto-lib.git/blob - skein/threefish_mix_4c.S
fixing E-Mail-Address & Copyright
[avr-crypto-lib.git] / skein / threefish_mix_4c.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
63 threefish_mix:
64         push r28
65         push r29
66         push_range 10, 17
67         movw r28, r24
68         mov vROT,r22
69         ldd A0, Y+ 0
70         ldd A1, Y+ 1
71         ldd A2, Y+ 2
72         ldd A3, Y+ 3
73         ldd A4, Y+ 4
74         ldd A5, Y+ 5
75         ldd A6, Y+ 6
76         ldd A7, Y+ 7
77         ldd B0, Y+ 8
78         ldd B1, Y+ 9
79         ldd B2, Y+10
80         ldd B3, Y+11
81         ldd B4, Y+12
82         ldd B5, Y+13
83         ldd B6, Y+14
84         ldd B7, Y+15
85         add A0, B0
86         adc A1, B1
87         adc A2, B2
88         adc A3, B3
89         adc A4, B4
90         adc A5, B5
91         adc A6, B6
92         adc A7, B7
93
94         mov r26, vROT
95         adiw r26, 3
96         lsr r26
97         lsr r26
98         lsr r26
99 ;       andi r26, 0x07
100         ldi r30, pm_lo8(byte_rot_jmptable)
101         ldi r31, pm_hi8(byte_rot_jmptable)
102         add r30, r26
103         adc r31, r1
104         ijmp
105 post_byterot:
106         ldi r30, lo8(bit_rot_lut)
107         ldi r31, hi8(bit_rot_lut)
108         andi vROT, 0x07
109         add r30, vROT
110         adc r31, r1
111         lpm r27, Z
112         bst r27, 7
113         andi r27, 0x07
114         brts 1f
115         rjmp bit_rotl
116 1:      rjmp bit_rotr
117 post_bitrot:    
118         eor B0, A0
119         eor B1, A1
120         eor B2, A2
121         eor B3, A3
122         eor B4, A4
123         eor B5, A5
124         eor B6, A6
125         eor B7, A7
126
127         std Y+ 0, A0
128         std Y+ 1, A1
129         std Y+ 2, A2
130         std Y+ 3, A3
131         std Y+ 4, A4
132         std Y+ 5, A5
133         std Y+ 6, A6
134         std Y+ 7, A7
135         std Y+ 8, B0
136         std Y+ 9, B1
137         std Y+10, B2
138         std Y+11, B3
139         std Y+12, B4
140         std Y+13, B5
141         std Y+14, B6
142         std Y+15, B7
143 exit:
144         pop_range 10, 17
145         pop r29
146         pop r28
147         ret
148
149 bit_rot_lut:
150         .byte 0x00
151         .byte 0x01
152         .byte 0x02
153         .byte 0x03
154         .byte 0x04
155         .byte 0x83
156         .byte 0x82
157         .byte 0x81
158
159 byte_rot_jmptable:
160         rjmp  post_byterot;ret; rjmp  byte_rotr_0
161         rjmp  byte_rotr_7
162         rjmp  byte_rotr_6
163         rjmp  byte_rotr_5
164         rjmp  byte_rotr_4
165         rjmp  byte_rotr_3
166         rjmp  byte_rotr_2
167         rjmp  byte_rotr_1
168         rjmp  post_byterot;ret; rjmp  byte_rotr_0
169         
170 ; 0 1 2 3 4 5 6 7
171 ; 1 2 3 4 5 6 7 0
172
173 byte_rotr_1: /* 10 words */
174         mov r0, B0
175         mov B0, B1
176         mov B1, B2
177         mov B2, B3
178         mov B3, B4
179         mov B4, B5
180         mov B5, B6
181         mov B6, B7
182         mov B7, r0
183 byte_rotr_0:    
184         rjmp post_byterot
185
186 ; 0 1 2 3 4 5 6 7       
187 ; 2 3 4 5 6 7 0 1
188         
189 byte_rotr_2: /* 11 words */
190         mov r0, B0
191         mov B0, B2
192         mov B2, B4
193         mov B4, B6
194         mov B6, r0
195         mov r0, B1
196         mov B1, B3
197         mov B3, B5
198         mov B5, B7
199         mov B7, r0
200         rjmp post_byterot
201
202 ; 0 1 2 3 4 5 6 7
203 ; 3 4 5 6 7 0 1 2
204
205 byte_rotr_3: /* 10 words */
206         mov r0, B0
207         mov B0, B3
208         mov B3, B6
209         mov B6, B1
210         mov B1, B4
211         mov B4, B7
212         mov B7, B2
213         mov B2, B5
214         mov B5, r0
215         rjmp post_byterot
216
217 ; 0 1 2 3 4 5 6 7
218 ; 4 5 6 7 0 1 2 3
219 byte_rotr_4: /* 13 words */
220         mov r0, B0
221         mov B0, B4
222         mov B4, r0
223         
224         mov r0, B1
225         mov B1, B5
226         mov B5, r0
227         
228         mov r0, B2
229         mov B2, B6
230         mov B6, r0
231         
232         mov r0, B3
233         mov B3, B7
234         mov B7, r0
235         rjmp post_byterot
236
237 ; 0 1 2 3 4 5 6 7
238 ; 5 6 7 0 1 2 3 4
239 byte_rotr_5: /* 10 words */
240         mov r0, B0
241         mov B0, B5
242         mov B5, B2
243         mov B2, B7
244         mov B7, B4
245         mov B4, B1
246         mov B1, B6
247         mov B6, B3
248         mov B3, r0
249         rjmp post_byterot
250         
251 ; 0 1 2 3 4 5 6 7
252 ; 6 7 0 1 2 3 4 5
253 byte_rotr_6: /* 11 words */
254         mov r0, B0
255         mov B0, B6
256         mov B6, B4
257         mov B4, B2
258         mov B2, r0
259         
260         mov r0, B1
261         mov B1, B7
262         mov B7, B5
263         mov B5, B3
264         mov B3, r0
265         rjmp post_byterot
266
267 ; 0 1 2 3 4 5 6 7
268 ; 7 0 1 2 3 4 5 6
269 byte_rotr_7: /* 10 words */
270         mov r0, B7
271         mov B7, B6
272         mov B6, B5
273         mov B5, B4
274         mov B4, B3
275         mov B3, B2
276         mov B2, B1
277         mov B1, B0
278         mov B0, r0
279         rjmp post_byterot
280
281 bit_rotl:
282         tst r27
283         brne 1f
284         rjmp post_bitrot
285 1:      mov r0, B7
286         rol r0
287         rol B0
288         rol B1
289         rol B2
290         rol B3
291         rol B4
292         rol B5
293         rol B6
294         rol B7
295         dec r27
296         rjmp bit_rotl
297         
298 bit_rotr:
299         tst r27
300         brne 1f
301         rjmp post_bitrot
302 1:      mov r0, B0
303         ror r0
304         ror B7
305         ror B6
306         ror B5
307         ror B4
308         ror B3
309         ror B2
310         ror B1
311         ror B0
312         dec r27
313         rjmp bit_rotr
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328