blob: 204ee3e17f62a7fb568fe1a25ed24ad2e8c8cca5 [file] [log] [blame]
Adam Langleyd9e397b2015-01-22 14:27:53 -08001
2@ ====================================================================
3@ Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
4@ project. The module is, however, dual licensed under OpenSSL and
5@ CRYPTOGAMS licenses depending on where you obtain it. For further
6@ details see http://www.openssl.org/~appro/cryptogams/.
7@
8@ Specific modes and adaptation for Linux kernel by Ard Biesheuvel
9@ <ard.biesheuvel@linaro.org>. Permission to use under GPL terms is
10@ granted.
11@ ====================================================================
12
13@ Bit-sliced AES for ARM NEON
14@
15@ February 2012.
16@
17@ This implementation is direct adaptation of bsaes-x86_64 module for
18@ ARM NEON. Except that this module is endian-neutral [in sense that
19@ it can be compiled for either endianness] by courtesy of vld1.8's
20@ neutrality. Initial version doesn't implement interface to OpenSSL,
21@ only low-level primitives and unsupported entry points, just enough
22@ to collect performance results, which for Cortex-A8 core are:
23@
24@ encrypt 19.5 cycles per byte processed with 128-bit key
25@ decrypt 22.1 cycles per byte processed with 128-bit key
26@ key conv. 440 cycles per 128-bit key/0.18 of 8x block
27@
28@ Snapdragon S4 encrypts byte in 17.6 cycles and decrypts in 19.7,
29@ which is [much] worse than anticipated (for further details see
30@ http://www.openssl.org/~appro/Snapdragon-S4.html).
31@
32@ Cortex-A15 manages in 14.2/16.1 cycles [when integer-only code
33@ manages in 20.0 cycles].
34@
35@ When comparing to x86_64 results keep in mind that NEON unit is
36@ [mostly] single-issue and thus can't [fully] benefit from
37@ instruction-level parallelism. And when comparing to aes-armv4
38@ results keep in mind key schedule conversion overhead (see
39@ bsaes-x86_64.pl for further details)...
40@
41@ <appro@openssl.org>
42
43@ April-August 2013
44@
45@ Add CBC, CTR and XTS subroutines, adapt for kernel use.
46@
47@ <ard.biesheuvel@linaro.org>
48
49#if defined(__arm__)
50#ifndef __KERNEL__
51# include "arm_arch.h"
52
53# define VFP_ABI_PUSH vstmdb sp!,{d8-d15}
54# define VFP_ABI_POP vldmia sp!,{d8-d15}
55# define VFP_ABI_FRAME 0x40
56#else
57# define VFP_ABI_PUSH
58# define VFP_ABI_POP
59# define VFP_ABI_FRAME 0
60# define BSAES_ASM_EXTENDED_KEY
61# define XTS_CHAIN_TWEAK
62# define __ARM_ARCH__ __LINUX_ARM_ARCH__
Adam Langleye9ada862015-05-11 17:20:37 -070063# define __ARM_MAX_ARCH__ 7
Adam Langleyd9e397b2015-01-22 14:27:53 -080064#endif
65
66#ifdef __thumb__
67# define adrl adr
68#endif
69
Adam Langleye9ada862015-05-11 17:20:37 -070070#if __ARM_MAX_ARCH__>=7
71.arch armv7-a
72.fpu neon
73
Adam Langleyd9e397b2015-01-22 14:27:53 -080074.text
75.syntax unified @ ARMv7-capable assembler is expected to handle this
Adam Langleye9ada862015-05-11 17:20:37 -070076#if defined(__thumb2__) && !defined(__APPLE__)
Adam Langleyd9e397b2015-01-22 14:27:53 -080077.thumb
78#else
Adam Langleye9ada862015-05-11 17:20:37 -070079.code 32
Adam Langleyd9e397b2015-01-22 14:27:53 -080080#endif
81
Adam Langleyd9e397b2015-01-22 14:27:53 -080082.type _bsaes_decrypt8,%function
83.align 4
84_bsaes_decrypt8:
85 adr r6,_bsaes_decrypt8
86 vldmia r4!, {q9} @ round 0 key
Adam Langleye9ada862015-05-11 17:20:37 -070087#ifdef __APPLE__
88 adr r6,.LM0ISR
89#else
Adam Langleyd9e397b2015-01-22 14:27:53 -080090 add r6,r6,#.LM0ISR-_bsaes_decrypt8
Adam Langleye9ada862015-05-11 17:20:37 -070091#endif
Adam Langleyd9e397b2015-01-22 14:27:53 -080092
93 vldmia r6!, {q8} @ .LM0ISR
94 veor q10, q0, q9 @ xor with round0 key
95 veor q11, q1, q9
Adam Langleye9ada862015-05-11 17:20:37 -070096 vtbl.8 d0, {q10}, d16
97 vtbl.8 d1, {q10}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -080098 veor q12, q2, q9
Adam Langleye9ada862015-05-11 17:20:37 -070099 vtbl.8 d2, {q11}, d16
100 vtbl.8 d3, {q11}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -0800101 veor q13, q3, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700102 vtbl.8 d4, {q12}, d16
103 vtbl.8 d5, {q12}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -0800104 veor q14, q4, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700105 vtbl.8 d6, {q13}, d16
106 vtbl.8 d7, {q13}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -0800107 veor q15, q5, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700108 vtbl.8 d8, {q14}, d16
109 vtbl.8 d9, {q14}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -0800110 veor q10, q6, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700111 vtbl.8 d10, {q15}, d16
112 vtbl.8 d11, {q15}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -0800113 veor q11, q7, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700114 vtbl.8 d12, {q10}, d16
115 vtbl.8 d13, {q10}, d17
116 vtbl.8 d14, {q11}, d16
117 vtbl.8 d15, {q11}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -0800118 vmov.i8 q8,#0x55 @ compose .LBS0
119 vmov.i8 q9,#0x33 @ compose .LBS1
120 vshr.u64 q10, q6, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700121 vshr.u64 q11, q4, #1
122 veor q10, q10, q7
123 veor q11, q11, q5
124 vand q10, q10, q8
125 vand q11, q11, q8
126 veor q7, q7, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800127 vshl.u64 q10, q10, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700128 veor q5, q5, q11
129 vshl.u64 q11, q11, #1
130 veor q6, q6, q10
131 veor q4, q4, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800132 vshr.u64 q10, q2, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700133 vshr.u64 q11, q0, #1
134 veor q10, q10, q3
135 veor q11, q11, q1
136 vand q10, q10, q8
137 vand q11, q11, q8
138 veor q3, q3, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800139 vshl.u64 q10, q10, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700140 veor q1, q1, q11
141 vshl.u64 q11, q11, #1
142 veor q2, q2, q10
143 veor q0, q0, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800144 vmov.i8 q8,#0x0f @ compose .LBS2
145 vshr.u64 q10, q5, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700146 vshr.u64 q11, q4, #2
147 veor q10, q10, q7
148 veor q11, q11, q6
149 vand q10, q10, q9
150 vand q11, q11, q9
151 veor q7, q7, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800152 vshl.u64 q10, q10, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700153 veor q6, q6, q11
154 vshl.u64 q11, q11, #2
155 veor q5, q5, q10
156 veor q4, q4, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800157 vshr.u64 q10, q1, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700158 vshr.u64 q11, q0, #2
159 veor q10, q10, q3
160 veor q11, q11, q2
161 vand q10, q10, q9
162 vand q11, q11, q9
163 veor q3, q3, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800164 vshl.u64 q10, q10, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700165 veor q2, q2, q11
166 vshl.u64 q11, q11, #2
167 veor q1, q1, q10
168 veor q0, q0, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800169 vshr.u64 q10, q3, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700170 vshr.u64 q11, q2, #4
171 veor q10, q10, q7
172 veor q11, q11, q6
173 vand q10, q10, q8
174 vand q11, q11, q8
175 veor q7, q7, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800176 vshl.u64 q10, q10, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700177 veor q6, q6, q11
178 vshl.u64 q11, q11, #4
179 veor q3, q3, q10
180 veor q2, q2, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800181 vshr.u64 q10, q1, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700182 vshr.u64 q11, q0, #4
183 veor q10, q10, q5
184 veor q11, q11, q4
185 vand q10, q10, q8
186 vand q11, q11, q8
187 veor q5, q5, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800188 vshl.u64 q10, q10, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700189 veor q4, q4, q11
190 vshl.u64 q11, q11, #4
191 veor q1, q1, q10
192 veor q0, q0, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800193 sub r5,r5,#1
194 b .Ldec_sbox
195.align 4
196.Ldec_loop:
Adam Langleye9ada862015-05-11 17:20:37 -0700197 vldmia r4!, {q8,q9,q10,q11}
Adam Langleyd9e397b2015-01-22 14:27:53 -0800198 veor q8, q8, q0
199 veor q9, q9, q1
200 vtbl.8 d0, {q8}, d24
201 vtbl.8 d1, {q8}, d25
202 vldmia r4!, {q8}
203 veor q10, q10, q2
204 vtbl.8 d2, {q9}, d24
205 vtbl.8 d3, {q9}, d25
206 vldmia r4!, {q9}
207 veor q11, q11, q3
208 vtbl.8 d4, {q10}, d24
209 vtbl.8 d5, {q10}, d25
210 vldmia r4!, {q10}
211 vtbl.8 d6, {q11}, d24
212 vtbl.8 d7, {q11}, d25
213 vldmia r4!, {q11}
214 veor q8, q8, q4
215 veor q9, q9, q5
216 vtbl.8 d8, {q8}, d24
217 vtbl.8 d9, {q8}, d25
218 veor q10, q10, q6
219 vtbl.8 d10, {q9}, d24
220 vtbl.8 d11, {q9}, d25
221 veor q11, q11, q7
222 vtbl.8 d12, {q10}, d24
223 vtbl.8 d13, {q10}, d25
224 vtbl.8 d14, {q11}, d24
225 vtbl.8 d15, {q11}, d25
226.Ldec_sbox:
Adam Langleye9ada862015-05-11 17:20:37 -0700227 veor q1, q1, q4
Adam Langleyd9e397b2015-01-22 14:27:53 -0800228 veor q3, q3, q4
229
230 veor q4, q4, q7
Adam Langleye9ada862015-05-11 17:20:37 -0700231 veor q1, q1, q6
Adam Langleyd9e397b2015-01-22 14:27:53 -0800232 veor q2, q2, q7
233 veor q6, q6, q4
234
235 veor q0, q0, q1
236 veor q2, q2, q5
Adam Langleye9ada862015-05-11 17:20:37 -0700237 veor q7, q7, q6
Adam Langleyd9e397b2015-01-22 14:27:53 -0800238 veor q3, q3, q0
239 veor q5, q5, q0
240 veor q1, q1, q3
241 veor q11, q3, q0
242 veor q10, q7, q4
243 veor q9, q1, q6
244 veor q13, q4, q0
Adam Langleye9ada862015-05-11 17:20:37 -0700245 vmov q8, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800246 veor q12, q5, q2
247
248 vorr q10, q10, q9
249 veor q15, q11, q8
250 vand q14, q11, q12
251 vorr q11, q11, q12
252 veor q12, q12, q9
253 vand q8, q8, q9
254 veor q9, q6, q2
255 vand q15, q15, q12
256 vand q13, q13, q9
257 veor q9, q3, q7
258 veor q12, q1, q5
259 veor q11, q11, q13
260 veor q10, q10, q13
261 vand q13, q9, q12
262 vorr q9, q9, q12
263 veor q11, q11, q15
264 veor q8, q8, q13
265 veor q10, q10, q14
266 veor q9, q9, q15
267 veor q8, q8, q14
268 vand q12, q4, q6
269 veor q9, q9, q14
270 vand q13, q0, q2
271 vand q14, q7, q1
272 vorr q15, q3, q5
273 veor q11, q11, q12
274 veor q9, q9, q14
275 veor q8, q8, q15
276 veor q10, q10, q13
277
278 @ Inv_GF16 0, 1, 2, 3, s0, s1, s2, s3
279
280 @ new smaller inversion
281
282 vand q14, q11, q9
283 vmov q12, q8
284
285 veor q13, q10, q14
286 veor q15, q8, q14
287 veor q14, q8, q14 @ q14=q15
288
289 vbsl q13, q9, q8
290 vbsl q15, q11, q10
291 veor q11, q11, q10
292
293 vbsl q12, q13, q14
294 vbsl q8, q14, q13
295
296 vand q14, q12, q15
297 veor q9, q9, q8
298
299 veor q14, q14, q11
300 veor q12, q5, q2
301 veor q8, q1, q6
Adam Langleye9ada862015-05-11 17:20:37 -0700302 veor q10, q15, q14
Adam Langleyd9e397b2015-01-22 14:27:53 -0800303 vand q10, q10, q5
304 veor q5, q5, q1
305 vand q11, q1, q15
306 vand q5, q5, q14
307 veor q1, q11, q10
308 veor q5, q5, q11
309 veor q15, q15, q13
310 veor q14, q14, q9
311 veor q11, q15, q14
Adam Langleye9ada862015-05-11 17:20:37 -0700312 veor q10, q13, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -0800313 vand q11, q11, q12
Adam Langleye9ada862015-05-11 17:20:37 -0700314 vand q10, q10, q2
Adam Langleyd9e397b2015-01-22 14:27:53 -0800315 veor q12, q12, q8
Adam Langleye9ada862015-05-11 17:20:37 -0700316 veor q2, q2, q6
Adam Langleyd9e397b2015-01-22 14:27:53 -0800317 vand q8, q8, q15
Adam Langleye9ada862015-05-11 17:20:37 -0700318 vand q6, q6, q13
Adam Langleyd9e397b2015-01-22 14:27:53 -0800319 vand q12, q12, q14
Adam Langleye9ada862015-05-11 17:20:37 -0700320 vand q2, q2, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -0800321 veor q8, q8, q12
Adam Langleye9ada862015-05-11 17:20:37 -0700322 veor q2, q2, q6
Adam Langleyd9e397b2015-01-22 14:27:53 -0800323 veor q12, q12, q11
Adam Langleye9ada862015-05-11 17:20:37 -0700324 veor q6, q6, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800325 veor q5, q5, q12
326 veor q2, q2, q12
327 veor q1, q1, q8
328 veor q6, q6, q8
329
330 veor q12, q3, q0
331 veor q8, q7, q4
332 veor q11, q15, q14
Adam Langleye9ada862015-05-11 17:20:37 -0700333 veor q10, q13, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -0800334 vand q11, q11, q12
Adam Langleye9ada862015-05-11 17:20:37 -0700335 vand q10, q10, q0
Adam Langleyd9e397b2015-01-22 14:27:53 -0800336 veor q12, q12, q8
Adam Langleye9ada862015-05-11 17:20:37 -0700337 veor q0, q0, q4
Adam Langleyd9e397b2015-01-22 14:27:53 -0800338 vand q8, q8, q15
Adam Langleye9ada862015-05-11 17:20:37 -0700339 vand q4, q4, q13
Adam Langleyd9e397b2015-01-22 14:27:53 -0800340 vand q12, q12, q14
Adam Langleye9ada862015-05-11 17:20:37 -0700341 vand q0, q0, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -0800342 veor q8, q8, q12
Adam Langleye9ada862015-05-11 17:20:37 -0700343 veor q0, q0, q4
Adam Langleyd9e397b2015-01-22 14:27:53 -0800344 veor q12, q12, q11
Adam Langleye9ada862015-05-11 17:20:37 -0700345 veor q4, q4, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800346 veor q15, q15, q13
347 veor q14, q14, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700348 veor q10, q15, q14
Adam Langleyd9e397b2015-01-22 14:27:53 -0800349 vand q10, q10, q3
350 veor q3, q3, q7
351 vand q11, q7, q15
352 vand q3, q3, q14
353 veor q7, q11, q10
354 veor q3, q3, q11
355 veor q3, q3, q12
356 veor q0, q0, q12
357 veor q7, q7, q8
358 veor q4, q4, q8
359 veor q1, q1, q7
360 veor q6, q6, q5
361
362 veor q4, q4, q1
363 veor q2, q2, q7
364 veor q5, q5, q7
365 veor q4, q4, q2
Adam Langleye9ada862015-05-11 17:20:37 -0700366 veor q7, q7, q0
Adam Langleyd9e397b2015-01-22 14:27:53 -0800367 veor q4, q4, q5
Adam Langleye9ada862015-05-11 17:20:37 -0700368 veor q3, q3, q6
369 veor q6, q6, q1
Adam Langleyd9e397b2015-01-22 14:27:53 -0800370 veor q3, q3, q4
371
372 veor q4, q4, q0
373 veor q7, q7, q3
374 subs r5,r5,#1
375 bcc .Ldec_done
376 @ multiplication by 0x05-0x00-0x04-0x00
377 vext.8 q8, q0, q0, #8
378 vext.8 q14, q3, q3, #8
379 vext.8 q15, q5, q5, #8
380 veor q8, q8, q0
381 vext.8 q9, q1, q1, #8
382 veor q14, q14, q3
383 vext.8 q10, q6, q6, #8
384 veor q15, q15, q5
385 vext.8 q11, q4, q4, #8
386 veor q9, q9, q1
387 vext.8 q12, q2, q2, #8
388 veor q10, q10, q6
389 vext.8 q13, q7, q7, #8
390 veor q11, q11, q4
391 veor q12, q12, q2
392 veor q13, q13, q7
393
Adam Langleye9ada862015-05-11 17:20:37 -0700394 veor q0, q0, q14
395 veor q1, q1, q14
396 veor q6, q6, q8
397 veor q2, q2, q10
398 veor q4, q4, q9
399 veor q1, q1, q15
400 veor q6, q6, q15
401 veor q2, q2, q14
402 veor q7, q7, q11
403 veor q4, q4, q14
404 veor q3, q3, q12
405 veor q2, q2, q15
406 veor q7, q7, q15
407 veor q5, q5, q13
Adam Langleyd9e397b2015-01-22 14:27:53 -0800408 vext.8 q8, q0, q0, #12 @ x0 <<< 32
409 vext.8 q9, q1, q1, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700410 veor q0, q0, q8 @ x0 ^ (x0 <<< 32)
Adam Langleyd9e397b2015-01-22 14:27:53 -0800411 vext.8 q10, q6, q6, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700412 veor q1, q1, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -0800413 vext.8 q11, q4, q4, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700414 veor q6, q6, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800415 vext.8 q12, q2, q2, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700416 veor q4, q4, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800417 vext.8 q13, q7, q7, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700418 veor q2, q2, q12
Adam Langleyd9e397b2015-01-22 14:27:53 -0800419 vext.8 q14, q3, q3, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700420 veor q7, q7, q13
Adam Langleyd9e397b2015-01-22 14:27:53 -0800421 vext.8 q15, q5, q5, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700422 veor q3, q3, q14
Adam Langleyd9e397b2015-01-22 14:27:53 -0800423
424 veor q9, q9, q0
Adam Langleye9ada862015-05-11 17:20:37 -0700425 veor q5, q5, q15
426 vext.8 q0, q0, q0, #8 @ (x0 ^ (x0 <<< 32)) <<< 64)
Adam Langleyd9e397b2015-01-22 14:27:53 -0800427 veor q10, q10, q1
428 veor q8, q8, q5
429 veor q9, q9, q5
Adam Langleye9ada862015-05-11 17:20:37 -0700430 vext.8 q1, q1, q1, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800431 veor q13, q13, q2
Adam Langleye9ada862015-05-11 17:20:37 -0700432 veor q0, q0, q8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800433 veor q14, q14, q7
Adam Langleye9ada862015-05-11 17:20:37 -0700434 veor q1, q1, q9
435 vext.8 q8, q2, q2, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800436 veor q12, q12, q4
Adam Langleye9ada862015-05-11 17:20:37 -0700437 vext.8 q9, q7, q7, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800438 veor q15, q15, q3
Adam Langleye9ada862015-05-11 17:20:37 -0700439 vext.8 q2, q4, q4, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800440 veor q11, q11, q6
Adam Langleye9ada862015-05-11 17:20:37 -0700441 vext.8 q7, q5, q5, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800442 veor q12, q12, q5
Adam Langleye9ada862015-05-11 17:20:37 -0700443 vext.8 q4, q3, q3, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800444 veor q11, q11, q5
Adam Langleye9ada862015-05-11 17:20:37 -0700445 vext.8 q3, q6, q6, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800446 veor q5, q9, q13
447 veor q11, q11, q2
448 veor q7, q7, q15
449 veor q6, q4, q14
450 veor q4, q8, q12
451 veor q2, q3, q10
452 vmov q3, q11
453 @ vmov q5, q9
454 vldmia r6, {q12} @ .LISR
455 ite eq @ Thumb2 thing, sanity check in ARM
456 addeq r6,r6,#0x10
457 bne .Ldec_loop
458 vldmia r6, {q12} @ .LISRM0
459 b .Ldec_loop
460.align 4
461.Ldec_done:
462 vmov.i8 q8,#0x55 @ compose .LBS0
463 vmov.i8 q9,#0x33 @ compose .LBS1
464 vshr.u64 q10, q3, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700465 vshr.u64 q11, q2, #1
466 veor q10, q10, q5
467 veor q11, q11, q7
468 vand q10, q10, q8
469 vand q11, q11, q8
470 veor q5, q5, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800471 vshl.u64 q10, q10, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700472 veor q7, q7, q11
473 vshl.u64 q11, q11, #1
474 veor q3, q3, q10
475 veor q2, q2, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800476 vshr.u64 q10, q6, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700477 vshr.u64 q11, q0, #1
478 veor q10, q10, q4
479 veor q11, q11, q1
480 vand q10, q10, q8
481 vand q11, q11, q8
482 veor q4, q4, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800483 vshl.u64 q10, q10, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700484 veor q1, q1, q11
485 vshl.u64 q11, q11, #1
486 veor q6, q6, q10
487 veor q0, q0, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800488 vmov.i8 q8,#0x0f @ compose .LBS2
489 vshr.u64 q10, q7, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700490 vshr.u64 q11, q2, #2
491 veor q10, q10, q5
492 veor q11, q11, q3
493 vand q10, q10, q9
494 vand q11, q11, q9
495 veor q5, q5, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800496 vshl.u64 q10, q10, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700497 veor q3, q3, q11
498 vshl.u64 q11, q11, #2
499 veor q7, q7, q10
500 veor q2, q2, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800501 vshr.u64 q10, q1, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700502 vshr.u64 q11, q0, #2
503 veor q10, q10, q4
504 veor q11, q11, q6
505 vand q10, q10, q9
506 vand q11, q11, q9
507 veor q4, q4, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800508 vshl.u64 q10, q10, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700509 veor q6, q6, q11
510 vshl.u64 q11, q11, #2
511 veor q1, q1, q10
512 veor q0, q0, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800513 vshr.u64 q10, q4, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700514 vshr.u64 q11, q6, #4
515 veor q10, q10, q5
516 veor q11, q11, q3
517 vand q10, q10, q8
518 vand q11, q11, q8
519 veor q5, q5, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800520 vshl.u64 q10, q10, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700521 veor q3, q3, q11
522 vshl.u64 q11, q11, #4
523 veor q4, q4, q10
524 veor q6, q6, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800525 vshr.u64 q10, q1, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700526 vshr.u64 q11, q0, #4
527 veor q10, q10, q7
528 veor q11, q11, q2
529 vand q10, q10, q8
530 vand q11, q11, q8
531 veor q7, q7, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800532 vshl.u64 q10, q10, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700533 veor q2, q2, q11
534 vshl.u64 q11, q11, #4
535 veor q1, q1, q10
536 veor q0, q0, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800537 vldmia r4, {q8} @ last round key
538 veor q6, q6, q8
539 veor q4, q4, q8
540 veor q2, q2, q8
541 veor q7, q7, q8
542 veor q3, q3, q8
543 veor q5, q5, q8
544 veor q0, q0, q8
545 veor q1, q1, q8
546 bx lr
547.size _bsaes_decrypt8,.-_bsaes_decrypt8
548
549.type _bsaes_const,%object
550.align 6
551_bsaes_const:
Adam Langleye9ada862015-05-11 17:20:37 -0700552.LM0ISR:@ InvShiftRows constants
553.quad 0x0a0e0206070b0f03, 0x0004080c0d010509
Adam Langleyd9e397b2015-01-22 14:27:53 -0800554.LISR:
Adam Langleye9ada862015-05-11 17:20:37 -0700555.quad 0x0504070602010003, 0x0f0e0d0c080b0a09
Adam Langleyd9e397b2015-01-22 14:27:53 -0800556.LISRM0:
Adam Langleye9ada862015-05-11 17:20:37 -0700557.quad 0x01040b0e0205080f, 0x0306090c00070a0d
558.LM0SR:@ ShiftRows constants
559.quad 0x0a0e02060f03070b, 0x0004080c05090d01
Adam Langleyd9e397b2015-01-22 14:27:53 -0800560.LSR:
Adam Langleye9ada862015-05-11 17:20:37 -0700561.quad 0x0504070600030201, 0x0f0e0d0c0a09080b
Adam Langleyd9e397b2015-01-22 14:27:53 -0800562.LSRM0:
Adam Langleye9ada862015-05-11 17:20:37 -0700563.quad 0x0304090e00050a0f, 0x01060b0c0207080d
Adam Langleyd9e397b2015-01-22 14:27:53 -0800564.LM0:
Adam Langleye9ada862015-05-11 17:20:37 -0700565.quad 0x02060a0e03070b0f, 0x0004080c0105090d
Adam Langleyd9e397b2015-01-22 14:27:53 -0800566.LREVM0SR:
Adam Langleye9ada862015-05-11 17:20:37 -0700567.quad 0x090d01050c000408, 0x03070b0f060a0e02
568.byte 66,105,116,45,115,108,105,99,101,100,32,65,69,83,32,102,111,114,32,78,69,79,78,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
569.align 2
Adam Langleyd9e397b2015-01-22 14:27:53 -0800570.align 6
571.size _bsaes_const,.-_bsaes_const
572
573.type _bsaes_encrypt8,%function
574.align 4
575_bsaes_encrypt8:
576 adr r6,_bsaes_encrypt8
577 vldmia r4!, {q9} @ round 0 key
Adam Langleye9ada862015-05-11 17:20:37 -0700578#ifdef __APPLE__
579 adr r6,.LM0SR
580#else
Adam Langleyd9e397b2015-01-22 14:27:53 -0800581 sub r6,r6,#_bsaes_encrypt8-.LM0SR
Adam Langleye9ada862015-05-11 17:20:37 -0700582#endif
Adam Langleyd9e397b2015-01-22 14:27:53 -0800583
584 vldmia r6!, {q8} @ .LM0SR
585_bsaes_encrypt8_alt:
586 veor q10, q0, q9 @ xor with round0 key
587 veor q11, q1, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700588 vtbl.8 d0, {q10}, d16
589 vtbl.8 d1, {q10}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -0800590 veor q12, q2, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700591 vtbl.8 d2, {q11}, d16
592 vtbl.8 d3, {q11}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -0800593 veor q13, q3, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700594 vtbl.8 d4, {q12}, d16
595 vtbl.8 d5, {q12}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -0800596 veor q14, q4, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700597 vtbl.8 d6, {q13}, d16
598 vtbl.8 d7, {q13}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -0800599 veor q15, q5, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700600 vtbl.8 d8, {q14}, d16
601 vtbl.8 d9, {q14}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -0800602 veor q10, q6, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700603 vtbl.8 d10, {q15}, d16
604 vtbl.8 d11, {q15}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -0800605 veor q11, q7, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700606 vtbl.8 d12, {q10}, d16
607 vtbl.8 d13, {q10}, d17
608 vtbl.8 d14, {q11}, d16
609 vtbl.8 d15, {q11}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -0800610_bsaes_encrypt8_bitslice:
611 vmov.i8 q8,#0x55 @ compose .LBS0
612 vmov.i8 q9,#0x33 @ compose .LBS1
613 vshr.u64 q10, q6, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700614 vshr.u64 q11, q4, #1
615 veor q10, q10, q7
616 veor q11, q11, q5
617 vand q10, q10, q8
618 vand q11, q11, q8
619 veor q7, q7, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800620 vshl.u64 q10, q10, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700621 veor q5, q5, q11
622 vshl.u64 q11, q11, #1
623 veor q6, q6, q10
624 veor q4, q4, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800625 vshr.u64 q10, q2, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700626 vshr.u64 q11, q0, #1
627 veor q10, q10, q3
628 veor q11, q11, q1
629 vand q10, q10, q8
630 vand q11, q11, q8
631 veor q3, q3, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800632 vshl.u64 q10, q10, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700633 veor q1, q1, q11
634 vshl.u64 q11, q11, #1
635 veor q2, q2, q10
636 veor q0, q0, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800637 vmov.i8 q8,#0x0f @ compose .LBS2
638 vshr.u64 q10, q5, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700639 vshr.u64 q11, q4, #2
640 veor q10, q10, q7
641 veor q11, q11, q6
642 vand q10, q10, q9
643 vand q11, q11, q9
644 veor q7, q7, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800645 vshl.u64 q10, q10, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700646 veor q6, q6, q11
647 vshl.u64 q11, q11, #2
648 veor q5, q5, q10
649 veor q4, q4, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800650 vshr.u64 q10, q1, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700651 vshr.u64 q11, q0, #2
652 veor q10, q10, q3
653 veor q11, q11, q2
654 vand q10, q10, q9
655 vand q11, q11, q9
656 veor q3, q3, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800657 vshl.u64 q10, q10, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700658 veor q2, q2, q11
659 vshl.u64 q11, q11, #2
660 veor q1, q1, q10
661 veor q0, q0, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800662 vshr.u64 q10, q3, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700663 vshr.u64 q11, q2, #4
664 veor q10, q10, q7
665 veor q11, q11, q6
666 vand q10, q10, q8
667 vand q11, q11, q8
668 veor q7, q7, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800669 vshl.u64 q10, q10, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700670 veor q6, q6, q11
671 vshl.u64 q11, q11, #4
672 veor q3, q3, q10
673 veor q2, q2, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800674 vshr.u64 q10, q1, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700675 vshr.u64 q11, q0, #4
676 veor q10, q10, q5
677 veor q11, q11, q4
678 vand q10, q10, q8
679 vand q11, q11, q8
680 veor q5, q5, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800681 vshl.u64 q10, q10, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700682 veor q4, q4, q11
683 vshl.u64 q11, q11, #4
684 veor q1, q1, q10
685 veor q0, q0, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800686 sub r5,r5,#1
687 b .Lenc_sbox
688.align 4
689.Lenc_loop:
Adam Langleye9ada862015-05-11 17:20:37 -0700690 vldmia r4!, {q8,q9,q10,q11}
Adam Langleyd9e397b2015-01-22 14:27:53 -0800691 veor q8, q8, q0
692 veor q9, q9, q1
693 vtbl.8 d0, {q8}, d24
694 vtbl.8 d1, {q8}, d25
695 vldmia r4!, {q8}
696 veor q10, q10, q2
697 vtbl.8 d2, {q9}, d24
698 vtbl.8 d3, {q9}, d25
699 vldmia r4!, {q9}
700 veor q11, q11, q3
701 vtbl.8 d4, {q10}, d24
702 vtbl.8 d5, {q10}, d25
703 vldmia r4!, {q10}
704 vtbl.8 d6, {q11}, d24
705 vtbl.8 d7, {q11}, d25
706 vldmia r4!, {q11}
707 veor q8, q8, q4
708 veor q9, q9, q5
709 vtbl.8 d8, {q8}, d24
710 vtbl.8 d9, {q8}, d25
711 veor q10, q10, q6
712 vtbl.8 d10, {q9}, d24
713 vtbl.8 d11, {q9}, d25
714 veor q11, q11, q7
715 vtbl.8 d12, {q10}, d24
716 vtbl.8 d13, {q10}, d25
717 vtbl.8 d14, {q11}, d24
718 vtbl.8 d15, {q11}, d25
719.Lenc_sbox:
720 veor q2, q2, q1
721 veor q5, q5, q6
722 veor q3, q3, q0
723 veor q6, q6, q2
724 veor q5, q5, q0
725
726 veor q6, q6, q3
727 veor q3, q3, q7
728 veor q7, q7, q5
729 veor q3, q3, q4
730 veor q4, q4, q5
731
732 veor q2, q2, q7
733 veor q3, q3, q1
734 veor q1, q1, q5
735 veor q11, q7, q4
736 veor q10, q1, q2
737 veor q9, q5, q3
738 veor q13, q2, q4
Adam Langleye9ada862015-05-11 17:20:37 -0700739 vmov q8, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800740 veor q12, q6, q0
741
742 vorr q10, q10, q9
743 veor q15, q11, q8
744 vand q14, q11, q12
745 vorr q11, q11, q12
746 veor q12, q12, q9
747 vand q8, q8, q9
748 veor q9, q3, q0
749 vand q15, q15, q12
750 vand q13, q13, q9
751 veor q9, q7, q1
752 veor q12, q5, q6
753 veor q11, q11, q13
754 veor q10, q10, q13
755 vand q13, q9, q12
756 vorr q9, q9, q12
757 veor q11, q11, q15
758 veor q8, q8, q13
759 veor q10, q10, q14
760 veor q9, q9, q15
761 veor q8, q8, q14
762 vand q12, q2, q3
763 veor q9, q9, q14
764 vand q13, q4, q0
765 vand q14, q1, q5
766 vorr q15, q7, q6
767 veor q11, q11, q12
768 veor q9, q9, q14
769 veor q8, q8, q15
770 veor q10, q10, q13
771
772 @ Inv_GF16 0, 1, 2, 3, s0, s1, s2, s3
773
774 @ new smaller inversion
775
776 vand q14, q11, q9
777 vmov q12, q8
778
779 veor q13, q10, q14
780 veor q15, q8, q14
781 veor q14, q8, q14 @ q14=q15
782
783 vbsl q13, q9, q8
784 vbsl q15, q11, q10
785 veor q11, q11, q10
786
787 vbsl q12, q13, q14
788 vbsl q8, q14, q13
789
790 vand q14, q12, q15
791 veor q9, q9, q8
792
793 veor q14, q14, q11
794 veor q12, q6, q0
795 veor q8, q5, q3
Adam Langleye9ada862015-05-11 17:20:37 -0700796 veor q10, q15, q14
Adam Langleyd9e397b2015-01-22 14:27:53 -0800797 vand q10, q10, q6
798 veor q6, q6, q5
799 vand q11, q5, q15
800 vand q6, q6, q14
801 veor q5, q11, q10
802 veor q6, q6, q11
803 veor q15, q15, q13
804 veor q14, q14, q9
805 veor q11, q15, q14
Adam Langleye9ada862015-05-11 17:20:37 -0700806 veor q10, q13, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -0800807 vand q11, q11, q12
Adam Langleye9ada862015-05-11 17:20:37 -0700808 vand q10, q10, q0
Adam Langleyd9e397b2015-01-22 14:27:53 -0800809 veor q12, q12, q8
Adam Langleye9ada862015-05-11 17:20:37 -0700810 veor q0, q0, q3
Adam Langleyd9e397b2015-01-22 14:27:53 -0800811 vand q8, q8, q15
Adam Langleye9ada862015-05-11 17:20:37 -0700812 vand q3, q3, q13
Adam Langleyd9e397b2015-01-22 14:27:53 -0800813 vand q12, q12, q14
Adam Langleye9ada862015-05-11 17:20:37 -0700814 vand q0, q0, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -0800815 veor q8, q8, q12
Adam Langleye9ada862015-05-11 17:20:37 -0700816 veor q0, q0, q3
Adam Langleyd9e397b2015-01-22 14:27:53 -0800817 veor q12, q12, q11
Adam Langleye9ada862015-05-11 17:20:37 -0700818 veor q3, q3, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800819 veor q6, q6, q12
820 veor q0, q0, q12
821 veor q5, q5, q8
822 veor q3, q3, q8
823
824 veor q12, q7, q4
825 veor q8, q1, q2
826 veor q11, q15, q14
Adam Langleye9ada862015-05-11 17:20:37 -0700827 veor q10, q13, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -0800828 vand q11, q11, q12
Adam Langleye9ada862015-05-11 17:20:37 -0700829 vand q10, q10, q4
Adam Langleyd9e397b2015-01-22 14:27:53 -0800830 veor q12, q12, q8
Adam Langleye9ada862015-05-11 17:20:37 -0700831 veor q4, q4, q2
Adam Langleyd9e397b2015-01-22 14:27:53 -0800832 vand q8, q8, q15
Adam Langleye9ada862015-05-11 17:20:37 -0700833 vand q2, q2, q13
Adam Langleyd9e397b2015-01-22 14:27:53 -0800834 vand q12, q12, q14
Adam Langleye9ada862015-05-11 17:20:37 -0700835 vand q4, q4, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -0800836 veor q8, q8, q12
Adam Langleye9ada862015-05-11 17:20:37 -0700837 veor q4, q4, q2
Adam Langleyd9e397b2015-01-22 14:27:53 -0800838 veor q12, q12, q11
Adam Langleye9ada862015-05-11 17:20:37 -0700839 veor q2, q2, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800840 veor q15, q15, q13
841 veor q14, q14, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700842 veor q10, q15, q14
Adam Langleyd9e397b2015-01-22 14:27:53 -0800843 vand q10, q10, q7
844 veor q7, q7, q1
845 vand q11, q1, q15
846 vand q7, q7, q14
847 veor q1, q11, q10
848 veor q7, q7, q11
849 veor q7, q7, q12
850 veor q4, q4, q12
851 veor q1, q1, q8
852 veor q2, q2, q8
853 veor q7, q7, q0
854 veor q1, q1, q6
855 veor q6, q6, q0
856 veor q4, q4, q7
857 veor q0, q0, q1
858
859 veor q1, q1, q5
860 veor q5, q5, q2
861 veor q2, q2, q3
862 veor q3, q3, q5
863 veor q4, q4, q5
864
865 veor q6, q6, q3
866 subs r5,r5,#1
867 bcc .Lenc_done
868 vext.8 q8, q0, q0, #12 @ x0 <<< 32
869 vext.8 q9, q1, q1, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700870 veor q0, q0, q8 @ x0 ^ (x0 <<< 32)
Adam Langleyd9e397b2015-01-22 14:27:53 -0800871 vext.8 q10, q4, q4, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700872 veor q1, q1, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -0800873 vext.8 q11, q6, q6, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700874 veor q4, q4, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800875 vext.8 q12, q3, q3, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700876 veor q6, q6, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800877 vext.8 q13, q7, q7, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700878 veor q3, q3, q12
Adam Langleyd9e397b2015-01-22 14:27:53 -0800879 vext.8 q14, q2, q2, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700880 veor q7, q7, q13
Adam Langleyd9e397b2015-01-22 14:27:53 -0800881 vext.8 q15, q5, q5, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700882 veor q2, q2, q14
Adam Langleyd9e397b2015-01-22 14:27:53 -0800883
884 veor q9, q9, q0
Adam Langleye9ada862015-05-11 17:20:37 -0700885 veor q5, q5, q15
886 vext.8 q0, q0, q0, #8 @ (x0 ^ (x0 <<< 32)) <<< 64)
Adam Langleyd9e397b2015-01-22 14:27:53 -0800887 veor q10, q10, q1
888 veor q8, q8, q5
889 veor q9, q9, q5
Adam Langleye9ada862015-05-11 17:20:37 -0700890 vext.8 q1, q1, q1, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800891 veor q13, q13, q3
Adam Langleye9ada862015-05-11 17:20:37 -0700892 veor q0, q0, q8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800893 veor q14, q14, q7
Adam Langleye9ada862015-05-11 17:20:37 -0700894 veor q1, q1, q9
895 vext.8 q8, q3, q3, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800896 veor q12, q12, q6
Adam Langleye9ada862015-05-11 17:20:37 -0700897 vext.8 q9, q7, q7, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800898 veor q15, q15, q2
Adam Langleye9ada862015-05-11 17:20:37 -0700899 vext.8 q3, q6, q6, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800900 veor q11, q11, q4
Adam Langleye9ada862015-05-11 17:20:37 -0700901 vext.8 q7, q5, q5, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800902 veor q12, q12, q5
Adam Langleye9ada862015-05-11 17:20:37 -0700903 vext.8 q6, q2, q2, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800904 veor q11, q11, q5
Adam Langleye9ada862015-05-11 17:20:37 -0700905 vext.8 q2, q4, q4, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800906 veor q5, q9, q13
907 veor q4, q8, q12
908 veor q3, q3, q11
909 veor q7, q7, q15
910 veor q6, q6, q14
911 @ vmov q4, q8
912 veor q2, q2, q10
913 @ vmov q5, q9
914 vldmia r6, {q12} @ .LSR
915 ite eq @ Thumb2 thing, samity check in ARM
916 addeq r6,r6,#0x10
917 bne .Lenc_loop
918 vldmia r6, {q12} @ .LSRM0
919 b .Lenc_loop
920.align 4
921.Lenc_done:
922 vmov.i8 q8,#0x55 @ compose .LBS0
923 vmov.i8 q9,#0x33 @ compose .LBS1
924 vshr.u64 q10, q2, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700925 vshr.u64 q11, q3, #1
926 veor q10, q10, q5
927 veor q11, q11, q7
928 vand q10, q10, q8
929 vand q11, q11, q8
930 veor q5, q5, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800931 vshl.u64 q10, q10, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700932 veor q7, q7, q11
933 vshl.u64 q11, q11, #1
934 veor q2, q2, q10
935 veor q3, q3, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800936 vshr.u64 q10, q4, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700937 vshr.u64 q11, q0, #1
938 veor q10, q10, q6
939 veor q11, q11, q1
940 vand q10, q10, q8
941 vand q11, q11, q8
942 veor q6, q6, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800943 vshl.u64 q10, q10, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700944 veor q1, q1, q11
945 vshl.u64 q11, q11, #1
946 veor q4, q4, q10
947 veor q0, q0, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800948 vmov.i8 q8,#0x0f @ compose .LBS2
949 vshr.u64 q10, q7, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700950 vshr.u64 q11, q3, #2
951 veor q10, q10, q5
952 veor q11, q11, q2
953 vand q10, q10, q9
954 vand q11, q11, q9
955 veor q5, q5, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800956 vshl.u64 q10, q10, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700957 veor q2, q2, q11
958 vshl.u64 q11, q11, #2
959 veor q7, q7, q10
960 veor q3, q3, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800961 vshr.u64 q10, q1, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700962 vshr.u64 q11, q0, #2
963 veor q10, q10, q6
964 veor q11, q11, q4
965 vand q10, q10, q9
966 vand q11, q11, q9
967 veor q6, q6, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800968 vshl.u64 q10, q10, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700969 veor q4, q4, q11
970 vshl.u64 q11, q11, #2
971 veor q1, q1, q10
972 veor q0, q0, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800973 vshr.u64 q10, q6, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700974 vshr.u64 q11, q4, #4
975 veor q10, q10, q5
976 veor q11, q11, q2
977 vand q10, q10, q8
978 vand q11, q11, q8
979 veor q5, q5, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800980 vshl.u64 q10, q10, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700981 veor q2, q2, q11
982 vshl.u64 q11, q11, #4
983 veor q6, q6, q10
984 veor q4, q4, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800985 vshr.u64 q10, q1, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700986 vshr.u64 q11, q0, #4
987 veor q10, q10, q7
988 veor q11, q11, q3
989 vand q10, q10, q8
990 vand q11, q11, q8
991 veor q7, q7, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800992 vshl.u64 q10, q10, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700993 veor q3, q3, q11
994 vshl.u64 q11, q11, #4
995 veor q1, q1, q10
996 veor q0, q0, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800997 vldmia r4, {q8} @ last round key
998 veor q4, q4, q8
999 veor q6, q6, q8
1000 veor q3, q3, q8
1001 veor q7, q7, q8
1002 veor q2, q2, q8
1003 veor q5, q5, q8
1004 veor q0, q0, q8
1005 veor q1, q1, q8
1006 bx lr
1007.size _bsaes_encrypt8,.-_bsaes_encrypt8
1008.type _bsaes_key_convert,%function
1009.align 4
1010_bsaes_key_convert:
1011 adr r6,_bsaes_key_convert
1012 vld1.8 {q7}, [r4]! @ load round 0 key
Adam Langleye9ada862015-05-11 17:20:37 -07001013#ifdef __APPLE__
1014 adr r6,.LM0
1015#else
Adam Langleyd9e397b2015-01-22 14:27:53 -08001016 sub r6,r6,#_bsaes_key_convert-.LM0
Adam Langleye9ada862015-05-11 17:20:37 -07001017#endif
Adam Langleyd9e397b2015-01-22 14:27:53 -08001018 vld1.8 {q15}, [r4]! @ load round 1 key
1019
1020 vmov.i8 q8, #0x01 @ bit masks
1021 vmov.i8 q9, #0x02
1022 vmov.i8 q10, #0x04
1023 vmov.i8 q11, #0x08
1024 vmov.i8 q12, #0x10
1025 vmov.i8 q13, #0x20
1026 vldmia r6, {q14} @ .LM0
1027
1028#ifdef __ARMEL__
1029 vrev32.8 q7, q7
1030 vrev32.8 q15, q15
1031#endif
1032 sub r5,r5,#1
1033 vstmia r12!, {q7} @ save round 0 key
1034 b .Lkey_loop
1035
1036.align 4
1037.Lkey_loop:
1038 vtbl.8 d14,{q15},d28
1039 vtbl.8 d15,{q15},d29
1040 vmov.i8 q6, #0x40
1041 vmov.i8 q15, #0x80
1042
1043 vtst.8 q0, q7, q8
1044 vtst.8 q1, q7, q9
1045 vtst.8 q2, q7, q10
1046 vtst.8 q3, q7, q11
1047 vtst.8 q4, q7, q12
1048 vtst.8 q5, q7, q13
1049 vtst.8 q6, q7, q6
1050 vtst.8 q7, q7, q15
1051 vld1.8 {q15}, [r4]! @ load next round key
1052 vmvn q0, q0 @ "pnot"
1053 vmvn q1, q1
1054 vmvn q5, q5
1055 vmvn q6, q6
1056#ifdef __ARMEL__
1057 vrev32.8 q15, q15
1058#endif
1059 subs r5,r5,#1
Adam Langleye9ada862015-05-11 17:20:37 -07001060 vstmia r12!,{q0,q1,q2,q3,q4,q5,q6,q7} @ write bit-sliced round key
Adam Langleyd9e397b2015-01-22 14:27:53 -08001061 bne .Lkey_loop
1062
1063 vmov.i8 q7,#0x63 @ compose .L63
1064 @ don't save last round key
1065 bx lr
1066.size _bsaes_key_convert,.-_bsaes_key_convert
Adam Langleyd9e397b2015-01-22 14:27:53 -08001067
Adam Langleye9ada862015-05-11 17:20:37 -07001068
1069
1070.globl bsaes_cbc_encrypt
Adam Langleyd9e397b2015-01-22 14:27:53 -08001071.hidden bsaes_cbc_encrypt
1072.type bsaes_cbc_encrypt,%function
1073.align 5
1074bsaes_cbc_encrypt:
1075#ifndef __KERNEL__
1076 cmp r2, #128
1077#ifndef __thumb__
1078 blo AES_cbc_encrypt
1079#else
1080 bhs 1f
1081 b AES_cbc_encrypt
10821:
1083#endif
1084#endif
1085
1086 @ it is up to the caller to make sure we are called with enc == 0
1087
1088 mov ip, sp
Adam Langleye9ada862015-05-11 17:20:37 -07001089 stmdb sp!, {r4,r5,r6,r7,r8,r9,r10, lr}
Adam Langleyd9e397b2015-01-22 14:27:53 -08001090 VFP_ABI_PUSH
1091 ldr r8, [ip] @ IV is 1st arg on the stack
1092 mov r2, r2, lsr#4 @ len in 16 byte blocks
1093 sub sp, #0x10 @ scratch space to carry over the IV
1094 mov r9, sp @ save sp
1095
1096 ldr r10, [r3, #240] @ get # of rounds
1097#ifndef BSAES_ASM_EXTENDED_KEY
1098 @ allocate the key schedule on the stack
1099 sub r12, sp, r10, lsl#7 @ 128 bytes per inner round key
1100 add r12, #96 @ sifze of bit-slices key schedule
1101
1102 @ populate the key schedule
1103 mov r4, r3 @ pass key
1104 mov r5, r10 @ pass # of rounds
1105 mov sp, r12 @ sp is sp
1106 bl _bsaes_key_convert
1107 vldmia sp, {q6}
1108 vstmia r12, {q15} @ save last round key
1109 veor q7, q7, q6 @ fix up round 0 key
1110 vstmia sp, {q7}
1111#else
1112 ldr r12, [r3, #244]
1113 eors r12, #1
1114 beq 0f
1115
1116 @ populate the key schedule
1117 str r12, [r3, #244]
1118 mov r4, r3 @ pass key
1119 mov r5, r10 @ pass # of rounds
1120 add r12, r3, #248 @ pass key schedule
1121 bl _bsaes_key_convert
1122 add r4, r3, #248
1123 vldmia r4, {q6}
1124 vstmia r12, {q15} @ save last round key
1125 veor q7, q7, q6 @ fix up round 0 key
1126 vstmia r4, {q7}
1127
1128.align 2
Adam Langleye9ada862015-05-11 17:20:37 -07001129
Adam Langleyd9e397b2015-01-22 14:27:53 -08001130#endif
1131
1132 vld1.8 {q15}, [r8] @ load IV
1133 b .Lcbc_dec_loop
1134
1135.align 4
1136.Lcbc_dec_loop:
1137 subs r2, r2, #0x8
1138 bmi .Lcbc_dec_loop_finish
1139
Adam Langleye9ada862015-05-11 17:20:37 -07001140 vld1.8 {q0,q1}, [r0]! @ load input
1141 vld1.8 {q2,q3}, [r0]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001142#ifndef BSAES_ASM_EXTENDED_KEY
1143 mov r4, sp @ pass the key
1144#else
1145 add r4, r3, #248
1146#endif
Adam Langleye9ada862015-05-11 17:20:37 -07001147 vld1.8 {q4,q5}, [r0]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001148 mov r5, r10
Adam Langleye9ada862015-05-11 17:20:37 -07001149 vld1.8 {q6,q7}, [r0]
Adam Langleyd9e397b2015-01-22 14:27:53 -08001150 sub r0, r0, #0x60
1151 vstmia r9, {q15} @ put aside IV
1152
1153 bl _bsaes_decrypt8
1154
1155 vldmia r9, {q14} @ reload IV
Adam Langleye9ada862015-05-11 17:20:37 -07001156 vld1.8 {q8,q9}, [r0]! @ reload input
Adam Langleyd9e397b2015-01-22 14:27:53 -08001157 veor q0, q0, q14 @ ^= IV
Adam Langleye9ada862015-05-11 17:20:37 -07001158 vld1.8 {q10,q11}, [r0]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001159 veor q1, q1, q8
1160 veor q6, q6, q9
Adam Langleye9ada862015-05-11 17:20:37 -07001161 vld1.8 {q12,q13}, [r0]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001162 veor q4, q4, q10
1163 veor q2, q2, q11
Adam Langleye9ada862015-05-11 17:20:37 -07001164 vld1.8 {q14,q15}, [r0]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001165 veor q7, q7, q12
Adam Langleye9ada862015-05-11 17:20:37 -07001166 vst1.8 {q0,q1}, [r1]! @ write output
Adam Langleyd9e397b2015-01-22 14:27:53 -08001167 veor q3, q3, q13
1168 vst1.8 {q6}, [r1]!
1169 veor q5, q5, q14
1170 vst1.8 {q4}, [r1]!
1171 vst1.8 {q2}, [r1]!
1172 vst1.8 {q7}, [r1]!
1173 vst1.8 {q3}, [r1]!
1174 vst1.8 {q5}, [r1]!
1175
1176 b .Lcbc_dec_loop
1177
1178.Lcbc_dec_loop_finish:
1179 adds r2, r2, #8
1180 beq .Lcbc_dec_done
1181
1182 vld1.8 {q0}, [r0]! @ load input
1183 cmp r2, #2
1184 blo .Lcbc_dec_one
1185 vld1.8 {q1}, [r0]!
1186#ifndef BSAES_ASM_EXTENDED_KEY
1187 mov r4, sp @ pass the key
1188#else
1189 add r4, r3, #248
1190#endif
1191 mov r5, r10
1192 vstmia r9, {q15} @ put aside IV
1193 beq .Lcbc_dec_two
1194 vld1.8 {q2}, [r0]!
1195 cmp r2, #4
1196 blo .Lcbc_dec_three
1197 vld1.8 {q3}, [r0]!
1198 beq .Lcbc_dec_four
1199 vld1.8 {q4}, [r0]!
1200 cmp r2, #6
1201 blo .Lcbc_dec_five
1202 vld1.8 {q5}, [r0]!
1203 beq .Lcbc_dec_six
1204 vld1.8 {q6}, [r0]!
1205 sub r0, r0, #0x70
1206
1207 bl _bsaes_decrypt8
1208
1209 vldmia r9, {q14} @ reload IV
Adam Langleye9ada862015-05-11 17:20:37 -07001210 vld1.8 {q8,q9}, [r0]! @ reload input
Adam Langleyd9e397b2015-01-22 14:27:53 -08001211 veor q0, q0, q14 @ ^= IV
Adam Langleye9ada862015-05-11 17:20:37 -07001212 vld1.8 {q10,q11}, [r0]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001213 veor q1, q1, q8
1214 veor q6, q6, q9
Adam Langleye9ada862015-05-11 17:20:37 -07001215 vld1.8 {q12,q13}, [r0]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001216 veor q4, q4, q10
1217 veor q2, q2, q11
1218 vld1.8 {q15}, [r0]!
1219 veor q7, q7, q12
Adam Langleye9ada862015-05-11 17:20:37 -07001220 vst1.8 {q0,q1}, [r1]! @ write output
Adam Langleyd9e397b2015-01-22 14:27:53 -08001221 veor q3, q3, q13
1222 vst1.8 {q6}, [r1]!
1223 vst1.8 {q4}, [r1]!
1224 vst1.8 {q2}, [r1]!
1225 vst1.8 {q7}, [r1]!
1226 vst1.8 {q3}, [r1]!
1227 b .Lcbc_dec_done
1228.align 4
1229.Lcbc_dec_six:
1230 sub r0, r0, #0x60
1231 bl _bsaes_decrypt8
1232 vldmia r9,{q14} @ reload IV
Adam Langleye9ada862015-05-11 17:20:37 -07001233 vld1.8 {q8,q9}, [r0]! @ reload input
Adam Langleyd9e397b2015-01-22 14:27:53 -08001234 veor q0, q0, q14 @ ^= IV
Adam Langleye9ada862015-05-11 17:20:37 -07001235 vld1.8 {q10,q11}, [r0]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001236 veor q1, q1, q8
1237 veor q6, q6, q9
1238 vld1.8 {q12}, [r0]!
1239 veor q4, q4, q10
1240 veor q2, q2, q11
1241 vld1.8 {q15}, [r0]!
1242 veor q7, q7, q12
Adam Langleye9ada862015-05-11 17:20:37 -07001243 vst1.8 {q0,q1}, [r1]! @ write output
Adam Langleyd9e397b2015-01-22 14:27:53 -08001244 vst1.8 {q6}, [r1]!
1245 vst1.8 {q4}, [r1]!
1246 vst1.8 {q2}, [r1]!
1247 vst1.8 {q7}, [r1]!
1248 b .Lcbc_dec_done
1249.align 4
1250.Lcbc_dec_five:
1251 sub r0, r0, #0x50
1252 bl _bsaes_decrypt8
1253 vldmia r9, {q14} @ reload IV
Adam Langleye9ada862015-05-11 17:20:37 -07001254 vld1.8 {q8,q9}, [r0]! @ reload input
Adam Langleyd9e397b2015-01-22 14:27:53 -08001255 veor q0, q0, q14 @ ^= IV
Adam Langleye9ada862015-05-11 17:20:37 -07001256 vld1.8 {q10,q11}, [r0]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001257 veor q1, q1, q8
1258 veor q6, q6, q9
1259 vld1.8 {q15}, [r0]!
1260 veor q4, q4, q10
Adam Langleye9ada862015-05-11 17:20:37 -07001261 vst1.8 {q0,q1}, [r1]! @ write output
Adam Langleyd9e397b2015-01-22 14:27:53 -08001262 veor q2, q2, q11
1263 vst1.8 {q6}, [r1]!
1264 vst1.8 {q4}, [r1]!
1265 vst1.8 {q2}, [r1]!
1266 b .Lcbc_dec_done
1267.align 4
1268.Lcbc_dec_four:
1269 sub r0, r0, #0x40
1270 bl _bsaes_decrypt8
1271 vldmia r9, {q14} @ reload IV
Adam Langleye9ada862015-05-11 17:20:37 -07001272 vld1.8 {q8,q9}, [r0]! @ reload input
Adam Langleyd9e397b2015-01-22 14:27:53 -08001273 veor q0, q0, q14 @ ^= IV
1274 vld1.8 {q10}, [r0]!
1275 veor q1, q1, q8
1276 veor q6, q6, q9
1277 vld1.8 {q15}, [r0]!
1278 veor q4, q4, q10
Adam Langleye9ada862015-05-11 17:20:37 -07001279 vst1.8 {q0,q1}, [r1]! @ write output
Adam Langleyd9e397b2015-01-22 14:27:53 -08001280 vst1.8 {q6}, [r1]!
1281 vst1.8 {q4}, [r1]!
1282 b .Lcbc_dec_done
1283.align 4
1284.Lcbc_dec_three:
1285 sub r0, r0, #0x30
1286 bl _bsaes_decrypt8
1287 vldmia r9, {q14} @ reload IV
Adam Langleye9ada862015-05-11 17:20:37 -07001288 vld1.8 {q8,q9}, [r0]! @ reload input
Adam Langleyd9e397b2015-01-22 14:27:53 -08001289 veor q0, q0, q14 @ ^= IV
1290 vld1.8 {q15}, [r0]!
1291 veor q1, q1, q8
1292 veor q6, q6, q9
Adam Langleye9ada862015-05-11 17:20:37 -07001293 vst1.8 {q0,q1}, [r1]! @ write output
Adam Langleyd9e397b2015-01-22 14:27:53 -08001294 vst1.8 {q6}, [r1]!
1295 b .Lcbc_dec_done
1296.align 4
1297.Lcbc_dec_two:
1298 sub r0, r0, #0x20
1299 bl _bsaes_decrypt8
1300 vldmia r9, {q14} @ reload IV
1301 vld1.8 {q8}, [r0]! @ reload input
1302 veor q0, q0, q14 @ ^= IV
1303 vld1.8 {q15}, [r0]! @ reload input
1304 veor q1, q1, q8
Adam Langleye9ada862015-05-11 17:20:37 -07001305 vst1.8 {q0,q1}, [r1]! @ write output
Adam Langleyd9e397b2015-01-22 14:27:53 -08001306 b .Lcbc_dec_done
1307.align 4
1308.Lcbc_dec_one:
1309 sub r0, r0, #0x10
1310 mov r10, r1 @ save original out pointer
1311 mov r1, r9 @ use the iv scratch space as out buffer
1312 mov r2, r3
1313 vmov q4,q15 @ just in case ensure that IV
1314 vmov q5,q0 @ and input are preserved
1315 bl AES_decrypt
1316 vld1.8 {q0}, [r9,:64] @ load result
1317 veor q0, q0, q4 @ ^= IV
1318 vmov q15, q5 @ q5 holds input
1319 vst1.8 {q0}, [r10] @ write output
1320
1321.Lcbc_dec_done:
1322#ifndef BSAES_ASM_EXTENDED_KEY
1323 vmov.i32 q0, #0
1324 vmov.i32 q1, #0
Adam Langleye9ada862015-05-11 17:20:37 -07001325.Lcbc_dec_bzero:@ wipe key schedule [if any]
1326 vstmia sp!, {q0,q1}
1327 cmp sp, r9
1328 bne .Lcbc_dec_bzero
Adam Langleyd9e397b2015-01-22 14:27:53 -08001329#endif
1330
1331 mov sp, r9
1332 add sp, #0x10 @ add sp,r9,#0x10 is no good for thumb
1333 vst1.8 {q15}, [r8] @ return IV
1334 VFP_ABI_POP
Adam Langleye9ada862015-05-11 17:20:37 -07001335 ldmia sp!, {r4,r5,r6,r7,r8,r9,r10, pc}
Adam Langleyd9e397b2015-01-22 14:27:53 -08001336.size bsaes_cbc_encrypt,.-bsaes_cbc_encrypt
Adam Langleye9ada862015-05-11 17:20:37 -07001337
1338.globl bsaes_ctr32_encrypt_blocks
Adam Langleyd9e397b2015-01-22 14:27:53 -08001339.hidden bsaes_ctr32_encrypt_blocks
1340.type bsaes_ctr32_encrypt_blocks,%function
1341.align 5
1342bsaes_ctr32_encrypt_blocks:
1343 cmp r2, #8 @ use plain AES for
1344 blo .Lctr_enc_short @ small sizes
1345
1346 mov ip, sp
Adam Langleye9ada862015-05-11 17:20:37 -07001347 stmdb sp!, {r4,r5,r6,r7,r8,r9,r10, lr}
Adam Langleyd9e397b2015-01-22 14:27:53 -08001348 VFP_ABI_PUSH
1349 ldr r8, [ip] @ ctr is 1st arg on the stack
1350 sub sp, sp, #0x10 @ scratch space to carry over the ctr
1351 mov r9, sp @ save sp
1352
1353 ldr r10, [r3, #240] @ get # of rounds
1354#ifndef BSAES_ASM_EXTENDED_KEY
1355 @ allocate the key schedule on the stack
1356 sub r12, sp, r10, lsl#7 @ 128 bytes per inner round key
1357 add r12, #96 @ size of bit-sliced key schedule
1358
1359 @ populate the key schedule
1360 mov r4, r3 @ pass key
1361 mov r5, r10 @ pass # of rounds
1362 mov sp, r12 @ sp is sp
1363 bl _bsaes_key_convert
1364 veor q7,q7,q15 @ fix up last round key
1365 vstmia r12, {q7} @ save last round key
1366
1367 vld1.8 {q0}, [r8] @ load counter
Adam Langleye9ada862015-05-11 17:20:37 -07001368#ifdef __APPLE__
Adam Langleyf4e42722015-06-04 17:45:09 -07001369 mov r8, #:lower16:(.LREVM0SR-.LM0)
Adam Langleye9ada862015-05-11 17:20:37 -07001370 add r8, r6, r8
1371#else
Adam Langleyd9e397b2015-01-22 14:27:53 -08001372 add r8, r6, #.LREVM0SR-.LM0 @ borrow r8
Adam Langleye9ada862015-05-11 17:20:37 -07001373#endif
Adam Langleyd9e397b2015-01-22 14:27:53 -08001374 vldmia sp, {q4} @ load round0 key
1375#else
1376 ldr r12, [r3, #244]
1377 eors r12, #1
1378 beq 0f
1379
1380 @ populate the key schedule
1381 str r12, [r3, #244]
1382 mov r4, r3 @ pass key
1383 mov r5, r10 @ pass # of rounds
1384 add r12, r3, #248 @ pass key schedule
1385 bl _bsaes_key_convert
1386 veor q7,q7,q15 @ fix up last round key
1387 vstmia r12, {q7} @ save last round key
1388
1389.align 2
Adam Langleye9ada862015-05-11 17:20:37 -07001390 add r12, r3, #248
Adam Langleyd9e397b2015-01-22 14:27:53 -08001391 vld1.8 {q0}, [r8] @ load counter
1392 adrl r8, .LREVM0SR @ borrow r8
1393 vldmia r12, {q4} @ load round0 key
1394 sub sp, #0x10 @ place for adjusted round0 key
1395#endif
1396
1397 vmov.i32 q8,#1 @ compose 1<<96
Adam Langleye9ada862015-05-11 17:20:37 -07001398 veor q9,q9,q9
Adam Langleyd9e397b2015-01-22 14:27:53 -08001399 vrev32.8 q0,q0
Adam Langleye9ada862015-05-11 17:20:37 -07001400 vext.8 q8,q9,q8,#4
Adam Langleyd9e397b2015-01-22 14:27:53 -08001401 vrev32.8 q4,q4
1402 vadd.u32 q9,q8,q8 @ compose 2<<96
1403 vstmia sp, {q4} @ save adjusted round0 key
1404 b .Lctr_enc_loop
1405
1406.align 4
1407.Lctr_enc_loop:
1408 vadd.u32 q10, q8, q9 @ compose 3<<96
1409 vadd.u32 q1, q0, q8 @ +1
1410 vadd.u32 q2, q0, q9 @ +2
1411 vadd.u32 q3, q0, q10 @ +3
1412 vadd.u32 q4, q1, q10
1413 vadd.u32 q5, q2, q10
1414 vadd.u32 q6, q3, q10
1415 vadd.u32 q7, q4, q10
1416 vadd.u32 q10, q5, q10 @ next counter
1417
1418 @ Borrow prologue from _bsaes_encrypt8 to use the opportunity
1419 @ to flip byte order in 32-bit counter
1420
Adam Langleye9ada862015-05-11 17:20:37 -07001421 vldmia sp, {q9} @ load round0 key
Adam Langleyd9e397b2015-01-22 14:27:53 -08001422#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07001423 add r4, sp, #0x10 @ pass next round key
Adam Langleyd9e397b2015-01-22 14:27:53 -08001424#else
Adam Langleye9ada862015-05-11 17:20:37 -07001425 add r4, r3, #264
Adam Langleyd9e397b2015-01-22 14:27:53 -08001426#endif
Adam Langleye9ada862015-05-11 17:20:37 -07001427 vldmia r8, {q8} @ .LREVM0SR
1428 mov r5, r10 @ pass rounds
1429 vstmia r9, {q10} @ save next counter
1430#ifdef __APPLE__
Adam Langleyf4e42722015-06-04 17:45:09 -07001431 mov r6, #:lower16:(.LREVM0SR-.LSR)
Adam Langleye9ada862015-05-11 17:20:37 -07001432 sub r6, r8, r6
1433#else
1434 sub r6, r8, #.LREVM0SR-.LSR @ pass constants
1435#endif
Adam Langleyd9e397b2015-01-22 14:27:53 -08001436
Adam Langleye9ada862015-05-11 17:20:37 -07001437 bl _bsaes_encrypt8_alt
Adam Langleyd9e397b2015-01-22 14:27:53 -08001438
Adam Langleye9ada862015-05-11 17:20:37 -07001439 subs r2, r2, #8
1440 blo .Lctr_enc_loop_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08001441
Adam Langleye9ada862015-05-11 17:20:37 -07001442 vld1.8 {q8,q9}, [r0]! @ load input
1443 vld1.8 {q10,q11}, [r0]!
1444 veor q0, q8
1445 veor q1, q9
1446 vld1.8 {q12,q13}, [r0]!
1447 veor q4, q10
1448 veor q6, q11
1449 vld1.8 {q14,q15}, [r0]!
1450 veor q3, q12
1451 vst1.8 {q0,q1}, [r1]! @ write output
1452 veor q7, q13
1453 veor q2, q14
1454 vst1.8 {q4}, [r1]!
1455 veor q5, q15
1456 vst1.8 {q6}, [r1]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001457 vmov.i32 q8, #1 @ compose 1<<96
Adam Langleye9ada862015-05-11 17:20:37 -07001458 vst1.8 {q3}, [r1]!
1459 veor q9, q9, q9
1460 vst1.8 {q7}, [r1]!
1461 vext.8 q8, q9, q8, #4
1462 vst1.8 {q2}, [r1]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001463 vadd.u32 q9,q8,q8 @ compose 2<<96
Adam Langleye9ada862015-05-11 17:20:37 -07001464 vst1.8 {q5}, [r1]!
1465 vldmia r9, {q0} @ load counter
Adam Langleyd9e397b2015-01-22 14:27:53 -08001466
Adam Langleye9ada862015-05-11 17:20:37 -07001467 bne .Lctr_enc_loop
1468 b .Lctr_enc_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08001469
1470.align 4
1471.Lctr_enc_loop_done:
Adam Langleye9ada862015-05-11 17:20:37 -07001472 add r2, r2, #8
1473 vld1.8 {q8}, [r0]! @ load input
1474 veor q0, q8
1475 vst1.8 {q0}, [r1]! @ write output
1476 cmp r2, #2
1477 blo .Lctr_enc_done
1478 vld1.8 {q9}, [r0]!
1479 veor q1, q9
1480 vst1.8 {q1}, [r1]!
1481 beq .Lctr_enc_done
1482 vld1.8 {q10}, [r0]!
1483 veor q4, q10
1484 vst1.8 {q4}, [r1]!
1485 cmp r2, #4
1486 blo .Lctr_enc_done
1487 vld1.8 {q11}, [r0]!
1488 veor q6, q11
1489 vst1.8 {q6}, [r1]!
1490 beq .Lctr_enc_done
1491 vld1.8 {q12}, [r0]!
1492 veor q3, q12
1493 vst1.8 {q3}, [r1]!
1494 cmp r2, #6
1495 blo .Lctr_enc_done
1496 vld1.8 {q13}, [r0]!
1497 veor q7, q13
1498 vst1.8 {q7}, [r1]!
1499 beq .Lctr_enc_done
1500 vld1.8 {q14}, [r0]
1501 veor q2, q14
1502 vst1.8 {q2}, [r1]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001503
1504.Lctr_enc_done:
1505 vmov.i32 q0, #0
1506 vmov.i32 q1, #0
1507#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07001508.Lctr_enc_bzero:@ wipe key schedule [if any]
1509 vstmia sp!, {q0,q1}
1510 cmp sp, r9
1511 bne .Lctr_enc_bzero
Adam Langleyd9e397b2015-01-22 14:27:53 -08001512#else
Adam Langleye9ada862015-05-11 17:20:37 -07001513 vstmia sp, {q0,q1}
Adam Langleyd9e397b2015-01-22 14:27:53 -08001514#endif
1515
1516 mov sp, r9
1517 add sp, #0x10 @ add sp,r9,#0x10 is no good for thumb
1518 VFP_ABI_POP
Adam Langleye9ada862015-05-11 17:20:37 -07001519 ldmia sp!, {r4,r5,r6,r7,r8,r9,r10, pc} @ return
Adam Langleyd9e397b2015-01-22 14:27:53 -08001520
1521.align 4
1522.Lctr_enc_short:
1523 ldr ip, [sp] @ ctr pointer is passed on stack
Adam Langleye9ada862015-05-11 17:20:37 -07001524 stmdb sp!, {r4,r5,r6,r7,r8, lr}
Adam Langleyd9e397b2015-01-22 14:27:53 -08001525
1526 mov r4, r0 @ copy arguments
1527 mov r5, r1
1528 mov r6, r2
1529 mov r7, r3
Adam Langleye9ada862015-05-11 17:20:37 -07001530 ldr r8, [ip, #12] @ load counter .LSW
Adam Langleyd9e397b2015-01-22 14:27:53 -08001531 vld1.8 {q1}, [ip] @ load whole counter value
1532#ifdef __ARMEL__
1533 rev r8, r8
1534#endif
1535 sub sp, sp, #0x10
Adam Langleye9ada862015-05-11 17:20:37 -07001536 vst1.8 {q1}, [sp] @ copy counter value
Adam Langleyd9e397b2015-01-22 14:27:53 -08001537 sub sp, sp, #0x10
1538
1539.Lctr_enc_short_loop:
1540 add r0, sp, #0x10 @ input counter value
1541 mov r1, sp @ output on the stack
1542 mov r2, r7 @ key
1543
1544 bl AES_encrypt
1545
1546 vld1.8 {q0}, [r4]! @ load input
Adam Langleye9ada862015-05-11 17:20:37 -07001547 vld1.8 {q1}, [sp] @ load encrypted counter
Adam Langleyd9e397b2015-01-22 14:27:53 -08001548 add r8, r8, #1
1549#ifdef __ARMEL__
1550 rev r0, r8
1551 str r0, [sp, #0x1c] @ next counter value
1552#else
1553 str r8, [sp, #0x1c] @ next counter value
1554#endif
1555 veor q0,q0,q1
1556 vst1.8 {q0}, [r5]! @ store output
1557 subs r6, r6, #1
1558 bne .Lctr_enc_short_loop
1559
1560 vmov.i32 q0, #0
1561 vmov.i32 q1, #0
Adam Langleye9ada862015-05-11 17:20:37 -07001562 vstmia sp!, {q0,q1}
Adam Langleyd9e397b2015-01-22 14:27:53 -08001563
Adam Langleye9ada862015-05-11 17:20:37 -07001564 ldmia sp!, {r4,r5,r6,r7,r8, pc}
Adam Langleyd9e397b2015-01-22 14:27:53 -08001565.size bsaes_ctr32_encrypt_blocks,.-bsaes_ctr32_encrypt_blocks
1566.globl bsaes_xts_encrypt
1567.hidden bsaes_xts_encrypt
1568.type bsaes_xts_encrypt,%function
1569.align 4
1570bsaes_xts_encrypt:
1571 mov ip, sp
Adam Langleye9ada862015-05-11 17:20:37 -07001572 stmdb sp!, {r4,r5,r6,r7,r8,r9,r10, lr} @ 0x20
Adam Langleyd9e397b2015-01-22 14:27:53 -08001573 VFP_ABI_PUSH
1574 mov r6, sp @ future r3
1575
1576 mov r7, r0
1577 mov r8, r1
1578 mov r9, r2
1579 mov r10, r3
1580
1581 sub r0, sp, #0x10 @ 0x10
1582 bic r0, #0xf @ align at 16 bytes
1583 mov sp, r0
1584
1585#ifdef XTS_CHAIN_TWEAK
1586 ldr r0, [ip] @ pointer to input tweak
1587#else
1588 @ generate initial tweak
1589 ldr r0, [ip, #4] @ iv[]
1590 mov r1, sp
1591 ldr r2, [ip, #0] @ key2
1592 bl AES_encrypt
1593 mov r0,sp @ pointer to initial tweak
1594#endif
1595
1596 ldr r1, [r10, #240] @ get # of rounds
1597 mov r3, r6
1598#ifndef BSAES_ASM_EXTENDED_KEY
1599 @ allocate the key schedule on the stack
1600 sub r12, sp, r1, lsl#7 @ 128 bytes per inner round key
1601 @ add r12, #96 @ size of bit-sliced key schedule
1602 sub r12, #48 @ place for tweak[9]
1603
1604 @ populate the key schedule
1605 mov r4, r10 @ pass key
1606 mov r5, r1 @ pass # of rounds
1607 mov sp, r12
1608 add r12, #0x90 @ pass key schedule
1609 bl _bsaes_key_convert
1610 veor q7, q7, q15 @ fix up last round key
1611 vstmia r12, {q7} @ save last round key
1612#else
1613 ldr r12, [r10, #244]
1614 eors r12, #1
1615 beq 0f
1616
1617 str r12, [r10, #244]
1618 mov r4, r10 @ pass key
1619 mov r5, r1 @ pass # of rounds
1620 add r12, r10, #248 @ pass key schedule
1621 bl _bsaes_key_convert
1622 veor q7, q7, q15 @ fix up last round key
1623 vstmia r12, {q7}
1624
1625.align 2
Adam Langleye9ada862015-05-11 17:20:37 -07001626 sub sp, #0x90 @ place for tweak[9]
Adam Langleyd9e397b2015-01-22 14:27:53 -08001627#endif
1628
1629 vld1.8 {q8}, [r0] @ initial tweak
1630 adr r2, .Lxts_magic
1631
1632 subs r9, #0x80
1633 blo .Lxts_enc_short
1634 b .Lxts_enc_loop
1635
1636.align 4
1637.Lxts_enc_loop:
Adam Langleye9ada862015-05-11 17:20:37 -07001638 vldmia r2, {q5} @ load XTS magic
Adam Langleyd9e397b2015-01-22 14:27:53 -08001639 vshr.s64 q6, q8, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001640 mov r0, sp
1641 vand q6, q6, q5
Adam Langleyd9e397b2015-01-22 14:27:53 -08001642 vadd.u64 q9, q8, q8
Adam Langleye9ada862015-05-11 17:20:37 -07001643 vst1.64 {q8}, [r0,:128]!
1644 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08001645 vshr.s64 q7, q9, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001646 veor q9, q9, q6
1647 vand q7, q7, q5
Adam Langleyd9e397b2015-01-22 14:27:53 -08001648 vadd.u64 q10, q9, q9
Adam Langleye9ada862015-05-11 17:20:37 -07001649 vst1.64 {q9}, [r0,:128]!
1650 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08001651 vshr.s64 q6, q10, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001652 veor q10, q10, q7
1653 vand q6, q6, q5
1654 vld1.8 {q0}, [r7]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001655 vadd.u64 q11, q10, q10
Adam Langleye9ada862015-05-11 17:20:37 -07001656 vst1.64 {q10}, [r0,:128]!
1657 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08001658 vshr.s64 q7, q11, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001659 veor q11, q11, q6
1660 vand q7, q7, q5
1661 vld1.8 {q1}, [r7]!
1662 veor q0, q0, q8
Adam Langleyd9e397b2015-01-22 14:27:53 -08001663 vadd.u64 q12, q11, q11
Adam Langleye9ada862015-05-11 17:20:37 -07001664 vst1.64 {q11}, [r0,:128]!
1665 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08001666 vshr.s64 q6, q12, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001667 veor q12, q12, q7
1668 vand q6, q6, q5
1669 vld1.8 {q2}, [r7]!
1670 veor q1, q1, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -08001671 vadd.u64 q13, q12, q12
Adam Langleye9ada862015-05-11 17:20:37 -07001672 vst1.64 {q12}, [r0,:128]!
1673 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08001674 vshr.s64 q7, q13, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001675 veor q13, q13, q6
1676 vand q7, q7, q5
1677 vld1.8 {q3}, [r7]!
1678 veor q2, q2, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -08001679 vadd.u64 q14, q13, q13
Adam Langleye9ada862015-05-11 17:20:37 -07001680 vst1.64 {q13}, [r0,:128]!
1681 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08001682 vshr.s64 q6, q14, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001683 veor q14, q14, q7
1684 vand q6, q6, q5
1685 vld1.8 {q4}, [r7]!
1686 veor q3, q3, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -08001687 vadd.u64 q15, q14, q14
Adam Langleye9ada862015-05-11 17:20:37 -07001688 vst1.64 {q14}, [r0,:128]!
1689 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08001690 vshr.s64 q7, q15, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001691 veor q15, q15, q6
1692 vand q7, q7, q5
1693 vld1.8 {q5}, [r7]!
1694 veor q4, q4, q12
Adam Langleyd9e397b2015-01-22 14:27:53 -08001695 vadd.u64 q8, q15, q15
Adam Langleye9ada862015-05-11 17:20:37 -07001696 vst1.64 {q15}, [r0,:128]!
1697 vswp d15,d14
1698 veor q8, q8, q7
1699 vst1.64 {q8}, [r0,:128] @ next round tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08001700
Adam Langleye9ada862015-05-11 17:20:37 -07001701 vld1.8 {q6,q7}, [r7]!
1702 veor q5, q5, q13
Adam Langleyd9e397b2015-01-22 14:27:53 -08001703#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07001704 add r4, sp, #0x90 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08001705#else
Adam Langleye9ada862015-05-11 17:20:37 -07001706 add r4, r10, #248 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08001707#endif
Adam Langleye9ada862015-05-11 17:20:37 -07001708 veor q6, q6, q14
1709 mov r5, r1 @ pass rounds
1710 veor q7, q7, q15
1711 mov r0, sp
Adam Langleyd9e397b2015-01-22 14:27:53 -08001712
Adam Langleye9ada862015-05-11 17:20:37 -07001713 bl _bsaes_encrypt8
Adam Langleyd9e397b2015-01-22 14:27:53 -08001714
Adam Langleye9ada862015-05-11 17:20:37 -07001715 vld1.64 {q8,q9}, [r0,:128]!
1716 vld1.64 {q10,q11}, [r0,:128]!
1717 veor q0, q0, q8
1718 vld1.64 {q12,q13}, [r0,:128]!
1719 veor q1, q1, q9
1720 veor q8, q4, q10
1721 vst1.8 {q0,q1}, [r8]!
1722 veor q9, q6, q11
1723 vld1.64 {q14,q15}, [r0,:128]!
1724 veor q10, q3, q12
1725 vst1.8 {q8,q9}, [r8]!
1726 veor q11, q7, q13
1727 veor q12, q2, q14
1728 vst1.8 {q10,q11}, [r8]!
1729 veor q13, q5, q15
1730 vst1.8 {q12,q13}, [r8]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001731
Adam Langleye9ada862015-05-11 17:20:37 -07001732 vld1.64 {q8}, [r0,:128] @ next round tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08001733
Adam Langleye9ada862015-05-11 17:20:37 -07001734 subs r9, #0x80
1735 bpl .Lxts_enc_loop
Adam Langleyd9e397b2015-01-22 14:27:53 -08001736
1737.Lxts_enc_short:
Adam Langleye9ada862015-05-11 17:20:37 -07001738 adds r9, #0x70
1739 bmi .Lxts_enc_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08001740
Adam Langleye9ada862015-05-11 17:20:37 -07001741 vldmia r2, {q5} @ load XTS magic
Adam Langleyd9e397b2015-01-22 14:27:53 -08001742 vshr.s64 q7, q8, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001743 mov r0, sp
1744 vand q7, q7, q5
Adam Langleyd9e397b2015-01-22 14:27:53 -08001745 vadd.u64 q9, q8, q8
Adam Langleye9ada862015-05-11 17:20:37 -07001746 vst1.64 {q8}, [r0,:128]!
1747 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08001748 vshr.s64 q6, q9, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001749 veor q9, q9, q7
1750 vand q6, q6, q5
Adam Langleyd9e397b2015-01-22 14:27:53 -08001751 vadd.u64 q10, q9, q9
Adam Langleye9ada862015-05-11 17:20:37 -07001752 vst1.64 {q9}, [r0,:128]!
1753 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08001754 vshr.s64 q7, q10, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001755 veor q10, q10, q6
1756 vand q7, q7, q5
1757 vld1.8 {q0}, [r7]!
1758 subs r9, #0x10
1759 bmi .Lxts_enc_1
Adam Langleyd9e397b2015-01-22 14:27:53 -08001760 vadd.u64 q11, q10, q10
Adam Langleye9ada862015-05-11 17:20:37 -07001761 vst1.64 {q10}, [r0,:128]!
1762 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08001763 vshr.s64 q6, q11, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001764 veor q11, q11, q7
1765 vand q6, q6, q5
1766 vld1.8 {q1}, [r7]!
1767 subs r9, #0x10
1768 bmi .Lxts_enc_2
1769 veor q0, q0, q8
Adam Langleyd9e397b2015-01-22 14:27:53 -08001770 vadd.u64 q12, q11, q11
Adam Langleye9ada862015-05-11 17:20:37 -07001771 vst1.64 {q11}, [r0,:128]!
1772 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08001773 vshr.s64 q7, q12, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001774 veor q12, q12, q6
1775 vand q7, q7, q5
1776 vld1.8 {q2}, [r7]!
1777 subs r9, #0x10
1778 bmi .Lxts_enc_3
1779 veor q1, q1, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -08001780 vadd.u64 q13, q12, q12
Adam Langleye9ada862015-05-11 17:20:37 -07001781 vst1.64 {q12}, [r0,:128]!
1782 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08001783 vshr.s64 q6, q13, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001784 veor q13, q13, q7
1785 vand q6, q6, q5
1786 vld1.8 {q3}, [r7]!
1787 subs r9, #0x10
1788 bmi .Lxts_enc_4
1789 veor q2, q2, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -08001790 vadd.u64 q14, q13, q13
Adam Langleye9ada862015-05-11 17:20:37 -07001791 vst1.64 {q13}, [r0,:128]!
1792 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08001793 vshr.s64 q7, q14, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001794 veor q14, q14, q6
1795 vand q7, q7, q5
1796 vld1.8 {q4}, [r7]!
1797 subs r9, #0x10
1798 bmi .Lxts_enc_5
1799 veor q3, q3, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -08001800 vadd.u64 q15, q14, q14
Adam Langleye9ada862015-05-11 17:20:37 -07001801 vst1.64 {q14}, [r0,:128]!
1802 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08001803 vshr.s64 q6, q15, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001804 veor q15, q15, q7
1805 vand q6, q6, q5
1806 vld1.8 {q5}, [r7]!
1807 subs r9, #0x10
1808 bmi .Lxts_enc_6
1809 veor q4, q4, q12
1810 sub r9, #0x10
1811 vst1.64 {q15}, [r0,:128] @ next round tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08001812
Adam Langleye9ada862015-05-11 17:20:37 -07001813 vld1.8 {q6}, [r7]!
1814 veor q5, q5, q13
Adam Langleyd9e397b2015-01-22 14:27:53 -08001815#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07001816 add r4, sp, #0x90 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08001817#else
Adam Langleye9ada862015-05-11 17:20:37 -07001818 add r4, r10, #248 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08001819#endif
Adam Langleye9ada862015-05-11 17:20:37 -07001820 veor q6, q6, q14
1821 mov r5, r1 @ pass rounds
1822 mov r0, sp
Adam Langleyd9e397b2015-01-22 14:27:53 -08001823
Adam Langleye9ada862015-05-11 17:20:37 -07001824 bl _bsaes_encrypt8
Adam Langleyd9e397b2015-01-22 14:27:53 -08001825
Adam Langleye9ada862015-05-11 17:20:37 -07001826 vld1.64 {q8,q9}, [r0,:128]!
1827 vld1.64 {q10,q11}, [r0,:128]!
1828 veor q0, q0, q8
1829 vld1.64 {q12,q13}, [r0,:128]!
1830 veor q1, q1, q9
1831 veor q8, q4, q10
1832 vst1.8 {q0,q1}, [r8]!
1833 veor q9, q6, q11
1834 vld1.64 {q14}, [r0,:128]!
1835 veor q10, q3, q12
1836 vst1.8 {q8,q9}, [r8]!
1837 veor q11, q7, q13
1838 veor q12, q2, q14
1839 vst1.8 {q10,q11}, [r8]!
1840 vst1.8 {q12}, [r8]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001841
Adam Langleye9ada862015-05-11 17:20:37 -07001842 vld1.64 {q8}, [r0,:128] @ next round tweak
1843 b .Lxts_enc_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08001844.align 4
1845.Lxts_enc_6:
Adam Langleye9ada862015-05-11 17:20:37 -07001846 vst1.64 {q14}, [r0,:128] @ next round tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08001847
Adam Langleye9ada862015-05-11 17:20:37 -07001848 veor q4, q4, q12
Adam Langleyd9e397b2015-01-22 14:27:53 -08001849#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07001850 add r4, sp, #0x90 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08001851#else
Adam Langleye9ada862015-05-11 17:20:37 -07001852 add r4, r10, #248 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08001853#endif
Adam Langleye9ada862015-05-11 17:20:37 -07001854 veor q5, q5, q13
1855 mov r5, r1 @ pass rounds
1856 mov r0, sp
Adam Langleyd9e397b2015-01-22 14:27:53 -08001857
Adam Langleye9ada862015-05-11 17:20:37 -07001858 bl _bsaes_encrypt8
Adam Langleyd9e397b2015-01-22 14:27:53 -08001859
Adam Langleye9ada862015-05-11 17:20:37 -07001860 vld1.64 {q8,q9}, [r0,:128]!
1861 vld1.64 {q10,q11}, [r0,:128]!
1862 veor q0, q0, q8
1863 vld1.64 {q12,q13}, [r0,:128]!
1864 veor q1, q1, q9
1865 veor q8, q4, q10
1866 vst1.8 {q0,q1}, [r8]!
1867 veor q9, q6, q11
1868 veor q10, q3, q12
1869 vst1.8 {q8,q9}, [r8]!
1870 veor q11, q7, q13
1871 vst1.8 {q10,q11}, [r8]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001872
Adam Langleye9ada862015-05-11 17:20:37 -07001873 vld1.64 {q8}, [r0,:128] @ next round tweak
1874 b .Lxts_enc_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08001875
1876@ put this in range for both ARM and Thumb mode adr instructions
1877.align 5
1878.Lxts_magic:
Adam Langleye9ada862015-05-11 17:20:37 -07001879.quad 1, 0x87
Adam Langleyd9e397b2015-01-22 14:27:53 -08001880
1881.align 5
1882.Lxts_enc_5:
Adam Langleye9ada862015-05-11 17:20:37 -07001883 vst1.64 {q13}, [r0,:128] @ next round tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08001884
Adam Langleye9ada862015-05-11 17:20:37 -07001885 veor q3, q3, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -08001886#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07001887 add r4, sp, #0x90 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08001888#else
Adam Langleye9ada862015-05-11 17:20:37 -07001889 add r4, r10, #248 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08001890#endif
Adam Langleye9ada862015-05-11 17:20:37 -07001891 veor q4, q4, q12
1892 mov r5, r1 @ pass rounds
1893 mov r0, sp
Adam Langleyd9e397b2015-01-22 14:27:53 -08001894
Adam Langleye9ada862015-05-11 17:20:37 -07001895 bl _bsaes_encrypt8
Adam Langleyd9e397b2015-01-22 14:27:53 -08001896
Adam Langleye9ada862015-05-11 17:20:37 -07001897 vld1.64 {q8,q9}, [r0,:128]!
1898 vld1.64 {q10,q11}, [r0,:128]!
1899 veor q0, q0, q8
1900 vld1.64 {q12}, [r0,:128]!
1901 veor q1, q1, q9
1902 veor q8, q4, q10
1903 vst1.8 {q0,q1}, [r8]!
1904 veor q9, q6, q11
1905 veor q10, q3, q12
1906 vst1.8 {q8,q9}, [r8]!
1907 vst1.8 {q10}, [r8]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001908
Adam Langleye9ada862015-05-11 17:20:37 -07001909 vld1.64 {q8}, [r0,:128] @ next round tweak
1910 b .Lxts_enc_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08001911.align 4
1912.Lxts_enc_4:
Adam Langleye9ada862015-05-11 17:20:37 -07001913 vst1.64 {q12}, [r0,:128] @ next round tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08001914
Adam Langleye9ada862015-05-11 17:20:37 -07001915 veor q2, q2, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -08001916#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07001917 add r4, sp, #0x90 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08001918#else
Adam Langleye9ada862015-05-11 17:20:37 -07001919 add r4, r10, #248 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08001920#endif
Adam Langleye9ada862015-05-11 17:20:37 -07001921 veor q3, q3, q11
1922 mov r5, r1 @ pass rounds
1923 mov r0, sp
Adam Langleyd9e397b2015-01-22 14:27:53 -08001924
Adam Langleye9ada862015-05-11 17:20:37 -07001925 bl _bsaes_encrypt8
Adam Langleyd9e397b2015-01-22 14:27:53 -08001926
Adam Langleye9ada862015-05-11 17:20:37 -07001927 vld1.64 {q8,q9}, [r0,:128]!
1928 vld1.64 {q10,q11}, [r0,:128]!
1929 veor q0, q0, q8
1930 veor q1, q1, q9
1931 veor q8, q4, q10
1932 vst1.8 {q0,q1}, [r8]!
1933 veor q9, q6, q11
1934 vst1.8 {q8,q9}, [r8]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001935
Adam Langleye9ada862015-05-11 17:20:37 -07001936 vld1.64 {q8}, [r0,:128] @ next round tweak
1937 b .Lxts_enc_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08001938.align 4
1939.Lxts_enc_3:
Adam Langleye9ada862015-05-11 17:20:37 -07001940 vst1.64 {q11}, [r0,:128] @ next round tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08001941
Adam Langleye9ada862015-05-11 17:20:37 -07001942 veor q1, q1, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -08001943#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07001944 add r4, sp, #0x90 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08001945#else
Adam Langleye9ada862015-05-11 17:20:37 -07001946 add r4, r10, #248 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08001947#endif
Adam Langleye9ada862015-05-11 17:20:37 -07001948 veor q2, q2, q10
1949 mov r5, r1 @ pass rounds
1950 mov r0, sp
Adam Langleyd9e397b2015-01-22 14:27:53 -08001951
Adam Langleye9ada862015-05-11 17:20:37 -07001952 bl _bsaes_encrypt8
Adam Langleyd9e397b2015-01-22 14:27:53 -08001953
Adam Langleye9ada862015-05-11 17:20:37 -07001954 vld1.64 {q8,q9}, [r0,:128]!
1955 vld1.64 {q10}, [r0,:128]!
1956 veor q0, q0, q8
1957 veor q1, q1, q9
1958 veor q8, q4, q10
1959 vst1.8 {q0,q1}, [r8]!
1960 vst1.8 {q8}, [r8]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001961
Adam Langleye9ada862015-05-11 17:20:37 -07001962 vld1.64 {q8}, [r0,:128] @ next round tweak
1963 b .Lxts_enc_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08001964.align 4
1965.Lxts_enc_2:
Adam Langleye9ada862015-05-11 17:20:37 -07001966 vst1.64 {q10}, [r0,:128] @ next round tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08001967
Adam Langleye9ada862015-05-11 17:20:37 -07001968 veor q0, q0, q8
Adam Langleyd9e397b2015-01-22 14:27:53 -08001969#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07001970 add r4, sp, #0x90 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08001971#else
Adam Langleye9ada862015-05-11 17:20:37 -07001972 add r4, r10, #248 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08001973#endif
Adam Langleye9ada862015-05-11 17:20:37 -07001974 veor q1, q1, q9
1975 mov r5, r1 @ pass rounds
1976 mov r0, sp
Adam Langleyd9e397b2015-01-22 14:27:53 -08001977
Adam Langleye9ada862015-05-11 17:20:37 -07001978 bl _bsaes_encrypt8
Adam Langleyd9e397b2015-01-22 14:27:53 -08001979
Adam Langleye9ada862015-05-11 17:20:37 -07001980 vld1.64 {q8,q9}, [r0,:128]!
1981 veor q0, q0, q8
1982 veor q1, q1, q9
1983 vst1.8 {q0,q1}, [r8]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001984
Adam Langleye9ada862015-05-11 17:20:37 -07001985 vld1.64 {q8}, [r0,:128] @ next round tweak
1986 b .Lxts_enc_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08001987.align 4
1988.Lxts_enc_1:
Adam Langleye9ada862015-05-11 17:20:37 -07001989 mov r0, sp
1990 veor q0, q8
1991 mov r1, sp
1992 vst1.8 {q0}, [sp,:128]
1993 mov r2, r10
1994 mov r4, r3 @ preserve fp
Adam Langleyd9e397b2015-01-22 14:27:53 -08001995
Adam Langleye9ada862015-05-11 17:20:37 -07001996 bl AES_encrypt
Adam Langleyd9e397b2015-01-22 14:27:53 -08001997
Adam Langleye9ada862015-05-11 17:20:37 -07001998 vld1.8 {q0}, [sp,:128]
1999 veor q0, q0, q8
2000 vst1.8 {q0}, [r8]!
2001 mov r3, r4
Adam Langleyd9e397b2015-01-22 14:27:53 -08002002
Adam Langleye9ada862015-05-11 17:20:37 -07002003 vmov q8, q9 @ next round tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08002004
2005.Lxts_enc_done:
2006#ifndef XTS_CHAIN_TWEAK
Adam Langleye9ada862015-05-11 17:20:37 -07002007 adds r9, #0x10
2008 beq .Lxts_enc_ret
2009 sub r6, r8, #0x10
Adam Langleyd9e397b2015-01-22 14:27:53 -08002010
2011.Lxts_enc_steal:
Adam Langleye9ada862015-05-11 17:20:37 -07002012 ldrb r0, [r7], #1
2013 ldrb r1, [r8, #-0x10]
2014 strb r0, [r8, #-0x10]
2015 strb r1, [r8], #1
Adam Langleyd9e397b2015-01-22 14:27:53 -08002016
Adam Langleye9ada862015-05-11 17:20:37 -07002017 subs r9, #1
2018 bhi .Lxts_enc_steal
Adam Langleyd9e397b2015-01-22 14:27:53 -08002019
Adam Langleye9ada862015-05-11 17:20:37 -07002020 vld1.8 {q0}, [r6]
2021 mov r0, sp
2022 veor q0, q0, q8
2023 mov r1, sp
2024 vst1.8 {q0}, [sp,:128]
2025 mov r2, r10
2026 mov r4, r3 @ preserve fp
Adam Langleyd9e397b2015-01-22 14:27:53 -08002027
Adam Langleye9ada862015-05-11 17:20:37 -07002028 bl AES_encrypt
Adam Langleyd9e397b2015-01-22 14:27:53 -08002029
Adam Langleye9ada862015-05-11 17:20:37 -07002030 vld1.8 {q0}, [sp,:128]
2031 veor q0, q0, q8
2032 vst1.8 {q0}, [r6]
2033 mov r3, r4
Adam Langleyd9e397b2015-01-22 14:27:53 -08002034#endif
2035
2036.Lxts_enc_ret:
Adam Langleye9ada862015-05-11 17:20:37 -07002037 bic r0, r3, #0xf
Adam Langleyd9e397b2015-01-22 14:27:53 -08002038 vmov.i32 q0, #0
2039 vmov.i32 q1, #0
2040#ifdef XTS_CHAIN_TWEAK
Adam Langleye9ada862015-05-11 17:20:37 -07002041 ldr r1, [r3, #0x20+VFP_ABI_FRAME] @ chain tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08002042#endif
Adam Langleye9ada862015-05-11 17:20:37 -07002043.Lxts_enc_bzero:@ wipe key schedule [if any]
2044 vstmia sp!, {q0,q1}
2045 cmp sp, r0
2046 bne .Lxts_enc_bzero
Adam Langleyd9e397b2015-01-22 14:27:53 -08002047
Adam Langleye9ada862015-05-11 17:20:37 -07002048 mov sp, r3
Adam Langleyd9e397b2015-01-22 14:27:53 -08002049#ifdef XTS_CHAIN_TWEAK
Adam Langleye9ada862015-05-11 17:20:37 -07002050 vst1.8 {q8}, [r1]
Adam Langleyd9e397b2015-01-22 14:27:53 -08002051#endif
2052 VFP_ABI_POP
Adam Langleye9ada862015-05-11 17:20:37 -07002053 ldmia sp!, {r4,r5,r6,r7,r8,r9,r10, pc} @ return
Adam Langleyd9e397b2015-01-22 14:27:53 -08002054
2055.size bsaes_xts_encrypt,.-bsaes_xts_encrypt
2056
2057.globl bsaes_xts_decrypt
2058.hidden bsaes_xts_decrypt
2059.type bsaes_xts_decrypt,%function
2060.align 4
2061bsaes_xts_decrypt:
2062 mov ip, sp
Adam Langleye9ada862015-05-11 17:20:37 -07002063 stmdb sp!, {r4,r5,r6,r7,r8,r9,r10, lr} @ 0x20
Adam Langleyd9e397b2015-01-22 14:27:53 -08002064 VFP_ABI_PUSH
2065 mov r6, sp @ future r3
2066
2067 mov r7, r0
2068 mov r8, r1
2069 mov r9, r2
2070 mov r10, r3
2071
2072 sub r0, sp, #0x10 @ 0x10
2073 bic r0, #0xf @ align at 16 bytes
2074 mov sp, r0
2075
2076#ifdef XTS_CHAIN_TWEAK
2077 ldr r0, [ip] @ pointer to input tweak
2078#else
2079 @ generate initial tweak
2080 ldr r0, [ip, #4] @ iv[]
2081 mov r1, sp
2082 ldr r2, [ip, #0] @ key2
2083 bl AES_encrypt
2084 mov r0, sp @ pointer to initial tweak
2085#endif
2086
2087 ldr r1, [r10, #240] @ get # of rounds
2088 mov r3, r6
2089#ifndef BSAES_ASM_EXTENDED_KEY
2090 @ allocate the key schedule on the stack
2091 sub r12, sp, r1, lsl#7 @ 128 bytes per inner round key
2092 @ add r12, #96 @ size of bit-sliced key schedule
2093 sub r12, #48 @ place for tweak[9]
2094
2095 @ populate the key schedule
2096 mov r4, r10 @ pass key
2097 mov r5, r1 @ pass # of rounds
2098 mov sp, r12
2099 add r12, #0x90 @ pass key schedule
2100 bl _bsaes_key_convert
2101 add r4, sp, #0x90
2102 vldmia r4, {q6}
2103 vstmia r12, {q15} @ save last round key
2104 veor q7, q7, q6 @ fix up round 0 key
2105 vstmia r4, {q7}
2106#else
2107 ldr r12, [r10, #244]
2108 eors r12, #1
2109 beq 0f
2110
2111 str r12, [r10, #244]
2112 mov r4, r10 @ pass key
2113 mov r5, r1 @ pass # of rounds
2114 add r12, r10, #248 @ pass key schedule
2115 bl _bsaes_key_convert
2116 add r4, r10, #248
2117 vldmia r4, {q6}
2118 vstmia r12, {q15} @ save last round key
2119 veor q7, q7, q6 @ fix up round 0 key
2120 vstmia r4, {q7}
2121
2122.align 2
Adam Langleye9ada862015-05-11 17:20:37 -07002123 sub sp, #0x90 @ place for tweak[9]
Adam Langleyd9e397b2015-01-22 14:27:53 -08002124#endif
2125 vld1.8 {q8}, [r0] @ initial tweak
2126 adr r2, .Lxts_magic
2127
Adam Langleye9ada862015-05-11 17:20:37 -07002128#ifndef XTS_CHAIN_TWEAK
Adam Langleyd9e397b2015-01-22 14:27:53 -08002129 tst r9, #0xf @ if not multiple of 16
2130 it ne @ Thumb2 thing, sanity check in ARM
2131 subne r9, #0x10 @ subtract another 16 bytes
Adam Langleye9ada862015-05-11 17:20:37 -07002132#endif
Adam Langleyd9e397b2015-01-22 14:27:53 -08002133 subs r9, #0x80
2134
2135 blo .Lxts_dec_short
2136 b .Lxts_dec_loop
2137
2138.align 4
2139.Lxts_dec_loop:
Adam Langleye9ada862015-05-11 17:20:37 -07002140 vldmia r2, {q5} @ load XTS magic
Adam Langleyd9e397b2015-01-22 14:27:53 -08002141 vshr.s64 q6, q8, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002142 mov r0, sp
2143 vand q6, q6, q5
Adam Langleyd9e397b2015-01-22 14:27:53 -08002144 vadd.u64 q9, q8, q8
Adam Langleye9ada862015-05-11 17:20:37 -07002145 vst1.64 {q8}, [r0,:128]!
2146 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08002147 vshr.s64 q7, q9, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002148 veor q9, q9, q6
2149 vand q7, q7, q5
Adam Langleyd9e397b2015-01-22 14:27:53 -08002150 vadd.u64 q10, q9, q9
Adam Langleye9ada862015-05-11 17:20:37 -07002151 vst1.64 {q9}, [r0,:128]!
2152 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08002153 vshr.s64 q6, q10, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002154 veor q10, q10, q7
2155 vand q6, q6, q5
2156 vld1.8 {q0}, [r7]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08002157 vadd.u64 q11, q10, q10
Adam Langleye9ada862015-05-11 17:20:37 -07002158 vst1.64 {q10}, [r0,:128]!
2159 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08002160 vshr.s64 q7, q11, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002161 veor q11, q11, q6
2162 vand q7, q7, q5
2163 vld1.8 {q1}, [r7]!
2164 veor q0, q0, q8
Adam Langleyd9e397b2015-01-22 14:27:53 -08002165 vadd.u64 q12, q11, q11
Adam Langleye9ada862015-05-11 17:20:37 -07002166 vst1.64 {q11}, [r0,:128]!
2167 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08002168 vshr.s64 q6, q12, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002169 veor q12, q12, q7
2170 vand q6, q6, q5
2171 vld1.8 {q2}, [r7]!
2172 veor q1, q1, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -08002173 vadd.u64 q13, q12, q12
Adam Langleye9ada862015-05-11 17:20:37 -07002174 vst1.64 {q12}, [r0,:128]!
2175 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08002176 vshr.s64 q7, q13, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002177 veor q13, q13, q6
2178 vand q7, q7, q5
2179 vld1.8 {q3}, [r7]!
2180 veor q2, q2, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -08002181 vadd.u64 q14, q13, q13
Adam Langleye9ada862015-05-11 17:20:37 -07002182 vst1.64 {q13}, [r0,:128]!
2183 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08002184 vshr.s64 q6, q14, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002185 veor q14, q14, q7
2186 vand q6, q6, q5
2187 vld1.8 {q4}, [r7]!
2188 veor q3, q3, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -08002189 vadd.u64 q15, q14, q14
Adam Langleye9ada862015-05-11 17:20:37 -07002190 vst1.64 {q14}, [r0,:128]!
2191 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08002192 vshr.s64 q7, q15, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002193 veor q15, q15, q6
2194 vand q7, q7, q5
2195 vld1.8 {q5}, [r7]!
2196 veor q4, q4, q12
Adam Langleyd9e397b2015-01-22 14:27:53 -08002197 vadd.u64 q8, q15, q15
Adam Langleye9ada862015-05-11 17:20:37 -07002198 vst1.64 {q15}, [r0,:128]!
2199 vswp d15,d14
2200 veor q8, q8, q7
2201 vst1.64 {q8}, [r0,:128] @ next round tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08002202
Adam Langleye9ada862015-05-11 17:20:37 -07002203 vld1.8 {q6,q7}, [r7]!
2204 veor q5, q5, q13
Adam Langleyd9e397b2015-01-22 14:27:53 -08002205#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07002206 add r4, sp, #0x90 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002207#else
Adam Langleye9ada862015-05-11 17:20:37 -07002208 add r4, r10, #248 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002209#endif
Adam Langleye9ada862015-05-11 17:20:37 -07002210 veor q6, q6, q14
2211 mov r5, r1 @ pass rounds
2212 veor q7, q7, q15
2213 mov r0, sp
Adam Langleyd9e397b2015-01-22 14:27:53 -08002214
Adam Langleye9ada862015-05-11 17:20:37 -07002215 bl _bsaes_decrypt8
Adam Langleyd9e397b2015-01-22 14:27:53 -08002216
Adam Langleye9ada862015-05-11 17:20:37 -07002217 vld1.64 {q8,q9}, [r0,:128]!
2218 vld1.64 {q10,q11}, [r0,:128]!
2219 veor q0, q0, q8
2220 vld1.64 {q12,q13}, [r0,:128]!
2221 veor q1, q1, q9
2222 veor q8, q6, q10
2223 vst1.8 {q0,q1}, [r8]!
2224 veor q9, q4, q11
2225 vld1.64 {q14,q15}, [r0,:128]!
2226 veor q10, q2, q12
2227 vst1.8 {q8,q9}, [r8]!
2228 veor q11, q7, q13
2229 veor q12, q3, q14
2230 vst1.8 {q10,q11}, [r8]!
2231 veor q13, q5, q15
2232 vst1.8 {q12,q13}, [r8]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08002233
Adam Langleye9ada862015-05-11 17:20:37 -07002234 vld1.64 {q8}, [r0,:128] @ next round tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08002235
Adam Langleye9ada862015-05-11 17:20:37 -07002236 subs r9, #0x80
2237 bpl .Lxts_dec_loop
Adam Langleyd9e397b2015-01-22 14:27:53 -08002238
2239.Lxts_dec_short:
Adam Langleye9ada862015-05-11 17:20:37 -07002240 adds r9, #0x70
2241 bmi .Lxts_dec_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08002242
Adam Langleye9ada862015-05-11 17:20:37 -07002243 vldmia r2, {q5} @ load XTS magic
Adam Langleyd9e397b2015-01-22 14:27:53 -08002244 vshr.s64 q7, q8, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002245 mov r0, sp
2246 vand q7, q7, q5
Adam Langleyd9e397b2015-01-22 14:27:53 -08002247 vadd.u64 q9, q8, q8
Adam Langleye9ada862015-05-11 17:20:37 -07002248 vst1.64 {q8}, [r0,:128]!
2249 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08002250 vshr.s64 q6, q9, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002251 veor q9, q9, q7
2252 vand q6, q6, q5
Adam Langleyd9e397b2015-01-22 14:27:53 -08002253 vadd.u64 q10, q9, q9
Adam Langleye9ada862015-05-11 17:20:37 -07002254 vst1.64 {q9}, [r0,:128]!
2255 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08002256 vshr.s64 q7, q10, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002257 veor q10, q10, q6
2258 vand q7, q7, q5
2259 vld1.8 {q0}, [r7]!
2260 subs r9, #0x10
2261 bmi .Lxts_dec_1
Adam Langleyd9e397b2015-01-22 14:27:53 -08002262 vadd.u64 q11, q10, q10
Adam Langleye9ada862015-05-11 17:20:37 -07002263 vst1.64 {q10}, [r0,:128]!
2264 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08002265 vshr.s64 q6, q11, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002266 veor q11, q11, q7
2267 vand q6, q6, q5
2268 vld1.8 {q1}, [r7]!
2269 subs r9, #0x10
2270 bmi .Lxts_dec_2
2271 veor q0, q0, q8
Adam Langleyd9e397b2015-01-22 14:27:53 -08002272 vadd.u64 q12, q11, q11
Adam Langleye9ada862015-05-11 17:20:37 -07002273 vst1.64 {q11}, [r0,:128]!
2274 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08002275 vshr.s64 q7, q12, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002276 veor q12, q12, q6
2277 vand q7, q7, q5
2278 vld1.8 {q2}, [r7]!
2279 subs r9, #0x10
2280 bmi .Lxts_dec_3
2281 veor q1, q1, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -08002282 vadd.u64 q13, q12, q12
Adam Langleye9ada862015-05-11 17:20:37 -07002283 vst1.64 {q12}, [r0,:128]!
2284 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08002285 vshr.s64 q6, q13, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002286 veor q13, q13, q7
2287 vand q6, q6, q5
2288 vld1.8 {q3}, [r7]!
2289 subs r9, #0x10
2290 bmi .Lxts_dec_4
2291 veor q2, q2, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -08002292 vadd.u64 q14, q13, q13
Adam Langleye9ada862015-05-11 17:20:37 -07002293 vst1.64 {q13}, [r0,:128]!
2294 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08002295 vshr.s64 q7, q14, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002296 veor q14, q14, q6
2297 vand q7, q7, q5
2298 vld1.8 {q4}, [r7]!
2299 subs r9, #0x10
2300 bmi .Lxts_dec_5
2301 veor q3, q3, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -08002302 vadd.u64 q15, q14, q14
Adam Langleye9ada862015-05-11 17:20:37 -07002303 vst1.64 {q14}, [r0,:128]!
2304 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08002305 vshr.s64 q6, q15, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002306 veor q15, q15, q7
2307 vand q6, q6, q5
2308 vld1.8 {q5}, [r7]!
2309 subs r9, #0x10
2310 bmi .Lxts_dec_6
2311 veor q4, q4, q12
2312 sub r9, #0x10
2313 vst1.64 {q15}, [r0,:128] @ next round tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08002314
Adam Langleye9ada862015-05-11 17:20:37 -07002315 vld1.8 {q6}, [r7]!
2316 veor q5, q5, q13
Adam Langleyd9e397b2015-01-22 14:27:53 -08002317#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07002318 add r4, sp, #0x90 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002319#else
Adam Langleye9ada862015-05-11 17:20:37 -07002320 add r4, r10, #248 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002321#endif
Adam Langleye9ada862015-05-11 17:20:37 -07002322 veor q6, q6, q14
2323 mov r5, r1 @ pass rounds
2324 mov r0, sp
Adam Langleyd9e397b2015-01-22 14:27:53 -08002325
Adam Langleye9ada862015-05-11 17:20:37 -07002326 bl _bsaes_decrypt8
Adam Langleyd9e397b2015-01-22 14:27:53 -08002327
Adam Langleye9ada862015-05-11 17:20:37 -07002328 vld1.64 {q8,q9}, [r0,:128]!
2329 vld1.64 {q10,q11}, [r0,:128]!
2330 veor q0, q0, q8
2331 vld1.64 {q12,q13}, [r0,:128]!
2332 veor q1, q1, q9
2333 veor q8, q6, q10
2334 vst1.8 {q0,q1}, [r8]!
2335 veor q9, q4, q11
2336 vld1.64 {q14}, [r0,:128]!
2337 veor q10, q2, q12
2338 vst1.8 {q8,q9}, [r8]!
2339 veor q11, q7, q13
2340 veor q12, q3, q14
2341 vst1.8 {q10,q11}, [r8]!
2342 vst1.8 {q12}, [r8]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08002343
Adam Langleye9ada862015-05-11 17:20:37 -07002344 vld1.64 {q8}, [r0,:128] @ next round tweak
2345 b .Lxts_dec_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08002346.align 4
2347.Lxts_dec_6:
Adam Langleye9ada862015-05-11 17:20:37 -07002348 vst1.64 {q14}, [r0,:128] @ next round tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08002349
Adam Langleye9ada862015-05-11 17:20:37 -07002350 veor q4, q4, q12
Adam Langleyd9e397b2015-01-22 14:27:53 -08002351#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07002352 add r4, sp, #0x90 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002353#else
Adam Langleye9ada862015-05-11 17:20:37 -07002354 add r4, r10, #248 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002355#endif
Adam Langleye9ada862015-05-11 17:20:37 -07002356 veor q5, q5, q13
2357 mov r5, r1 @ pass rounds
2358 mov r0, sp
Adam Langleyd9e397b2015-01-22 14:27:53 -08002359
Adam Langleye9ada862015-05-11 17:20:37 -07002360 bl _bsaes_decrypt8
Adam Langleyd9e397b2015-01-22 14:27:53 -08002361
Adam Langleye9ada862015-05-11 17:20:37 -07002362 vld1.64 {q8,q9}, [r0,:128]!
2363 vld1.64 {q10,q11}, [r0,:128]!
2364 veor q0, q0, q8
2365 vld1.64 {q12,q13}, [r0,:128]!
2366 veor q1, q1, q9
2367 veor q8, q6, q10
2368 vst1.8 {q0,q1}, [r8]!
2369 veor q9, q4, q11
2370 veor q10, q2, q12
2371 vst1.8 {q8,q9}, [r8]!
2372 veor q11, q7, q13
2373 vst1.8 {q10,q11}, [r8]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08002374
Adam Langleye9ada862015-05-11 17:20:37 -07002375 vld1.64 {q8}, [r0,:128] @ next round tweak
2376 b .Lxts_dec_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08002377.align 4
2378.Lxts_dec_5:
Adam Langleye9ada862015-05-11 17:20:37 -07002379 vst1.64 {q13}, [r0,:128] @ next round tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08002380
Adam Langleye9ada862015-05-11 17:20:37 -07002381 veor q3, q3, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -08002382#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07002383 add r4, sp, #0x90 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002384#else
Adam Langleye9ada862015-05-11 17:20:37 -07002385 add r4, r10, #248 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002386#endif
Adam Langleye9ada862015-05-11 17:20:37 -07002387 veor q4, q4, q12
2388 mov r5, r1 @ pass rounds
2389 mov r0, sp
Adam Langleyd9e397b2015-01-22 14:27:53 -08002390
Adam Langleye9ada862015-05-11 17:20:37 -07002391 bl _bsaes_decrypt8
Adam Langleyd9e397b2015-01-22 14:27:53 -08002392
Adam Langleye9ada862015-05-11 17:20:37 -07002393 vld1.64 {q8,q9}, [r0,:128]!
2394 vld1.64 {q10,q11}, [r0,:128]!
2395 veor q0, q0, q8
2396 vld1.64 {q12}, [r0,:128]!
2397 veor q1, q1, q9
2398 veor q8, q6, q10
2399 vst1.8 {q0,q1}, [r8]!
2400 veor q9, q4, q11
2401 veor q10, q2, q12
2402 vst1.8 {q8,q9}, [r8]!
2403 vst1.8 {q10}, [r8]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08002404
Adam Langleye9ada862015-05-11 17:20:37 -07002405 vld1.64 {q8}, [r0,:128] @ next round tweak
2406 b .Lxts_dec_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08002407.align 4
2408.Lxts_dec_4:
Adam Langleye9ada862015-05-11 17:20:37 -07002409 vst1.64 {q12}, [r0,:128] @ next round tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08002410
Adam Langleye9ada862015-05-11 17:20:37 -07002411 veor q2, q2, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -08002412#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07002413 add r4, sp, #0x90 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002414#else
Adam Langleye9ada862015-05-11 17:20:37 -07002415 add r4, r10, #248 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002416#endif
Adam Langleye9ada862015-05-11 17:20:37 -07002417 veor q3, q3, q11
2418 mov r5, r1 @ pass rounds
2419 mov r0, sp
Adam Langleyd9e397b2015-01-22 14:27:53 -08002420
Adam Langleye9ada862015-05-11 17:20:37 -07002421 bl _bsaes_decrypt8
Adam Langleyd9e397b2015-01-22 14:27:53 -08002422
Adam Langleye9ada862015-05-11 17:20:37 -07002423 vld1.64 {q8,q9}, [r0,:128]!
2424 vld1.64 {q10,q11}, [r0,:128]!
2425 veor q0, q0, q8
2426 veor q1, q1, q9
2427 veor q8, q6, q10
2428 vst1.8 {q0,q1}, [r8]!
2429 veor q9, q4, q11
2430 vst1.8 {q8,q9}, [r8]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08002431
Adam Langleye9ada862015-05-11 17:20:37 -07002432 vld1.64 {q8}, [r0,:128] @ next round tweak
2433 b .Lxts_dec_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08002434.align 4
2435.Lxts_dec_3:
Adam Langleye9ada862015-05-11 17:20:37 -07002436 vst1.64 {q11}, [r0,:128] @ next round tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08002437
Adam Langleye9ada862015-05-11 17:20:37 -07002438 veor q1, q1, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -08002439#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07002440 add r4, sp, #0x90 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002441#else
Adam Langleye9ada862015-05-11 17:20:37 -07002442 add r4, r10, #248 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002443#endif
Adam Langleye9ada862015-05-11 17:20:37 -07002444 veor q2, q2, q10
2445 mov r5, r1 @ pass rounds
2446 mov r0, sp
Adam Langleyd9e397b2015-01-22 14:27:53 -08002447
Adam Langleye9ada862015-05-11 17:20:37 -07002448 bl _bsaes_decrypt8
Adam Langleyd9e397b2015-01-22 14:27:53 -08002449
Adam Langleye9ada862015-05-11 17:20:37 -07002450 vld1.64 {q8,q9}, [r0,:128]!
2451 vld1.64 {q10}, [r0,:128]!
2452 veor q0, q0, q8
2453 veor q1, q1, q9
2454 veor q8, q6, q10
2455 vst1.8 {q0,q1}, [r8]!
2456 vst1.8 {q8}, [r8]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08002457
Adam Langleye9ada862015-05-11 17:20:37 -07002458 vld1.64 {q8}, [r0,:128] @ next round tweak
2459 b .Lxts_dec_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08002460.align 4
2461.Lxts_dec_2:
Adam Langleye9ada862015-05-11 17:20:37 -07002462 vst1.64 {q10}, [r0,:128] @ next round tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08002463
Adam Langleye9ada862015-05-11 17:20:37 -07002464 veor q0, q0, q8
Adam Langleyd9e397b2015-01-22 14:27:53 -08002465#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07002466 add r4, sp, #0x90 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002467#else
Adam Langleye9ada862015-05-11 17:20:37 -07002468 add r4, r10, #248 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002469#endif
Adam Langleye9ada862015-05-11 17:20:37 -07002470 veor q1, q1, q9
2471 mov r5, r1 @ pass rounds
2472 mov r0, sp
Adam Langleyd9e397b2015-01-22 14:27:53 -08002473
Adam Langleye9ada862015-05-11 17:20:37 -07002474 bl _bsaes_decrypt8
Adam Langleyd9e397b2015-01-22 14:27:53 -08002475
Adam Langleye9ada862015-05-11 17:20:37 -07002476 vld1.64 {q8,q9}, [r0,:128]!
2477 veor q0, q0, q8
2478 veor q1, q1, q9
2479 vst1.8 {q0,q1}, [r8]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08002480
Adam Langleye9ada862015-05-11 17:20:37 -07002481 vld1.64 {q8}, [r0,:128] @ next round tweak
2482 b .Lxts_dec_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08002483.align 4
2484.Lxts_dec_1:
Adam Langleye9ada862015-05-11 17:20:37 -07002485 mov r0, sp
2486 veor q0, q8
2487 mov r1, sp
2488 vst1.8 {q0}, [sp,:128]
2489 mov r2, r10
2490 mov r4, r3 @ preserve fp
2491 mov r5, r2 @ preserve magic
Adam Langleyd9e397b2015-01-22 14:27:53 -08002492
Adam Langleye9ada862015-05-11 17:20:37 -07002493 bl AES_decrypt
Adam Langleyd9e397b2015-01-22 14:27:53 -08002494
Adam Langleye9ada862015-05-11 17:20:37 -07002495 vld1.8 {q0}, [sp,:128]
2496 veor q0, q0, q8
2497 vst1.8 {q0}, [r8]!
2498 mov r3, r4
2499 mov r2, r5
Adam Langleyd9e397b2015-01-22 14:27:53 -08002500
Adam Langleye9ada862015-05-11 17:20:37 -07002501 vmov q8, q9 @ next round tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08002502
2503.Lxts_dec_done:
2504#ifndef XTS_CHAIN_TWEAK
Adam Langleye9ada862015-05-11 17:20:37 -07002505 adds r9, #0x10
2506 beq .Lxts_dec_ret
Adam Langleyd9e397b2015-01-22 14:27:53 -08002507
2508 @ calculate one round of extra tweak for the stolen ciphertext
Adam Langleye9ada862015-05-11 17:20:37 -07002509 vldmia r2, {q5}
Adam Langleyd9e397b2015-01-22 14:27:53 -08002510 vshr.s64 q6, q8, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002511 vand q6, q6, q5
Adam Langleyd9e397b2015-01-22 14:27:53 -08002512 vadd.u64 q9, q8, q8
Adam Langleye9ada862015-05-11 17:20:37 -07002513 vswp d13,d12
2514 veor q9, q9, q6
Adam Langleyd9e397b2015-01-22 14:27:53 -08002515
2516 @ perform the final decryption with the last tweak value
Adam Langleye9ada862015-05-11 17:20:37 -07002517 vld1.8 {q0}, [r7]!
2518 mov r0, sp
2519 veor q0, q0, q9
2520 mov r1, sp
2521 vst1.8 {q0}, [sp,:128]
2522 mov r2, r10
2523 mov r4, r3 @ preserve fp
Adam Langleyd9e397b2015-01-22 14:27:53 -08002524
Adam Langleye9ada862015-05-11 17:20:37 -07002525 bl AES_decrypt
Adam Langleyd9e397b2015-01-22 14:27:53 -08002526
Adam Langleye9ada862015-05-11 17:20:37 -07002527 vld1.8 {q0}, [sp,:128]
2528 veor q0, q0, q9
2529 vst1.8 {q0}, [r8]
Adam Langleyd9e397b2015-01-22 14:27:53 -08002530
Adam Langleye9ada862015-05-11 17:20:37 -07002531 mov r6, r8
Adam Langleyd9e397b2015-01-22 14:27:53 -08002532.Lxts_dec_steal:
Adam Langleye9ada862015-05-11 17:20:37 -07002533 ldrb r1, [r8]
2534 ldrb r0, [r7], #1
2535 strb r1, [r8, #0x10]
2536 strb r0, [r8], #1
Adam Langleyd9e397b2015-01-22 14:27:53 -08002537
Adam Langleye9ada862015-05-11 17:20:37 -07002538 subs r9, #1
2539 bhi .Lxts_dec_steal
Adam Langleyd9e397b2015-01-22 14:27:53 -08002540
Adam Langleye9ada862015-05-11 17:20:37 -07002541 vld1.8 {q0}, [r6]
2542 mov r0, sp
2543 veor q0, q8
2544 mov r1, sp
2545 vst1.8 {q0}, [sp,:128]
2546 mov r2, r10
Adam Langleyd9e397b2015-01-22 14:27:53 -08002547
Adam Langleye9ada862015-05-11 17:20:37 -07002548 bl AES_decrypt
Adam Langleyd9e397b2015-01-22 14:27:53 -08002549
Adam Langleye9ada862015-05-11 17:20:37 -07002550 vld1.8 {q0}, [sp,:128]
2551 veor q0, q0, q8
2552 vst1.8 {q0}, [r6]
2553 mov r3, r4
Adam Langleyd9e397b2015-01-22 14:27:53 -08002554#endif
2555
2556.Lxts_dec_ret:
Adam Langleye9ada862015-05-11 17:20:37 -07002557 bic r0, r3, #0xf
Adam Langleyd9e397b2015-01-22 14:27:53 -08002558 vmov.i32 q0, #0
2559 vmov.i32 q1, #0
2560#ifdef XTS_CHAIN_TWEAK
Adam Langleye9ada862015-05-11 17:20:37 -07002561 ldr r1, [r3, #0x20+VFP_ABI_FRAME] @ chain tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08002562#endif
Adam Langleye9ada862015-05-11 17:20:37 -07002563.Lxts_dec_bzero:@ wipe key schedule [if any]
2564 vstmia sp!, {q0,q1}
2565 cmp sp, r0
2566 bne .Lxts_dec_bzero
Adam Langleyd9e397b2015-01-22 14:27:53 -08002567
Adam Langleye9ada862015-05-11 17:20:37 -07002568 mov sp, r3
Adam Langleyd9e397b2015-01-22 14:27:53 -08002569#ifdef XTS_CHAIN_TWEAK
Adam Langleye9ada862015-05-11 17:20:37 -07002570 vst1.8 {q8}, [r1]
Adam Langleyd9e397b2015-01-22 14:27:53 -08002571#endif
2572 VFP_ABI_POP
Adam Langleye9ada862015-05-11 17:20:37 -07002573 ldmia sp!, {r4,r5,r6,r7,r8,r9,r10, pc} @ return
Adam Langleyd9e397b2015-01-22 14:27:53 -08002574
2575.size bsaes_xts_decrypt,.-bsaes_xts_decrypt
2576#endif
2577#endif