]> git.cryptolib.org Git - avr-crypto-lib.git/blob - aes/aes_dec-asm_faster.S
fixing style, typos and uart
[avr-crypto-lib.git] / aes / aes_dec-asm_faster.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
34 .global aes256_dec
35 aes256_dec:
36         ldi r20, 14
37         rjmp aes_decrypt_core
38
39 .global aes192_dec
40 aes192_dec:
41         ldi r20, 12
42         rjmp aes_decrypt_core
43
44 .global aes128_dec
45 aes128_dec:
46         ldi r20, 10
47
48
49 /*
50   void aes_decrypt_core(aes_cipher_state_t *state, const aes_genctx_t *ks, uint8_t rounds)
51 */
52 T0= 2
53 T1= 3
54 T2= 4
55 T3= 5
56 T4 = 6
57 T5 = 7
58 ST00 =  8
59 ST01 =  9
60 ST02 = 10
61 ST03 = 11
62 ST10 = 12
63 ST11 = 13
64 ST12 = 14
65 ST13 = 15
66 ST20 = 16
67 ST21 = 17
68 ST22 = 18
69 ST23 = 19
70 ST30 = 20
71 ST31 = 21
72 ST32 = 22
73 ST33 = 23
74 CTR = 24
75 /*
76  * param state:  r24:r25
77  * param ks:     r22:r23
78  * param rounds: r20   
79  */
80 .global aes_decrypt_core
81 aes_decrypt_core:
82         push_range 2, 17
83         push r28
84         push r29
85         push r24
86         push r25
87         movw r26, r22
88         movw r30, r24
89         mov  CTR, r20
90         inc r20
91         swap r20 /* r20*16 */
92         add r26, r20
93         adc r27, r1
94         clt
95         .irp param, ST00, ST01, ST02, ST03, ST10, ST11, ST12, ST13, ST20, ST21, ST22, ST23, ST30, ST31, ST32, ST33
96                 ld \param, Z+
97         .endr
98         
99         ldi xREDUCER, 0x1b /* load reducer */
100         
101
102         .irp param, ST33, ST32, ST31, ST30, ST23, ST22, ST21, ST20, ST13, ST12, ST11, ST10, ST03, ST02, ST01, ST00
103                 ld r0, -X
104                 eor \param, r0
105         .endr
106 1:
107         dec CTR
108         brne 2f
109         set
110 2:      
111         ldi r31, hi8(aes_invsbox)
112         /* substitute and invShift */
113         .irp param, ST00, ST10, ST20, ST30
114                 mov r30, \param
115                 lpm \param, Z
116         .endr
117         mov r30, ST31
118         lpm T0, Z
119         mov r30, ST21
120         lpm ST31, Z
121         mov r30, ST11
122         lpm ST21, Z
123         mov r30, ST01
124         lpm ST11, Z
125         mov ST01, T0
126         
127         mov r30, ST32
128         lpm T0, Z
129         mov r30, ST22
130         lpm T1,Z
131         mov r30, ST12
132         lpm ST32, Z
133         mov r30, ST02
134         lpm ST22, Z
135         mov ST12, T0
136         mov ST02, T1
137         
138         mov r30, ST03
139         lpm T0, Z
140         mov r30, ST13
141         lpm ST03, Z
142         mov r30, ST23
143         lpm ST13, Z
144         mov r30, ST33
145         lpm ST23, Z
146         mov ST33, T0
147         
148         /* key addition */
149         .irp param, ST33, ST32, ST31, ST30, ST23, ST22, ST21, ST20, ST13, ST12, ST11, ST10, ST03, ST02, ST01, ST00
150                 ld r0, -X
151                 eor \param, r0
152         .endr
153         brtc 2f
154 exit:
155         pop r31
156         pop r30
157         st Z+, ST00
158         st Z+, ST01
159         st Z+, ST02
160         st Z+, ST03
161         st Z+, ST10
162         st Z+, ST11
163         st Z+, ST12
164         st Z+, ST13
165         st Z+, ST20
166         st Z+, ST21
167         st Z+, ST22
168         st Z+, ST23
169         st Z+, ST30
170         st Z+, ST31
171         st Z+, ST32
172         st Z+, ST33
173         pop r29
174         pop r28
175         pop_range 2, 17
176         ret
177 2:      
178         /* inv column (row) mixing*/
179         /* invMixCol (Row) 1 */
180                 /* preparing */
181         ldi r31, hi8(lut_gf256mul_0x09)
182         mov T0, ST03
183         eor T0, ST02 ; T0 = t
184         mov T1, ST00
185         eor T1, ST01 ; T1 = u
186         mov r30, T0
187         eor r30, T1
188         lpm T2, Z  ; T2 = v'
189         
190         ldi r31, hi8(lut_gf256mul_0x04)
191         mov r30, ST02
192         eor r30, ST00
193         lpm T3, Z
194         eor T3, T2;  T3 = w
195         
196         mov r30, ST03
197         eor r30, ST01
198         lpm P, Z  ; T2 = v
199         eor T2, P 
200          
201            /* now the big move */
202         mov T4, ST00
203         eor T4, ST03
204         lsl T4
205         brcc 3f
206         eor T4, xREDUCER
207 3:  eor T4, T2
208         eor ST03, T4    
209
210         mov T4, ST02
211         eor T4, ST01
212         lsl T4
213         brcc 3f
214         eor T4, xREDUCER
215 3:  eor T4, T2
216         eor ST01, T4
217         
218         lsl T0
219         brcc 3f
220         eor T0, xREDUCER
221 3:  eor T0, T3
222         eor ST02, T0
223         
224         lsl T1
225         brcc 3f
226         eor T1, xREDUCER
227 3:  eor T1, T3
228         eor ST00, T1
229         
230         /* invMixCol (Row) 2 */
231                 /* preparing */
232         ldi r31, hi8(lut_gf256mul_0x09)
233         mov T0, ST13
234         eor T0, ST12 ; T0 = t
235         mov T1, ST10
236         eor T1, ST11 ; T1 = u
237         mov r30, T0
238         eor r30, T1
239
240         lpm T2, Z  ; T2 = v'
241         
242         ldi r31, hi8(lut_gf256mul_0x04)
243         mov r30, ST12
244         eor r30, ST10
245         lpm T3, Z
246         eor T3, T2;  T3 = w
247         
248         mov r30, ST13
249         eor r30, ST11
250         lpm P, Z
251         eor T2, P ; T2 = v
252          
253            /* now the big move */
254         mov T4, ST10
255         eor T4, ST13
256         lsl T4
257         brcc 3f
258         eor T4, xREDUCER
259 3:  eor T4, T2
260         eor ST13, T4    
261
262         mov T4, ST12
263         eor T4, ST11
264         lsl T4
265         brcc 3f
266         eor T4, xREDUCER
267 3:  eor T4, T2
268         eor ST11, T4
269         
270         lsl T0
271         brcc 3f
272         eor T0, xREDUCER
273 3:  eor T0, T3
274         eor ST12, T0
275         
276         lsl T1
277         brcc 3f
278         eor T1, xREDUCER
279 3:  eor T1, T3
280         eor ST10, T1
281         
282         /* invMixCol (Row) 2 */
283                 /* preparing */
284         ldi r31, hi8(lut_gf256mul_0x09)
285         mov T0, ST23
286         eor T0, ST22 ; T0 = t
287         mov T1, ST20
288         eor T1, ST21 ; T1 = u
289         mov r30, T0
290         eor r30, T1
291
292         lpm T2, Z  ; T2 = v'
293         
294         ldi r31, hi8(lut_gf256mul_0x04)
295         mov r30, ST22
296         eor r30, ST20
297         lpm T3, Z
298         eor T3, T2;  T3 = w
299         
300         mov r30, ST23
301         eor r30, ST21
302         lpm P, Z
303         eor T2, P ; T2 = v
304          
305            /* now the big move */
306         mov T4, ST20
307         eor T4, ST23
308         lsl T4
309         brcc 3f
310         eor T4, xREDUCER
311 3:  eor T4, T2
312         eor ST23, T4    
313
314         mov T4, ST22
315         eor T4, ST21
316         lsl T4
317         brcc 3f
318         eor T4, xREDUCER
319 3:  eor T4, T2
320         eor ST21, T4
321         
322         lsl T0
323         brcc 3f
324         eor T0, xREDUCER
325 3:  eor T0, T3
326         eor ST22, T0
327         
328         lsl T1
329         brcc 3f
330         eor T1, xREDUCER
331 3:  eor T1, T3
332         eor ST20, T1
333         
334         /* invMixCol (Row) 3 */
335                 /* preparing */
336         ldi r31, hi8(lut_gf256mul_0x09)
337         mov T0, ST33
338         eor T0, ST32 ; T0 = t
339         mov T1, ST30
340         eor T1, ST31 ; T1 = u
341         mov r30, T0
342         eor r30, T1
343
344         lpm T2, Z  ; T2 = v'
345         
346         ldi r31, hi8(lut_gf256mul_0x04)
347         mov r30, ST32
348         eor r30, ST30
349         lpm T3, Z
350         eor T3, T2;  T3 = w
351         
352         mov r30, ST33
353         eor r30, ST31
354         lpm P, Z
355         eor T2, P ; T2 = v
356          
357            /* now the big move */
358         mov T4, ST30
359         eor T4, ST33
360         lsl T4
361         brcc 3f
362         eor T4, xREDUCER
363 3:  eor T4, T2
364         eor ST33, T4    
365
366         mov T4, ST32
367         eor T4, ST31
368         lsl T4
369         brcc 3f
370         eor T4, xREDUCER
371 3:  eor T4, T2
372         eor ST31, T4
373         
374         lsl T0
375         brcc 3f
376         eor T0, xREDUCER
377 3:  eor T0, T3
378         eor ST32, T0
379         
380         lsl T1
381         brcc 3f
382         eor T1, xREDUCER
383 3:  eor T1, T3
384         eor ST30, T1
385         
386         rjmp 1b
387
388 .balign 256
389
390 lut_gf256mul_0x09:
391 .byte   0x00, 0x09, 0x12, 0x1B, 0x24, 0x2D, 0x36, 0x3F
392 .byte   0x48, 0x41, 0x5A, 0x53, 0x6C, 0x65, 0x7E, 0x77
393 .byte   0x90, 0x99, 0x82, 0x8B, 0xB4, 0xBD, 0xA6, 0xAF
394 .byte   0xD8, 0xD1, 0xCA, 0xC3, 0xFC, 0xF5, 0xEE, 0xE7
395 .byte   0x3B, 0x32, 0x29, 0x20, 0x1F, 0x16, 0x0D, 0x04
396 .byte   0x73, 0x7A, 0x61, 0x68, 0x57, 0x5E, 0x45, 0x4C
397 .byte   0xAB, 0xA2, 0xB9, 0xB0, 0x8F, 0x86, 0x9D, 0x94
398 .byte   0xE3, 0xEA, 0xF1, 0xF8, 0xC7, 0xCE, 0xD5, 0xDC
399 .byte   0x76, 0x7F, 0x64, 0x6D, 0x52, 0x5B, 0x40, 0x49
400 .byte   0x3E, 0x37, 0x2C, 0x25, 0x1A, 0x13, 0x08, 0x01
401 .byte   0xE6, 0xEF, 0xF4, 0xFD, 0xC2, 0xCB, 0xD0, 0xD9
402 .byte   0xAE, 0xA7, 0xBC, 0xB5, 0x8A, 0x83, 0x98, 0x91
403 .byte   0x4D, 0x44, 0x5F, 0x56, 0x69, 0x60, 0x7B, 0x72
404 .byte   0x05, 0x0C, 0x17, 0x1E, 0x21, 0x28, 0x33, 0x3A
405 .byte   0xDD, 0xD4, 0xCF, 0xC6, 0xF9, 0xF0, 0xEB, 0xE2
406 .byte   0x95, 0x9C, 0x87, 0x8E, 0xB1, 0xB8, 0xA3, 0xAA
407 .byte   0xEC, 0xE5, 0xFE, 0xF7, 0xC8, 0xC1, 0xDA, 0xD3
408 .byte   0xA4, 0xAD, 0xB6, 0xBF, 0x80, 0x89, 0x92, 0x9B
409 .byte   0x7C, 0x75, 0x6E, 0x67, 0x58, 0x51, 0x4A, 0x43
410 .byte   0x34, 0x3D, 0x26, 0x2F, 0x10, 0x19, 0x02, 0x0B
411 .byte   0xD7, 0xDE, 0xC5, 0xCC, 0xF3, 0xFA, 0xE1, 0xE8
412 .byte   0x9F, 0x96, 0x8D, 0x84, 0xBB, 0xB2, 0xA9, 0xA0
413 .byte   0x47, 0x4E, 0x55, 0x5C, 0x63, 0x6A, 0x71, 0x78
414 .byte   0x0F, 0x06, 0x1D, 0x14, 0x2B, 0x22, 0x39, 0x30
415 .byte   0x9A, 0x93, 0x88, 0x81, 0xBE, 0xB7, 0xAC, 0xA5
416 .byte   0xD2, 0xDB, 0xC0, 0xC9, 0xF6, 0xFF, 0xE4, 0xED
417 .byte   0x0A, 0x03, 0x18, 0x11, 0x2E, 0x27, 0x3C, 0x35
418 .byte   0x42, 0x4B, 0x50, 0x59, 0x66, 0x6F, 0x74, 0x7D
419 .byte   0xA1, 0xA8, 0xB3, 0xBA, 0x85, 0x8C, 0x97, 0x9E
420 .byte   0xE9, 0xE0, 0xFB, 0xF2, 0xCD, 0xC4, 0xDF, 0xD6
421 .byte   0x31, 0x38, 0x23, 0x2A, 0x15, 0x1C, 0x07, 0x0E
422 .byte   0x79, 0x70, 0x6B, 0x62, 0x5D, 0x54, 0x4F, 0x46 
423
424 lut_gf256mul_0x04:
425 .byte   0x00, 0x04, 0x08, 0x0C, 0x10, 0x14, 0x18, 0x1C
426 .byte   0x20, 0x24, 0x28, 0x2C, 0x30, 0x34, 0x38, 0x3C
427 .byte   0x40, 0x44, 0x48, 0x4C, 0x50, 0x54, 0x58, 0x5C
428 .byte   0x60, 0x64, 0x68, 0x6C, 0x70, 0x74, 0x78, 0x7C
429 .byte   0x80, 0x84, 0x88, 0x8C, 0x90, 0x94, 0x98, 0x9C
430 .byte   0xA0, 0xA4, 0xA8, 0xAC, 0xB0, 0xB4, 0xB8, 0xBC
431 .byte   0xC0, 0xC4, 0xC8, 0xCC, 0xD0, 0xD4, 0xD8, 0xDC
432 .byte   0xE0, 0xE4, 0xE8, 0xEC, 0xF0, 0xF4, 0xF8, 0xFC
433 .byte   0x1B, 0x1F, 0x13, 0x17, 0x0B, 0x0F, 0x03, 0x07
434 .byte   0x3B, 0x3F, 0x33, 0x37, 0x2B, 0x2F, 0x23, 0x27
435 .byte   0x5B, 0x5F, 0x53, 0x57, 0x4B, 0x4F, 0x43, 0x47
436 .byte   0x7B, 0x7F, 0x73, 0x77, 0x6B, 0x6F, 0x63, 0x67
437 .byte   0x9B, 0x9F, 0x93, 0x97, 0x8B, 0x8F, 0x83, 0x87
438 .byte   0xBB, 0xBF, 0xB3, 0xB7, 0xAB, 0xAF, 0xA3, 0xA7
439 .byte   0xDB, 0xDF, 0xD3, 0xD7, 0xCB, 0xCF, 0xC3, 0xC7
440 .byte   0xFB, 0xFF, 0xF3, 0xF7, 0xEB, 0xEF, 0xE3, 0xE7
441 .byte   0x36, 0x32, 0x3E, 0x3A, 0x26, 0x22, 0x2E, 0x2A
442 .byte   0x16, 0x12, 0x1E, 0x1A, 0x06, 0x02, 0x0E, 0x0A
443 .byte   0x76, 0x72, 0x7E, 0x7A, 0x66, 0x62, 0x6E, 0x6A
444 .byte   0x56, 0x52, 0x5E, 0x5A, 0x46, 0x42, 0x4E, 0x4A
445 .byte   0xB6, 0xB2, 0xBE, 0xBA, 0xA6, 0xA2, 0xAE, 0xAA
446 .byte   0x96, 0x92, 0x9E, 0x9A, 0x86, 0x82, 0x8E, 0x8A
447 .byte   0xF6, 0xF2, 0xFE, 0xFA, 0xE6, 0xE2, 0xEE, 0xEA
448 .byte   0xD6, 0xD2, 0xDE, 0xDA, 0xC6, 0xC2, 0xCE, 0xCA
449 .byte   0x2D, 0x29, 0x25, 0x21, 0x3D, 0x39, 0x35, 0x31
450 .byte   0x0D, 0x09, 0x05, 0x01, 0x1D, 0x19, 0x15, 0x11
451 .byte   0x6D, 0x69, 0x65, 0x61, 0x7D, 0x79, 0x75, 0x71
452 .byte   0x4D, 0x49, 0x45, 0x41, 0x5D, 0x59, 0x55, 0x51
453 .byte   0xAD, 0xA9, 0xA5, 0xA1, 0xBD, 0xB9, 0xB5, 0xB1
454 .byte   0x8D, 0x89, 0x85, 0x81, 0x9D, 0x99, 0x95, 0x91
455 .byte   0xED, 0xE9, 0xE5, 0xE1, 0xFD, 0xF9, 0xF5, 0xF1
456 .byte   0xCD, 0xC9, 0xC5, 0xC1, 0xDD, 0xD9, 0xD5, 0xD1
457