]> git.cryptolib.org Git - avr-crypto-lib.git/blob - aes/aes_enc-asm.S
new makefile and modified build process
[avr-crypto-lib.git] / aes / aes_enc-asm.S
1 /* aes_enc-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_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 .global aes256_enc
42 aes256_enc:
43         ldi r20, 14
44         rjmp aes_encrypt_core
45
46 .global aes192_enc
47 aes192_enc:
48         ldi r20, 12
49         rjmp aes_encrypt_core
50
51 .global aes128_enc
52 aes128_enc:
53         ldi r20, 10
54
55
56 /*
57   void aes_encrypt_core(aes_cipher_state_t* state, const aes_genctx_t* ks, uint8_t rounds)
58 */
59 T0= 2
60 T1= 3
61 T2= 4
62 T3= 5
63 SBOX_SAVE0 = 6
64 SBOX_SAVE1 = 7
65 ST00 =  8
66 ST01 =  9
67 ST02 = 10
68 ST03 = 11
69 ST10 = 12
70 ST11 = 13
71 ST12 = 14
72 ST13 = 15
73 ST20 = 16
74 ST21 = 17
75 ST22 = 18
76 ST23 = 19
77 ST30 = 20
78 ST31 = 21
79 ST32 = 22
80 ST33 = 23
81 CTR = 24
82 /*
83  * param state:  r24:r25
84  * param ks:     r22:r23
85  * param rounds: r20   
86  */
87 .global aes_encrypt_core
88 aes_encrypt_core:
89         push_range 2, 17
90         push r28
91         push r29
92         push r24
93         push r25
94         movw r26, r22
95         movw r30, r24
96         mov  CTR, r20
97         clt
98         
99         .irp param,ST00, ST01, ST02, ST03, ST10, ST11, ST12, ST13, ST20, ST21, ST22, ST23, ST30, ST31, ST32, ST33
100                 ld \param, Z+
101         .endr
102         
103         ldi xREDUCER, 0x1b /* load reducer */
104         ldi r31, hi8(aes_sbox)
105         
106         /* key whitening */
107 1:
108         .irp param,ST00, ST01, ST02, ST03, ST10, ST11, ST12, ST13, ST20, ST21, ST22, ST23, ST30, ST31, ST32, ST33
109                 ld r0, X+
110                 eor \param, r0
111         .endr
112         
113         brtc 2f
114 exit:   
115         pop r31
116         pop r30
117         st Z+, ST00
118         st Z+, ST01
119         st Z+, ST02
120         st Z+, ST03
121         st Z+, ST10
122         st Z+, ST11
123         st Z+, ST12
124         st Z+, ST13
125         st Z+, ST20
126         st Z+, ST21
127         st Z+, ST22
128         st Z+, ST23
129         st Z+, ST30
130         st Z+, ST31
131         st Z+, ST32
132         st Z+, ST33
133         pop r29
134         pop r28
135         pop_range 2, 17
136         ret
137
138 2:      dec CTR
139         brne 3f
140         set
141 3:
142
143         /* encryption loop */ 
144
145         /* SBOX substitution and shifting */
146         mov r30, ST00
147         lpm ST00, Z
148         mov r30, ST10
149         lpm ST10, Z
150         mov r30, ST20
151         lpm ST20, Z
152         mov r30, ST30
153         lpm ST30, Z
154
155         mov r30, ST01
156         lpm T0, Z
157         mov r30, ST11
158         lpm ST01, Z
159         mov r30, ST21
160         lpm ST11, Z
161         mov r30, ST31
162         lpm ST21, Z
163         mov ST31, T0
164
165         mov r30, ST02
166         lpm T0, Z
167         mov r30, ST12
168         lpm T1, Z
169         mov r30, ST22
170         lpm ST02, Z
171         mov r30, ST32
172         lpm ST12, Z
173         mov ST22, T0
174         mov ST32, T1
175
176         mov r30, ST03
177         lpm T0, Z
178         mov r30, ST33
179         lpm ST03, Z
180         mov r30, ST23
181         lpm ST33, Z
182         mov r30, ST13
183         lpm ST23, Z
184         mov ST13, T0
185                 
186         /* mixcols (or rows in our case) */
187         brtc 2f
188         rjmp 1b
189 2:      
190  /* mixrow 1 */
191         mov r0, ST02
192         eor r0, ST03
193         mov T2, r0
194                 
195         mov T0, ST00
196         eor ST00, ST01
197         eor r0, ST00
198         lsl ST00
199         brcc 3f
200         eor ST00, xREDUCER
201 3:      eor ST00, r0
202         eor ST00, T0
203         
204         mov T1, ST01
205         eor T1, ST02
206         lsl T1
207         brcc 3f
208         eor T1, xREDUCER
209 3:      eor T1, r0
210         eor ST01, T1
211         
212         lsl T2
213         brcc 3f
214         eor T2, xREDUCER
215 3:  eor T2, r0
216         eor ST02, T2
217         
218         eor T0, ST03
219         lsl T0
220         brcc 3f
221         eor T0, xREDUCER
222 3:      eor T0, r0
223         eor ST03, T0
224                 
225  /* mixrow 2 */
226         mov r0, ST12
227         eor r0, ST13
228         mov T2, r0
229                 
230         mov T0, ST10
231         eor ST10, ST11
232         eor r0, ST10
233         lsl ST10
234         brcc 3f
235         eor ST10, xREDUCER
236 3:      eor ST10, r0
237         eor ST10, T0
238         
239         mov T1, ST11
240         eor T1, ST12
241         lsl T1
242         brcc 3f
243         eor T1, xREDUCER
244 3:      eor T1, r0
245         eor ST11, T1
246         
247         lsl T2
248         brcc 3f
249         eor T2, xREDUCER
250 3:  eor T2, r0
251         eor ST12, T2
252         
253         eor T0, ST13
254         lsl T0
255         brcc 3f
256         eor T0, xREDUCER
257 3:      eor T0, r0
258         eor ST13, T0
259                 
260  /* mixrow 3 */
261         mov r0, ST22
262         eor r0, ST23
263         mov T2, r0
264                 
265         mov T0, ST20
266         eor ST20, ST21
267         eor r0, ST20
268         lsl ST20
269         brcc 3f
270         eor ST20, xREDUCER
271 3:      eor ST20, r0
272         eor ST20, T0
273         
274         mov T1, ST21
275         eor T1, ST22
276         lsl T1
277         brcc 3f
278         eor T1, xREDUCER
279 3:      eor T1, r0
280         eor ST21, T1
281         
282         lsl T2
283         brcc 3f
284         eor T2, xREDUCER
285 3:  eor T2, r0
286         eor ST22, T2
287         
288         eor T0, ST23
289         lsl T0
290         brcc 3f
291         eor T0, xREDUCER
292 3:      eor T0, r0
293         eor ST23, T0
294                 
295  /* mixrow 4 */
296         mov r0, ST32
297         eor r0, ST33
298         mov T2, r0
299                 
300         mov T0, ST30
301         eor ST30, ST31
302         eor r0, ST30
303         lsl ST30
304         brcc 3f
305         eor ST30, xREDUCER
306 3:      eor ST30, r0
307         eor ST30, T0
308         
309         mov T1, ST31
310         eor T1, ST32
311         lsl T1
312         brcc 3f
313         eor T1, xREDUCER
314 3:      eor T1, r0
315         eor ST31, T1
316         
317         lsl T2
318         brcc 3f
319         eor T2, xREDUCER
320 3:  eor T2, r0
321         eor ST32, T2
322         
323         eor T0, ST33
324         lsl T0
325         brcc 3f
326         eor T0, xREDUCER
327 3:      eor T0, r0
328         eor ST33, T0
329         /* mix colums (rows) done */
330
331         /* add key*/
332         rjmp 1b
333         
334
335
336
337
338
339
340
341