]> git.cryptolib.org Git - avr-crypto-lib.git/blob - aes_enc-asm.S
squeezing out a little more speed
[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 ST01, T1
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 ST02, T2
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 ST03, T3
229                 
230         mov ST00, T0
231
232         mov r1, ST10
233         eor r1, ST11
234         eor r1, ST12
235         eor r1, ST13
236                 
237         mov T0, ST10
238         eor T0, ST11
239         lsl T0
240         brcc 3f
241         eor T0, xREDUCER
242 3:      
243         eor T0, r1
244         eor T0, ST10
245         
246         mov T1, ST11
247         eor T1, ST12
248         lsl T1
249         brcc 3f
250         eor T1, xREDUCER
251 3:                      
252         eor T1, r1
253         eor ST11, T1
254         
255         mov T2, ST12
256         eor T2, ST13
257         lsl T2
258         brcc 3f
259         eor T2, xREDUCER
260 3:
261         eor T2, r1
262         eor ST12, T2
263         
264         mov T3, ST13
265         eor T3, ST10
266         lsl T3
267         brcc 3f
268         eor T3, xREDUCER
269 3:      
270         eor T3, r1
271         eor ST13, T3
272                 
273         mov ST10, T0
274
275         mov r1, ST20
276         eor r1, ST21
277         eor r1, ST22
278         eor r1, ST23
279                 
280         mov T0, ST20
281         eor T0, ST21
282         lsl T0
283         brcc 3f
284         eor T0, xREDUCER
285 3:      
286         eor T0, r1
287         eor T0, ST20
288         
289         mov T1, ST21
290         eor T1, ST22
291         lsl T1
292         brcc 3f
293         eor T1, xREDUCER
294 3:                      
295         eor T1, r1
296         eor ST21, T1
297         
298         mov T2, ST22
299         eor T2, ST23
300         lsl T2
301         brcc 3f
302         eor T2, xREDUCER
303 3:
304         eor T2, r1
305         eor ST22, T2
306         
307         mov T3, ST23
308         eor T3, ST20
309         lsl T3
310         brcc 3f
311         eor T3, xREDUCER
312 3:      
313         eor T3, r1
314         eor ST23, T3
315                 
316         mov ST20, T0
317
318         mov r1, ST30
319         eor r1, ST31
320         eor r1, ST32
321         eor r1, ST33
322                 
323         mov T0, ST30
324         eor T0, ST31
325         lsl T0
326         brcc 3f
327         eor T0, xREDUCER
328 3:      
329         eor T0, r1
330         eor T0, ST30
331         
332         mov T1, ST31
333         eor T1, ST32
334         lsl T1
335         brcc 3f
336         eor T1, xREDUCER
337 3:                      
338         eor T1, r1
339         eor ST31, T1
340         
341         mov T2, ST32
342         eor T2, ST33
343         lsl T2
344         brcc 3f
345         eor T2, xREDUCER
346 3:
347         eor T2, r1
348         eor ST32, T2
349         
350         mov T3, ST33
351         eor T3, ST30
352         lsl T3
353         brcc 3f
354         eor T3, xREDUCER
355 3:      
356         eor T3, r1
357         eor ST33, T3
358                 
359         mov ST30, T0
360
361         /* mix colums (rows) done */
362
363         /* add key*/
364         rjmp 1b
365         
366 exit:   
367         pop r31
368         pop r30
369         st Z+, ST00
370         st Z+, ST01
371         st Z+, ST02
372         st Z+, ST03
373         st Z+, ST10
374         st Z+, ST11
375         st Z+, ST12
376         st Z+, ST13
377         st Z+, ST20
378         st Z+, ST21
379         st Z+, ST22
380         st Z+, ST23
381         st Z+, ST30
382         st Z+, ST31
383         st Z+, ST32
384         st Z+, ST33
385         clr r1
386         pop r29
387         pop r28
388         pop_range 2, 17
389         ret
390
391
392
393
394
395
396