blob: f9c6de73ff91feb3b2bb043641c9f6c2ffbb06d6 [file] [log] [blame]
Kenny Rootb8494592015-09-25 02:29:14 +00001#if defined(__arm__)
Robert Sloan6f79a502017-04-03 09:16:40 -07002@ Copyright 2012-2016 The OpenSSL Project Authors. All Rights Reserved.
3@
4@ Licensed under the OpenSSL license (the "License"). You may not use
5@ this file except in compliance with the License. You can obtain a copy
6@ in the file LICENSE in the source distribution or at
7@ https://www.openssl.org/source/license.html
8
Adam Langleyd9e397b2015-01-22 14:27:53 -08009
10@ ====================================================================
11@ Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
12@ project. The module is, however, dual licensed under OpenSSL and
13@ CRYPTOGAMS licenses depending on where you obtain it. For further
14@ details see http://www.openssl.org/~appro/cryptogams/.
15@
16@ Specific modes and adaptation for Linux kernel by Ard Biesheuvel
17@ <ard.biesheuvel@linaro.org>. Permission to use under GPL terms is
18@ granted.
19@ ====================================================================
20
21@ Bit-sliced AES for ARM NEON
22@
23@ February 2012.
24@
25@ This implementation is direct adaptation of bsaes-x86_64 module for
26@ ARM NEON. Except that this module is endian-neutral [in sense that
27@ it can be compiled for either endianness] by courtesy of vld1.8's
28@ neutrality. Initial version doesn't implement interface to OpenSSL,
29@ only low-level primitives and unsupported entry points, just enough
30@ to collect performance results, which for Cortex-A8 core are:
31@
32@ encrypt 19.5 cycles per byte processed with 128-bit key
33@ decrypt 22.1 cycles per byte processed with 128-bit key
34@ key conv. 440 cycles per 128-bit key/0.18 of 8x block
35@
36@ Snapdragon S4 encrypts byte in 17.6 cycles and decrypts in 19.7,
37@ which is [much] worse than anticipated (for further details see
38@ http://www.openssl.org/~appro/Snapdragon-S4.html).
39@
40@ Cortex-A15 manages in 14.2/16.1 cycles [when integer-only code
41@ manages in 20.0 cycles].
42@
43@ When comparing to x86_64 results keep in mind that NEON unit is
44@ [mostly] single-issue and thus can't [fully] benefit from
45@ instruction-level parallelism. And when comparing to aes-armv4
46@ results keep in mind key schedule conversion overhead (see
47@ bsaes-x86_64.pl for further details)...
48@
49@ <appro@openssl.org>
50
51@ April-August 2013
52@
53@ Add CBC, CTR and XTS subroutines, adapt for kernel use.
54@
55@ <ard.biesheuvel@linaro.org>
56
Adam Langleyd9e397b2015-01-22 14:27:53 -080057#ifndef __KERNEL__
Kenny Rootb8494592015-09-25 02:29:14 +000058# include <openssl/arm_arch.h>
Adam Langleyd9e397b2015-01-22 14:27:53 -080059
60# define VFP_ABI_PUSH vstmdb sp!,{d8-d15}
61# define VFP_ABI_POP vldmia sp!,{d8-d15}
62# define VFP_ABI_FRAME 0x40
63#else
64# define VFP_ABI_PUSH
65# define VFP_ABI_POP
66# define VFP_ABI_FRAME 0
67# define BSAES_ASM_EXTENDED_KEY
68# define XTS_CHAIN_TWEAK
69# define __ARM_ARCH__ __LINUX_ARM_ARCH__
Adam Langleye9ada862015-05-11 17:20:37 -070070# define __ARM_MAX_ARCH__ 7
Adam Langleyd9e397b2015-01-22 14:27:53 -080071#endif
72
73#ifdef __thumb__
74# define adrl adr
75#endif
76
Adam Langleye9ada862015-05-11 17:20:37 -070077#if __ARM_MAX_ARCH__>=7
78.arch armv7-a
79.fpu neon
80
Adam Langleyd9e397b2015-01-22 14:27:53 -080081.text
82.syntax unified @ ARMv7-capable assembler is expected to handle this
Adam Langleye9ada862015-05-11 17:20:37 -070083#if defined(__thumb2__) && !defined(__APPLE__)
Adam Langleyd9e397b2015-01-22 14:27:53 -080084.thumb
85#else
Adam Langleye9ada862015-05-11 17:20:37 -070086.code 32
Robert Sloan6f79a502017-04-03 09:16:40 -070087# undef __thumb2__
Adam Langleyd9e397b2015-01-22 14:27:53 -080088#endif
89
Adam Langleyd9e397b2015-01-22 14:27:53 -080090.type _bsaes_decrypt8,%function
91.align 4
92_bsaes_decrypt8:
Robert Sloand5c22152017-11-13 09:22:12 -080093 adr r6,.
Adam Langleyd9e397b2015-01-22 14:27:53 -080094 vldmia r4!, {q9} @ round 0 key
Adam Langleye9ada862015-05-11 17:20:37 -070095#ifdef __APPLE__
96 adr r6,.LM0ISR
97#else
Adam Langleyd9e397b2015-01-22 14:27:53 -080098 add r6,r6,#.LM0ISR-_bsaes_decrypt8
Adam Langleye9ada862015-05-11 17:20:37 -070099#endif
Adam Langleyd9e397b2015-01-22 14:27:53 -0800100
101 vldmia r6!, {q8} @ .LM0ISR
102 veor q10, q0, q9 @ xor with round0 key
103 veor q11, q1, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700104 vtbl.8 d0, {q10}, d16
105 vtbl.8 d1, {q10}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -0800106 veor q12, q2, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700107 vtbl.8 d2, {q11}, d16
108 vtbl.8 d3, {q11}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -0800109 veor q13, q3, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700110 vtbl.8 d4, {q12}, d16
111 vtbl.8 d5, {q12}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -0800112 veor q14, q4, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700113 vtbl.8 d6, {q13}, d16
114 vtbl.8 d7, {q13}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -0800115 veor q15, q5, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700116 vtbl.8 d8, {q14}, d16
117 vtbl.8 d9, {q14}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -0800118 veor q10, q6, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700119 vtbl.8 d10, {q15}, d16
120 vtbl.8 d11, {q15}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -0800121 veor q11, q7, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700122 vtbl.8 d12, {q10}, d16
123 vtbl.8 d13, {q10}, d17
124 vtbl.8 d14, {q11}, d16
125 vtbl.8 d15, {q11}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -0800126 vmov.i8 q8,#0x55 @ compose .LBS0
127 vmov.i8 q9,#0x33 @ compose .LBS1
128 vshr.u64 q10, q6, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700129 vshr.u64 q11, q4, #1
130 veor q10, q10, q7
131 veor q11, q11, q5
132 vand q10, q10, q8
133 vand q11, q11, q8
134 veor q7, q7, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800135 vshl.u64 q10, q10, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700136 veor q5, q5, q11
137 vshl.u64 q11, q11, #1
138 veor q6, q6, q10
139 veor q4, q4, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800140 vshr.u64 q10, q2, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700141 vshr.u64 q11, q0, #1
142 veor q10, q10, q3
143 veor q11, q11, q1
144 vand q10, q10, q8
145 vand q11, q11, q8
146 veor q3, q3, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800147 vshl.u64 q10, q10, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700148 veor q1, q1, q11
149 vshl.u64 q11, q11, #1
150 veor q2, q2, q10
151 veor q0, q0, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800152 vmov.i8 q8,#0x0f @ compose .LBS2
153 vshr.u64 q10, q5, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700154 vshr.u64 q11, q4, #2
155 veor q10, q10, q7
156 veor q11, q11, q6
157 vand q10, q10, q9
158 vand q11, q11, q9
159 veor q7, q7, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800160 vshl.u64 q10, q10, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700161 veor q6, q6, q11
162 vshl.u64 q11, q11, #2
163 veor q5, q5, q10
164 veor q4, q4, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800165 vshr.u64 q10, q1, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700166 vshr.u64 q11, q0, #2
167 veor q10, q10, q3
168 veor q11, q11, q2
169 vand q10, q10, q9
170 vand q11, q11, q9
171 veor q3, q3, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800172 vshl.u64 q10, q10, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700173 veor q2, q2, q11
174 vshl.u64 q11, q11, #2
175 veor q1, q1, q10
176 veor q0, q0, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800177 vshr.u64 q10, q3, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700178 vshr.u64 q11, q2, #4
179 veor q10, q10, q7
180 veor q11, q11, q6
181 vand q10, q10, q8
182 vand q11, q11, q8
183 veor q7, q7, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800184 vshl.u64 q10, q10, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700185 veor q6, q6, q11
186 vshl.u64 q11, q11, #4
187 veor q3, q3, q10
188 veor q2, q2, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800189 vshr.u64 q10, q1, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700190 vshr.u64 q11, q0, #4
191 veor q10, q10, q5
192 veor q11, q11, q4
193 vand q10, q10, q8
194 vand q11, q11, q8
195 veor q5, q5, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800196 vshl.u64 q10, q10, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700197 veor q4, q4, q11
198 vshl.u64 q11, q11, #4
199 veor q1, q1, q10
200 veor q0, q0, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800201 sub r5,r5,#1
202 b .Ldec_sbox
203.align 4
204.Ldec_loop:
Adam Langleye9ada862015-05-11 17:20:37 -0700205 vldmia r4!, {q8,q9,q10,q11}
Adam Langleyd9e397b2015-01-22 14:27:53 -0800206 veor q8, q8, q0
207 veor q9, q9, q1
208 vtbl.8 d0, {q8}, d24
209 vtbl.8 d1, {q8}, d25
210 vldmia r4!, {q8}
211 veor q10, q10, q2
212 vtbl.8 d2, {q9}, d24
213 vtbl.8 d3, {q9}, d25
214 vldmia r4!, {q9}
215 veor q11, q11, q3
216 vtbl.8 d4, {q10}, d24
217 vtbl.8 d5, {q10}, d25
218 vldmia r4!, {q10}
219 vtbl.8 d6, {q11}, d24
220 vtbl.8 d7, {q11}, d25
221 vldmia r4!, {q11}
222 veor q8, q8, q4
223 veor q9, q9, q5
224 vtbl.8 d8, {q8}, d24
225 vtbl.8 d9, {q8}, d25
226 veor q10, q10, q6
227 vtbl.8 d10, {q9}, d24
228 vtbl.8 d11, {q9}, d25
229 veor q11, q11, q7
230 vtbl.8 d12, {q10}, d24
231 vtbl.8 d13, {q10}, d25
232 vtbl.8 d14, {q11}, d24
233 vtbl.8 d15, {q11}, d25
234.Ldec_sbox:
Adam Langleye9ada862015-05-11 17:20:37 -0700235 veor q1, q1, q4
Adam Langleyd9e397b2015-01-22 14:27:53 -0800236 veor q3, q3, q4
237
238 veor q4, q4, q7
Adam Langleye9ada862015-05-11 17:20:37 -0700239 veor q1, q1, q6
Adam Langleyd9e397b2015-01-22 14:27:53 -0800240 veor q2, q2, q7
241 veor q6, q6, q4
242
243 veor q0, q0, q1
244 veor q2, q2, q5
Adam Langleye9ada862015-05-11 17:20:37 -0700245 veor q7, q7, q6
Adam Langleyd9e397b2015-01-22 14:27:53 -0800246 veor q3, q3, q0
247 veor q5, q5, q0
248 veor q1, q1, q3
249 veor q11, q3, q0
250 veor q10, q7, q4
251 veor q9, q1, q6
252 veor q13, q4, q0
Adam Langleye9ada862015-05-11 17:20:37 -0700253 vmov q8, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800254 veor q12, q5, q2
255
256 vorr q10, q10, q9
257 veor q15, q11, q8
258 vand q14, q11, q12
259 vorr q11, q11, q12
260 veor q12, q12, q9
261 vand q8, q8, q9
262 veor q9, q6, q2
263 vand q15, q15, q12
264 vand q13, q13, q9
265 veor q9, q3, q7
266 veor q12, q1, q5
267 veor q11, q11, q13
268 veor q10, q10, q13
269 vand q13, q9, q12
270 vorr q9, q9, q12
271 veor q11, q11, q15
272 veor q8, q8, q13
273 veor q10, q10, q14
274 veor q9, q9, q15
275 veor q8, q8, q14
276 vand q12, q4, q6
277 veor q9, q9, q14
278 vand q13, q0, q2
279 vand q14, q7, q1
280 vorr q15, q3, q5
281 veor q11, q11, q12
282 veor q9, q9, q14
283 veor q8, q8, q15
284 veor q10, q10, q13
285
286 @ Inv_GF16 0, 1, 2, 3, s0, s1, s2, s3
287
288 @ new smaller inversion
289
290 vand q14, q11, q9
291 vmov q12, q8
292
293 veor q13, q10, q14
294 veor q15, q8, q14
295 veor q14, q8, q14 @ q14=q15
296
297 vbsl q13, q9, q8
298 vbsl q15, q11, q10
299 veor q11, q11, q10
300
301 vbsl q12, q13, q14
302 vbsl q8, q14, q13
303
304 vand q14, q12, q15
305 veor q9, q9, q8
306
307 veor q14, q14, q11
308 veor q12, q5, q2
309 veor q8, q1, q6
Adam Langleye9ada862015-05-11 17:20:37 -0700310 veor q10, q15, q14
Adam Langleyd9e397b2015-01-22 14:27:53 -0800311 vand q10, q10, q5
312 veor q5, q5, q1
313 vand q11, q1, q15
314 vand q5, q5, q14
315 veor q1, q11, q10
316 veor q5, q5, q11
317 veor q15, q15, q13
318 veor q14, q14, q9
319 veor q11, q15, q14
Adam Langleye9ada862015-05-11 17:20:37 -0700320 veor q10, q13, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -0800321 vand q11, q11, q12
Adam Langleye9ada862015-05-11 17:20:37 -0700322 vand q10, q10, q2
Adam Langleyd9e397b2015-01-22 14:27:53 -0800323 veor q12, q12, q8
Adam Langleye9ada862015-05-11 17:20:37 -0700324 veor q2, q2, q6
Adam Langleyd9e397b2015-01-22 14:27:53 -0800325 vand q8, q8, q15
Adam Langleye9ada862015-05-11 17:20:37 -0700326 vand q6, q6, q13
Adam Langleyd9e397b2015-01-22 14:27:53 -0800327 vand q12, q12, q14
Adam Langleye9ada862015-05-11 17:20:37 -0700328 vand q2, q2, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -0800329 veor q8, q8, q12
Adam Langleye9ada862015-05-11 17:20:37 -0700330 veor q2, q2, q6
Adam Langleyd9e397b2015-01-22 14:27:53 -0800331 veor q12, q12, q11
Adam Langleye9ada862015-05-11 17:20:37 -0700332 veor q6, q6, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800333 veor q5, q5, q12
334 veor q2, q2, q12
335 veor q1, q1, q8
336 veor q6, q6, q8
337
338 veor q12, q3, q0
339 veor q8, q7, q4
340 veor q11, q15, q14
Adam Langleye9ada862015-05-11 17:20:37 -0700341 veor q10, q13, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -0800342 vand q11, q11, q12
Adam Langleye9ada862015-05-11 17:20:37 -0700343 vand q10, q10, q0
Adam Langleyd9e397b2015-01-22 14:27:53 -0800344 veor q12, q12, q8
Adam Langleye9ada862015-05-11 17:20:37 -0700345 veor q0, q0, q4
Adam Langleyd9e397b2015-01-22 14:27:53 -0800346 vand q8, q8, q15
Adam Langleye9ada862015-05-11 17:20:37 -0700347 vand q4, q4, q13
Adam Langleyd9e397b2015-01-22 14:27:53 -0800348 vand q12, q12, q14
Adam Langleye9ada862015-05-11 17:20:37 -0700349 vand q0, q0, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -0800350 veor q8, q8, q12
Adam Langleye9ada862015-05-11 17:20:37 -0700351 veor q0, q0, q4
Adam Langleyd9e397b2015-01-22 14:27:53 -0800352 veor q12, q12, q11
Adam Langleye9ada862015-05-11 17:20:37 -0700353 veor q4, q4, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800354 veor q15, q15, q13
355 veor q14, q14, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700356 veor q10, q15, q14
Adam Langleyd9e397b2015-01-22 14:27:53 -0800357 vand q10, q10, q3
358 veor q3, q3, q7
359 vand q11, q7, q15
360 vand q3, q3, q14
361 veor q7, q11, q10
362 veor q3, q3, q11
363 veor q3, q3, q12
364 veor q0, q0, q12
365 veor q7, q7, q8
366 veor q4, q4, q8
367 veor q1, q1, q7
368 veor q6, q6, q5
369
370 veor q4, q4, q1
371 veor q2, q2, q7
372 veor q5, q5, q7
373 veor q4, q4, q2
Adam Langleye9ada862015-05-11 17:20:37 -0700374 veor q7, q7, q0
Adam Langleyd9e397b2015-01-22 14:27:53 -0800375 veor q4, q4, q5
Adam Langleye9ada862015-05-11 17:20:37 -0700376 veor q3, q3, q6
377 veor q6, q6, q1
Adam Langleyd9e397b2015-01-22 14:27:53 -0800378 veor q3, q3, q4
379
380 veor q4, q4, q0
381 veor q7, q7, q3
382 subs r5,r5,#1
383 bcc .Ldec_done
384 @ multiplication by 0x05-0x00-0x04-0x00
385 vext.8 q8, q0, q0, #8
386 vext.8 q14, q3, q3, #8
387 vext.8 q15, q5, q5, #8
388 veor q8, q8, q0
389 vext.8 q9, q1, q1, #8
390 veor q14, q14, q3
391 vext.8 q10, q6, q6, #8
392 veor q15, q15, q5
393 vext.8 q11, q4, q4, #8
394 veor q9, q9, q1
395 vext.8 q12, q2, q2, #8
396 veor q10, q10, q6
397 vext.8 q13, q7, q7, #8
398 veor q11, q11, q4
399 veor q12, q12, q2
400 veor q13, q13, q7
401
Adam Langleye9ada862015-05-11 17:20:37 -0700402 veor q0, q0, q14
403 veor q1, q1, q14
404 veor q6, q6, q8
405 veor q2, q2, q10
406 veor q4, q4, q9
407 veor q1, q1, q15
408 veor q6, q6, q15
409 veor q2, q2, q14
410 veor q7, q7, q11
411 veor q4, q4, q14
412 veor q3, q3, q12
413 veor q2, q2, q15
414 veor q7, q7, q15
415 veor q5, q5, q13
Adam Langleyd9e397b2015-01-22 14:27:53 -0800416 vext.8 q8, q0, q0, #12 @ x0 <<< 32
417 vext.8 q9, q1, q1, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700418 veor q0, q0, q8 @ x0 ^ (x0 <<< 32)
Adam Langleyd9e397b2015-01-22 14:27:53 -0800419 vext.8 q10, q6, q6, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700420 veor q1, q1, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -0800421 vext.8 q11, q4, q4, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700422 veor q6, q6, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800423 vext.8 q12, q2, q2, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700424 veor q4, q4, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800425 vext.8 q13, q7, q7, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700426 veor q2, q2, q12
Adam Langleyd9e397b2015-01-22 14:27:53 -0800427 vext.8 q14, q3, q3, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700428 veor q7, q7, q13
Adam Langleyd9e397b2015-01-22 14:27:53 -0800429 vext.8 q15, q5, q5, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700430 veor q3, q3, q14
Adam Langleyd9e397b2015-01-22 14:27:53 -0800431
432 veor q9, q9, q0
Adam Langleye9ada862015-05-11 17:20:37 -0700433 veor q5, q5, q15
434 vext.8 q0, q0, q0, #8 @ (x0 ^ (x0 <<< 32)) <<< 64)
Adam Langleyd9e397b2015-01-22 14:27:53 -0800435 veor q10, q10, q1
436 veor q8, q8, q5
437 veor q9, q9, q5
Adam Langleye9ada862015-05-11 17:20:37 -0700438 vext.8 q1, q1, q1, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800439 veor q13, q13, q2
Adam Langleye9ada862015-05-11 17:20:37 -0700440 veor q0, q0, q8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800441 veor q14, q14, q7
Adam Langleye9ada862015-05-11 17:20:37 -0700442 veor q1, q1, q9
443 vext.8 q8, q2, q2, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800444 veor q12, q12, q4
Adam Langleye9ada862015-05-11 17:20:37 -0700445 vext.8 q9, q7, q7, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800446 veor q15, q15, q3
Adam Langleye9ada862015-05-11 17:20:37 -0700447 vext.8 q2, q4, q4, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800448 veor q11, q11, q6
Adam Langleye9ada862015-05-11 17:20:37 -0700449 vext.8 q7, q5, q5, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800450 veor q12, q12, q5
Adam Langleye9ada862015-05-11 17:20:37 -0700451 vext.8 q4, q3, q3, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800452 veor q11, q11, q5
Adam Langleye9ada862015-05-11 17:20:37 -0700453 vext.8 q3, q6, q6, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800454 veor q5, q9, q13
455 veor q11, q11, q2
456 veor q7, q7, q15
457 veor q6, q4, q14
458 veor q4, q8, q12
459 veor q2, q3, q10
460 vmov q3, q11
461 @ vmov q5, q9
462 vldmia r6, {q12} @ .LISR
463 ite eq @ Thumb2 thing, sanity check in ARM
464 addeq r6,r6,#0x10
465 bne .Ldec_loop
466 vldmia r6, {q12} @ .LISRM0
467 b .Ldec_loop
468.align 4
469.Ldec_done:
470 vmov.i8 q8,#0x55 @ compose .LBS0
471 vmov.i8 q9,#0x33 @ compose .LBS1
472 vshr.u64 q10, q3, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700473 vshr.u64 q11, q2, #1
474 veor q10, q10, q5
475 veor q11, q11, q7
476 vand q10, q10, q8
477 vand q11, q11, q8
478 veor q5, q5, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800479 vshl.u64 q10, q10, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700480 veor q7, q7, q11
481 vshl.u64 q11, q11, #1
482 veor q3, q3, q10
483 veor q2, q2, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800484 vshr.u64 q10, q6, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700485 vshr.u64 q11, q0, #1
486 veor q10, q10, q4
487 veor q11, q11, q1
488 vand q10, q10, q8
489 vand q11, q11, q8
490 veor q4, q4, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800491 vshl.u64 q10, q10, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700492 veor q1, q1, q11
493 vshl.u64 q11, q11, #1
494 veor q6, q6, q10
495 veor q0, q0, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800496 vmov.i8 q8,#0x0f @ compose .LBS2
497 vshr.u64 q10, q7, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700498 vshr.u64 q11, q2, #2
499 veor q10, q10, q5
500 veor q11, q11, q3
501 vand q10, q10, q9
502 vand q11, q11, q9
503 veor q5, q5, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800504 vshl.u64 q10, q10, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700505 veor q3, q3, q11
506 vshl.u64 q11, q11, #2
507 veor q7, q7, q10
508 veor q2, q2, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800509 vshr.u64 q10, q1, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700510 vshr.u64 q11, q0, #2
511 veor q10, q10, q4
512 veor q11, q11, q6
513 vand q10, q10, q9
514 vand q11, q11, q9
515 veor q4, q4, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800516 vshl.u64 q10, q10, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700517 veor q6, q6, q11
518 vshl.u64 q11, q11, #2
519 veor q1, q1, q10
520 veor q0, q0, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800521 vshr.u64 q10, q4, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700522 vshr.u64 q11, q6, #4
523 veor q10, q10, q5
524 veor q11, q11, q3
525 vand q10, q10, q8
526 vand q11, q11, q8
527 veor q5, q5, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800528 vshl.u64 q10, q10, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700529 veor q3, q3, q11
530 vshl.u64 q11, q11, #4
531 veor q4, q4, q10
532 veor q6, q6, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800533 vshr.u64 q10, q1, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700534 vshr.u64 q11, q0, #4
535 veor q10, q10, q7
536 veor q11, q11, q2
537 vand q10, q10, q8
538 vand q11, q11, q8
539 veor q7, q7, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800540 vshl.u64 q10, q10, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700541 veor q2, q2, q11
542 vshl.u64 q11, q11, #4
543 veor q1, q1, q10
544 veor q0, q0, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800545 vldmia r4, {q8} @ last round key
546 veor q6, q6, q8
547 veor q4, q4, q8
548 veor q2, q2, q8
549 veor q7, q7, q8
550 veor q3, q3, q8
551 veor q5, q5, q8
552 veor q0, q0, q8
553 veor q1, q1, q8
554 bx lr
555.size _bsaes_decrypt8,.-_bsaes_decrypt8
556
557.type _bsaes_const,%object
558.align 6
559_bsaes_const:
Adam Langleye9ada862015-05-11 17:20:37 -0700560.LM0ISR:@ InvShiftRows constants
561.quad 0x0a0e0206070b0f03, 0x0004080c0d010509
Adam Langleyd9e397b2015-01-22 14:27:53 -0800562.LISR:
Adam Langleye9ada862015-05-11 17:20:37 -0700563.quad 0x0504070602010003, 0x0f0e0d0c080b0a09
Adam Langleyd9e397b2015-01-22 14:27:53 -0800564.LISRM0:
Adam Langleye9ada862015-05-11 17:20:37 -0700565.quad 0x01040b0e0205080f, 0x0306090c00070a0d
566.LM0SR:@ ShiftRows constants
567.quad 0x0a0e02060f03070b, 0x0004080c05090d01
Adam Langleyd9e397b2015-01-22 14:27:53 -0800568.LSR:
Adam Langleye9ada862015-05-11 17:20:37 -0700569.quad 0x0504070600030201, 0x0f0e0d0c0a09080b
Adam Langleyd9e397b2015-01-22 14:27:53 -0800570.LSRM0:
Adam Langleye9ada862015-05-11 17:20:37 -0700571.quad 0x0304090e00050a0f, 0x01060b0c0207080d
Adam Langleyd9e397b2015-01-22 14:27:53 -0800572.LM0:
Adam Langleye9ada862015-05-11 17:20:37 -0700573.quad 0x02060a0e03070b0f, 0x0004080c0105090d
Adam Langleyd9e397b2015-01-22 14:27:53 -0800574.LREVM0SR:
Adam Langleye9ada862015-05-11 17:20:37 -0700575.quad 0x090d01050c000408, 0x03070b0f060a0e02
576.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
577.align 2
Adam Langleyd9e397b2015-01-22 14:27:53 -0800578.align 6
579.size _bsaes_const,.-_bsaes_const
580
581.type _bsaes_encrypt8,%function
582.align 4
583_bsaes_encrypt8:
Robert Sloand5c22152017-11-13 09:22:12 -0800584 adr r6,.
Adam Langleyd9e397b2015-01-22 14:27:53 -0800585 vldmia r4!, {q9} @ round 0 key
Adam Langleye9ada862015-05-11 17:20:37 -0700586#ifdef __APPLE__
587 adr r6,.LM0SR
588#else
Adam Langleyd9e397b2015-01-22 14:27:53 -0800589 sub r6,r6,#_bsaes_encrypt8-.LM0SR
Adam Langleye9ada862015-05-11 17:20:37 -0700590#endif
Adam Langleyd9e397b2015-01-22 14:27:53 -0800591
592 vldmia r6!, {q8} @ .LM0SR
593_bsaes_encrypt8_alt:
594 veor q10, q0, q9 @ xor with round0 key
595 veor q11, q1, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700596 vtbl.8 d0, {q10}, d16
597 vtbl.8 d1, {q10}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -0800598 veor q12, q2, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700599 vtbl.8 d2, {q11}, d16
600 vtbl.8 d3, {q11}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -0800601 veor q13, q3, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700602 vtbl.8 d4, {q12}, d16
603 vtbl.8 d5, {q12}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -0800604 veor q14, q4, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700605 vtbl.8 d6, {q13}, d16
606 vtbl.8 d7, {q13}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -0800607 veor q15, q5, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700608 vtbl.8 d8, {q14}, d16
609 vtbl.8 d9, {q14}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -0800610 veor q10, q6, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700611 vtbl.8 d10, {q15}, d16
612 vtbl.8 d11, {q15}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -0800613 veor q11, q7, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700614 vtbl.8 d12, {q10}, d16
615 vtbl.8 d13, {q10}, d17
616 vtbl.8 d14, {q11}, d16
617 vtbl.8 d15, {q11}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -0800618_bsaes_encrypt8_bitslice:
619 vmov.i8 q8,#0x55 @ compose .LBS0
620 vmov.i8 q9,#0x33 @ compose .LBS1
621 vshr.u64 q10, q6, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700622 vshr.u64 q11, q4, #1
623 veor q10, q10, q7
624 veor q11, q11, q5
625 vand q10, q10, q8
626 vand q11, q11, q8
627 veor q7, q7, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800628 vshl.u64 q10, q10, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700629 veor q5, q5, q11
630 vshl.u64 q11, q11, #1
631 veor q6, q6, q10
632 veor q4, q4, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800633 vshr.u64 q10, q2, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700634 vshr.u64 q11, q0, #1
635 veor q10, q10, q3
636 veor q11, q11, q1
637 vand q10, q10, q8
638 vand q11, q11, q8
639 veor q3, q3, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800640 vshl.u64 q10, q10, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700641 veor q1, q1, q11
642 vshl.u64 q11, q11, #1
643 veor q2, q2, q10
644 veor q0, q0, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800645 vmov.i8 q8,#0x0f @ compose .LBS2
646 vshr.u64 q10, q5, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700647 vshr.u64 q11, q4, #2
648 veor q10, q10, q7
649 veor q11, q11, q6
650 vand q10, q10, q9
651 vand q11, q11, q9
652 veor q7, q7, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800653 vshl.u64 q10, q10, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700654 veor q6, q6, q11
655 vshl.u64 q11, q11, #2
656 veor q5, q5, q10
657 veor q4, q4, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800658 vshr.u64 q10, q1, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700659 vshr.u64 q11, q0, #2
660 veor q10, q10, q3
661 veor q11, q11, q2
662 vand q10, q10, q9
663 vand q11, q11, q9
664 veor q3, q3, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800665 vshl.u64 q10, q10, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700666 veor q2, q2, q11
667 vshl.u64 q11, q11, #2
668 veor q1, q1, q10
669 veor q0, q0, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800670 vshr.u64 q10, q3, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700671 vshr.u64 q11, q2, #4
672 veor q10, q10, q7
673 veor q11, q11, q6
674 vand q10, q10, q8
675 vand q11, q11, q8
676 veor q7, q7, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800677 vshl.u64 q10, q10, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700678 veor q6, q6, q11
679 vshl.u64 q11, q11, #4
680 veor q3, q3, q10
681 veor q2, q2, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800682 vshr.u64 q10, q1, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700683 vshr.u64 q11, q0, #4
684 veor q10, q10, q5
685 veor q11, q11, q4
686 vand q10, q10, q8
687 vand q11, q11, q8
688 veor q5, q5, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800689 vshl.u64 q10, q10, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700690 veor q4, q4, q11
691 vshl.u64 q11, q11, #4
692 veor q1, q1, q10
693 veor q0, q0, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800694 sub r5,r5,#1
695 b .Lenc_sbox
696.align 4
697.Lenc_loop:
Adam Langleye9ada862015-05-11 17:20:37 -0700698 vldmia r4!, {q8,q9,q10,q11}
Adam Langleyd9e397b2015-01-22 14:27:53 -0800699 veor q8, q8, q0
700 veor q9, q9, q1
701 vtbl.8 d0, {q8}, d24
702 vtbl.8 d1, {q8}, d25
703 vldmia r4!, {q8}
704 veor q10, q10, q2
705 vtbl.8 d2, {q9}, d24
706 vtbl.8 d3, {q9}, d25
707 vldmia r4!, {q9}
708 veor q11, q11, q3
709 vtbl.8 d4, {q10}, d24
710 vtbl.8 d5, {q10}, d25
711 vldmia r4!, {q10}
712 vtbl.8 d6, {q11}, d24
713 vtbl.8 d7, {q11}, d25
714 vldmia r4!, {q11}
715 veor q8, q8, q4
716 veor q9, q9, q5
717 vtbl.8 d8, {q8}, d24
718 vtbl.8 d9, {q8}, d25
719 veor q10, q10, q6
720 vtbl.8 d10, {q9}, d24
721 vtbl.8 d11, {q9}, d25
722 veor q11, q11, q7
723 vtbl.8 d12, {q10}, d24
724 vtbl.8 d13, {q10}, d25
725 vtbl.8 d14, {q11}, d24
726 vtbl.8 d15, {q11}, d25
727.Lenc_sbox:
728 veor q2, q2, q1
729 veor q5, q5, q6
730 veor q3, q3, q0
731 veor q6, q6, q2
732 veor q5, q5, q0
733
734 veor q6, q6, q3
735 veor q3, q3, q7
736 veor q7, q7, q5
737 veor q3, q3, q4
738 veor q4, q4, q5
739
740 veor q2, q2, q7
741 veor q3, q3, q1
742 veor q1, q1, q5
743 veor q11, q7, q4
744 veor q10, q1, q2
745 veor q9, q5, q3
746 veor q13, q2, q4
Adam Langleye9ada862015-05-11 17:20:37 -0700747 vmov q8, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800748 veor q12, q6, q0
749
750 vorr q10, q10, q9
751 veor q15, q11, q8
752 vand q14, q11, q12
753 vorr q11, q11, q12
754 veor q12, q12, q9
755 vand q8, q8, q9
756 veor q9, q3, q0
757 vand q15, q15, q12
758 vand q13, q13, q9
759 veor q9, q7, q1
760 veor q12, q5, q6
761 veor q11, q11, q13
762 veor q10, q10, q13
763 vand q13, q9, q12
764 vorr q9, q9, q12
765 veor q11, q11, q15
766 veor q8, q8, q13
767 veor q10, q10, q14
768 veor q9, q9, q15
769 veor q8, q8, q14
770 vand q12, q2, q3
771 veor q9, q9, q14
772 vand q13, q4, q0
773 vand q14, q1, q5
774 vorr q15, q7, q6
775 veor q11, q11, q12
776 veor q9, q9, q14
777 veor q8, q8, q15
778 veor q10, q10, q13
779
780 @ Inv_GF16 0, 1, 2, 3, s0, s1, s2, s3
781
782 @ new smaller inversion
783
784 vand q14, q11, q9
785 vmov q12, q8
786
787 veor q13, q10, q14
788 veor q15, q8, q14
789 veor q14, q8, q14 @ q14=q15
790
791 vbsl q13, q9, q8
792 vbsl q15, q11, q10
793 veor q11, q11, q10
794
795 vbsl q12, q13, q14
796 vbsl q8, q14, q13
797
798 vand q14, q12, q15
799 veor q9, q9, q8
800
801 veor q14, q14, q11
802 veor q12, q6, q0
803 veor q8, q5, q3
Adam Langleye9ada862015-05-11 17:20:37 -0700804 veor q10, q15, q14
Adam Langleyd9e397b2015-01-22 14:27:53 -0800805 vand q10, q10, q6
806 veor q6, q6, q5
807 vand q11, q5, q15
808 vand q6, q6, q14
809 veor q5, q11, q10
810 veor q6, q6, q11
811 veor q15, q15, q13
812 veor q14, q14, q9
813 veor q11, q15, q14
Adam Langleye9ada862015-05-11 17:20:37 -0700814 veor q10, q13, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -0800815 vand q11, q11, q12
Adam Langleye9ada862015-05-11 17:20:37 -0700816 vand q10, q10, q0
Adam Langleyd9e397b2015-01-22 14:27:53 -0800817 veor q12, q12, q8
Adam Langleye9ada862015-05-11 17:20:37 -0700818 veor q0, q0, q3
Adam Langleyd9e397b2015-01-22 14:27:53 -0800819 vand q8, q8, q15
Adam Langleye9ada862015-05-11 17:20:37 -0700820 vand q3, q3, q13
Adam Langleyd9e397b2015-01-22 14:27:53 -0800821 vand q12, q12, q14
Adam Langleye9ada862015-05-11 17:20:37 -0700822 vand q0, q0, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -0800823 veor q8, q8, q12
Adam Langleye9ada862015-05-11 17:20:37 -0700824 veor q0, q0, q3
Adam Langleyd9e397b2015-01-22 14:27:53 -0800825 veor q12, q12, q11
Adam Langleye9ada862015-05-11 17:20:37 -0700826 veor q3, q3, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800827 veor q6, q6, q12
828 veor q0, q0, q12
829 veor q5, q5, q8
830 veor q3, q3, q8
831
832 veor q12, q7, q4
833 veor q8, q1, q2
834 veor q11, q15, q14
Adam Langleye9ada862015-05-11 17:20:37 -0700835 veor q10, q13, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -0800836 vand q11, q11, q12
Adam Langleye9ada862015-05-11 17:20:37 -0700837 vand q10, q10, q4
Adam Langleyd9e397b2015-01-22 14:27:53 -0800838 veor q12, q12, q8
Adam Langleye9ada862015-05-11 17:20:37 -0700839 veor q4, q4, q2
Adam Langleyd9e397b2015-01-22 14:27:53 -0800840 vand q8, q8, q15
Adam Langleye9ada862015-05-11 17:20:37 -0700841 vand q2, q2, q13
Adam Langleyd9e397b2015-01-22 14:27:53 -0800842 vand q12, q12, q14
Adam Langleye9ada862015-05-11 17:20:37 -0700843 vand q4, q4, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -0800844 veor q8, q8, q12
Adam Langleye9ada862015-05-11 17:20:37 -0700845 veor q4, q4, q2
Adam Langleyd9e397b2015-01-22 14:27:53 -0800846 veor q12, q12, q11
Adam Langleye9ada862015-05-11 17:20:37 -0700847 veor q2, q2, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800848 veor q15, q15, q13
849 veor q14, q14, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700850 veor q10, q15, q14
Adam Langleyd9e397b2015-01-22 14:27:53 -0800851 vand q10, q10, q7
852 veor q7, q7, q1
853 vand q11, q1, q15
854 vand q7, q7, q14
855 veor q1, q11, q10
856 veor q7, q7, q11
857 veor q7, q7, q12
858 veor q4, q4, q12
859 veor q1, q1, q8
860 veor q2, q2, q8
861 veor q7, q7, q0
862 veor q1, q1, q6
863 veor q6, q6, q0
864 veor q4, q4, q7
865 veor q0, q0, q1
866
867 veor q1, q1, q5
868 veor q5, q5, q2
869 veor q2, q2, q3
870 veor q3, q3, q5
871 veor q4, q4, q5
872
873 veor q6, q6, q3
874 subs r5,r5,#1
875 bcc .Lenc_done
876 vext.8 q8, q0, q0, #12 @ x0 <<< 32
877 vext.8 q9, q1, q1, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700878 veor q0, q0, q8 @ x0 ^ (x0 <<< 32)
Adam Langleyd9e397b2015-01-22 14:27:53 -0800879 vext.8 q10, q4, q4, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700880 veor q1, q1, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -0800881 vext.8 q11, q6, q6, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700882 veor q4, q4, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800883 vext.8 q12, q3, q3, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700884 veor q6, q6, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800885 vext.8 q13, q7, q7, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700886 veor q3, q3, q12
Adam Langleyd9e397b2015-01-22 14:27:53 -0800887 vext.8 q14, q2, q2, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700888 veor q7, q7, q13
Adam Langleyd9e397b2015-01-22 14:27:53 -0800889 vext.8 q15, q5, q5, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700890 veor q2, q2, q14
Adam Langleyd9e397b2015-01-22 14:27:53 -0800891
892 veor q9, q9, q0
Adam Langleye9ada862015-05-11 17:20:37 -0700893 veor q5, q5, q15
894 vext.8 q0, q0, q0, #8 @ (x0 ^ (x0 <<< 32)) <<< 64)
Adam Langleyd9e397b2015-01-22 14:27:53 -0800895 veor q10, q10, q1
896 veor q8, q8, q5
897 veor q9, q9, q5
Adam Langleye9ada862015-05-11 17:20:37 -0700898 vext.8 q1, q1, q1, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800899 veor q13, q13, q3
Adam Langleye9ada862015-05-11 17:20:37 -0700900 veor q0, q0, q8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800901 veor q14, q14, q7
Adam Langleye9ada862015-05-11 17:20:37 -0700902 veor q1, q1, q9
903 vext.8 q8, q3, q3, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800904 veor q12, q12, q6
Adam Langleye9ada862015-05-11 17:20:37 -0700905 vext.8 q9, q7, q7, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800906 veor q15, q15, q2
Adam Langleye9ada862015-05-11 17:20:37 -0700907 vext.8 q3, q6, q6, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800908 veor q11, q11, q4
Adam Langleye9ada862015-05-11 17:20:37 -0700909 vext.8 q7, q5, q5, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800910 veor q12, q12, q5
Adam Langleye9ada862015-05-11 17:20:37 -0700911 vext.8 q6, q2, q2, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800912 veor q11, q11, q5
Adam Langleye9ada862015-05-11 17:20:37 -0700913 vext.8 q2, q4, q4, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800914 veor q5, q9, q13
915 veor q4, q8, q12
916 veor q3, q3, q11
917 veor q7, q7, q15
918 veor q6, q6, q14
919 @ vmov q4, q8
920 veor q2, q2, q10
921 @ vmov q5, q9
922 vldmia r6, {q12} @ .LSR
923 ite eq @ Thumb2 thing, samity check in ARM
924 addeq r6,r6,#0x10
925 bne .Lenc_loop
926 vldmia r6, {q12} @ .LSRM0
927 b .Lenc_loop
928.align 4
929.Lenc_done:
930 vmov.i8 q8,#0x55 @ compose .LBS0
931 vmov.i8 q9,#0x33 @ compose .LBS1
932 vshr.u64 q10, q2, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700933 vshr.u64 q11, q3, #1
934 veor q10, q10, q5
935 veor q11, q11, q7
936 vand q10, q10, q8
937 vand q11, q11, q8
938 veor q5, q5, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800939 vshl.u64 q10, q10, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700940 veor q7, q7, q11
941 vshl.u64 q11, q11, #1
942 veor q2, q2, q10
943 veor q3, q3, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800944 vshr.u64 q10, q4, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700945 vshr.u64 q11, q0, #1
946 veor q10, q10, q6
947 veor q11, q11, q1
948 vand q10, q10, q8
949 vand q11, q11, q8
950 veor q6, q6, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800951 vshl.u64 q10, q10, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700952 veor q1, q1, q11
953 vshl.u64 q11, q11, #1
954 veor q4, q4, q10
955 veor q0, q0, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800956 vmov.i8 q8,#0x0f @ compose .LBS2
957 vshr.u64 q10, q7, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700958 vshr.u64 q11, q3, #2
959 veor q10, q10, q5
960 veor q11, q11, q2
961 vand q10, q10, q9
962 vand q11, q11, q9
963 veor q5, q5, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800964 vshl.u64 q10, q10, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700965 veor q2, q2, q11
966 vshl.u64 q11, q11, #2
967 veor q7, q7, q10
968 veor q3, q3, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800969 vshr.u64 q10, q1, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700970 vshr.u64 q11, q0, #2
971 veor q10, q10, q6
972 veor q11, q11, q4
973 vand q10, q10, q9
974 vand q11, q11, q9
975 veor q6, q6, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800976 vshl.u64 q10, q10, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700977 veor q4, q4, q11
978 vshl.u64 q11, q11, #2
979 veor q1, q1, q10
980 veor q0, q0, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800981 vshr.u64 q10, q6, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700982 vshr.u64 q11, q4, #4
983 veor q10, q10, q5
984 veor q11, q11, q2
985 vand q10, q10, q8
986 vand q11, q11, q8
987 veor q5, q5, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800988 vshl.u64 q10, q10, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700989 veor q2, q2, q11
990 vshl.u64 q11, q11, #4
991 veor q6, q6, q10
992 veor q4, q4, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800993 vshr.u64 q10, q1, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700994 vshr.u64 q11, q0, #4
995 veor q10, q10, q7
996 veor q11, q11, q3
997 vand q10, q10, q8
998 vand q11, q11, q8
999 veor q7, q7, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -08001000 vshl.u64 q10, q10, #4
Adam Langleye9ada862015-05-11 17:20:37 -07001001 veor q3, q3, q11
1002 vshl.u64 q11, q11, #4
1003 veor q1, q1, q10
1004 veor q0, q0, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -08001005 vldmia r4, {q8} @ last round key
1006 veor q4, q4, q8
1007 veor q6, q6, q8
1008 veor q3, q3, q8
1009 veor q7, q7, q8
1010 veor q2, q2, q8
1011 veor q5, q5, q8
1012 veor q0, q0, q8
1013 veor q1, q1, q8
1014 bx lr
1015.size _bsaes_encrypt8,.-_bsaes_encrypt8
1016.type _bsaes_key_convert,%function
1017.align 4
1018_bsaes_key_convert:
Robert Sloand5c22152017-11-13 09:22:12 -08001019 adr r6,.
Adam Langleyd9e397b2015-01-22 14:27:53 -08001020 vld1.8 {q7}, [r4]! @ load round 0 key
Adam Langleye9ada862015-05-11 17:20:37 -07001021#ifdef __APPLE__
1022 adr r6,.LM0
1023#else
Adam Langleyd9e397b2015-01-22 14:27:53 -08001024 sub r6,r6,#_bsaes_key_convert-.LM0
Adam Langleye9ada862015-05-11 17:20:37 -07001025#endif
Adam Langleyd9e397b2015-01-22 14:27:53 -08001026 vld1.8 {q15}, [r4]! @ load round 1 key
1027
1028 vmov.i8 q8, #0x01 @ bit masks
1029 vmov.i8 q9, #0x02
1030 vmov.i8 q10, #0x04
1031 vmov.i8 q11, #0x08
1032 vmov.i8 q12, #0x10
1033 vmov.i8 q13, #0x20
1034 vldmia r6, {q14} @ .LM0
1035
1036#ifdef __ARMEL__
1037 vrev32.8 q7, q7
1038 vrev32.8 q15, q15
1039#endif
1040 sub r5,r5,#1
1041 vstmia r12!, {q7} @ save round 0 key
1042 b .Lkey_loop
1043
1044.align 4
1045.Lkey_loop:
1046 vtbl.8 d14,{q15},d28
1047 vtbl.8 d15,{q15},d29
1048 vmov.i8 q6, #0x40
1049 vmov.i8 q15, #0x80
1050
1051 vtst.8 q0, q7, q8
1052 vtst.8 q1, q7, q9
1053 vtst.8 q2, q7, q10
1054 vtst.8 q3, q7, q11
1055 vtst.8 q4, q7, q12
1056 vtst.8 q5, q7, q13
1057 vtst.8 q6, q7, q6
1058 vtst.8 q7, q7, q15
1059 vld1.8 {q15}, [r4]! @ load next round key
1060 vmvn q0, q0 @ "pnot"
1061 vmvn q1, q1
1062 vmvn q5, q5
1063 vmvn q6, q6
1064#ifdef __ARMEL__
1065 vrev32.8 q15, q15
1066#endif
1067 subs r5,r5,#1
Adam Langleye9ada862015-05-11 17:20:37 -07001068 vstmia r12!,{q0,q1,q2,q3,q4,q5,q6,q7} @ write bit-sliced round key
Adam Langleyd9e397b2015-01-22 14:27:53 -08001069 bne .Lkey_loop
1070
1071 vmov.i8 q7,#0x63 @ compose .L63
1072 @ don't save last round key
1073 bx lr
1074.size _bsaes_key_convert,.-_bsaes_key_convert
Adam Langleyd9e397b2015-01-22 14:27:53 -08001075
Adam Langleye9ada862015-05-11 17:20:37 -07001076
1077
1078.globl bsaes_cbc_encrypt
Adam Langleyd9e397b2015-01-22 14:27:53 -08001079.hidden bsaes_cbc_encrypt
1080.type bsaes_cbc_encrypt,%function
1081.align 5
1082bsaes_cbc_encrypt:
1083#ifndef __KERNEL__
1084 cmp r2, #128
1085#ifndef __thumb__
1086 blo AES_cbc_encrypt
1087#else
1088 bhs 1f
1089 b AES_cbc_encrypt
10901:
1091#endif
1092#endif
1093
1094 @ it is up to the caller to make sure we are called with enc == 0
1095
1096 mov ip, sp
Adam Langleye9ada862015-05-11 17:20:37 -07001097 stmdb sp!, {r4,r5,r6,r7,r8,r9,r10, lr}
Adam Langleyd9e397b2015-01-22 14:27:53 -08001098 VFP_ABI_PUSH
1099 ldr r8, [ip] @ IV is 1st arg on the stack
1100 mov r2, r2, lsr#4 @ len in 16 byte blocks
1101 sub sp, #0x10 @ scratch space to carry over the IV
1102 mov r9, sp @ save sp
1103
1104 ldr r10, [r3, #240] @ get # of rounds
1105#ifndef BSAES_ASM_EXTENDED_KEY
1106 @ allocate the key schedule on the stack
1107 sub r12, sp, r10, lsl#7 @ 128 bytes per inner round key
1108 add r12, #96 @ sifze of bit-slices key schedule
1109
1110 @ populate the key schedule
1111 mov r4, r3 @ pass key
1112 mov r5, r10 @ pass # of rounds
1113 mov sp, r12 @ sp is sp
1114 bl _bsaes_key_convert
1115 vldmia sp, {q6}
1116 vstmia r12, {q15} @ save last round key
1117 veor q7, q7, q6 @ fix up round 0 key
1118 vstmia sp, {q7}
1119#else
1120 ldr r12, [r3, #244]
1121 eors r12, #1
1122 beq 0f
1123
1124 @ populate the key schedule
1125 str r12, [r3, #244]
1126 mov r4, r3 @ pass key
1127 mov r5, r10 @ pass # of rounds
1128 add r12, r3, #248 @ pass key schedule
1129 bl _bsaes_key_convert
1130 add r4, r3, #248
1131 vldmia r4, {q6}
1132 vstmia r12, {q15} @ save last round key
1133 veor q7, q7, q6 @ fix up round 0 key
1134 vstmia r4, {q7}
1135
1136.align 2
Adam Langleye9ada862015-05-11 17:20:37 -07001137
Adam Langleyd9e397b2015-01-22 14:27:53 -08001138#endif
1139
1140 vld1.8 {q15}, [r8] @ load IV
1141 b .Lcbc_dec_loop
1142
1143.align 4
1144.Lcbc_dec_loop:
1145 subs r2, r2, #0x8
1146 bmi .Lcbc_dec_loop_finish
1147
Adam Langleye9ada862015-05-11 17:20:37 -07001148 vld1.8 {q0,q1}, [r0]! @ load input
1149 vld1.8 {q2,q3}, [r0]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001150#ifndef BSAES_ASM_EXTENDED_KEY
1151 mov r4, sp @ pass the key
1152#else
1153 add r4, r3, #248
1154#endif
Adam Langleye9ada862015-05-11 17:20:37 -07001155 vld1.8 {q4,q5}, [r0]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001156 mov r5, r10
Adam Langleye9ada862015-05-11 17:20:37 -07001157 vld1.8 {q6,q7}, [r0]
Adam Langleyd9e397b2015-01-22 14:27:53 -08001158 sub r0, r0, #0x60
1159 vstmia r9, {q15} @ put aside IV
1160
1161 bl _bsaes_decrypt8
1162
1163 vldmia r9, {q14} @ reload IV
Adam Langleye9ada862015-05-11 17:20:37 -07001164 vld1.8 {q8,q9}, [r0]! @ reload input
Adam Langleyd9e397b2015-01-22 14:27:53 -08001165 veor q0, q0, q14 @ ^= IV
Adam Langleye9ada862015-05-11 17:20:37 -07001166 vld1.8 {q10,q11}, [r0]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001167 veor q1, q1, q8
1168 veor q6, q6, q9
Adam Langleye9ada862015-05-11 17:20:37 -07001169 vld1.8 {q12,q13}, [r0]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001170 veor q4, q4, q10
1171 veor q2, q2, q11
Adam Langleye9ada862015-05-11 17:20:37 -07001172 vld1.8 {q14,q15}, [r0]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001173 veor q7, q7, q12
Adam Langleye9ada862015-05-11 17:20:37 -07001174 vst1.8 {q0,q1}, [r1]! @ write output
Adam Langleyd9e397b2015-01-22 14:27:53 -08001175 veor q3, q3, q13
1176 vst1.8 {q6}, [r1]!
1177 veor q5, q5, q14
1178 vst1.8 {q4}, [r1]!
1179 vst1.8 {q2}, [r1]!
1180 vst1.8 {q7}, [r1]!
1181 vst1.8 {q3}, [r1]!
1182 vst1.8 {q5}, [r1]!
1183
1184 b .Lcbc_dec_loop
1185
1186.Lcbc_dec_loop_finish:
1187 adds r2, r2, #8
1188 beq .Lcbc_dec_done
1189
1190 vld1.8 {q0}, [r0]! @ load input
1191 cmp r2, #2
1192 blo .Lcbc_dec_one
1193 vld1.8 {q1}, [r0]!
1194#ifndef BSAES_ASM_EXTENDED_KEY
1195 mov r4, sp @ pass the key
1196#else
1197 add r4, r3, #248
1198#endif
1199 mov r5, r10
1200 vstmia r9, {q15} @ put aside IV
1201 beq .Lcbc_dec_two
1202 vld1.8 {q2}, [r0]!
1203 cmp r2, #4
1204 blo .Lcbc_dec_three
1205 vld1.8 {q3}, [r0]!
1206 beq .Lcbc_dec_four
1207 vld1.8 {q4}, [r0]!
1208 cmp r2, #6
1209 blo .Lcbc_dec_five
1210 vld1.8 {q5}, [r0]!
1211 beq .Lcbc_dec_six
1212 vld1.8 {q6}, [r0]!
1213 sub r0, r0, #0x70
1214
1215 bl _bsaes_decrypt8
1216
1217 vldmia r9, {q14} @ reload IV
Adam Langleye9ada862015-05-11 17:20:37 -07001218 vld1.8 {q8,q9}, [r0]! @ reload input
Adam Langleyd9e397b2015-01-22 14:27:53 -08001219 veor q0, q0, q14 @ ^= IV
Adam Langleye9ada862015-05-11 17:20:37 -07001220 vld1.8 {q10,q11}, [r0]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001221 veor q1, q1, q8
1222 veor q6, q6, q9
Adam Langleye9ada862015-05-11 17:20:37 -07001223 vld1.8 {q12,q13}, [r0]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001224 veor q4, q4, q10
1225 veor q2, q2, q11
1226 vld1.8 {q15}, [r0]!
1227 veor q7, q7, q12
Adam Langleye9ada862015-05-11 17:20:37 -07001228 vst1.8 {q0,q1}, [r1]! @ write output
Adam Langleyd9e397b2015-01-22 14:27:53 -08001229 veor q3, q3, q13
1230 vst1.8 {q6}, [r1]!
1231 vst1.8 {q4}, [r1]!
1232 vst1.8 {q2}, [r1]!
1233 vst1.8 {q7}, [r1]!
1234 vst1.8 {q3}, [r1]!
1235 b .Lcbc_dec_done
1236.align 4
1237.Lcbc_dec_six:
1238 sub r0, r0, #0x60
1239 bl _bsaes_decrypt8
1240 vldmia r9,{q14} @ reload IV
Adam Langleye9ada862015-05-11 17:20:37 -07001241 vld1.8 {q8,q9}, [r0]! @ reload input
Adam Langleyd9e397b2015-01-22 14:27:53 -08001242 veor q0, q0, q14 @ ^= IV
Adam Langleye9ada862015-05-11 17:20:37 -07001243 vld1.8 {q10,q11}, [r0]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001244 veor q1, q1, q8
1245 veor q6, q6, q9
1246 vld1.8 {q12}, [r0]!
1247 veor q4, q4, q10
1248 veor q2, q2, q11
1249 vld1.8 {q15}, [r0]!
1250 veor q7, q7, q12
Adam Langleye9ada862015-05-11 17:20:37 -07001251 vst1.8 {q0,q1}, [r1]! @ write output
Adam Langleyd9e397b2015-01-22 14:27:53 -08001252 vst1.8 {q6}, [r1]!
1253 vst1.8 {q4}, [r1]!
1254 vst1.8 {q2}, [r1]!
1255 vst1.8 {q7}, [r1]!
1256 b .Lcbc_dec_done
1257.align 4
1258.Lcbc_dec_five:
1259 sub r0, r0, #0x50
1260 bl _bsaes_decrypt8
1261 vldmia r9, {q14} @ reload IV
Adam Langleye9ada862015-05-11 17:20:37 -07001262 vld1.8 {q8,q9}, [r0]! @ reload input
Adam Langleyd9e397b2015-01-22 14:27:53 -08001263 veor q0, q0, q14 @ ^= IV
Adam Langleye9ada862015-05-11 17:20:37 -07001264 vld1.8 {q10,q11}, [r0]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001265 veor q1, q1, q8
1266 veor q6, q6, q9
1267 vld1.8 {q15}, [r0]!
1268 veor q4, q4, q10
Adam Langleye9ada862015-05-11 17:20:37 -07001269 vst1.8 {q0,q1}, [r1]! @ write output
Adam Langleyd9e397b2015-01-22 14:27:53 -08001270 veor q2, q2, q11
1271 vst1.8 {q6}, [r1]!
1272 vst1.8 {q4}, [r1]!
1273 vst1.8 {q2}, [r1]!
1274 b .Lcbc_dec_done
1275.align 4
1276.Lcbc_dec_four:
1277 sub r0, r0, #0x40
1278 bl _bsaes_decrypt8
1279 vldmia r9, {q14} @ reload IV
Adam Langleye9ada862015-05-11 17:20:37 -07001280 vld1.8 {q8,q9}, [r0]! @ reload input
Adam Langleyd9e397b2015-01-22 14:27:53 -08001281 veor q0, q0, q14 @ ^= IV
1282 vld1.8 {q10}, [r0]!
1283 veor q1, q1, q8
1284 veor q6, q6, q9
1285 vld1.8 {q15}, [r0]!
1286 veor q4, q4, q10
Adam Langleye9ada862015-05-11 17:20:37 -07001287 vst1.8 {q0,q1}, [r1]! @ write output
Adam Langleyd9e397b2015-01-22 14:27:53 -08001288 vst1.8 {q6}, [r1]!
1289 vst1.8 {q4}, [r1]!
1290 b .Lcbc_dec_done
1291.align 4
1292.Lcbc_dec_three:
1293 sub r0, r0, #0x30
1294 bl _bsaes_decrypt8
1295 vldmia r9, {q14} @ reload IV
Adam Langleye9ada862015-05-11 17:20:37 -07001296 vld1.8 {q8,q9}, [r0]! @ reload input
Adam Langleyd9e397b2015-01-22 14:27:53 -08001297 veor q0, q0, q14 @ ^= IV
1298 vld1.8 {q15}, [r0]!
1299 veor q1, q1, q8
1300 veor q6, q6, q9
Adam Langleye9ada862015-05-11 17:20:37 -07001301 vst1.8 {q0,q1}, [r1]! @ write output
Adam Langleyd9e397b2015-01-22 14:27:53 -08001302 vst1.8 {q6}, [r1]!
1303 b .Lcbc_dec_done
1304.align 4
1305.Lcbc_dec_two:
1306 sub r0, r0, #0x20
1307 bl _bsaes_decrypt8
1308 vldmia r9, {q14} @ reload IV
1309 vld1.8 {q8}, [r0]! @ reload input
1310 veor q0, q0, q14 @ ^= IV
1311 vld1.8 {q15}, [r0]! @ reload input
1312 veor q1, q1, q8
Adam Langleye9ada862015-05-11 17:20:37 -07001313 vst1.8 {q0,q1}, [r1]! @ write output
Adam Langleyd9e397b2015-01-22 14:27:53 -08001314 b .Lcbc_dec_done
1315.align 4
1316.Lcbc_dec_one:
1317 sub r0, r0, #0x10
1318 mov r10, r1 @ save original out pointer
1319 mov r1, r9 @ use the iv scratch space as out buffer
1320 mov r2, r3
1321 vmov q4,q15 @ just in case ensure that IV
1322 vmov q5,q0 @ and input are preserved
1323 bl AES_decrypt
Robert Sloan6f79a502017-04-03 09:16:40 -07001324 vld1.8 {q0}, [r9] @ load result
Adam Langleyd9e397b2015-01-22 14:27:53 -08001325 veor q0, q0, q4 @ ^= IV
1326 vmov q15, q5 @ q5 holds input
1327 vst1.8 {q0}, [r10] @ write output
1328
1329.Lcbc_dec_done:
1330#ifndef BSAES_ASM_EXTENDED_KEY
1331 vmov.i32 q0, #0
1332 vmov.i32 q1, #0
Adam Langleye9ada862015-05-11 17:20:37 -07001333.Lcbc_dec_bzero:@ wipe key schedule [if any]
1334 vstmia sp!, {q0,q1}
1335 cmp sp, r9
1336 bne .Lcbc_dec_bzero
Adam Langleyd9e397b2015-01-22 14:27:53 -08001337#endif
1338
1339 mov sp, r9
1340 add sp, #0x10 @ add sp,r9,#0x10 is no good for thumb
1341 vst1.8 {q15}, [r8] @ return IV
1342 VFP_ABI_POP
Adam Langleye9ada862015-05-11 17:20:37 -07001343 ldmia sp!, {r4,r5,r6,r7,r8,r9,r10, pc}
Adam Langleyd9e397b2015-01-22 14:27:53 -08001344.size bsaes_cbc_encrypt,.-bsaes_cbc_encrypt
Adam Langleye9ada862015-05-11 17:20:37 -07001345
1346.globl bsaes_ctr32_encrypt_blocks
Adam Langleyd9e397b2015-01-22 14:27:53 -08001347.hidden bsaes_ctr32_encrypt_blocks
1348.type bsaes_ctr32_encrypt_blocks,%function
1349.align 5
1350bsaes_ctr32_encrypt_blocks:
1351 cmp r2, #8 @ use plain AES for
1352 blo .Lctr_enc_short @ small sizes
1353
1354 mov ip, sp
Adam Langleye9ada862015-05-11 17:20:37 -07001355 stmdb sp!, {r4,r5,r6,r7,r8,r9,r10, lr}
Adam Langleyd9e397b2015-01-22 14:27:53 -08001356 VFP_ABI_PUSH
1357 ldr r8, [ip] @ ctr is 1st arg on the stack
1358 sub sp, sp, #0x10 @ scratch space to carry over the ctr
1359 mov r9, sp @ save sp
1360
1361 ldr r10, [r3, #240] @ get # of rounds
1362#ifndef BSAES_ASM_EXTENDED_KEY
1363 @ allocate the key schedule on the stack
1364 sub r12, sp, r10, lsl#7 @ 128 bytes per inner round key
1365 add r12, #96 @ size of bit-sliced key schedule
1366
1367 @ populate the key schedule
1368 mov r4, r3 @ pass key
1369 mov r5, r10 @ pass # of rounds
1370 mov sp, r12 @ sp is sp
1371 bl _bsaes_key_convert
1372 veor q7,q7,q15 @ fix up last round key
1373 vstmia r12, {q7} @ save last round key
1374
1375 vld1.8 {q0}, [r8] @ load counter
Adam Langleye9ada862015-05-11 17:20:37 -07001376#ifdef __APPLE__
Adam Langleyf4e42722015-06-04 17:45:09 -07001377 mov r8, #:lower16:(.LREVM0SR-.LM0)
Adam Langleye9ada862015-05-11 17:20:37 -07001378 add r8, r6, r8
1379#else
Adam Langleyd9e397b2015-01-22 14:27:53 -08001380 add r8, r6, #.LREVM0SR-.LM0 @ borrow r8
Adam Langleye9ada862015-05-11 17:20:37 -07001381#endif
Adam Langleyd9e397b2015-01-22 14:27:53 -08001382 vldmia sp, {q4} @ load round0 key
1383#else
1384 ldr r12, [r3, #244]
1385 eors r12, #1
1386 beq 0f
1387
1388 @ populate the key schedule
1389 str r12, [r3, #244]
1390 mov r4, r3 @ pass key
1391 mov r5, r10 @ pass # of rounds
1392 add r12, r3, #248 @ pass key schedule
1393 bl _bsaes_key_convert
1394 veor q7,q7,q15 @ fix up last round key
1395 vstmia r12, {q7} @ save last round key
1396
1397.align 2
Adam Langleye9ada862015-05-11 17:20:37 -07001398 add r12, r3, #248
Adam Langleyd9e397b2015-01-22 14:27:53 -08001399 vld1.8 {q0}, [r8] @ load counter
1400 adrl r8, .LREVM0SR @ borrow r8
1401 vldmia r12, {q4} @ load round0 key
1402 sub sp, #0x10 @ place for adjusted round0 key
1403#endif
1404
1405 vmov.i32 q8,#1 @ compose 1<<96
Adam Langleye9ada862015-05-11 17:20:37 -07001406 veor q9,q9,q9
Adam Langleyd9e397b2015-01-22 14:27:53 -08001407 vrev32.8 q0,q0
Adam Langleye9ada862015-05-11 17:20:37 -07001408 vext.8 q8,q9,q8,#4
Adam Langleyd9e397b2015-01-22 14:27:53 -08001409 vrev32.8 q4,q4
1410 vadd.u32 q9,q8,q8 @ compose 2<<96
1411 vstmia sp, {q4} @ save adjusted round0 key
1412 b .Lctr_enc_loop
1413
1414.align 4
1415.Lctr_enc_loop:
1416 vadd.u32 q10, q8, q9 @ compose 3<<96
1417 vadd.u32 q1, q0, q8 @ +1
1418 vadd.u32 q2, q0, q9 @ +2
1419 vadd.u32 q3, q0, q10 @ +3
1420 vadd.u32 q4, q1, q10
1421 vadd.u32 q5, q2, q10
1422 vadd.u32 q6, q3, q10
1423 vadd.u32 q7, q4, q10
1424 vadd.u32 q10, q5, q10 @ next counter
1425
1426 @ Borrow prologue from _bsaes_encrypt8 to use the opportunity
1427 @ to flip byte order in 32-bit counter
1428
Adam Langleye9ada862015-05-11 17:20:37 -07001429 vldmia sp, {q9} @ load round0 key
Adam Langleyd9e397b2015-01-22 14:27:53 -08001430#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07001431 add r4, sp, #0x10 @ pass next round key
Adam Langleyd9e397b2015-01-22 14:27:53 -08001432#else
Adam Langleye9ada862015-05-11 17:20:37 -07001433 add r4, r3, #264
Adam Langleyd9e397b2015-01-22 14:27:53 -08001434#endif
Adam Langleye9ada862015-05-11 17:20:37 -07001435 vldmia r8, {q8} @ .LREVM0SR
1436 mov r5, r10 @ pass rounds
1437 vstmia r9, {q10} @ save next counter
1438#ifdef __APPLE__
Adam Langleyf4e42722015-06-04 17:45:09 -07001439 mov r6, #:lower16:(.LREVM0SR-.LSR)
Adam Langleye9ada862015-05-11 17:20:37 -07001440 sub r6, r8, r6
1441#else
1442 sub r6, r8, #.LREVM0SR-.LSR @ pass constants
1443#endif
Adam Langleyd9e397b2015-01-22 14:27:53 -08001444
Adam Langleye9ada862015-05-11 17:20:37 -07001445 bl _bsaes_encrypt8_alt
Adam Langleyd9e397b2015-01-22 14:27:53 -08001446
Adam Langleye9ada862015-05-11 17:20:37 -07001447 subs r2, r2, #8
1448 blo .Lctr_enc_loop_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08001449
Adam Langleye9ada862015-05-11 17:20:37 -07001450 vld1.8 {q8,q9}, [r0]! @ load input
1451 vld1.8 {q10,q11}, [r0]!
1452 veor q0, q8
1453 veor q1, q9
1454 vld1.8 {q12,q13}, [r0]!
1455 veor q4, q10
1456 veor q6, q11
1457 vld1.8 {q14,q15}, [r0]!
1458 veor q3, q12
1459 vst1.8 {q0,q1}, [r1]! @ write output
1460 veor q7, q13
1461 veor q2, q14
1462 vst1.8 {q4}, [r1]!
1463 veor q5, q15
1464 vst1.8 {q6}, [r1]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001465 vmov.i32 q8, #1 @ compose 1<<96
Adam Langleye9ada862015-05-11 17:20:37 -07001466 vst1.8 {q3}, [r1]!
1467 veor q9, q9, q9
1468 vst1.8 {q7}, [r1]!
1469 vext.8 q8, q9, q8, #4
1470 vst1.8 {q2}, [r1]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001471 vadd.u32 q9,q8,q8 @ compose 2<<96
Adam Langleye9ada862015-05-11 17:20:37 -07001472 vst1.8 {q5}, [r1]!
1473 vldmia r9, {q0} @ load counter
Adam Langleyd9e397b2015-01-22 14:27:53 -08001474
Adam Langleye9ada862015-05-11 17:20:37 -07001475 bne .Lctr_enc_loop
1476 b .Lctr_enc_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08001477
1478.align 4
1479.Lctr_enc_loop_done:
Adam Langleye9ada862015-05-11 17:20:37 -07001480 add r2, r2, #8
1481 vld1.8 {q8}, [r0]! @ load input
1482 veor q0, q8
1483 vst1.8 {q0}, [r1]! @ write output
1484 cmp r2, #2
1485 blo .Lctr_enc_done
1486 vld1.8 {q9}, [r0]!
1487 veor q1, q9
1488 vst1.8 {q1}, [r1]!
1489 beq .Lctr_enc_done
1490 vld1.8 {q10}, [r0]!
1491 veor q4, q10
1492 vst1.8 {q4}, [r1]!
1493 cmp r2, #4
1494 blo .Lctr_enc_done
1495 vld1.8 {q11}, [r0]!
1496 veor q6, q11
1497 vst1.8 {q6}, [r1]!
1498 beq .Lctr_enc_done
1499 vld1.8 {q12}, [r0]!
1500 veor q3, q12
1501 vst1.8 {q3}, [r1]!
1502 cmp r2, #6
1503 blo .Lctr_enc_done
1504 vld1.8 {q13}, [r0]!
1505 veor q7, q13
1506 vst1.8 {q7}, [r1]!
1507 beq .Lctr_enc_done
1508 vld1.8 {q14}, [r0]
1509 veor q2, q14
1510 vst1.8 {q2}, [r1]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001511
1512.Lctr_enc_done:
1513 vmov.i32 q0, #0
1514 vmov.i32 q1, #0
1515#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07001516.Lctr_enc_bzero:@ wipe key schedule [if any]
1517 vstmia sp!, {q0,q1}
1518 cmp sp, r9
1519 bne .Lctr_enc_bzero
Adam Langleyd9e397b2015-01-22 14:27:53 -08001520#else
Adam Langleye9ada862015-05-11 17:20:37 -07001521 vstmia sp, {q0,q1}
Adam Langleyd9e397b2015-01-22 14:27:53 -08001522#endif
1523
1524 mov sp, r9
1525 add sp, #0x10 @ add sp,r9,#0x10 is no good for thumb
1526 VFP_ABI_POP
Adam Langleye9ada862015-05-11 17:20:37 -07001527 ldmia sp!, {r4,r5,r6,r7,r8,r9,r10, pc} @ return
Adam Langleyd9e397b2015-01-22 14:27:53 -08001528
1529.align 4
1530.Lctr_enc_short:
1531 ldr ip, [sp] @ ctr pointer is passed on stack
Adam Langleye9ada862015-05-11 17:20:37 -07001532 stmdb sp!, {r4,r5,r6,r7,r8, lr}
Adam Langleyd9e397b2015-01-22 14:27:53 -08001533
1534 mov r4, r0 @ copy arguments
1535 mov r5, r1
1536 mov r6, r2
1537 mov r7, r3
Adam Langleye9ada862015-05-11 17:20:37 -07001538 ldr r8, [ip, #12] @ load counter .LSW
Adam Langleyd9e397b2015-01-22 14:27:53 -08001539 vld1.8 {q1}, [ip] @ load whole counter value
1540#ifdef __ARMEL__
1541 rev r8, r8
1542#endif
1543 sub sp, sp, #0x10
Adam Langleye9ada862015-05-11 17:20:37 -07001544 vst1.8 {q1}, [sp] @ copy counter value
Adam Langleyd9e397b2015-01-22 14:27:53 -08001545 sub sp, sp, #0x10
1546
1547.Lctr_enc_short_loop:
1548 add r0, sp, #0x10 @ input counter value
1549 mov r1, sp @ output on the stack
1550 mov r2, r7 @ key
1551
1552 bl AES_encrypt
1553
1554 vld1.8 {q0}, [r4]! @ load input
Adam Langleye9ada862015-05-11 17:20:37 -07001555 vld1.8 {q1}, [sp] @ load encrypted counter
Adam Langleyd9e397b2015-01-22 14:27:53 -08001556 add r8, r8, #1
1557#ifdef __ARMEL__
1558 rev r0, r8
1559 str r0, [sp, #0x1c] @ next counter value
1560#else
1561 str r8, [sp, #0x1c] @ next counter value
1562#endif
1563 veor q0,q0,q1
1564 vst1.8 {q0}, [r5]! @ store output
1565 subs r6, r6, #1
1566 bne .Lctr_enc_short_loop
1567
1568 vmov.i32 q0, #0
1569 vmov.i32 q1, #0
Adam Langleye9ada862015-05-11 17:20:37 -07001570 vstmia sp!, {q0,q1}
Adam Langleyd9e397b2015-01-22 14:27:53 -08001571
Adam Langleye9ada862015-05-11 17:20:37 -07001572 ldmia sp!, {r4,r5,r6,r7,r8, pc}
Adam Langleyd9e397b2015-01-22 14:27:53 -08001573.size bsaes_ctr32_encrypt_blocks,.-bsaes_ctr32_encrypt_blocks
1574.globl bsaes_xts_encrypt
1575.hidden bsaes_xts_encrypt
1576.type bsaes_xts_encrypt,%function
1577.align 4
1578bsaes_xts_encrypt:
1579 mov ip, sp
Adam Langleye9ada862015-05-11 17:20:37 -07001580 stmdb sp!, {r4,r5,r6,r7,r8,r9,r10, lr} @ 0x20
Adam Langleyd9e397b2015-01-22 14:27:53 -08001581 VFP_ABI_PUSH
1582 mov r6, sp @ future r3
1583
1584 mov r7, r0
1585 mov r8, r1
1586 mov r9, r2
1587 mov r10, r3
1588
1589 sub r0, sp, #0x10 @ 0x10
1590 bic r0, #0xf @ align at 16 bytes
1591 mov sp, r0
1592
1593#ifdef XTS_CHAIN_TWEAK
1594 ldr r0, [ip] @ pointer to input tweak
1595#else
1596 @ generate initial tweak
1597 ldr r0, [ip, #4] @ iv[]
1598 mov r1, sp
1599 ldr r2, [ip, #0] @ key2
1600 bl AES_encrypt
1601 mov r0,sp @ pointer to initial tweak
1602#endif
1603
1604 ldr r1, [r10, #240] @ get # of rounds
1605 mov r3, r6
1606#ifndef BSAES_ASM_EXTENDED_KEY
1607 @ allocate the key schedule on the stack
1608 sub r12, sp, r1, lsl#7 @ 128 bytes per inner round key
1609 @ add r12, #96 @ size of bit-sliced key schedule
1610 sub r12, #48 @ place for tweak[9]
1611
1612 @ populate the key schedule
1613 mov r4, r10 @ pass key
1614 mov r5, r1 @ pass # of rounds
1615 mov sp, r12
1616 add r12, #0x90 @ pass key schedule
1617 bl _bsaes_key_convert
1618 veor q7, q7, q15 @ fix up last round key
1619 vstmia r12, {q7} @ save last round key
1620#else
1621 ldr r12, [r10, #244]
1622 eors r12, #1
1623 beq 0f
1624
1625 str r12, [r10, #244]
1626 mov r4, r10 @ pass key
1627 mov r5, r1 @ pass # of rounds
1628 add r12, r10, #248 @ pass key schedule
1629 bl _bsaes_key_convert
1630 veor q7, q7, q15 @ fix up last round key
1631 vstmia r12, {q7}
1632
1633.align 2
Adam Langleye9ada862015-05-11 17:20:37 -07001634 sub sp, #0x90 @ place for tweak[9]
Adam Langleyd9e397b2015-01-22 14:27:53 -08001635#endif
1636
1637 vld1.8 {q8}, [r0] @ initial tweak
1638 adr r2, .Lxts_magic
1639
1640 subs r9, #0x80
1641 blo .Lxts_enc_short
1642 b .Lxts_enc_loop
1643
1644.align 4
1645.Lxts_enc_loop:
Adam Langleye9ada862015-05-11 17:20:37 -07001646 vldmia r2, {q5} @ load XTS magic
Adam Langleyd9e397b2015-01-22 14:27:53 -08001647 vshr.s64 q6, q8, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001648 mov r0, sp
1649 vand q6, q6, q5
Adam Langleyd9e397b2015-01-22 14:27:53 -08001650 vadd.u64 q9, q8, q8
Adam Langleye9ada862015-05-11 17:20:37 -07001651 vst1.64 {q8}, [r0,:128]!
1652 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08001653 vshr.s64 q7, q9, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001654 veor q9, q9, q6
1655 vand q7, q7, q5
Adam Langleyd9e397b2015-01-22 14:27:53 -08001656 vadd.u64 q10, q9, q9
Adam Langleye9ada862015-05-11 17:20:37 -07001657 vst1.64 {q9}, [r0,:128]!
1658 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08001659 vshr.s64 q6, q10, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001660 veor q10, q10, q7
1661 vand q6, q6, q5
1662 vld1.8 {q0}, [r7]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001663 vadd.u64 q11, q10, q10
Adam Langleye9ada862015-05-11 17:20:37 -07001664 vst1.64 {q10}, [r0,:128]!
1665 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08001666 vshr.s64 q7, q11, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001667 veor q11, q11, q6
1668 vand q7, q7, q5
1669 vld1.8 {q1}, [r7]!
1670 veor q0, q0, q8
Adam Langleyd9e397b2015-01-22 14:27:53 -08001671 vadd.u64 q12, q11, q11
Adam Langleye9ada862015-05-11 17:20:37 -07001672 vst1.64 {q11}, [r0,:128]!
1673 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08001674 vshr.s64 q6, q12, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001675 veor q12, q12, q7
1676 vand q6, q6, q5
1677 vld1.8 {q2}, [r7]!
1678 veor q1, q1, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -08001679 vadd.u64 q13, q12, q12
Adam Langleye9ada862015-05-11 17:20:37 -07001680 vst1.64 {q12}, [r0,:128]!
1681 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08001682 vshr.s64 q7, q13, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001683 veor q13, q13, q6
1684 vand q7, q7, q5
1685 vld1.8 {q3}, [r7]!
1686 veor q2, q2, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -08001687 vadd.u64 q14, q13, q13
Adam Langleye9ada862015-05-11 17:20:37 -07001688 vst1.64 {q13}, [r0,:128]!
1689 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08001690 vshr.s64 q6, q14, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001691 veor q14, q14, q7
1692 vand q6, q6, q5
1693 vld1.8 {q4}, [r7]!
1694 veor q3, q3, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -08001695 vadd.u64 q15, q14, q14
Adam Langleye9ada862015-05-11 17:20:37 -07001696 vst1.64 {q14}, [r0,:128]!
1697 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08001698 vshr.s64 q7, q15, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001699 veor q15, q15, q6
1700 vand q7, q7, q5
1701 vld1.8 {q5}, [r7]!
1702 veor q4, q4, q12
Adam Langleyd9e397b2015-01-22 14:27:53 -08001703 vadd.u64 q8, q15, q15
Adam Langleye9ada862015-05-11 17:20:37 -07001704 vst1.64 {q15}, [r0,:128]!
1705 vswp d15,d14
1706 veor q8, q8, q7
1707 vst1.64 {q8}, [r0,:128] @ next round tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08001708
Adam Langleye9ada862015-05-11 17:20:37 -07001709 vld1.8 {q6,q7}, [r7]!
1710 veor q5, q5, q13
Adam Langleyd9e397b2015-01-22 14:27:53 -08001711#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07001712 add r4, sp, #0x90 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08001713#else
Adam Langleye9ada862015-05-11 17:20:37 -07001714 add r4, r10, #248 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08001715#endif
Adam Langleye9ada862015-05-11 17:20:37 -07001716 veor q6, q6, q14
1717 mov r5, r1 @ pass rounds
1718 veor q7, q7, q15
1719 mov r0, sp
Adam Langleyd9e397b2015-01-22 14:27:53 -08001720
Adam Langleye9ada862015-05-11 17:20:37 -07001721 bl _bsaes_encrypt8
Adam Langleyd9e397b2015-01-22 14:27:53 -08001722
Adam Langleye9ada862015-05-11 17:20:37 -07001723 vld1.64 {q8,q9}, [r0,:128]!
1724 vld1.64 {q10,q11}, [r0,:128]!
1725 veor q0, q0, q8
1726 vld1.64 {q12,q13}, [r0,:128]!
1727 veor q1, q1, q9
1728 veor q8, q4, q10
1729 vst1.8 {q0,q1}, [r8]!
1730 veor q9, q6, q11
1731 vld1.64 {q14,q15}, [r0,:128]!
1732 veor q10, q3, q12
1733 vst1.8 {q8,q9}, [r8]!
1734 veor q11, q7, q13
1735 veor q12, q2, q14
1736 vst1.8 {q10,q11}, [r8]!
1737 veor q13, q5, q15
1738 vst1.8 {q12,q13}, [r8]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001739
Adam Langleye9ada862015-05-11 17:20:37 -07001740 vld1.64 {q8}, [r0,:128] @ next round tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08001741
Adam Langleye9ada862015-05-11 17:20:37 -07001742 subs r9, #0x80
1743 bpl .Lxts_enc_loop
Adam Langleyd9e397b2015-01-22 14:27:53 -08001744
1745.Lxts_enc_short:
Adam Langleye9ada862015-05-11 17:20:37 -07001746 adds r9, #0x70
1747 bmi .Lxts_enc_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08001748
Adam Langleye9ada862015-05-11 17:20:37 -07001749 vldmia r2, {q5} @ load XTS magic
Adam Langleyd9e397b2015-01-22 14:27:53 -08001750 vshr.s64 q7, q8, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001751 mov r0, sp
1752 vand q7, q7, q5
Adam Langleyd9e397b2015-01-22 14:27:53 -08001753 vadd.u64 q9, q8, q8
Adam Langleye9ada862015-05-11 17:20:37 -07001754 vst1.64 {q8}, [r0,:128]!
1755 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08001756 vshr.s64 q6, q9, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001757 veor q9, q9, q7
1758 vand q6, q6, q5
Adam Langleyd9e397b2015-01-22 14:27:53 -08001759 vadd.u64 q10, q9, q9
Adam Langleye9ada862015-05-11 17:20:37 -07001760 vst1.64 {q9}, [r0,:128]!
1761 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08001762 vshr.s64 q7, q10, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001763 veor q10, q10, q6
1764 vand q7, q7, q5
1765 vld1.8 {q0}, [r7]!
1766 subs r9, #0x10
1767 bmi .Lxts_enc_1
Adam Langleyd9e397b2015-01-22 14:27:53 -08001768 vadd.u64 q11, q10, q10
Adam Langleye9ada862015-05-11 17:20:37 -07001769 vst1.64 {q10}, [r0,:128]!
1770 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08001771 vshr.s64 q6, q11, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001772 veor q11, q11, q7
1773 vand q6, q6, q5
1774 vld1.8 {q1}, [r7]!
1775 subs r9, #0x10
1776 bmi .Lxts_enc_2
1777 veor q0, q0, q8
Adam Langleyd9e397b2015-01-22 14:27:53 -08001778 vadd.u64 q12, q11, q11
Adam Langleye9ada862015-05-11 17:20:37 -07001779 vst1.64 {q11}, [r0,:128]!
1780 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08001781 vshr.s64 q7, q12, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001782 veor q12, q12, q6
1783 vand q7, q7, q5
1784 vld1.8 {q2}, [r7]!
1785 subs r9, #0x10
1786 bmi .Lxts_enc_3
1787 veor q1, q1, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -08001788 vadd.u64 q13, q12, q12
Adam Langleye9ada862015-05-11 17:20:37 -07001789 vst1.64 {q12}, [r0,:128]!
1790 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08001791 vshr.s64 q6, q13, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001792 veor q13, q13, q7
1793 vand q6, q6, q5
1794 vld1.8 {q3}, [r7]!
1795 subs r9, #0x10
1796 bmi .Lxts_enc_4
1797 veor q2, q2, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -08001798 vadd.u64 q14, q13, q13
Adam Langleye9ada862015-05-11 17:20:37 -07001799 vst1.64 {q13}, [r0,:128]!
1800 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08001801 vshr.s64 q7, q14, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001802 veor q14, q14, q6
1803 vand q7, q7, q5
1804 vld1.8 {q4}, [r7]!
1805 subs r9, #0x10
1806 bmi .Lxts_enc_5
1807 veor q3, q3, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -08001808 vadd.u64 q15, q14, q14
Adam Langleye9ada862015-05-11 17:20:37 -07001809 vst1.64 {q14}, [r0,:128]!
1810 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08001811 vshr.s64 q6, q15, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001812 veor q15, q15, q7
1813 vand q6, q6, q5
1814 vld1.8 {q5}, [r7]!
1815 subs r9, #0x10
1816 bmi .Lxts_enc_6
1817 veor q4, q4, q12
1818 sub r9, #0x10
1819 vst1.64 {q15}, [r0,:128] @ next round tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08001820
Adam Langleye9ada862015-05-11 17:20:37 -07001821 vld1.8 {q6}, [r7]!
1822 veor q5, q5, q13
Adam Langleyd9e397b2015-01-22 14:27:53 -08001823#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07001824 add r4, sp, #0x90 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08001825#else
Adam Langleye9ada862015-05-11 17:20:37 -07001826 add r4, r10, #248 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08001827#endif
Adam Langleye9ada862015-05-11 17:20:37 -07001828 veor q6, q6, q14
1829 mov r5, r1 @ pass rounds
1830 mov r0, sp
Adam Langleyd9e397b2015-01-22 14:27:53 -08001831
Adam Langleye9ada862015-05-11 17:20:37 -07001832 bl _bsaes_encrypt8
Adam Langleyd9e397b2015-01-22 14:27:53 -08001833
Adam Langleye9ada862015-05-11 17:20:37 -07001834 vld1.64 {q8,q9}, [r0,:128]!
1835 vld1.64 {q10,q11}, [r0,:128]!
1836 veor q0, q0, q8
1837 vld1.64 {q12,q13}, [r0,:128]!
1838 veor q1, q1, q9
1839 veor q8, q4, q10
1840 vst1.8 {q0,q1}, [r8]!
1841 veor q9, q6, q11
1842 vld1.64 {q14}, [r0,:128]!
1843 veor q10, q3, q12
1844 vst1.8 {q8,q9}, [r8]!
1845 veor q11, q7, q13
1846 veor q12, q2, q14
1847 vst1.8 {q10,q11}, [r8]!
1848 vst1.8 {q12}, [r8]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001849
Adam Langleye9ada862015-05-11 17:20:37 -07001850 vld1.64 {q8}, [r0,:128] @ next round tweak
1851 b .Lxts_enc_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08001852.align 4
1853.Lxts_enc_6:
Adam Langleye9ada862015-05-11 17:20:37 -07001854 veor q4, q4, q12
Adam Langleyd9e397b2015-01-22 14:27:53 -08001855#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07001856 add r4, sp, #0x90 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08001857#else
Adam Langleye9ada862015-05-11 17:20:37 -07001858 add r4, r10, #248 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08001859#endif
Adam Langleye9ada862015-05-11 17:20:37 -07001860 veor q5, q5, q13
1861 mov r5, r1 @ pass rounds
1862 mov r0, sp
Adam Langleyd9e397b2015-01-22 14:27:53 -08001863
Adam Langleye9ada862015-05-11 17:20:37 -07001864 bl _bsaes_encrypt8
Adam Langleyd9e397b2015-01-22 14:27:53 -08001865
Adam Langleye9ada862015-05-11 17:20:37 -07001866 vld1.64 {q8,q9}, [r0,:128]!
1867 vld1.64 {q10,q11}, [r0,:128]!
1868 veor q0, q0, q8
1869 vld1.64 {q12,q13}, [r0,:128]!
1870 veor q1, q1, q9
1871 veor q8, q4, q10
1872 vst1.8 {q0,q1}, [r8]!
1873 veor q9, q6, q11
1874 veor q10, q3, q12
1875 vst1.8 {q8,q9}, [r8]!
1876 veor q11, q7, q13
1877 vst1.8 {q10,q11}, [r8]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001878
Adam Langleye9ada862015-05-11 17:20:37 -07001879 vld1.64 {q8}, [r0,:128] @ next round tweak
1880 b .Lxts_enc_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08001881
1882@ put this in range for both ARM and Thumb mode adr instructions
1883.align 5
1884.Lxts_magic:
Adam Langleye9ada862015-05-11 17:20:37 -07001885.quad 1, 0x87
Adam Langleyd9e397b2015-01-22 14:27:53 -08001886
1887.align 5
1888.Lxts_enc_5:
Adam Langleye9ada862015-05-11 17:20:37 -07001889 veor q3, q3, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -08001890#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07001891 add r4, sp, #0x90 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08001892#else
Adam Langleye9ada862015-05-11 17:20:37 -07001893 add r4, r10, #248 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08001894#endif
Adam Langleye9ada862015-05-11 17:20:37 -07001895 veor q4, q4, q12
1896 mov r5, r1 @ pass rounds
1897 mov r0, sp
Adam Langleyd9e397b2015-01-22 14:27:53 -08001898
Adam Langleye9ada862015-05-11 17:20:37 -07001899 bl _bsaes_encrypt8
Adam Langleyd9e397b2015-01-22 14:27:53 -08001900
Adam Langleye9ada862015-05-11 17:20:37 -07001901 vld1.64 {q8,q9}, [r0,:128]!
1902 vld1.64 {q10,q11}, [r0,:128]!
1903 veor q0, q0, q8
1904 vld1.64 {q12}, [r0,:128]!
1905 veor q1, q1, q9
1906 veor q8, q4, q10
1907 vst1.8 {q0,q1}, [r8]!
1908 veor q9, q6, q11
1909 veor q10, q3, q12
1910 vst1.8 {q8,q9}, [r8]!
1911 vst1.8 {q10}, [r8]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001912
Adam Langleye9ada862015-05-11 17:20:37 -07001913 vld1.64 {q8}, [r0,:128] @ next round tweak
1914 b .Lxts_enc_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08001915.align 4
1916.Lxts_enc_4:
Adam Langleye9ada862015-05-11 17:20:37 -07001917 veor q2, q2, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -08001918#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07001919 add r4, sp, #0x90 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08001920#else
Adam Langleye9ada862015-05-11 17:20:37 -07001921 add r4, r10, #248 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08001922#endif
Adam Langleye9ada862015-05-11 17:20:37 -07001923 veor q3, q3, q11
1924 mov r5, r1 @ pass rounds
1925 mov r0, sp
Adam Langleyd9e397b2015-01-22 14:27:53 -08001926
Adam Langleye9ada862015-05-11 17:20:37 -07001927 bl _bsaes_encrypt8
Adam Langleyd9e397b2015-01-22 14:27:53 -08001928
Adam Langleye9ada862015-05-11 17:20:37 -07001929 vld1.64 {q8,q9}, [r0,:128]!
1930 vld1.64 {q10,q11}, [r0,:128]!
1931 veor q0, q0, q8
1932 veor q1, q1, q9
1933 veor q8, q4, q10
1934 vst1.8 {q0,q1}, [r8]!
1935 veor q9, q6, q11
1936 vst1.8 {q8,q9}, [r8]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001937
Adam Langleye9ada862015-05-11 17:20:37 -07001938 vld1.64 {q8}, [r0,:128] @ next round tweak
1939 b .Lxts_enc_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08001940.align 4
1941.Lxts_enc_3:
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 veor q0, q0, q8
Adam Langleyd9e397b2015-01-22 14:27:53 -08001967#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07001968 add r4, sp, #0x90 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08001969#else
Adam Langleye9ada862015-05-11 17:20:37 -07001970 add r4, r10, #248 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08001971#endif
Adam Langleye9ada862015-05-11 17:20:37 -07001972 veor q1, q1, q9
1973 mov r5, r1 @ pass rounds
1974 mov r0, sp
Adam Langleyd9e397b2015-01-22 14:27:53 -08001975
Adam Langleye9ada862015-05-11 17:20:37 -07001976 bl _bsaes_encrypt8
Adam Langleyd9e397b2015-01-22 14:27:53 -08001977
Adam Langleye9ada862015-05-11 17:20:37 -07001978 vld1.64 {q8,q9}, [r0,:128]!
1979 veor q0, q0, q8
1980 veor q1, q1, q9
1981 vst1.8 {q0,q1}, [r8]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001982
Adam Langleye9ada862015-05-11 17:20:37 -07001983 vld1.64 {q8}, [r0,:128] @ next round tweak
1984 b .Lxts_enc_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08001985.align 4
1986.Lxts_enc_1:
Adam Langleye9ada862015-05-11 17:20:37 -07001987 mov r0, sp
David Benjaminc895d6b2016-08-11 13:26:41 -04001988 veor q0, q0, q8
Adam Langleye9ada862015-05-11 17:20:37 -07001989 mov r1, sp
1990 vst1.8 {q0}, [sp,:128]
1991 mov r2, r10
1992 mov r4, r3 @ preserve fp
Adam Langleyd9e397b2015-01-22 14:27:53 -08001993
Adam Langleye9ada862015-05-11 17:20:37 -07001994 bl AES_encrypt
Adam Langleyd9e397b2015-01-22 14:27:53 -08001995
Adam Langleye9ada862015-05-11 17:20:37 -07001996 vld1.8 {q0}, [sp,:128]
1997 veor q0, q0, q8
1998 vst1.8 {q0}, [r8]!
1999 mov r3, r4
Adam Langleyd9e397b2015-01-22 14:27:53 -08002000
Adam Langleye9ada862015-05-11 17:20:37 -07002001 vmov q8, q9 @ next round tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08002002
2003.Lxts_enc_done:
2004#ifndef XTS_CHAIN_TWEAK
Adam Langleye9ada862015-05-11 17:20:37 -07002005 adds r9, #0x10
2006 beq .Lxts_enc_ret
2007 sub r6, r8, #0x10
Adam Langleyd9e397b2015-01-22 14:27:53 -08002008
2009.Lxts_enc_steal:
Adam Langleye9ada862015-05-11 17:20:37 -07002010 ldrb r0, [r7], #1
2011 ldrb r1, [r8, #-0x10]
2012 strb r0, [r8, #-0x10]
2013 strb r1, [r8], #1
Adam Langleyd9e397b2015-01-22 14:27:53 -08002014
Adam Langleye9ada862015-05-11 17:20:37 -07002015 subs r9, #1
2016 bhi .Lxts_enc_steal
Adam Langleyd9e397b2015-01-22 14:27:53 -08002017
Adam Langleye9ada862015-05-11 17:20:37 -07002018 vld1.8 {q0}, [r6]
2019 mov r0, sp
2020 veor q0, q0, q8
2021 mov r1, sp
2022 vst1.8 {q0}, [sp,:128]
2023 mov r2, r10
2024 mov r4, r3 @ preserve fp
Adam Langleyd9e397b2015-01-22 14:27:53 -08002025
Adam Langleye9ada862015-05-11 17:20:37 -07002026 bl AES_encrypt
Adam Langleyd9e397b2015-01-22 14:27:53 -08002027
Adam Langleye9ada862015-05-11 17:20:37 -07002028 vld1.8 {q0}, [sp,:128]
2029 veor q0, q0, q8
2030 vst1.8 {q0}, [r6]
2031 mov r3, r4
Adam Langleyd9e397b2015-01-22 14:27:53 -08002032#endif
2033
2034.Lxts_enc_ret:
Adam Langleye9ada862015-05-11 17:20:37 -07002035 bic r0, r3, #0xf
Adam Langleyd9e397b2015-01-22 14:27:53 -08002036 vmov.i32 q0, #0
2037 vmov.i32 q1, #0
2038#ifdef XTS_CHAIN_TWEAK
Adam Langleye9ada862015-05-11 17:20:37 -07002039 ldr r1, [r3, #0x20+VFP_ABI_FRAME] @ chain tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08002040#endif
Adam Langleye9ada862015-05-11 17:20:37 -07002041.Lxts_enc_bzero:@ wipe key schedule [if any]
2042 vstmia sp!, {q0,q1}
2043 cmp sp, r0
2044 bne .Lxts_enc_bzero
Adam Langleyd9e397b2015-01-22 14:27:53 -08002045
Adam Langleye9ada862015-05-11 17:20:37 -07002046 mov sp, r3
Adam Langleyd9e397b2015-01-22 14:27:53 -08002047#ifdef XTS_CHAIN_TWEAK
Adam Langleye9ada862015-05-11 17:20:37 -07002048 vst1.8 {q8}, [r1]
Adam Langleyd9e397b2015-01-22 14:27:53 -08002049#endif
2050 VFP_ABI_POP
Adam Langleye9ada862015-05-11 17:20:37 -07002051 ldmia sp!, {r4,r5,r6,r7,r8,r9,r10, pc} @ return
Adam Langleyd9e397b2015-01-22 14:27:53 -08002052
2053.size bsaes_xts_encrypt,.-bsaes_xts_encrypt
2054
2055.globl bsaes_xts_decrypt
2056.hidden bsaes_xts_decrypt
2057.type bsaes_xts_decrypt,%function
2058.align 4
2059bsaes_xts_decrypt:
2060 mov ip, sp
Adam Langleye9ada862015-05-11 17:20:37 -07002061 stmdb sp!, {r4,r5,r6,r7,r8,r9,r10, lr} @ 0x20
Adam Langleyd9e397b2015-01-22 14:27:53 -08002062 VFP_ABI_PUSH
2063 mov r6, sp @ future r3
2064
2065 mov r7, r0
2066 mov r8, r1
2067 mov r9, r2
2068 mov r10, r3
2069
2070 sub r0, sp, #0x10 @ 0x10
2071 bic r0, #0xf @ align at 16 bytes
2072 mov sp, r0
2073
2074#ifdef XTS_CHAIN_TWEAK
2075 ldr r0, [ip] @ pointer to input tweak
2076#else
2077 @ generate initial tweak
2078 ldr r0, [ip, #4] @ iv[]
2079 mov r1, sp
2080 ldr r2, [ip, #0] @ key2
2081 bl AES_encrypt
2082 mov r0, sp @ pointer to initial tweak
2083#endif
2084
2085 ldr r1, [r10, #240] @ get # of rounds
2086 mov r3, r6
2087#ifndef BSAES_ASM_EXTENDED_KEY
2088 @ allocate the key schedule on the stack
2089 sub r12, sp, r1, lsl#7 @ 128 bytes per inner round key
2090 @ add r12, #96 @ size of bit-sliced key schedule
2091 sub r12, #48 @ place for tweak[9]
2092
2093 @ populate the key schedule
2094 mov r4, r10 @ pass key
2095 mov r5, r1 @ pass # of rounds
2096 mov sp, r12
2097 add r12, #0x90 @ pass key schedule
2098 bl _bsaes_key_convert
2099 add r4, sp, #0x90
2100 vldmia r4, {q6}
2101 vstmia r12, {q15} @ save last round key
2102 veor q7, q7, q6 @ fix up round 0 key
2103 vstmia r4, {q7}
2104#else
2105 ldr r12, [r10, #244]
2106 eors r12, #1
2107 beq 0f
2108
2109 str r12, [r10, #244]
2110 mov r4, r10 @ pass key
2111 mov r5, r1 @ pass # of rounds
2112 add r12, r10, #248 @ pass key schedule
2113 bl _bsaes_key_convert
2114 add r4, r10, #248
2115 vldmia r4, {q6}
2116 vstmia r12, {q15} @ save last round key
2117 veor q7, q7, q6 @ fix up round 0 key
2118 vstmia r4, {q7}
2119
2120.align 2
Adam Langleye9ada862015-05-11 17:20:37 -07002121 sub sp, #0x90 @ place for tweak[9]
Adam Langleyd9e397b2015-01-22 14:27:53 -08002122#endif
2123 vld1.8 {q8}, [r0] @ initial tweak
2124 adr r2, .Lxts_magic
2125
Adam Langleye9ada862015-05-11 17:20:37 -07002126#ifndef XTS_CHAIN_TWEAK
Adam Langleyd9e397b2015-01-22 14:27:53 -08002127 tst r9, #0xf @ if not multiple of 16
2128 it ne @ Thumb2 thing, sanity check in ARM
2129 subne r9, #0x10 @ subtract another 16 bytes
Adam Langleye9ada862015-05-11 17:20:37 -07002130#endif
Adam Langleyd9e397b2015-01-22 14:27:53 -08002131 subs r9, #0x80
2132
2133 blo .Lxts_dec_short
2134 b .Lxts_dec_loop
2135
2136.align 4
2137.Lxts_dec_loop:
Adam Langleye9ada862015-05-11 17:20:37 -07002138 vldmia r2, {q5} @ load XTS magic
Adam Langleyd9e397b2015-01-22 14:27:53 -08002139 vshr.s64 q6, q8, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002140 mov r0, sp
2141 vand q6, q6, q5
Adam Langleyd9e397b2015-01-22 14:27:53 -08002142 vadd.u64 q9, q8, q8
Adam Langleye9ada862015-05-11 17:20:37 -07002143 vst1.64 {q8}, [r0,:128]!
2144 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08002145 vshr.s64 q7, q9, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002146 veor q9, q9, q6
2147 vand q7, q7, q5
Adam Langleyd9e397b2015-01-22 14:27:53 -08002148 vadd.u64 q10, q9, q9
Adam Langleye9ada862015-05-11 17:20:37 -07002149 vst1.64 {q9}, [r0,:128]!
2150 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08002151 vshr.s64 q6, q10, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002152 veor q10, q10, q7
2153 vand q6, q6, q5
2154 vld1.8 {q0}, [r7]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08002155 vadd.u64 q11, q10, q10
Adam Langleye9ada862015-05-11 17:20:37 -07002156 vst1.64 {q10}, [r0,:128]!
2157 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08002158 vshr.s64 q7, q11, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002159 veor q11, q11, q6
2160 vand q7, q7, q5
2161 vld1.8 {q1}, [r7]!
2162 veor q0, q0, q8
Adam Langleyd9e397b2015-01-22 14:27:53 -08002163 vadd.u64 q12, q11, q11
Adam Langleye9ada862015-05-11 17:20:37 -07002164 vst1.64 {q11}, [r0,:128]!
2165 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08002166 vshr.s64 q6, q12, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002167 veor q12, q12, q7
2168 vand q6, q6, q5
2169 vld1.8 {q2}, [r7]!
2170 veor q1, q1, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -08002171 vadd.u64 q13, q12, q12
Adam Langleye9ada862015-05-11 17:20:37 -07002172 vst1.64 {q12}, [r0,:128]!
2173 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08002174 vshr.s64 q7, q13, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002175 veor q13, q13, q6
2176 vand q7, q7, q5
2177 vld1.8 {q3}, [r7]!
2178 veor q2, q2, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -08002179 vadd.u64 q14, q13, q13
Adam Langleye9ada862015-05-11 17:20:37 -07002180 vst1.64 {q13}, [r0,:128]!
2181 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08002182 vshr.s64 q6, q14, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002183 veor q14, q14, q7
2184 vand q6, q6, q5
2185 vld1.8 {q4}, [r7]!
2186 veor q3, q3, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -08002187 vadd.u64 q15, q14, q14
Adam Langleye9ada862015-05-11 17:20:37 -07002188 vst1.64 {q14}, [r0,:128]!
2189 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08002190 vshr.s64 q7, q15, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002191 veor q15, q15, q6
2192 vand q7, q7, q5
2193 vld1.8 {q5}, [r7]!
2194 veor q4, q4, q12
Adam Langleyd9e397b2015-01-22 14:27:53 -08002195 vadd.u64 q8, q15, q15
Adam Langleye9ada862015-05-11 17:20:37 -07002196 vst1.64 {q15}, [r0,:128]!
2197 vswp d15,d14
2198 veor q8, q8, q7
2199 vst1.64 {q8}, [r0,:128] @ next round tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08002200
Adam Langleye9ada862015-05-11 17:20:37 -07002201 vld1.8 {q6,q7}, [r7]!
2202 veor q5, q5, q13
Adam Langleyd9e397b2015-01-22 14:27:53 -08002203#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07002204 add r4, sp, #0x90 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002205#else
Adam Langleye9ada862015-05-11 17:20:37 -07002206 add r4, r10, #248 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002207#endif
Adam Langleye9ada862015-05-11 17:20:37 -07002208 veor q6, q6, q14
2209 mov r5, r1 @ pass rounds
2210 veor q7, q7, q15
2211 mov r0, sp
Adam Langleyd9e397b2015-01-22 14:27:53 -08002212
Adam Langleye9ada862015-05-11 17:20:37 -07002213 bl _bsaes_decrypt8
Adam Langleyd9e397b2015-01-22 14:27:53 -08002214
Adam Langleye9ada862015-05-11 17:20:37 -07002215 vld1.64 {q8,q9}, [r0,:128]!
2216 vld1.64 {q10,q11}, [r0,:128]!
2217 veor q0, q0, q8
2218 vld1.64 {q12,q13}, [r0,:128]!
2219 veor q1, q1, q9
2220 veor q8, q6, q10
2221 vst1.8 {q0,q1}, [r8]!
2222 veor q9, q4, q11
2223 vld1.64 {q14,q15}, [r0,:128]!
2224 veor q10, q2, q12
2225 vst1.8 {q8,q9}, [r8]!
2226 veor q11, q7, q13
2227 veor q12, q3, q14
2228 vst1.8 {q10,q11}, [r8]!
2229 veor q13, q5, q15
2230 vst1.8 {q12,q13}, [r8]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08002231
Adam Langleye9ada862015-05-11 17:20:37 -07002232 vld1.64 {q8}, [r0,:128] @ next round tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08002233
Adam Langleye9ada862015-05-11 17:20:37 -07002234 subs r9, #0x80
2235 bpl .Lxts_dec_loop
Adam Langleyd9e397b2015-01-22 14:27:53 -08002236
2237.Lxts_dec_short:
Adam Langleye9ada862015-05-11 17:20:37 -07002238 adds r9, #0x70
2239 bmi .Lxts_dec_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08002240
Adam Langleye9ada862015-05-11 17:20:37 -07002241 vldmia r2, {q5} @ load XTS magic
Adam Langleyd9e397b2015-01-22 14:27:53 -08002242 vshr.s64 q7, q8, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002243 mov r0, sp
2244 vand q7, q7, q5
Adam Langleyd9e397b2015-01-22 14:27:53 -08002245 vadd.u64 q9, q8, q8
Adam Langleye9ada862015-05-11 17:20:37 -07002246 vst1.64 {q8}, [r0,:128]!
2247 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08002248 vshr.s64 q6, q9, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002249 veor q9, q9, q7
2250 vand q6, q6, q5
Adam Langleyd9e397b2015-01-22 14:27:53 -08002251 vadd.u64 q10, q9, q9
Adam Langleye9ada862015-05-11 17:20:37 -07002252 vst1.64 {q9}, [r0,:128]!
2253 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08002254 vshr.s64 q7, q10, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002255 veor q10, q10, q6
2256 vand q7, q7, q5
2257 vld1.8 {q0}, [r7]!
2258 subs r9, #0x10
2259 bmi .Lxts_dec_1
Adam Langleyd9e397b2015-01-22 14:27:53 -08002260 vadd.u64 q11, q10, q10
Adam Langleye9ada862015-05-11 17:20:37 -07002261 vst1.64 {q10}, [r0,:128]!
2262 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08002263 vshr.s64 q6, q11, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002264 veor q11, q11, q7
2265 vand q6, q6, q5
2266 vld1.8 {q1}, [r7]!
2267 subs r9, #0x10
2268 bmi .Lxts_dec_2
2269 veor q0, q0, q8
Adam Langleyd9e397b2015-01-22 14:27:53 -08002270 vadd.u64 q12, q11, q11
Adam Langleye9ada862015-05-11 17:20:37 -07002271 vst1.64 {q11}, [r0,:128]!
2272 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08002273 vshr.s64 q7, q12, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002274 veor q12, q12, q6
2275 vand q7, q7, q5
2276 vld1.8 {q2}, [r7]!
2277 subs r9, #0x10
2278 bmi .Lxts_dec_3
2279 veor q1, q1, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -08002280 vadd.u64 q13, q12, q12
Adam Langleye9ada862015-05-11 17:20:37 -07002281 vst1.64 {q12}, [r0,:128]!
2282 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08002283 vshr.s64 q6, q13, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002284 veor q13, q13, q7
2285 vand q6, q6, q5
2286 vld1.8 {q3}, [r7]!
2287 subs r9, #0x10
2288 bmi .Lxts_dec_4
2289 veor q2, q2, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -08002290 vadd.u64 q14, q13, q13
Adam Langleye9ada862015-05-11 17:20:37 -07002291 vst1.64 {q13}, [r0,:128]!
2292 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08002293 vshr.s64 q7, q14, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002294 veor q14, q14, q6
2295 vand q7, q7, q5
2296 vld1.8 {q4}, [r7]!
2297 subs r9, #0x10
2298 bmi .Lxts_dec_5
2299 veor q3, q3, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -08002300 vadd.u64 q15, q14, q14
Adam Langleye9ada862015-05-11 17:20:37 -07002301 vst1.64 {q14}, [r0,:128]!
2302 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08002303 vshr.s64 q6, q15, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002304 veor q15, q15, q7
2305 vand q6, q6, q5
2306 vld1.8 {q5}, [r7]!
2307 subs r9, #0x10
2308 bmi .Lxts_dec_6
2309 veor q4, q4, q12
2310 sub r9, #0x10
2311 vst1.64 {q15}, [r0,:128] @ next round tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08002312
Adam Langleye9ada862015-05-11 17:20:37 -07002313 vld1.8 {q6}, [r7]!
2314 veor q5, q5, q13
Adam Langleyd9e397b2015-01-22 14:27:53 -08002315#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07002316 add r4, sp, #0x90 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002317#else
Adam Langleye9ada862015-05-11 17:20:37 -07002318 add r4, r10, #248 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002319#endif
Adam Langleye9ada862015-05-11 17:20:37 -07002320 veor q6, q6, q14
2321 mov r5, r1 @ pass rounds
2322 mov r0, sp
Adam Langleyd9e397b2015-01-22 14:27:53 -08002323
Adam Langleye9ada862015-05-11 17:20:37 -07002324 bl _bsaes_decrypt8
Adam Langleyd9e397b2015-01-22 14:27:53 -08002325
Adam Langleye9ada862015-05-11 17:20:37 -07002326 vld1.64 {q8,q9}, [r0,:128]!
2327 vld1.64 {q10,q11}, [r0,:128]!
2328 veor q0, q0, q8
2329 vld1.64 {q12,q13}, [r0,:128]!
2330 veor q1, q1, q9
2331 veor q8, q6, q10
2332 vst1.8 {q0,q1}, [r8]!
2333 veor q9, q4, q11
2334 vld1.64 {q14}, [r0,:128]!
2335 veor q10, q2, q12
2336 vst1.8 {q8,q9}, [r8]!
2337 veor q11, q7, q13
2338 veor q12, q3, q14
2339 vst1.8 {q10,q11}, [r8]!
2340 vst1.8 {q12}, [r8]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08002341
Adam Langleye9ada862015-05-11 17:20:37 -07002342 vld1.64 {q8}, [r0,:128] @ next round tweak
2343 b .Lxts_dec_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08002344.align 4
2345.Lxts_dec_6:
Adam Langleye9ada862015-05-11 17:20:37 -07002346 vst1.64 {q14}, [r0,:128] @ next round tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08002347
Adam Langleye9ada862015-05-11 17:20:37 -07002348 veor q4, q4, q12
Adam Langleyd9e397b2015-01-22 14:27:53 -08002349#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07002350 add r4, sp, #0x90 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002351#else
Adam Langleye9ada862015-05-11 17:20:37 -07002352 add r4, r10, #248 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002353#endif
Adam Langleye9ada862015-05-11 17:20:37 -07002354 veor q5, q5, q13
2355 mov r5, r1 @ pass rounds
2356 mov r0, sp
Adam Langleyd9e397b2015-01-22 14:27:53 -08002357
Adam Langleye9ada862015-05-11 17:20:37 -07002358 bl _bsaes_decrypt8
Adam Langleyd9e397b2015-01-22 14:27:53 -08002359
Adam Langleye9ada862015-05-11 17:20:37 -07002360 vld1.64 {q8,q9}, [r0,:128]!
2361 vld1.64 {q10,q11}, [r0,:128]!
2362 veor q0, q0, q8
2363 vld1.64 {q12,q13}, [r0,:128]!
2364 veor q1, q1, q9
2365 veor q8, q6, q10
2366 vst1.8 {q0,q1}, [r8]!
2367 veor q9, q4, q11
2368 veor q10, q2, q12
2369 vst1.8 {q8,q9}, [r8]!
2370 veor q11, q7, q13
2371 vst1.8 {q10,q11}, [r8]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08002372
Adam Langleye9ada862015-05-11 17:20:37 -07002373 vld1.64 {q8}, [r0,:128] @ next round tweak
2374 b .Lxts_dec_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08002375.align 4
2376.Lxts_dec_5:
Adam Langleye9ada862015-05-11 17:20:37 -07002377 veor q3, q3, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -08002378#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07002379 add r4, sp, #0x90 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002380#else
Adam Langleye9ada862015-05-11 17:20:37 -07002381 add r4, r10, #248 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002382#endif
Adam Langleye9ada862015-05-11 17:20:37 -07002383 veor q4, q4, q12
2384 mov r5, r1 @ pass rounds
2385 mov r0, sp
Adam Langleyd9e397b2015-01-22 14:27:53 -08002386
Adam Langleye9ada862015-05-11 17:20:37 -07002387 bl _bsaes_decrypt8
Adam Langleyd9e397b2015-01-22 14:27:53 -08002388
Adam Langleye9ada862015-05-11 17:20:37 -07002389 vld1.64 {q8,q9}, [r0,:128]!
2390 vld1.64 {q10,q11}, [r0,:128]!
2391 veor q0, q0, q8
2392 vld1.64 {q12}, [r0,:128]!
2393 veor q1, q1, q9
2394 veor q8, q6, q10
2395 vst1.8 {q0,q1}, [r8]!
2396 veor q9, q4, q11
2397 veor q10, q2, q12
2398 vst1.8 {q8,q9}, [r8]!
2399 vst1.8 {q10}, [r8]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08002400
Adam Langleye9ada862015-05-11 17:20:37 -07002401 vld1.64 {q8}, [r0,:128] @ next round tweak
2402 b .Lxts_dec_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08002403.align 4
2404.Lxts_dec_4:
Adam Langleye9ada862015-05-11 17:20:37 -07002405 veor q2, q2, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -08002406#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07002407 add r4, sp, #0x90 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002408#else
Adam Langleye9ada862015-05-11 17:20:37 -07002409 add r4, r10, #248 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002410#endif
Adam Langleye9ada862015-05-11 17:20:37 -07002411 veor q3, q3, q11
2412 mov r5, r1 @ pass rounds
2413 mov r0, sp
Adam Langleyd9e397b2015-01-22 14:27:53 -08002414
Adam Langleye9ada862015-05-11 17:20:37 -07002415 bl _bsaes_decrypt8
Adam Langleyd9e397b2015-01-22 14:27:53 -08002416
Adam Langleye9ada862015-05-11 17:20:37 -07002417 vld1.64 {q8,q9}, [r0,:128]!
2418 vld1.64 {q10,q11}, [r0,:128]!
2419 veor q0, q0, q8
2420 veor q1, q1, q9
2421 veor q8, q6, q10
2422 vst1.8 {q0,q1}, [r8]!
2423 veor q9, q4, q11
2424 vst1.8 {q8,q9}, [r8]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08002425
Adam Langleye9ada862015-05-11 17:20:37 -07002426 vld1.64 {q8}, [r0,:128] @ next round tweak
2427 b .Lxts_dec_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08002428.align 4
2429.Lxts_dec_3:
Adam Langleye9ada862015-05-11 17:20:37 -07002430 veor q1, q1, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -08002431#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07002432 add r4, sp, #0x90 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002433#else
Adam Langleye9ada862015-05-11 17:20:37 -07002434 add r4, r10, #248 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002435#endif
Adam Langleye9ada862015-05-11 17:20:37 -07002436 veor q2, q2, q10
2437 mov r5, r1 @ pass rounds
2438 mov r0, sp
Adam Langleyd9e397b2015-01-22 14:27:53 -08002439
Adam Langleye9ada862015-05-11 17:20:37 -07002440 bl _bsaes_decrypt8
Adam Langleyd9e397b2015-01-22 14:27:53 -08002441
Adam Langleye9ada862015-05-11 17:20:37 -07002442 vld1.64 {q8,q9}, [r0,:128]!
2443 vld1.64 {q10}, [r0,:128]!
2444 veor q0, q0, q8
2445 veor q1, q1, q9
2446 veor q8, q6, q10
2447 vst1.8 {q0,q1}, [r8]!
2448 vst1.8 {q8}, [r8]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08002449
Adam Langleye9ada862015-05-11 17:20:37 -07002450 vld1.64 {q8}, [r0,:128] @ next round tweak
2451 b .Lxts_dec_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08002452.align 4
2453.Lxts_dec_2:
Adam Langleye9ada862015-05-11 17:20:37 -07002454 veor q0, q0, q8
Adam Langleyd9e397b2015-01-22 14:27:53 -08002455#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07002456 add r4, sp, #0x90 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002457#else
Adam Langleye9ada862015-05-11 17:20:37 -07002458 add r4, r10, #248 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002459#endif
Adam Langleye9ada862015-05-11 17:20:37 -07002460 veor q1, q1, q9
2461 mov r5, r1 @ pass rounds
2462 mov r0, sp
Adam Langleyd9e397b2015-01-22 14:27:53 -08002463
Adam Langleye9ada862015-05-11 17:20:37 -07002464 bl _bsaes_decrypt8
Adam Langleyd9e397b2015-01-22 14:27:53 -08002465
Adam Langleye9ada862015-05-11 17:20:37 -07002466 vld1.64 {q8,q9}, [r0,:128]!
2467 veor q0, q0, q8
2468 veor q1, q1, q9
2469 vst1.8 {q0,q1}, [r8]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08002470
Adam Langleye9ada862015-05-11 17:20:37 -07002471 vld1.64 {q8}, [r0,:128] @ next round tweak
2472 b .Lxts_dec_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08002473.align 4
2474.Lxts_dec_1:
Adam Langleye9ada862015-05-11 17:20:37 -07002475 mov r0, sp
David Benjaminc895d6b2016-08-11 13:26:41 -04002476 veor q0, q0, q8
Adam Langleye9ada862015-05-11 17:20:37 -07002477 mov r1, sp
2478 vst1.8 {q0}, [sp,:128]
David Benjaminc895d6b2016-08-11 13:26:41 -04002479 mov r5, r2 @ preserve magic
Adam Langleye9ada862015-05-11 17:20:37 -07002480 mov r2, r10
2481 mov r4, r3 @ preserve fp
Adam Langleyd9e397b2015-01-22 14:27:53 -08002482
Adam Langleye9ada862015-05-11 17:20:37 -07002483 bl AES_decrypt
Adam Langleyd9e397b2015-01-22 14:27:53 -08002484
Adam Langleye9ada862015-05-11 17:20:37 -07002485 vld1.8 {q0}, [sp,:128]
2486 veor q0, q0, q8
2487 vst1.8 {q0}, [r8]!
2488 mov r3, r4
2489 mov r2, r5
Adam Langleyd9e397b2015-01-22 14:27:53 -08002490
Adam Langleye9ada862015-05-11 17:20:37 -07002491 vmov q8, q9 @ next round tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08002492
2493.Lxts_dec_done:
2494#ifndef XTS_CHAIN_TWEAK
Adam Langleye9ada862015-05-11 17:20:37 -07002495 adds r9, #0x10
2496 beq .Lxts_dec_ret
Adam Langleyd9e397b2015-01-22 14:27:53 -08002497
2498 @ calculate one round of extra tweak for the stolen ciphertext
Adam Langleye9ada862015-05-11 17:20:37 -07002499 vldmia r2, {q5}
Adam Langleyd9e397b2015-01-22 14:27:53 -08002500 vshr.s64 q6, q8, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002501 vand q6, q6, q5
Adam Langleyd9e397b2015-01-22 14:27:53 -08002502 vadd.u64 q9, q8, q8
Adam Langleye9ada862015-05-11 17:20:37 -07002503 vswp d13,d12
2504 veor q9, q9, q6
Adam Langleyd9e397b2015-01-22 14:27:53 -08002505
2506 @ perform the final decryption with the last tweak value
Adam Langleye9ada862015-05-11 17:20:37 -07002507 vld1.8 {q0}, [r7]!
2508 mov r0, sp
2509 veor q0, q0, q9
2510 mov r1, sp
2511 vst1.8 {q0}, [sp,:128]
2512 mov r2, r10
2513 mov r4, r3 @ preserve fp
Adam Langleyd9e397b2015-01-22 14:27:53 -08002514
Adam Langleye9ada862015-05-11 17:20:37 -07002515 bl AES_decrypt
Adam Langleyd9e397b2015-01-22 14:27:53 -08002516
Adam Langleye9ada862015-05-11 17:20:37 -07002517 vld1.8 {q0}, [sp,:128]
2518 veor q0, q0, q9
2519 vst1.8 {q0}, [r8]
Adam Langleyd9e397b2015-01-22 14:27:53 -08002520
Adam Langleye9ada862015-05-11 17:20:37 -07002521 mov r6, r8
Adam Langleyd9e397b2015-01-22 14:27:53 -08002522.Lxts_dec_steal:
Adam Langleye9ada862015-05-11 17:20:37 -07002523 ldrb r1, [r8]
2524 ldrb r0, [r7], #1
2525 strb r1, [r8, #0x10]
2526 strb r0, [r8], #1
Adam Langleyd9e397b2015-01-22 14:27:53 -08002527
Adam Langleye9ada862015-05-11 17:20:37 -07002528 subs r9, #1
2529 bhi .Lxts_dec_steal
Adam Langleyd9e397b2015-01-22 14:27:53 -08002530
Adam Langleye9ada862015-05-11 17:20:37 -07002531 vld1.8 {q0}, [r6]
2532 mov r0, sp
2533 veor q0, q8
2534 mov r1, sp
2535 vst1.8 {q0}, [sp,:128]
2536 mov r2, r10
Adam Langleyd9e397b2015-01-22 14:27:53 -08002537
Adam Langleye9ada862015-05-11 17:20:37 -07002538 bl AES_decrypt
Adam Langleyd9e397b2015-01-22 14:27:53 -08002539
Adam Langleye9ada862015-05-11 17:20:37 -07002540 vld1.8 {q0}, [sp,:128]
2541 veor q0, q0, q8
2542 vst1.8 {q0}, [r6]
2543 mov r3, r4
Adam Langleyd9e397b2015-01-22 14:27:53 -08002544#endif
2545
2546.Lxts_dec_ret:
Adam Langleye9ada862015-05-11 17:20:37 -07002547 bic r0, r3, #0xf
Adam Langleyd9e397b2015-01-22 14:27:53 -08002548 vmov.i32 q0, #0
2549 vmov.i32 q1, #0
2550#ifdef XTS_CHAIN_TWEAK
Adam Langleye9ada862015-05-11 17:20:37 -07002551 ldr r1, [r3, #0x20+VFP_ABI_FRAME] @ chain tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08002552#endif
Adam Langleye9ada862015-05-11 17:20:37 -07002553.Lxts_dec_bzero:@ wipe key schedule [if any]
2554 vstmia sp!, {q0,q1}
2555 cmp sp, r0
2556 bne .Lxts_dec_bzero
Adam Langleyd9e397b2015-01-22 14:27:53 -08002557
Adam Langleye9ada862015-05-11 17:20:37 -07002558 mov sp, r3
Adam Langleyd9e397b2015-01-22 14:27:53 -08002559#ifdef XTS_CHAIN_TWEAK
Adam Langleye9ada862015-05-11 17:20:37 -07002560 vst1.8 {q8}, [r1]
Adam Langleyd9e397b2015-01-22 14:27:53 -08002561#endif
2562 VFP_ABI_POP
Adam Langleye9ada862015-05-11 17:20:37 -07002563 ldmia sp!, {r4,r5,r6,r7,r8,r9,r10, pc} @ return
Adam Langleyd9e397b2015-01-22 14:27:53 -08002564
2565.size bsaes_xts_decrypt,.-bsaes_xts_decrypt
2566#endif
David Benjamin4969cc92016-04-22 15:02:23 -04002567#endif