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