]> git.cryptolib.org Git - avr-crypto-lib.git/blob - threefish_mix.S
2a35940ae86b93259900a196d833b1911124219c
[avr-crypto-lib.git] / threefish_mix.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 #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 byte_rot_jmptable:
135         rjmp  post_byterot;ret; rjmp  byte_rotr_0
136         rjmp  byte_rotr_7
137         rjmp  byte_rotr_6
138         rjmp  byte_rotr_5
139         rjmp  byte_rotr_4
140         rjmp  byte_rotr_3
141         rjmp  byte_rotr_2
142         rjmp  byte_rotr_1
143         rjmp  post_byterot;ret; rjmp  byte_rotr_0
144         
145 ; 0 1 2 3 4 5 6 7
146 ; 1 2 3 4 5 6 7 0
147
148 byte_rotr_1: /* 10 words */
149         mov r0, B0
150         mov B0, B1
151         mov B1, B2
152         mov B2, B3
153         mov B3, B4
154         mov B4, B5
155         mov B5, B6
156         mov B6, B7
157         mov B7, r0
158 byte_rotr_0:    
159         rjmp post_byterot
160
161 ; 0 1 2 3 4 5 6 7       
162 ; 2 3 4 5 6 7 0 1
163         
164 byte_rotr_2: /* 11 words */
165         mov r0, B0
166         mov B0, B2
167         mov B2, B4
168         mov B4, B6
169         mov B6, r0
170         mov r0, B1
171         mov B1, B3
172         mov B3, B5
173         mov B5, B7
174         mov B7, r0
175         rjmp post_byterot
176
177 ; 0 1 2 3 4 5 6 7
178 ; 3 4 5 6 7 0 1 2
179
180 byte_rotr_3: /* 10 words */
181         mov r0, B0
182         mov B0, B3
183         mov B3, B6
184         mov B6, B1
185         mov B1, B4
186         mov B4, B7
187         mov B7, B2
188         mov B2, B5
189         mov B5, r0
190         rjmp post_byterot
191
192 ; 0 1 2 3 4 5 6 7
193 ; 4 5 6 7 0 1 2 3
194 byte_rotr_4: /* 13 words */
195         mov r0, B0
196         mov B0, B4
197         mov B4, r0
198         
199         mov r0, B1
200         mov B1, B5
201         mov B5, r0
202         
203         mov r0, B2
204         mov B2, B6
205         mov B6, r0
206         
207         mov r0, B3
208         mov B3, B7
209         mov B7, r0
210         rjmp post_byterot
211
212 ; 0 1 2 3 4 5 6 7
213 ; 5 6 7 0 1 2 3 4
214 byte_rotr_5: /* 10 words */
215         mov r0, B0
216         mov B0, B5
217         mov B5, B2
218         mov B2, B7
219         mov B7, B4
220         mov B4, B1
221         mov B1, B6
222         mov B6, B3
223         mov B3, r0
224         rjmp post_byterot
225         
226 ; 0 1 2 3 4 5 6 7
227 ; 6 7 0 1 2 3 4 5
228 byte_rotr_6: /* 11 words */
229         mov r0, B0
230         mov B0, B6
231         mov B6, B4
232         mov B4, B2
233         mov B2, r0
234         
235         mov r0, B1
236         mov B1, B7
237         mov B7, B5
238         mov B5, B3
239         mov B3, r0
240         rjmp post_byterot
241
242 ; 0 1 2 3 4 5 6 7
243 ; 7 0 1 2 3 4 5 6
244 byte_rotr_7: /* 10 words */
245         mov r0, B7
246         mov B7, B6
247         mov B6, B5
248         mov B5, B4
249         mov B4, B3
250         mov B3, B2
251         mov B2, B1
252         mov B1, B0
253         mov B0, r0
254         rjmp post_byterot
255
256 bit_rotl:
257         tst vROT
258         brne 1f
259         rjmp post_bitrot
260 1:      mov r0, B7
261         rol r0
262         rol B0
263         rol B1
264         rol B2
265         rol B3
266         rol B4
267         rol B5
268         rol B6
269         rol B7
270         dec vROT
271         rjmp bit_rotl
272         
273 bit_rotr:
274         tst vROT
275         brne 1f
276         rjmp post_bitrot
277 1:      mov r0, B0
278         ror r0
279         ror B7
280         ror B6
281         ror B5
282         ror B4
283         ror B3
284         ror B2
285         ror B1
286         ror B0
287         dec vROT
288         rjmp bit_rotr
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303