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