]> git.cryptolib.org Git - avr-crypto-lib.git/blob - aes_enc-asm.S
72b9e6ecbb5d3cbe0b5856436beae9e6015a8147
[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 5f
56         eor P, B
57 5:
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         
122         ldi xREDUCER, 0x1b /* load reducer */
123         ldi r31, hi8(aes_sbox)
124         
125         /* key whitening */
126 1:
127         .irp param,ST00, ST01, ST02, ST03, ST10, ST11, ST12, ST13, ST20, ST21, ST22, ST23, ST30, ST31, ST32, ST33
128                 ld r0, X+
129                 eor \param, r0
130         .endr
131         
132         brtc 2f
133         rjmp exit
134 2:      dec CTR
135         brne 3f
136         set
137 3:
138
139         /* encryption loop */ 
140
141         /* SBOX substitution and shifting */
142         mov r30, ST00
143         lpm ST00, Z
144         mov r30, ST10
145         lpm ST10, Z
146         mov r30, ST20
147         lpm ST20, Z
148         mov r30, ST30
149         lpm ST30, Z
150
151         mov r30, ST01
152         lpm T0, Z
153         mov r30, ST11
154         lpm ST01, Z
155         mov r30, ST21
156         lpm ST11, Z
157         mov r30, ST31
158         lpm ST21, Z
159         mov ST31, T0
160
161         mov r30, ST02
162         lpm T0, Z
163         mov r30, ST12
164         lpm T1, Z
165         mov r30, ST22
166         lpm ST02, Z
167         mov r30, ST32
168         lpm ST12, Z
169         mov ST22, T0
170         mov ST32, T1
171
172         mov r30, ST03
173         lpm T0, Z
174         mov r30, ST13
175         lpm T1, Z
176         mov r30, ST23
177         lpm T2, Z
178         mov r30, ST33
179         lpm ST03, Z
180         mov ST13, T0
181         mov ST23, T1
182         mov ST33, T2
183         
184         /* mixcols (or rows in our case) */
185         brtc 2f
186         rjmp 1b
187 2:      
188         
189         mov r1, ST00
190         eor r1, ST01
191         eor r1, ST02
192         eor r1, ST03
193                 
194         mov T0, ST00
195         eor T0, ST01
196         lsl T0
197         brcc 3f
198         eor T0, xREDUCER
199 3:      
200         eor T0, r1
201         eor T0, ST00
202         
203         mov T1, ST01
204         eor T1, ST02
205         lsl T1
206         brcc 3f
207         eor T1, xREDUCER
208 3:                      
209         eor T1, r1
210         eor T1, ST01
211         
212         mov T2, ST02
213         eor T2, ST03
214         lsl T2
215         brcc 3f
216         eor T2, xREDUCER
217 3:
218         eor T2, r1
219         eor T2, ST02
220         
221         mov T3, ST03
222         eor T3, ST00
223         lsl T3
224         brcc 3f
225         eor T3, xREDUCER
226 3:      
227         eor T3, r1
228         eor T3, ST03
229                 
230         mov ST00, T0
231         mov ST01, T1
232         mov ST02, T2
233         mov ST03, T3
234
235
236         mov r1, ST10
237         eor r1, ST11
238         eor r1, ST12
239         eor r1, ST13
240                 
241         mov T0, ST10
242         eor T0, ST11
243         lsl T0
244         brcc 3f
245         eor T0, xREDUCER
246 3:      
247         eor T0, r1
248         eor T0, ST10
249         
250         mov T1, ST11
251         eor T1, ST12
252         lsl T1
253         brcc 3f
254         eor T1, xREDUCER
255 3:                      
256         eor T1, r1
257         eor T1, ST11
258         
259         mov T2, ST12
260         eor T2, ST13
261         lsl T2
262         brcc 3f
263         eor T2, xREDUCER
264 3:
265         eor T2, r1
266         eor T2, ST12
267         
268         mov T3, ST13
269         eor T3, ST10
270         lsl T3
271         brcc 3f
272         eor T3, xREDUCER
273 3:      
274         eor T3, r1
275         eor T3, ST13
276                 
277         mov ST10, T0
278         mov ST11, T1
279         mov ST12, T2
280         mov ST13, T3
281
282         mov r1, ST20
283         eor r1, ST21
284         eor r1, ST22
285         eor r1, ST23
286                 
287         mov T0, ST20
288         eor T0, ST21
289         lsl T0
290         brcc 3f
291         eor T0, xREDUCER
292 3:      
293         eor T0, r1
294         eor T0, ST20
295         
296         mov T1, ST21
297         eor T1, ST22
298         lsl T1
299         brcc 3f
300         eor T1, xREDUCER
301 3:                      
302         eor T1, r1
303         eor T1, ST21
304         
305         mov T2, ST22
306         eor T2, ST23
307         lsl T2
308         brcc 3f
309         eor T2, xREDUCER
310 3:
311         eor T2, r1
312         eor T2, ST22
313         
314         mov T3, ST23
315         eor T3, ST20
316         lsl T3
317         brcc 3f
318         eor T3, xREDUCER
319 3:      
320         eor T3, r1
321         eor T3, ST23
322                 
323         mov ST20, T0
324         mov ST21, T1
325         mov ST22, T2
326         mov ST23, T3
327
328         mov r1, ST30
329         eor r1, ST31
330         eor r1, ST32
331         eor r1, ST33
332                 
333         mov T0, ST30
334         eor T0, ST31
335         lsl T0
336         brcc 3f
337         eor T0, xREDUCER
338 3:      
339         eor T0, r1
340         eor T0, ST30
341         
342         mov T1, ST31
343         eor T1, ST32
344         lsl T1
345         brcc 3f
346         eor T1, xREDUCER
347 3:                      
348         eor T1, r1
349         eor T1, ST31
350         
351         mov T2, ST32
352         eor T2, ST33
353         lsl T2
354         brcc 3f
355         eor T2, xREDUCER
356 3:
357         eor T2, r1
358         eor T2, ST32
359         
360         mov T3, ST33
361         eor T3, ST30
362         lsl T3
363         brcc 3f
364         eor T3, xREDUCER
365 3:      
366         eor T3, r1
367         eor T3, ST33
368                 
369         mov ST30, T0
370         mov ST31, T1
371         mov ST32, T2
372         mov ST33, T3
373
374         /* mix colums (rows) done */
375
376         /* add key*/
377         rjmp 1b
378         
379 exit:   
380         pop r31
381         pop r30
382         st Z+, ST00
383         st Z+, ST01
384         st Z+, ST02
385         st Z+, ST03
386         st Z+, ST10
387         st Z+, ST11
388         st Z+, ST12
389         st Z+, ST13
390         st Z+, ST20
391         st Z+, ST21
392         st Z+, ST22
393         st Z+, ST23
394         st Z+, ST30
395         st Z+, ST31
396         st Z+, ST32
397         st Z+, ST33
398         clr r1
399         pop r29
400         pop r28
401         pop_range 2, 17
402         ret
403
404
405
406
407
408
409