]> git.cryptolib.org Git - avr-crypto-lib.git/blob - skein/threefish_invmix.S
fixing E-Mail-Address & Copyright
[avr-crypto-lib.git] / skein / threefish_invmix.S
1 /* threefish_invmix.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-21
23  * \license GPLv3 or later
24  */ 
25
26 #include "avr-asm-macros.S"
27
28 /*
29 #define X0 (((uint64_t*)data)[0])
30 #define X1 (((uint64_t*)data)[1])
31 void threefish_invmix(void *data, uint8_t rot){
32         uint64_t x;
33         x = X1;
34         x ^= X0;
35         X1 = ((x>>rot)|(x<<(64-rot)));
36         X0 -= X1;
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_invmix_asm
63 threefish_invmix_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         eor B0, A0
83         eor B1, A1
84         eor B2, A2
85         eor B3, A3
86         eor B4, A4
87         eor B5, A5
88         eor B6, A6
89         eor B7, A7
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_rotr
104 1:      rjmp bit_rotl
105 post_bitrot:    
106         sub A0, B0
107         sbc A1, B1
108         sbc A2, B2
109         sbc A3, B3
110         sbc A4, B4
111         sbc A5, B5
112         sbc A6, B6
113         sbc A7, B7
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_1
137         rjmp  byte_rotr_2
138         rjmp  byte_rotr_3
139         rjmp  byte_rotr_4
140         rjmp  byte_rotr_5
141         rjmp  byte_rotr_6
142         rjmp  byte_rotr_7
143         rjmp  post_byterot;ret; rjmp  byte_rotr_0
144         
145
146         
147 ; 0 1 2 3 4 5 6 7
148 ; 1 2 3 4 5 6 7 0
149 ;.global byte_rotr_1
150 ;.global byte_rotr_0
151 byte_rotr_1: /* 10 words */
152         mov r0, B0
153         mov B0, B1
154         mov B1, B2
155         mov B2, B3
156         mov B3, B4
157         mov B4, B5
158         mov B5, B6
159         mov B6, B7
160         mov B7, r0
161 byte_rotr_0:    
162         rjmp post_byterot
163
164 ; 0 1 2 3 4 5 6 7       
165 ; 2 3 4 5 6 7 0 1
166 ;.global byte_rotr_2    
167 byte_rotr_2: /* 11 words */
168         mov r0, B0
169         mov B0, B2
170         mov B2, B4
171         mov B4, B6
172         mov B6, r0
173         mov r0, B1
174         mov B1, B3
175         mov B3, B5
176         mov B5, B7
177         mov B7, r0
178         rjmp post_byterot
179
180 ; 0 1 2 3 4 5 6 7
181 ; 3 4 5 6 7 0 1 2
182 ;.global byte_rotr_3
183 byte_rotr_3: /* 10 words */
184         mov r0, B0
185         mov B0, B3
186         mov B3, B6
187         mov B6, B1
188         mov B1, B4
189         mov B4, B7
190         mov B7, B2
191         mov B2, B5
192         mov B5, r0
193         rjmp post_byterot
194
195 ; 0 1 2 3 4 5 6 7
196 ; 4 5 6 7 0 1 2 3
197 ;.global byte_rotr_4
198 byte_rotr_4: /* 13 words */
199         mov r0, B0
200         mov B0, B4
201         mov B4, r0
202         
203         mov r0, B1
204         mov B1, B5
205         mov B5, r0
206         
207         mov r0, B2
208         mov B2, B6
209         mov B6, r0
210         
211         mov r0, B3
212         mov B3, B7
213         mov B7, r0
214         rjmp post_byterot
215
216 ; 0 1 2 3 4 5 6 7
217 ; 5 6 7 0 1 2 3 4
218 ;.global byte_rotr_5
219 byte_rotr_5: /* 10 words */
220         mov r0, B0
221         mov B0, B5
222         mov B5, B2
223         mov B2, B7
224         mov B7, B4
225         mov B4, B1
226         mov B1, B6
227         mov B6, B3
228         mov B3, r0
229         rjmp post_byterot
230         
231 ; 0 1 2 3 4 5 6 7
232 ; 6 7 0 1 2 3 4 5
233 ;.global byte_rotr_6
234 byte_rotr_6: /* 11 words */
235         mov r0, B0
236         mov B0, B6
237         mov B6, B4
238         mov B4, B2
239         mov B2, r0
240         
241         mov r0, B1
242         mov B1, B7
243         mov B7, B5
244         mov B5, B3
245         mov B3, r0
246         rjmp post_byterot
247
248 ; 0 1 2 3 4 5 6 7
249 ; 7 0 1 2 3 4 5 6
250 ;.global byte_rotr_7
251 byte_rotr_7: /* 10 words */
252         mov r0, B7
253         mov B7, B6
254         mov B6, B5
255         mov B5, B4
256         mov B4, B3
257         mov B3, B2
258         mov B2, B1
259         mov B1, B0
260         mov B0, r0
261         rjmp post_byterot
262
263 ;.global bit_rotl
264 bit_rotl:
265         tst vROT
266         brne 1f
267         rjmp post_bitrot
268 1:      mov r0, B7
269         rol r0
270         rol B0
271         rol B1
272         rol B2
273         rol B3
274         rol B4
275         rol B5
276         rol B6
277         rol B7
278         dec vROT
279         rjmp bit_rotl
280         
281 ;.global bit_rotr
282 bit_rotr:
283         tst vROT
284         brne 1f
285         rjmp post_bitrot
286 1:      mov r0, B0
287         ror r0
288         ror B7
289         ror B6
290         ror B5
291         ror B4
292         ror B3
293         ror B2
294         ror B1
295         ror B0
296         dec vROT
297         rjmp bit_rotr
298
299