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