]> git.cryptolib.org Git - avr-crypto-lib.git/blob - aes/aes_dec-asm.S
new and more compact aes
[avr-crypto-lib.git] / aes / aes_dec-asm.S
1 /* aes_dec-asm.S */
2 /*
3     This file is part of the AVR-Crypto-Lib.
4     Copyright (C) 2008, 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  * \file     aes_dec-asm.S
21  * \email    daniel.otte@rub.de
22  * \author   Daniel Otte 
23  * \date     2009-01-10
24  * \license  GPLv3 or later
25  * 
26  */
27
28 #include "avr-asm-macros.S"
29 A = 28
30 B = 29
31 P = 0
32 xREDUCER = 25 
33 gf256mul:
34         clr P
35 1:      
36         lsr A
37         breq 4f
38         brcc 2f
39         eor P, B
40 2:
41         lsl B
42         brcc 3f
43         eor B, xREDUCER 
44 3:
45         rjmp 1b
46 4:
47         brcc 2f
48         eor P, B
49 2:
50         ret
51
52 .global aes256_dec
53 aes256_dec:
54         ldi r20, 14
55         rjmp aes_decrypt_core
56
57 .global aes192_dec
58 aes192_dec:
59         ldi r20, 12
60         rjmp aes_decrypt_core
61
62 .global aes128_dec
63 aes128_dec:
64         ldi r20, 10
65
66
67 /*
68   void aes_decrypt_core(aes_cipher_state_t *state, const aes_genctx_t *ks, uint8_t rounds)
69 */
70 T0= 2
71 T1= 3
72 T2= 4
73 T3= 5
74 T4 = 6
75 T5 = 7
76 ST00 =  8
77 ST01 =  9
78 ST02 = 10
79 ST03 = 11
80 ST10 = 12
81 ST11 = 13
82 ST12 = 14
83 ST13 = 15
84 ST20 = 16
85 ST21 = 17
86 ST22 = 18
87 ST23 = 19
88 ST30 = 20
89 ST31 = 21
90 ST32 = 22
91 ST33 = 23
92 CTR = 24
93 /*
94  * param state:  r24:r25
95  * param ks:     r22:r23
96  * param rounds: r20   
97  */
98 .global aes_decrypt_core
99 aes_decrypt_core:
100         push_range 2, 17
101         push r28
102         push r29
103         push r24
104         push r25
105         movw r26, r22
106         movw r30, r24
107         mov  CTR, r20
108         inc r20
109         swap r20 /* r20*16 */
110         add r26, r20
111         adc r27, r1
112         clt
113 ;       ldi CTR, 2      
114         .irp param, ST00, ST01, ST02, ST03, ST10, ST11, ST12, ST13, ST20, ST21, ST22, ST23, ST30, ST31, ST32, ST33
115                 ld \param, Z+
116         .endr
117         
118         ldi xREDUCER, 0x1b /* load reducer */
119         ldi r31, hi8(aes_invsbox)
120         
121
122         .irp param, ST33, ST32, ST31, ST30, ST23, ST22, ST21, ST20, ST13, ST12, ST11, ST10, ST03, ST02, ST01, ST00
123                 ld r0, -X
124                 eor \param, r0
125         .endr
126 1:
127         dec CTR
128         brne 2f
129         set
130 2:      
131         /* substitute and invShift */
132         .irp param, ST00, ST10, ST20, ST30
133                 mov r30, \param
134                 lpm \param, Z
135         .endr
136         mov r30, ST31
137         lpm T0, Z
138         mov r30, ST21
139         lpm ST31, Z
140         mov r30, ST11
141         lpm ST21, Z
142         mov r30, ST01
143         lpm ST11, Z
144         mov ST01, T0
145         
146         mov r30, ST32
147         lpm T0, Z
148         mov r30, ST22
149         lpm T1,Z
150         mov r30, ST12
151         lpm ST32, Z
152         mov r30, ST02
153         lpm ST22, Z
154         mov ST12, T0
155         mov ST02, T1
156         
157         mov r30, ST03
158         lpm T0, Z
159         mov r30, ST13
160         lpm ST03, Z
161         mov r30, ST23
162         lpm ST13, Z
163         mov r30, ST33
164         lpm ST23, Z
165         mov ST33, T0
166         
167         /* key addition */
168         .irp param, ST33, ST32, ST31, ST30, ST23, ST22, ST21, ST20, ST13, ST12, ST11, ST10, ST03, ST02, ST01, ST00
169                 ld r0, -X
170                 eor \param, r0
171         .endr
172         brtc 2f
173 exit:
174         pop r31
175         pop r30
176         st Z+, ST00
177         st Z+, ST01
178         st Z+, ST02
179         st Z+, ST03
180         st Z+, ST10
181         st Z+, ST11
182         st Z+, ST12
183         st Z+, ST13
184         st Z+, ST20
185         st Z+, ST21
186         st Z+, ST22
187         st Z+, ST23
188         st Z+, ST30
189         st Z+, ST31
190         st Z+, ST32
191         st Z+, ST33
192         pop r29
193         pop r28
194         pop_range 2, 17
195         ret
196 2:      
197         /* inv column (row) mixing*/
198         /* invMixCol (Row) 1 */
199                 /* preparing */
200         mov T0, ST03
201         eor T0, ST02 ; T0 = t
202         mov T1, ST00
203         eor T1, ST01 ; T1 = u
204         mov T2, T0
205         eor T2, T1
206
207         mov B, T2
208         ldi A, 0x08
209         rcall gf256mul
210         eor T2, P  ; T2 = v'
211         
212         mov B, ST02
213         eor B, ST00
214         ldi A, 0x04
215         rcall gf256mul
216         mov T3, P
217         eor T3, T2;  T3 = w
218         
219         mov B, ST03
220         eor B, ST01
221         ldi A, 0x04
222         rcall gf256mul
223         eor T2, P ; T2 = v
224          
225            /* now the big move */
226         mov T4, ST00
227         eor T4, ST03
228         lsl T4
229         brcc 3f
230         eor T4, xREDUCER
231 3:  eor T4, T2
232         eor ST03, T4    
233
234         mov T4, ST02
235         eor T4, ST01
236         lsl T4
237         brcc 3f
238         eor T4, xREDUCER
239 3:  eor T4, T2
240         eor ST01, T4
241         
242         lsl T0
243         brcc 3f
244         eor T0, xREDUCER
245 3:  eor T0, T3
246         eor ST02, T0
247         
248         lsl T1
249         brcc 3f
250         eor T1, xREDUCER
251 3:  eor T1, T3
252         eor ST00, T1
253
254         /* invMixCol (Row) 2 */
255                 /* preparing */
256         mov T0, ST13
257         eor T0, ST12 ; T0 = t
258         mov T1, ST10
259         eor T1, ST11 ; T1 = u
260         mov T2, T0
261         eor T2, T1
262
263         mov B, T2
264         ldi A, 0x08
265         rcall gf256mul
266         eor T2, P  ; T2 = v'
267         
268         mov B, ST12
269         eor B, ST10
270         ldi A, 0x04
271         rcall gf256mul
272         mov T3, P
273         eor T3, T2;  T3 = w
274         
275         mov B, ST13
276         eor B, ST11
277         ldi A, 0x04
278         rcall gf256mul
279         eor T2, P ; T2 = v
280          
281            /* now the big move */
282         mov T4, ST10
283         eor T4, ST13
284         lsl T4
285         brcc 3f
286         eor T4, xREDUCER
287 3:  eor T4, T2
288         eor ST13, T4    
289
290         mov T4, ST12
291         eor T4, ST11
292         lsl T4
293         brcc 3f
294         eor T4, xREDUCER
295 3:  eor T4, T2
296         eor ST11, T4
297         
298         lsl T0
299         brcc 3f
300         eor T0, xREDUCER
301 3:  eor T0, T3
302         eor ST12, T0
303         
304         lsl T1
305         brcc 3f
306         eor T1, xREDUCER
307 3:  eor T1, T3
308         eor ST10, T1
309         
310         /* invMixCol (Row) 2 */
311                 /* preparing */
312         mov T0, ST23
313         eor T0, ST22 ; T0 = t
314         mov T1, ST20
315         eor T1, ST21 ; T1 = u
316         mov T2, T0
317         eor T2, T1
318
319         mov B, T2
320         ldi A, 0x08
321         rcall gf256mul
322         eor T2, P  ; T2 = v'
323         
324         mov B, ST22
325         eor B, ST20
326         ldi A, 0x04
327         rcall gf256mul
328         mov T3, P
329         eor T3, T2;  T3 = w
330         
331         mov B, ST23
332         eor B, ST21
333         ldi A, 0x04
334         rcall gf256mul
335         eor T2, P ; T2 = v
336          
337            /* now the big move */
338         mov T4, ST20
339         eor T4, ST23
340         lsl T4
341         brcc 3f
342         eor T4, xREDUCER
343 3:  eor T4, T2
344         eor ST23, T4    
345
346         mov T4, ST22
347         eor T4, ST21
348         lsl T4
349         brcc 3f
350         eor T4, xREDUCER
351 3:  eor T4, T2
352         eor ST21, T4
353         
354         lsl T0
355         brcc 3f
356         eor T0, xREDUCER
357 3:  eor T0, T3
358         eor ST22, T0
359         
360         lsl T1
361         brcc 3f
362         eor T1, xREDUCER
363 3:  eor T1, T3
364         eor ST20, T1
365         
366         /* invMixCol (Row) 3 */
367                 /* preparing */
368         mov T0, ST33
369         eor T0, ST32 ; T0 = t
370         mov T1, ST30
371         eor T1, ST31 ; T1 = u
372         mov T2, T0
373         eor T2, T1
374
375         mov B, T2
376         ldi A, 0x08
377         rcall gf256mul
378         eor T2, P  ; T2 = v'
379         
380         mov B, ST32
381         eor B, ST30
382         ldi A, 0x04
383         rcall gf256mul
384         mov T3, P
385         eor T3, T2;  T3 = w
386         
387         mov B, ST33
388         eor B, ST31
389         ldi A, 0x04
390         rcall gf256mul
391         eor T2, P ; T2 = v
392          
393            /* now the big move */
394         mov T4, ST30
395         eor T4, ST33
396         lsl T4
397         brcc 3f
398         eor T4, xREDUCER
399 3:  eor T4, T2
400         eor ST33, T4    
401
402         mov T4, ST32
403         eor T4, ST31
404         lsl T4
405         brcc 3f
406         eor T4, xREDUCER
407 3:  eor T4, T2
408         eor ST31, T4
409         
410         lsl T0
411         brcc 3f
412         eor T0, xREDUCER
413 3:  eor T0, T3
414         eor ST32, T0
415         
416         lsl T1
417         brcc 3f
418         eor T1, xREDUCER
419 3:  eor T1, T3
420         eor ST30, T1
421         
422         rjmp 1b
423         
424         
425