]> git.cryptolib.org Git - avr-crypto-lib.git/blob - aes_enc-asm.S
d8cec74b60cf292195924b4e8a759cc9d4542a16
[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  /* mixrow 1*/
189         mov r1, ST02
190         eor r1, ST03
191                 
192         mov T0, ST00
193         eor ST00, ST01
194         eor r1, ST00
195         lsl ST00
196         brcc 3f
197         eor ST00, xREDUCER
198 3:      eor ST00, r1
199         eor ST00, T0
200         
201         mov T1, ST01
202         eor T1, ST02
203         lsl T1
204         brcc 3f
205         eor T1, xREDUCER
206 3:      eor T1, r1
207         eor ST01, T1
208         
209         mov T2, ST02
210         eor T2, ST03
211         lsl T2
212         brcc 3f
213         eor T2, xREDUCER
214 3:  eor T2, r1
215         eor ST02, T2
216         
217         mov T3, ST03
218         eor T3, T0
219         lsl T3
220         brcc 3f
221         eor T3, xREDUCER
222 3:      eor T3, r1
223         eor ST03, T3
224                 
225  /* mixrow 2 */
226         mov r1, ST12
227         eor r1, ST13
228                 
229         mov T0, ST10
230         eor ST10, ST11
231         eor r1, ST10
232         lsl ST10
233         brcc 3f
234         eor ST10, xREDUCER
235 3:      eor ST10, r1
236         eor ST10, T0
237         
238         mov T1, ST11
239         eor T1, ST12
240         lsl T1
241         brcc 3f
242         eor T1, xREDUCER
243 3:      eor T1, r1
244         eor ST11, T1
245         
246         mov T2, ST12
247         eor T2, ST13
248         lsl T2
249         brcc 3f
250         eor T2, xREDUCER
251 3:  eor T2, r1
252         eor ST12, T2
253         
254         mov T3, ST13
255         eor T3, T0
256         lsl T3
257         brcc 3f
258         eor T3, xREDUCER
259 3:      eor T3, r1
260         eor ST13, T3
261                 
262  /* mixrow 3*/
263         mov r1, ST22
264         eor r1, ST23
265                 
266         mov T0, ST20
267         eor ST20, ST21
268         eor r1, ST20
269         lsl ST20
270         brcc 3f
271         eor ST20, xREDUCER
272 3:      eor ST20, r1
273         eor ST20, T0
274         
275         mov T1, ST21
276         eor T1, ST22
277         lsl T1
278         brcc 3f
279         eor T1, xREDUCER
280 3:      eor T1, r1
281         eor ST21, T1
282         
283         mov T2, ST22
284         eor T2, ST23
285         lsl T2
286         brcc 3f
287         eor T2, xREDUCER
288 3:  eor T2, r1
289         eor ST22, T2
290         
291         mov T3, ST23
292         eor T3, T0
293         lsl T3
294         brcc 3f
295         eor T3, xREDUCER
296 3:      eor T3, r1
297         eor ST23, T3
298                 
299  /* mixrow 4 */
300         mov r1, ST32
301         eor r1, ST33
302                 
303         mov T0, ST30
304         eor ST30, ST31
305         eor r1, ST30
306         lsl ST30
307         brcc 3f
308         eor ST30, xREDUCER
309 3:      eor ST30, r1
310         eor ST30, T0
311         
312         mov T1, ST31
313         eor T1, ST32
314         lsl T1
315         brcc 3f
316         eor T1, xREDUCER
317 3:      eor T1, r1
318         eor ST31, T1
319         
320         mov T2, ST32
321         eor T2, ST33
322         lsl T2
323         brcc 3f
324         eor T2, xREDUCER
325 3:  eor T2, r1
326         eor ST32, T2
327         
328         mov T3, ST33
329         eor T3, T0
330         lsl T3
331         brcc 3f
332         eor T3, xREDUCER
333 3:      eor T3, r1
334         eor ST33, T3
335                 
336
337         /* mix colums (rows) done */
338
339         /* add key*/
340         rjmp 1b
341         
342 exit:   
343         pop r31
344         pop r30
345         st Z+, ST00
346         st Z+, ST01
347         st Z+, ST02
348         st Z+, ST03
349         st Z+, ST10
350         st Z+, ST11
351         st Z+, ST12
352         st Z+, ST13
353         st Z+, ST20
354         st Z+, ST21
355         st Z+, ST22
356         st Z+, ST23
357         st Z+, ST30
358         st Z+, ST31
359         st Z+, ST32
360         st Z+, ST33
361         clr r1
362         pop r29
363         pop r28
364         pop_range 2, 17
365         ret
366
367
368
369
370
371
372