blob: a0b1e8202d09c39e6034f7226836788df14627aa [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
Robert Sloanab8b8882018-03-26 11:39:51 -070017@ of Linaro. Permission to use under GPL terms is granted.
Adam Langleyd9e397b2015-01-22 14:27:53 -080018@ ====================================================================
19
20@ Bit-sliced AES for ARM NEON
21@
22@ February 2012.
23@
24@ This implementation is direct adaptation of bsaes-x86_64 module for
25@ ARM NEON. Except that this module is endian-neutral [in sense that
26@ it can be compiled for either endianness] by courtesy of vld1.8's
27@ neutrality. Initial version doesn't implement interface to OpenSSL,
28@ only low-level primitives and unsupported entry points, just enough
29@ to collect performance results, which for Cortex-A8 core are:
30@
31@ encrypt 19.5 cycles per byte processed with 128-bit key
32@ decrypt 22.1 cycles per byte processed with 128-bit key
33@ key conv. 440 cycles per 128-bit key/0.18 of 8x block
34@
35@ Snapdragon S4 encrypts byte in 17.6 cycles and decrypts in 19.7,
36@ which is [much] worse than anticipated (for further details see
37@ http://www.openssl.org/~appro/Snapdragon-S4.html).
38@
39@ Cortex-A15 manages in 14.2/16.1 cycles [when integer-only code
40@ manages in 20.0 cycles].
41@
42@ When comparing to x86_64 results keep in mind that NEON unit is
43@ [mostly] single-issue and thus can't [fully] benefit from
44@ instruction-level parallelism. And when comparing to aes-armv4
45@ results keep in mind key schedule conversion overhead (see
46@ bsaes-x86_64.pl for further details)...
47@
48@ <appro@openssl.org>
49
50@ April-August 2013
Robert Sloanab8b8882018-03-26 11:39:51 -070051@ Add CBC, CTR and XTS subroutines and adapt for kernel use; courtesy of Ard.
Adam Langleyd9e397b2015-01-22 14:27:53 -080052
Adam Langleyd9e397b2015-01-22 14:27:53 -080053#ifndef __KERNEL__
Kenny Rootb8494592015-09-25 02:29:14 +000054# include <openssl/arm_arch.h>
Adam Langleyd9e397b2015-01-22 14:27:53 -080055
56# define VFP_ABI_PUSH vstmdb sp!,{d8-d15}
57# define VFP_ABI_POP vldmia sp!,{d8-d15}
58# define VFP_ABI_FRAME 0x40
59#else
60# define VFP_ABI_PUSH
61# define VFP_ABI_POP
62# define VFP_ABI_FRAME 0
63# define BSAES_ASM_EXTENDED_KEY
64# define XTS_CHAIN_TWEAK
65# define __ARM_ARCH__ __LINUX_ARM_ARCH__
Adam Langleye9ada862015-05-11 17:20:37 -070066# define __ARM_MAX_ARCH__ 7
Adam Langleyd9e397b2015-01-22 14:27:53 -080067#endif
68
69#ifdef __thumb__
70# define adrl adr
71#endif
72
Adam Langleye9ada862015-05-11 17:20:37 -070073#if __ARM_MAX_ARCH__>=7
74.arch armv7-a
75.fpu neon
76
Adam Langleyd9e397b2015-01-22 14:27:53 -080077.text
78.syntax unified @ ARMv7-capable assembler is expected to handle this
Adam Langleye9ada862015-05-11 17:20:37 -070079#if defined(__thumb2__) && !defined(__APPLE__)
Adam Langleyd9e397b2015-01-22 14:27:53 -080080.thumb
81#else
Adam Langleye9ada862015-05-11 17:20:37 -070082.code 32
Robert Sloan6f79a502017-04-03 09:16:40 -070083# undef __thumb2__
Adam Langleyd9e397b2015-01-22 14:27:53 -080084#endif
85
Adam Langleyd9e397b2015-01-22 14:27:53 -080086.type _bsaes_decrypt8,%function
87.align 4
88_bsaes_decrypt8:
Robert Sloand5c22152017-11-13 09:22:12 -080089 adr r6,.
Adam Langleyd9e397b2015-01-22 14:27:53 -080090 vldmia r4!, {q9} @ round 0 key
Robert Sloanab8b8882018-03-26 11:39:51 -070091#if defined(__thumb2__) || defined(__APPLE__)
Adam Langleye9ada862015-05-11 17:20:37 -070092 adr r6,.LM0ISR
93#else
Adam Langleyd9e397b2015-01-22 14:27:53 -080094 add r6,r6,#.LM0ISR-_bsaes_decrypt8
Adam Langleye9ada862015-05-11 17:20:37 -070095#endif
Adam Langleyd9e397b2015-01-22 14:27:53 -080096
97 vldmia r6!, {q8} @ .LM0ISR
98 veor q10, q0, q9 @ xor with round0 key
99 veor q11, q1, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700100 vtbl.8 d0, {q10}, d16
101 vtbl.8 d1, {q10}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -0800102 veor q12, q2, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700103 vtbl.8 d2, {q11}, d16
104 vtbl.8 d3, {q11}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -0800105 veor q13, q3, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700106 vtbl.8 d4, {q12}, d16
107 vtbl.8 d5, {q12}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -0800108 veor q14, q4, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700109 vtbl.8 d6, {q13}, d16
110 vtbl.8 d7, {q13}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -0800111 veor q15, q5, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700112 vtbl.8 d8, {q14}, d16
113 vtbl.8 d9, {q14}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -0800114 veor q10, q6, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700115 vtbl.8 d10, {q15}, d16
116 vtbl.8 d11, {q15}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -0800117 veor q11, q7, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700118 vtbl.8 d12, {q10}, d16
119 vtbl.8 d13, {q10}, d17
120 vtbl.8 d14, {q11}, d16
121 vtbl.8 d15, {q11}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -0800122 vmov.i8 q8,#0x55 @ compose .LBS0
123 vmov.i8 q9,#0x33 @ compose .LBS1
124 vshr.u64 q10, q6, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700125 vshr.u64 q11, q4, #1
126 veor q10, q10, q7
127 veor q11, q11, q5
128 vand q10, q10, q8
129 vand q11, q11, q8
130 veor q7, q7, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800131 vshl.u64 q10, q10, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700132 veor q5, q5, q11
133 vshl.u64 q11, q11, #1
134 veor q6, q6, q10
135 veor q4, q4, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800136 vshr.u64 q10, q2, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700137 vshr.u64 q11, q0, #1
138 veor q10, q10, q3
139 veor q11, q11, q1
140 vand q10, q10, q8
141 vand q11, q11, q8
142 veor q3, q3, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800143 vshl.u64 q10, q10, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700144 veor q1, q1, q11
145 vshl.u64 q11, q11, #1
146 veor q2, q2, q10
147 veor q0, q0, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800148 vmov.i8 q8,#0x0f @ compose .LBS2
149 vshr.u64 q10, q5, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700150 vshr.u64 q11, q4, #2
151 veor q10, q10, q7
152 veor q11, q11, q6
153 vand q10, q10, q9
154 vand q11, q11, q9
155 veor q7, q7, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800156 vshl.u64 q10, q10, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700157 veor q6, q6, q11
158 vshl.u64 q11, q11, #2
159 veor q5, q5, q10
160 veor q4, q4, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800161 vshr.u64 q10, q1, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700162 vshr.u64 q11, q0, #2
163 veor q10, q10, q3
164 veor q11, q11, q2
165 vand q10, q10, q9
166 vand q11, q11, q9
167 veor q3, q3, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800168 vshl.u64 q10, q10, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700169 veor q2, q2, q11
170 vshl.u64 q11, q11, #2
171 veor q1, q1, q10
172 veor q0, q0, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800173 vshr.u64 q10, q3, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700174 vshr.u64 q11, q2, #4
175 veor q10, q10, q7
176 veor q11, q11, q6
177 vand q10, q10, q8
178 vand q11, q11, q8
179 veor q7, q7, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800180 vshl.u64 q10, q10, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700181 veor q6, q6, q11
182 vshl.u64 q11, q11, #4
183 veor q3, q3, q10
184 veor q2, q2, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800185 vshr.u64 q10, q1, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700186 vshr.u64 q11, q0, #4
187 veor q10, q10, q5
188 veor q11, q11, q4
189 vand q10, q10, q8
190 vand q11, q11, q8
191 veor q5, q5, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800192 vshl.u64 q10, q10, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700193 veor q4, q4, q11
194 vshl.u64 q11, q11, #4
195 veor q1, q1, q10
196 veor q0, q0, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800197 sub r5,r5,#1
198 b .Ldec_sbox
199.align 4
200.Ldec_loop:
Adam Langleye9ada862015-05-11 17:20:37 -0700201 vldmia r4!, {q8,q9,q10,q11}
Adam Langleyd9e397b2015-01-22 14:27:53 -0800202 veor q8, q8, q0
203 veor q9, q9, q1
204 vtbl.8 d0, {q8}, d24
205 vtbl.8 d1, {q8}, d25
206 vldmia r4!, {q8}
207 veor q10, q10, q2
208 vtbl.8 d2, {q9}, d24
209 vtbl.8 d3, {q9}, d25
210 vldmia r4!, {q9}
211 veor q11, q11, q3
212 vtbl.8 d4, {q10}, d24
213 vtbl.8 d5, {q10}, d25
214 vldmia r4!, {q10}
215 vtbl.8 d6, {q11}, d24
216 vtbl.8 d7, {q11}, d25
217 vldmia r4!, {q11}
218 veor q8, q8, q4
219 veor q9, q9, q5
220 vtbl.8 d8, {q8}, d24
221 vtbl.8 d9, {q8}, d25
222 veor q10, q10, q6
223 vtbl.8 d10, {q9}, d24
224 vtbl.8 d11, {q9}, d25
225 veor q11, q11, q7
226 vtbl.8 d12, {q10}, d24
227 vtbl.8 d13, {q10}, d25
228 vtbl.8 d14, {q11}, d24
229 vtbl.8 d15, {q11}, d25
230.Ldec_sbox:
Adam Langleye9ada862015-05-11 17:20:37 -0700231 veor q1, q1, q4
Adam Langleyd9e397b2015-01-22 14:27:53 -0800232 veor q3, q3, q4
233
234 veor q4, q4, q7
Adam Langleye9ada862015-05-11 17:20:37 -0700235 veor q1, q1, q6
Adam Langleyd9e397b2015-01-22 14:27:53 -0800236 veor q2, q2, q7
237 veor q6, q6, q4
238
239 veor q0, q0, q1
240 veor q2, q2, q5
Adam Langleye9ada862015-05-11 17:20:37 -0700241 veor q7, q7, q6
Adam Langleyd9e397b2015-01-22 14:27:53 -0800242 veor q3, q3, q0
243 veor q5, q5, q0
244 veor q1, q1, q3
245 veor q11, q3, q0
246 veor q10, q7, q4
247 veor q9, q1, q6
248 veor q13, q4, q0
Adam Langleye9ada862015-05-11 17:20:37 -0700249 vmov q8, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800250 veor q12, q5, q2
251
252 vorr q10, q10, q9
253 veor q15, q11, q8
254 vand q14, q11, q12
255 vorr q11, q11, q12
256 veor q12, q12, q9
257 vand q8, q8, q9
258 veor q9, q6, q2
259 vand q15, q15, q12
260 vand q13, q13, q9
261 veor q9, q3, q7
262 veor q12, q1, q5
263 veor q11, q11, q13
264 veor q10, q10, q13
265 vand q13, q9, q12
266 vorr q9, q9, q12
267 veor q11, q11, q15
268 veor q8, q8, q13
269 veor q10, q10, q14
270 veor q9, q9, q15
271 veor q8, q8, q14
272 vand q12, q4, q6
273 veor q9, q9, q14
274 vand q13, q0, q2
275 vand q14, q7, q1
276 vorr q15, q3, q5
277 veor q11, q11, q12
278 veor q9, q9, q14
279 veor q8, q8, q15
280 veor q10, q10, q13
281
282 @ Inv_GF16 0, 1, 2, 3, s0, s1, s2, s3
283
284 @ new smaller inversion
285
286 vand q14, q11, q9
287 vmov q12, q8
288
289 veor q13, q10, q14
290 veor q15, q8, q14
291 veor q14, q8, q14 @ q14=q15
292
293 vbsl q13, q9, q8
294 vbsl q15, q11, q10
295 veor q11, q11, q10
296
297 vbsl q12, q13, q14
298 vbsl q8, q14, q13
299
300 vand q14, q12, q15
301 veor q9, q9, q8
302
303 veor q14, q14, q11
304 veor q12, q5, q2
305 veor q8, q1, q6
Adam Langleye9ada862015-05-11 17:20:37 -0700306 veor q10, q15, q14
Adam Langleyd9e397b2015-01-22 14:27:53 -0800307 vand q10, q10, q5
308 veor q5, q5, q1
309 vand q11, q1, q15
310 vand q5, q5, q14
311 veor q1, q11, q10
312 veor q5, q5, q11
313 veor q15, q15, q13
314 veor q14, q14, q9
315 veor q11, q15, q14
Adam Langleye9ada862015-05-11 17:20:37 -0700316 veor q10, q13, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -0800317 vand q11, q11, q12
Adam Langleye9ada862015-05-11 17:20:37 -0700318 vand q10, q10, q2
Adam Langleyd9e397b2015-01-22 14:27:53 -0800319 veor q12, q12, q8
Adam Langleye9ada862015-05-11 17:20:37 -0700320 veor q2, q2, q6
Adam Langleyd9e397b2015-01-22 14:27:53 -0800321 vand q8, q8, q15
Adam Langleye9ada862015-05-11 17:20:37 -0700322 vand q6, q6, q13
Adam Langleyd9e397b2015-01-22 14:27:53 -0800323 vand q12, q12, q14
Adam Langleye9ada862015-05-11 17:20:37 -0700324 vand q2, q2, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -0800325 veor q8, q8, q12
Adam Langleye9ada862015-05-11 17:20:37 -0700326 veor q2, q2, q6
Adam Langleyd9e397b2015-01-22 14:27:53 -0800327 veor q12, q12, q11
Adam Langleye9ada862015-05-11 17:20:37 -0700328 veor q6, q6, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800329 veor q5, q5, q12
330 veor q2, q2, q12
331 veor q1, q1, q8
332 veor q6, q6, q8
333
334 veor q12, q3, q0
335 veor q8, q7, q4
336 veor q11, q15, q14
Adam Langleye9ada862015-05-11 17:20:37 -0700337 veor q10, q13, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -0800338 vand q11, q11, q12
Adam Langleye9ada862015-05-11 17:20:37 -0700339 vand q10, q10, q0
Adam Langleyd9e397b2015-01-22 14:27:53 -0800340 veor q12, q12, q8
Adam Langleye9ada862015-05-11 17:20:37 -0700341 veor q0, q0, q4
Adam Langleyd9e397b2015-01-22 14:27:53 -0800342 vand q8, q8, q15
Adam Langleye9ada862015-05-11 17:20:37 -0700343 vand q4, q4, q13
Adam Langleyd9e397b2015-01-22 14:27:53 -0800344 vand q12, q12, q14
Adam Langleye9ada862015-05-11 17:20:37 -0700345 vand q0, q0, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -0800346 veor q8, q8, q12
Adam Langleye9ada862015-05-11 17:20:37 -0700347 veor q0, q0, q4
Adam Langleyd9e397b2015-01-22 14:27:53 -0800348 veor q12, q12, q11
Adam Langleye9ada862015-05-11 17:20:37 -0700349 veor q4, q4, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800350 veor q15, q15, q13
351 veor q14, q14, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700352 veor q10, q15, q14
Adam Langleyd9e397b2015-01-22 14:27:53 -0800353 vand q10, q10, q3
354 veor q3, q3, q7
355 vand q11, q7, q15
356 vand q3, q3, q14
357 veor q7, q11, q10
358 veor q3, q3, q11
359 veor q3, q3, q12
360 veor q0, q0, q12
361 veor q7, q7, q8
362 veor q4, q4, q8
363 veor q1, q1, q7
364 veor q6, q6, q5
365
366 veor q4, q4, q1
367 veor q2, q2, q7
368 veor q5, q5, q7
369 veor q4, q4, q2
Adam Langleye9ada862015-05-11 17:20:37 -0700370 veor q7, q7, q0
Adam Langleyd9e397b2015-01-22 14:27:53 -0800371 veor q4, q4, q5
Adam Langleye9ada862015-05-11 17:20:37 -0700372 veor q3, q3, q6
373 veor q6, q6, q1
Adam Langleyd9e397b2015-01-22 14:27:53 -0800374 veor q3, q3, q4
375
376 veor q4, q4, q0
377 veor q7, q7, q3
378 subs r5,r5,#1
379 bcc .Ldec_done
380 @ multiplication by 0x05-0x00-0x04-0x00
381 vext.8 q8, q0, q0, #8
382 vext.8 q14, q3, q3, #8
383 vext.8 q15, q5, q5, #8
384 veor q8, q8, q0
385 vext.8 q9, q1, q1, #8
386 veor q14, q14, q3
387 vext.8 q10, q6, q6, #8
388 veor q15, q15, q5
389 vext.8 q11, q4, q4, #8
390 veor q9, q9, q1
391 vext.8 q12, q2, q2, #8
392 veor q10, q10, q6
393 vext.8 q13, q7, q7, #8
394 veor q11, q11, q4
395 veor q12, q12, q2
396 veor q13, q13, q7
397
Adam Langleye9ada862015-05-11 17:20:37 -0700398 veor q0, q0, q14
399 veor q1, q1, q14
400 veor q6, q6, q8
401 veor q2, q2, q10
402 veor q4, q4, q9
403 veor q1, q1, q15
404 veor q6, q6, q15
405 veor q2, q2, q14
406 veor q7, q7, q11
407 veor q4, q4, q14
408 veor q3, q3, q12
409 veor q2, q2, q15
410 veor q7, q7, q15
411 veor q5, q5, q13
Adam Langleyd9e397b2015-01-22 14:27:53 -0800412 vext.8 q8, q0, q0, #12 @ x0 <<< 32
413 vext.8 q9, q1, q1, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700414 veor q0, q0, q8 @ x0 ^ (x0 <<< 32)
Adam Langleyd9e397b2015-01-22 14:27:53 -0800415 vext.8 q10, q6, q6, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700416 veor q1, q1, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -0800417 vext.8 q11, q4, q4, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700418 veor q6, q6, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800419 vext.8 q12, q2, q2, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700420 veor q4, q4, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800421 vext.8 q13, q7, q7, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700422 veor q2, q2, q12
Adam Langleyd9e397b2015-01-22 14:27:53 -0800423 vext.8 q14, q3, q3, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700424 veor q7, q7, q13
Adam Langleyd9e397b2015-01-22 14:27:53 -0800425 vext.8 q15, q5, q5, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700426 veor q3, q3, q14
Adam Langleyd9e397b2015-01-22 14:27:53 -0800427
428 veor q9, q9, q0
Adam Langleye9ada862015-05-11 17:20:37 -0700429 veor q5, q5, q15
430 vext.8 q0, q0, q0, #8 @ (x0 ^ (x0 <<< 32)) <<< 64)
Adam Langleyd9e397b2015-01-22 14:27:53 -0800431 veor q10, q10, q1
432 veor q8, q8, q5
433 veor q9, q9, q5
Adam Langleye9ada862015-05-11 17:20:37 -0700434 vext.8 q1, q1, q1, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800435 veor q13, q13, q2
Adam Langleye9ada862015-05-11 17:20:37 -0700436 veor q0, q0, q8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800437 veor q14, q14, q7
Adam Langleye9ada862015-05-11 17:20:37 -0700438 veor q1, q1, q9
439 vext.8 q8, q2, q2, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800440 veor q12, q12, q4
Adam Langleye9ada862015-05-11 17:20:37 -0700441 vext.8 q9, q7, q7, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800442 veor q15, q15, q3
Adam Langleye9ada862015-05-11 17:20:37 -0700443 vext.8 q2, q4, q4, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800444 veor q11, q11, q6
Adam Langleye9ada862015-05-11 17:20:37 -0700445 vext.8 q7, q5, q5, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800446 veor q12, q12, q5
Adam Langleye9ada862015-05-11 17:20:37 -0700447 vext.8 q4, q3, q3, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800448 veor q11, q11, q5
Adam Langleye9ada862015-05-11 17:20:37 -0700449 vext.8 q3, q6, q6, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800450 veor q5, q9, q13
451 veor q11, q11, q2
452 veor q7, q7, q15
453 veor q6, q4, q14
454 veor q4, q8, q12
455 veor q2, q3, q10
456 vmov q3, q11
457 @ vmov q5, q9
458 vldmia r6, {q12} @ .LISR
459 ite eq @ Thumb2 thing, sanity check in ARM
460 addeq r6,r6,#0x10
461 bne .Ldec_loop
462 vldmia r6, {q12} @ .LISRM0
463 b .Ldec_loop
464.align 4
465.Ldec_done:
466 vmov.i8 q8,#0x55 @ compose .LBS0
467 vmov.i8 q9,#0x33 @ compose .LBS1
468 vshr.u64 q10, q3, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700469 vshr.u64 q11, q2, #1
470 veor q10, q10, q5
471 veor q11, q11, q7
472 vand q10, q10, q8
473 vand q11, q11, q8
474 veor q5, q5, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800475 vshl.u64 q10, q10, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700476 veor q7, q7, q11
477 vshl.u64 q11, q11, #1
478 veor q3, q3, q10
479 veor q2, q2, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800480 vshr.u64 q10, q6, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700481 vshr.u64 q11, q0, #1
482 veor q10, q10, q4
483 veor q11, q11, q1
484 vand q10, q10, q8
485 vand q11, q11, q8
486 veor q4, q4, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800487 vshl.u64 q10, q10, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700488 veor q1, q1, q11
489 vshl.u64 q11, q11, #1
490 veor q6, q6, q10
491 veor q0, q0, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800492 vmov.i8 q8,#0x0f @ compose .LBS2
493 vshr.u64 q10, q7, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700494 vshr.u64 q11, q2, #2
495 veor q10, q10, q5
496 veor q11, q11, q3
497 vand q10, q10, q9
498 vand q11, q11, q9
499 veor q5, q5, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800500 vshl.u64 q10, q10, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700501 veor q3, q3, q11
502 vshl.u64 q11, q11, #2
503 veor q7, q7, q10
504 veor q2, q2, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800505 vshr.u64 q10, q1, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700506 vshr.u64 q11, q0, #2
507 veor q10, q10, q4
508 veor q11, q11, q6
509 vand q10, q10, q9
510 vand q11, q11, q9
511 veor q4, q4, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800512 vshl.u64 q10, q10, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700513 veor q6, q6, q11
514 vshl.u64 q11, q11, #2
515 veor q1, q1, q10
516 veor q0, q0, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800517 vshr.u64 q10, q4, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700518 vshr.u64 q11, q6, #4
519 veor q10, q10, q5
520 veor q11, q11, q3
521 vand q10, q10, q8
522 vand q11, q11, q8
523 veor q5, q5, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800524 vshl.u64 q10, q10, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700525 veor q3, q3, q11
526 vshl.u64 q11, q11, #4
527 veor q4, q4, q10
528 veor q6, q6, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800529 vshr.u64 q10, q1, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700530 vshr.u64 q11, q0, #4
531 veor q10, q10, q7
532 veor q11, q11, q2
533 vand q10, q10, q8
534 vand q11, q11, q8
535 veor q7, q7, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800536 vshl.u64 q10, q10, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700537 veor q2, q2, q11
538 vshl.u64 q11, q11, #4
539 veor q1, q1, q10
540 veor q0, q0, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800541 vldmia r4, {q8} @ last round key
542 veor q6, q6, q8
543 veor q4, q4, q8
544 veor q2, q2, q8
545 veor q7, q7, q8
546 veor q3, q3, q8
547 veor q5, q5, q8
548 veor q0, q0, q8
549 veor q1, q1, q8
550 bx lr
551.size _bsaes_decrypt8,.-_bsaes_decrypt8
552
553.type _bsaes_const,%object
554.align 6
555_bsaes_const:
Adam Langleye9ada862015-05-11 17:20:37 -0700556.LM0ISR:@ InvShiftRows constants
557.quad 0x0a0e0206070b0f03, 0x0004080c0d010509
Adam Langleyd9e397b2015-01-22 14:27:53 -0800558.LISR:
Adam Langleye9ada862015-05-11 17:20:37 -0700559.quad 0x0504070602010003, 0x0f0e0d0c080b0a09
Adam Langleyd9e397b2015-01-22 14:27:53 -0800560.LISRM0:
Adam Langleye9ada862015-05-11 17:20:37 -0700561.quad 0x01040b0e0205080f, 0x0306090c00070a0d
562.LM0SR:@ ShiftRows constants
563.quad 0x0a0e02060f03070b, 0x0004080c05090d01
Adam Langleyd9e397b2015-01-22 14:27:53 -0800564.LSR:
Adam Langleye9ada862015-05-11 17:20:37 -0700565.quad 0x0504070600030201, 0x0f0e0d0c0a09080b
Adam Langleyd9e397b2015-01-22 14:27:53 -0800566.LSRM0:
Adam Langleye9ada862015-05-11 17:20:37 -0700567.quad 0x0304090e00050a0f, 0x01060b0c0207080d
Adam Langleyd9e397b2015-01-22 14:27:53 -0800568.LM0:
Adam Langleye9ada862015-05-11 17:20:37 -0700569.quad 0x02060a0e03070b0f, 0x0004080c0105090d
Adam Langleyd9e397b2015-01-22 14:27:53 -0800570.LREVM0SR:
Adam Langleye9ada862015-05-11 17:20:37 -0700571.quad 0x090d01050c000408, 0x03070b0f060a0e02
572.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
573.align 2
Adam Langleyd9e397b2015-01-22 14:27:53 -0800574.align 6
575.size _bsaes_const,.-_bsaes_const
576
577.type _bsaes_encrypt8,%function
578.align 4
579_bsaes_encrypt8:
Robert Sloand5c22152017-11-13 09:22:12 -0800580 adr r6,.
Adam Langleyd9e397b2015-01-22 14:27:53 -0800581 vldmia r4!, {q9} @ round 0 key
Robert Sloanab8b8882018-03-26 11:39:51 -0700582#if defined(__thumb2__) || defined(__APPLE__)
Adam Langleye9ada862015-05-11 17:20:37 -0700583 adr r6,.LM0SR
584#else
Adam Langleyd9e397b2015-01-22 14:27:53 -0800585 sub r6,r6,#_bsaes_encrypt8-.LM0SR
Adam Langleye9ada862015-05-11 17:20:37 -0700586#endif
Adam Langleyd9e397b2015-01-22 14:27:53 -0800587
588 vldmia r6!, {q8} @ .LM0SR
589_bsaes_encrypt8_alt:
590 veor q10, q0, q9 @ xor with round0 key
591 veor q11, q1, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700592 vtbl.8 d0, {q10}, d16
593 vtbl.8 d1, {q10}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -0800594 veor q12, q2, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700595 vtbl.8 d2, {q11}, d16
596 vtbl.8 d3, {q11}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -0800597 veor q13, q3, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700598 vtbl.8 d4, {q12}, d16
599 vtbl.8 d5, {q12}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -0800600 veor q14, q4, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700601 vtbl.8 d6, {q13}, d16
602 vtbl.8 d7, {q13}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -0800603 veor q15, q5, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700604 vtbl.8 d8, {q14}, d16
605 vtbl.8 d9, {q14}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -0800606 veor q10, q6, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700607 vtbl.8 d10, {q15}, d16
608 vtbl.8 d11, {q15}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -0800609 veor q11, q7, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700610 vtbl.8 d12, {q10}, d16
611 vtbl.8 d13, {q10}, d17
612 vtbl.8 d14, {q11}, d16
613 vtbl.8 d15, {q11}, d17
Adam Langleyd9e397b2015-01-22 14:27:53 -0800614_bsaes_encrypt8_bitslice:
615 vmov.i8 q8,#0x55 @ compose .LBS0
616 vmov.i8 q9,#0x33 @ compose .LBS1
617 vshr.u64 q10, q6, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700618 vshr.u64 q11, q4, #1
619 veor q10, q10, q7
620 veor q11, q11, q5
621 vand q10, q10, q8
622 vand q11, q11, q8
623 veor q7, q7, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800624 vshl.u64 q10, q10, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700625 veor q5, q5, q11
626 vshl.u64 q11, q11, #1
627 veor q6, q6, q10
628 veor q4, q4, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800629 vshr.u64 q10, q2, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700630 vshr.u64 q11, q0, #1
631 veor q10, q10, q3
632 veor q11, q11, q1
633 vand q10, q10, q8
634 vand q11, q11, q8
635 veor q3, q3, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800636 vshl.u64 q10, q10, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700637 veor q1, q1, q11
638 vshl.u64 q11, q11, #1
639 veor q2, q2, q10
640 veor q0, q0, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800641 vmov.i8 q8,#0x0f @ compose .LBS2
642 vshr.u64 q10, q5, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700643 vshr.u64 q11, q4, #2
644 veor q10, q10, q7
645 veor q11, q11, q6
646 vand q10, q10, q9
647 vand q11, q11, q9
648 veor q7, q7, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800649 vshl.u64 q10, q10, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700650 veor q6, q6, q11
651 vshl.u64 q11, q11, #2
652 veor q5, q5, q10
653 veor q4, q4, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800654 vshr.u64 q10, q1, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700655 vshr.u64 q11, q0, #2
656 veor q10, q10, q3
657 veor q11, q11, q2
658 vand q10, q10, q9
659 vand q11, q11, q9
660 veor q3, q3, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800661 vshl.u64 q10, q10, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700662 veor q2, q2, q11
663 vshl.u64 q11, q11, #2
664 veor q1, q1, q10
665 veor q0, q0, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800666 vshr.u64 q10, q3, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700667 vshr.u64 q11, q2, #4
668 veor q10, q10, q7
669 veor q11, q11, q6
670 vand q10, q10, q8
671 vand q11, q11, q8
672 veor q7, q7, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800673 vshl.u64 q10, q10, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700674 veor q6, q6, q11
675 vshl.u64 q11, q11, #4
676 veor q3, q3, q10
677 veor q2, q2, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800678 vshr.u64 q10, q1, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700679 vshr.u64 q11, q0, #4
680 veor q10, q10, q5
681 veor q11, q11, q4
682 vand q10, q10, q8
683 vand q11, q11, q8
684 veor q5, q5, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800685 vshl.u64 q10, q10, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700686 veor q4, q4, q11
687 vshl.u64 q11, q11, #4
688 veor q1, q1, q10
689 veor q0, q0, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800690 sub r5,r5,#1
691 b .Lenc_sbox
692.align 4
693.Lenc_loop:
Adam Langleye9ada862015-05-11 17:20:37 -0700694 vldmia r4!, {q8,q9,q10,q11}
Adam Langleyd9e397b2015-01-22 14:27:53 -0800695 veor q8, q8, q0
696 veor q9, q9, q1
697 vtbl.8 d0, {q8}, d24
698 vtbl.8 d1, {q8}, d25
699 vldmia r4!, {q8}
700 veor q10, q10, q2
701 vtbl.8 d2, {q9}, d24
702 vtbl.8 d3, {q9}, d25
703 vldmia r4!, {q9}
704 veor q11, q11, q3
705 vtbl.8 d4, {q10}, d24
706 vtbl.8 d5, {q10}, d25
707 vldmia r4!, {q10}
708 vtbl.8 d6, {q11}, d24
709 vtbl.8 d7, {q11}, d25
710 vldmia r4!, {q11}
711 veor q8, q8, q4
712 veor q9, q9, q5
713 vtbl.8 d8, {q8}, d24
714 vtbl.8 d9, {q8}, d25
715 veor q10, q10, q6
716 vtbl.8 d10, {q9}, d24
717 vtbl.8 d11, {q9}, d25
718 veor q11, q11, q7
719 vtbl.8 d12, {q10}, d24
720 vtbl.8 d13, {q10}, d25
721 vtbl.8 d14, {q11}, d24
722 vtbl.8 d15, {q11}, d25
723.Lenc_sbox:
724 veor q2, q2, q1
725 veor q5, q5, q6
726 veor q3, q3, q0
727 veor q6, q6, q2
728 veor q5, q5, q0
729
730 veor q6, q6, q3
731 veor q3, q3, q7
732 veor q7, q7, q5
733 veor q3, q3, q4
734 veor q4, q4, q5
735
736 veor q2, q2, q7
737 veor q3, q3, q1
738 veor q1, q1, q5
739 veor q11, q7, q4
740 veor q10, q1, q2
741 veor q9, q5, q3
742 veor q13, q2, q4
Adam Langleye9ada862015-05-11 17:20:37 -0700743 vmov q8, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800744 veor q12, q6, q0
745
746 vorr q10, q10, q9
747 veor q15, q11, q8
748 vand q14, q11, q12
749 vorr q11, q11, q12
750 veor q12, q12, q9
751 vand q8, q8, q9
752 veor q9, q3, q0
753 vand q15, q15, q12
754 vand q13, q13, q9
755 veor q9, q7, q1
756 veor q12, q5, q6
757 veor q11, q11, q13
758 veor q10, q10, q13
759 vand q13, q9, q12
760 vorr q9, q9, q12
761 veor q11, q11, q15
762 veor q8, q8, q13
763 veor q10, q10, q14
764 veor q9, q9, q15
765 veor q8, q8, q14
766 vand q12, q2, q3
767 veor q9, q9, q14
768 vand q13, q4, q0
769 vand q14, q1, q5
770 vorr q15, q7, q6
771 veor q11, q11, q12
772 veor q9, q9, q14
773 veor q8, q8, q15
774 veor q10, q10, q13
775
776 @ Inv_GF16 0, 1, 2, 3, s0, s1, s2, s3
777
778 @ new smaller inversion
779
780 vand q14, q11, q9
781 vmov q12, q8
782
783 veor q13, q10, q14
784 veor q15, q8, q14
785 veor q14, q8, q14 @ q14=q15
786
787 vbsl q13, q9, q8
788 vbsl q15, q11, q10
789 veor q11, q11, q10
790
791 vbsl q12, q13, q14
792 vbsl q8, q14, q13
793
794 vand q14, q12, q15
795 veor q9, q9, q8
796
797 veor q14, q14, q11
798 veor q12, q6, q0
799 veor q8, q5, q3
Adam Langleye9ada862015-05-11 17:20:37 -0700800 veor q10, q15, q14
Adam Langleyd9e397b2015-01-22 14:27:53 -0800801 vand q10, q10, q6
802 veor q6, q6, q5
803 vand q11, q5, q15
804 vand q6, q6, q14
805 veor q5, q11, q10
806 veor q6, q6, q11
807 veor q15, q15, q13
808 veor q14, q14, q9
809 veor q11, q15, q14
Adam Langleye9ada862015-05-11 17:20:37 -0700810 veor q10, q13, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -0800811 vand q11, q11, q12
Adam Langleye9ada862015-05-11 17:20:37 -0700812 vand q10, q10, q0
Adam Langleyd9e397b2015-01-22 14:27:53 -0800813 veor q12, q12, q8
Adam Langleye9ada862015-05-11 17:20:37 -0700814 veor q0, q0, q3
Adam Langleyd9e397b2015-01-22 14:27:53 -0800815 vand q8, q8, q15
Adam Langleye9ada862015-05-11 17:20:37 -0700816 vand q3, q3, q13
Adam Langleyd9e397b2015-01-22 14:27:53 -0800817 vand q12, q12, q14
Adam Langleye9ada862015-05-11 17:20:37 -0700818 vand q0, q0, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -0800819 veor q8, q8, q12
Adam Langleye9ada862015-05-11 17:20:37 -0700820 veor q0, q0, q3
Adam Langleyd9e397b2015-01-22 14:27:53 -0800821 veor q12, q12, q11
Adam Langleye9ada862015-05-11 17:20:37 -0700822 veor q3, q3, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800823 veor q6, q6, q12
824 veor q0, q0, q12
825 veor q5, q5, q8
826 veor q3, q3, q8
827
828 veor q12, q7, q4
829 veor q8, q1, q2
830 veor q11, q15, q14
Adam Langleye9ada862015-05-11 17:20:37 -0700831 veor q10, q13, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -0800832 vand q11, q11, q12
Adam Langleye9ada862015-05-11 17:20:37 -0700833 vand q10, q10, q4
Adam Langleyd9e397b2015-01-22 14:27:53 -0800834 veor q12, q12, q8
Adam Langleye9ada862015-05-11 17:20:37 -0700835 veor q4, q4, q2
Adam Langleyd9e397b2015-01-22 14:27:53 -0800836 vand q8, q8, q15
Adam Langleye9ada862015-05-11 17:20:37 -0700837 vand q2, q2, q13
Adam Langleyd9e397b2015-01-22 14:27:53 -0800838 vand q12, q12, q14
Adam Langleye9ada862015-05-11 17:20:37 -0700839 vand q4, q4, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -0800840 veor q8, q8, q12
Adam Langleye9ada862015-05-11 17:20:37 -0700841 veor q4, q4, q2
Adam Langleyd9e397b2015-01-22 14:27:53 -0800842 veor q12, q12, q11
Adam Langleye9ada862015-05-11 17:20:37 -0700843 veor q2, q2, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800844 veor q15, q15, q13
845 veor q14, q14, q9
Adam Langleye9ada862015-05-11 17:20:37 -0700846 veor q10, q15, q14
Adam Langleyd9e397b2015-01-22 14:27:53 -0800847 vand q10, q10, q7
848 veor q7, q7, q1
849 vand q11, q1, q15
850 vand q7, q7, q14
851 veor q1, q11, q10
852 veor q7, q7, q11
853 veor q7, q7, q12
854 veor q4, q4, q12
855 veor q1, q1, q8
856 veor q2, q2, q8
857 veor q7, q7, q0
858 veor q1, q1, q6
859 veor q6, q6, q0
860 veor q4, q4, q7
861 veor q0, q0, q1
862
863 veor q1, q1, q5
864 veor q5, q5, q2
865 veor q2, q2, q3
866 veor q3, q3, q5
867 veor q4, q4, q5
868
869 veor q6, q6, q3
870 subs r5,r5,#1
871 bcc .Lenc_done
872 vext.8 q8, q0, q0, #12 @ x0 <<< 32
873 vext.8 q9, q1, q1, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700874 veor q0, q0, q8 @ x0 ^ (x0 <<< 32)
Adam Langleyd9e397b2015-01-22 14:27:53 -0800875 vext.8 q10, q4, q4, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700876 veor q1, q1, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -0800877 vext.8 q11, q6, q6, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700878 veor q4, q4, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800879 vext.8 q12, q3, q3, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700880 veor q6, q6, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800881 vext.8 q13, q7, q7, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700882 veor q3, q3, q12
Adam Langleyd9e397b2015-01-22 14:27:53 -0800883 vext.8 q14, q2, q2, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700884 veor q7, q7, q13
Adam Langleyd9e397b2015-01-22 14:27:53 -0800885 vext.8 q15, q5, q5, #12
Adam Langleye9ada862015-05-11 17:20:37 -0700886 veor q2, q2, q14
Adam Langleyd9e397b2015-01-22 14:27:53 -0800887
888 veor q9, q9, q0
Adam Langleye9ada862015-05-11 17:20:37 -0700889 veor q5, q5, q15
890 vext.8 q0, q0, q0, #8 @ (x0 ^ (x0 <<< 32)) <<< 64)
Adam Langleyd9e397b2015-01-22 14:27:53 -0800891 veor q10, q10, q1
892 veor q8, q8, q5
893 veor q9, q9, q5
Adam Langleye9ada862015-05-11 17:20:37 -0700894 vext.8 q1, q1, q1, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800895 veor q13, q13, q3
Adam Langleye9ada862015-05-11 17:20:37 -0700896 veor q0, q0, q8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800897 veor q14, q14, q7
Adam Langleye9ada862015-05-11 17:20:37 -0700898 veor q1, q1, q9
899 vext.8 q8, q3, q3, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800900 veor q12, q12, q6
Adam Langleye9ada862015-05-11 17:20:37 -0700901 vext.8 q9, q7, q7, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800902 veor q15, q15, q2
Adam Langleye9ada862015-05-11 17:20:37 -0700903 vext.8 q3, q6, q6, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800904 veor q11, q11, q4
Adam Langleye9ada862015-05-11 17:20:37 -0700905 vext.8 q7, q5, q5, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800906 veor q12, q12, q5
Adam Langleye9ada862015-05-11 17:20:37 -0700907 vext.8 q6, q2, q2, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800908 veor q11, q11, q5
Adam Langleye9ada862015-05-11 17:20:37 -0700909 vext.8 q2, q4, q4, #8
Adam Langleyd9e397b2015-01-22 14:27:53 -0800910 veor q5, q9, q13
911 veor q4, q8, q12
912 veor q3, q3, q11
913 veor q7, q7, q15
914 veor q6, q6, q14
915 @ vmov q4, q8
916 veor q2, q2, q10
917 @ vmov q5, q9
918 vldmia r6, {q12} @ .LSR
919 ite eq @ Thumb2 thing, samity check in ARM
920 addeq r6,r6,#0x10
921 bne .Lenc_loop
922 vldmia r6, {q12} @ .LSRM0
923 b .Lenc_loop
924.align 4
925.Lenc_done:
926 vmov.i8 q8,#0x55 @ compose .LBS0
927 vmov.i8 q9,#0x33 @ compose .LBS1
928 vshr.u64 q10, q2, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700929 vshr.u64 q11, q3, #1
930 veor q10, q10, q5
931 veor q11, q11, q7
932 vand q10, q10, q8
933 vand q11, q11, q8
934 veor q5, q5, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800935 vshl.u64 q10, q10, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700936 veor q7, q7, q11
937 vshl.u64 q11, q11, #1
938 veor q2, q2, q10
939 veor q3, q3, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800940 vshr.u64 q10, q4, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700941 vshr.u64 q11, q0, #1
942 veor q10, q10, q6
943 veor q11, q11, q1
944 vand q10, q10, q8
945 vand q11, q11, q8
946 veor q6, q6, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800947 vshl.u64 q10, q10, #1
Adam Langleye9ada862015-05-11 17:20:37 -0700948 veor q1, q1, q11
949 vshl.u64 q11, q11, #1
950 veor q4, q4, q10
951 veor q0, q0, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800952 vmov.i8 q8,#0x0f @ compose .LBS2
953 vshr.u64 q10, q7, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700954 vshr.u64 q11, q3, #2
955 veor q10, q10, q5
956 veor q11, q11, q2
957 vand q10, q10, q9
958 vand q11, q11, q9
959 veor q5, q5, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800960 vshl.u64 q10, q10, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700961 veor q2, q2, q11
962 vshl.u64 q11, q11, #2
963 veor q7, q7, q10
964 veor q3, q3, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800965 vshr.u64 q10, q1, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700966 vshr.u64 q11, q0, #2
967 veor q10, q10, q6
968 veor q11, q11, q4
969 vand q10, q10, q9
970 vand q11, q11, q9
971 veor q6, q6, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800972 vshl.u64 q10, q10, #2
Adam Langleye9ada862015-05-11 17:20:37 -0700973 veor q4, q4, q11
974 vshl.u64 q11, q11, #2
975 veor q1, q1, q10
976 veor q0, q0, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800977 vshr.u64 q10, q6, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700978 vshr.u64 q11, q4, #4
979 veor q10, q10, q5
980 veor q11, q11, q2
981 vand q10, q10, q8
982 vand q11, q11, q8
983 veor q5, q5, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800984 vshl.u64 q10, q10, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700985 veor q2, q2, q11
986 vshl.u64 q11, q11, #4
987 veor q6, q6, q10
988 veor q4, q4, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -0800989 vshr.u64 q10, q1, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700990 vshr.u64 q11, q0, #4
991 veor q10, q10, q7
992 veor q11, q11, q3
993 vand q10, q10, q8
994 vand q11, q11, q8
995 veor q7, q7, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -0800996 vshl.u64 q10, q10, #4
Adam Langleye9ada862015-05-11 17:20:37 -0700997 veor q3, q3, q11
998 vshl.u64 q11, q11, #4
999 veor q1, q1, q10
1000 veor q0, q0, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -08001001 vldmia r4, {q8} @ last round key
1002 veor q4, q4, q8
1003 veor q6, q6, q8
1004 veor q3, q3, q8
1005 veor q7, q7, q8
1006 veor q2, q2, q8
1007 veor q5, q5, q8
1008 veor q0, q0, q8
1009 veor q1, q1, q8
1010 bx lr
1011.size _bsaes_encrypt8,.-_bsaes_encrypt8
1012.type _bsaes_key_convert,%function
1013.align 4
1014_bsaes_key_convert:
Robert Sloand5c22152017-11-13 09:22:12 -08001015 adr r6,.
Adam Langleyd9e397b2015-01-22 14:27:53 -08001016 vld1.8 {q7}, [r4]! @ load round 0 key
Robert Sloanab8b8882018-03-26 11:39:51 -07001017#if defined(__thumb2__) || defined(__APPLE__)
Adam Langleye9ada862015-05-11 17:20:37 -07001018 adr r6,.LM0
1019#else
Adam Langleyd9e397b2015-01-22 14:27:53 -08001020 sub r6,r6,#_bsaes_key_convert-.LM0
Adam Langleye9ada862015-05-11 17:20:37 -07001021#endif
Adam Langleyd9e397b2015-01-22 14:27:53 -08001022 vld1.8 {q15}, [r4]! @ load round 1 key
1023
1024 vmov.i8 q8, #0x01 @ bit masks
1025 vmov.i8 q9, #0x02
1026 vmov.i8 q10, #0x04
1027 vmov.i8 q11, #0x08
1028 vmov.i8 q12, #0x10
1029 vmov.i8 q13, #0x20
1030 vldmia r6, {q14} @ .LM0
1031
1032#ifdef __ARMEL__
1033 vrev32.8 q7, q7
1034 vrev32.8 q15, q15
1035#endif
1036 sub r5,r5,#1
1037 vstmia r12!, {q7} @ save round 0 key
1038 b .Lkey_loop
1039
1040.align 4
1041.Lkey_loop:
1042 vtbl.8 d14,{q15},d28
1043 vtbl.8 d15,{q15},d29
1044 vmov.i8 q6, #0x40
1045 vmov.i8 q15, #0x80
1046
1047 vtst.8 q0, q7, q8
1048 vtst.8 q1, q7, q9
1049 vtst.8 q2, q7, q10
1050 vtst.8 q3, q7, q11
1051 vtst.8 q4, q7, q12
1052 vtst.8 q5, q7, q13
1053 vtst.8 q6, q7, q6
1054 vtst.8 q7, q7, q15
1055 vld1.8 {q15}, [r4]! @ load next round key
1056 vmvn q0, q0 @ "pnot"
1057 vmvn q1, q1
1058 vmvn q5, q5
1059 vmvn q6, q6
1060#ifdef __ARMEL__
1061 vrev32.8 q15, q15
1062#endif
1063 subs r5,r5,#1
Adam Langleye9ada862015-05-11 17:20:37 -07001064 vstmia r12!,{q0,q1,q2,q3,q4,q5,q6,q7} @ write bit-sliced round key
Adam Langleyd9e397b2015-01-22 14:27:53 -08001065 bne .Lkey_loop
1066
1067 vmov.i8 q7,#0x63 @ compose .L63
1068 @ don't save last round key
1069 bx lr
1070.size _bsaes_key_convert,.-_bsaes_key_convert
Adam Langleyd9e397b2015-01-22 14:27:53 -08001071
Adam Langleye9ada862015-05-11 17:20:37 -07001072
1073
1074.globl bsaes_cbc_encrypt
Adam Langleyd9e397b2015-01-22 14:27:53 -08001075.hidden bsaes_cbc_encrypt
1076.type bsaes_cbc_encrypt,%function
1077.align 5
1078bsaes_cbc_encrypt:
1079#ifndef __KERNEL__
1080 cmp r2, #128
1081#ifndef __thumb__
1082 blo AES_cbc_encrypt
1083#else
1084 bhs 1f
1085 b AES_cbc_encrypt
10861:
1087#endif
1088#endif
1089
1090 @ it is up to the caller to make sure we are called with enc == 0
1091
1092 mov ip, sp
Adam Langleye9ada862015-05-11 17:20:37 -07001093 stmdb sp!, {r4,r5,r6,r7,r8,r9,r10, lr}
Adam Langleyd9e397b2015-01-22 14:27:53 -08001094 VFP_ABI_PUSH
1095 ldr r8, [ip] @ IV is 1st arg on the stack
1096 mov r2, r2, lsr#4 @ len in 16 byte blocks
1097 sub sp, #0x10 @ scratch space to carry over the IV
1098 mov r9, sp @ save sp
1099
1100 ldr r10, [r3, #240] @ get # of rounds
1101#ifndef BSAES_ASM_EXTENDED_KEY
1102 @ allocate the key schedule on the stack
1103 sub r12, sp, r10, lsl#7 @ 128 bytes per inner round key
1104 add r12, #96 @ sifze of bit-slices key schedule
1105
1106 @ populate the key schedule
1107 mov r4, r3 @ pass key
1108 mov r5, r10 @ pass # of rounds
1109 mov sp, r12 @ sp is sp
1110 bl _bsaes_key_convert
1111 vldmia sp, {q6}
1112 vstmia r12, {q15} @ save last round key
1113 veor q7, q7, q6 @ fix up round 0 key
1114 vstmia sp, {q7}
1115#else
1116 ldr r12, [r3, #244]
1117 eors r12, #1
1118 beq 0f
1119
1120 @ populate the key schedule
1121 str r12, [r3, #244]
1122 mov r4, r3 @ pass key
1123 mov r5, r10 @ pass # of rounds
1124 add r12, r3, #248 @ pass key schedule
1125 bl _bsaes_key_convert
1126 add r4, r3, #248
1127 vldmia r4, {q6}
1128 vstmia r12, {q15} @ save last round key
1129 veor q7, q7, q6 @ fix up round 0 key
1130 vstmia r4, {q7}
1131
1132.align 2
Adam Langleye9ada862015-05-11 17:20:37 -07001133
Adam Langleyd9e397b2015-01-22 14:27:53 -08001134#endif
1135
1136 vld1.8 {q15}, [r8] @ load IV
1137 b .Lcbc_dec_loop
1138
1139.align 4
1140.Lcbc_dec_loop:
1141 subs r2, r2, #0x8
1142 bmi .Lcbc_dec_loop_finish
1143
Adam Langleye9ada862015-05-11 17:20:37 -07001144 vld1.8 {q0,q1}, [r0]! @ load input
1145 vld1.8 {q2,q3}, [r0]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001146#ifndef BSAES_ASM_EXTENDED_KEY
1147 mov r4, sp @ pass the key
1148#else
1149 add r4, r3, #248
1150#endif
Adam Langleye9ada862015-05-11 17:20:37 -07001151 vld1.8 {q4,q5}, [r0]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001152 mov r5, r10
Adam Langleye9ada862015-05-11 17:20:37 -07001153 vld1.8 {q6,q7}, [r0]
Adam Langleyd9e397b2015-01-22 14:27:53 -08001154 sub r0, r0, #0x60
1155 vstmia r9, {q15} @ put aside IV
1156
1157 bl _bsaes_decrypt8
1158
1159 vldmia r9, {q14} @ reload IV
Adam Langleye9ada862015-05-11 17:20:37 -07001160 vld1.8 {q8,q9}, [r0]! @ reload input
Adam Langleyd9e397b2015-01-22 14:27:53 -08001161 veor q0, q0, q14 @ ^= IV
Adam Langleye9ada862015-05-11 17:20:37 -07001162 vld1.8 {q10,q11}, [r0]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001163 veor q1, q1, q8
1164 veor q6, q6, q9
Adam Langleye9ada862015-05-11 17:20:37 -07001165 vld1.8 {q12,q13}, [r0]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001166 veor q4, q4, q10
1167 veor q2, q2, q11
Adam Langleye9ada862015-05-11 17:20:37 -07001168 vld1.8 {q14,q15}, [r0]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001169 veor q7, q7, q12
Adam Langleye9ada862015-05-11 17:20:37 -07001170 vst1.8 {q0,q1}, [r1]! @ write output
Adam Langleyd9e397b2015-01-22 14:27:53 -08001171 veor q3, q3, q13
1172 vst1.8 {q6}, [r1]!
1173 veor q5, q5, q14
1174 vst1.8 {q4}, [r1]!
1175 vst1.8 {q2}, [r1]!
1176 vst1.8 {q7}, [r1]!
1177 vst1.8 {q3}, [r1]!
1178 vst1.8 {q5}, [r1]!
1179
1180 b .Lcbc_dec_loop
1181
1182.Lcbc_dec_loop_finish:
1183 adds r2, r2, #8
1184 beq .Lcbc_dec_done
1185
1186 vld1.8 {q0}, [r0]! @ load input
1187 cmp r2, #2
1188 blo .Lcbc_dec_one
1189 vld1.8 {q1}, [r0]!
1190#ifndef BSAES_ASM_EXTENDED_KEY
1191 mov r4, sp @ pass the key
1192#else
1193 add r4, r3, #248
1194#endif
1195 mov r5, r10
1196 vstmia r9, {q15} @ put aside IV
1197 beq .Lcbc_dec_two
1198 vld1.8 {q2}, [r0]!
1199 cmp r2, #4
1200 blo .Lcbc_dec_three
1201 vld1.8 {q3}, [r0]!
1202 beq .Lcbc_dec_four
1203 vld1.8 {q4}, [r0]!
1204 cmp r2, #6
1205 blo .Lcbc_dec_five
1206 vld1.8 {q5}, [r0]!
1207 beq .Lcbc_dec_six
1208 vld1.8 {q6}, [r0]!
1209 sub r0, r0, #0x70
1210
1211 bl _bsaes_decrypt8
1212
1213 vldmia r9, {q14} @ reload IV
Adam Langleye9ada862015-05-11 17:20:37 -07001214 vld1.8 {q8,q9}, [r0]! @ reload input
Adam Langleyd9e397b2015-01-22 14:27:53 -08001215 veor q0, q0, q14 @ ^= IV
Adam Langleye9ada862015-05-11 17:20:37 -07001216 vld1.8 {q10,q11}, [r0]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001217 veor q1, q1, q8
1218 veor q6, q6, q9
Adam Langleye9ada862015-05-11 17:20:37 -07001219 vld1.8 {q12,q13}, [r0]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001220 veor q4, q4, q10
1221 veor q2, q2, q11
1222 vld1.8 {q15}, [r0]!
1223 veor q7, q7, q12
Adam Langleye9ada862015-05-11 17:20:37 -07001224 vst1.8 {q0,q1}, [r1]! @ write output
Adam Langleyd9e397b2015-01-22 14:27:53 -08001225 veor q3, q3, q13
1226 vst1.8 {q6}, [r1]!
1227 vst1.8 {q4}, [r1]!
1228 vst1.8 {q2}, [r1]!
1229 vst1.8 {q7}, [r1]!
1230 vst1.8 {q3}, [r1]!
1231 b .Lcbc_dec_done
1232.align 4
1233.Lcbc_dec_six:
1234 sub r0, r0, #0x60
1235 bl _bsaes_decrypt8
1236 vldmia r9,{q14} @ reload IV
Adam Langleye9ada862015-05-11 17:20:37 -07001237 vld1.8 {q8,q9}, [r0]! @ reload input
Adam Langleyd9e397b2015-01-22 14:27:53 -08001238 veor q0, q0, q14 @ ^= IV
Adam Langleye9ada862015-05-11 17:20:37 -07001239 vld1.8 {q10,q11}, [r0]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001240 veor q1, q1, q8
1241 veor q6, q6, q9
1242 vld1.8 {q12}, [r0]!
1243 veor q4, q4, q10
1244 veor q2, q2, q11
1245 vld1.8 {q15}, [r0]!
1246 veor q7, q7, q12
Adam Langleye9ada862015-05-11 17:20:37 -07001247 vst1.8 {q0,q1}, [r1]! @ write output
Adam Langleyd9e397b2015-01-22 14:27:53 -08001248 vst1.8 {q6}, [r1]!
1249 vst1.8 {q4}, [r1]!
1250 vst1.8 {q2}, [r1]!
1251 vst1.8 {q7}, [r1]!
1252 b .Lcbc_dec_done
1253.align 4
1254.Lcbc_dec_five:
1255 sub r0, r0, #0x50
1256 bl _bsaes_decrypt8
1257 vldmia r9, {q14} @ reload IV
Adam Langleye9ada862015-05-11 17:20:37 -07001258 vld1.8 {q8,q9}, [r0]! @ reload input
Adam Langleyd9e397b2015-01-22 14:27:53 -08001259 veor q0, q0, q14 @ ^= IV
Adam Langleye9ada862015-05-11 17:20:37 -07001260 vld1.8 {q10,q11}, [r0]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001261 veor q1, q1, q8
1262 veor q6, q6, q9
1263 vld1.8 {q15}, [r0]!
1264 veor q4, q4, q10
Adam Langleye9ada862015-05-11 17:20:37 -07001265 vst1.8 {q0,q1}, [r1]! @ write output
Adam Langleyd9e397b2015-01-22 14:27:53 -08001266 veor q2, q2, q11
1267 vst1.8 {q6}, [r1]!
1268 vst1.8 {q4}, [r1]!
1269 vst1.8 {q2}, [r1]!
1270 b .Lcbc_dec_done
1271.align 4
1272.Lcbc_dec_four:
1273 sub r0, r0, #0x40
1274 bl _bsaes_decrypt8
1275 vldmia r9, {q14} @ reload IV
Adam Langleye9ada862015-05-11 17:20:37 -07001276 vld1.8 {q8,q9}, [r0]! @ reload input
Adam Langleyd9e397b2015-01-22 14:27:53 -08001277 veor q0, q0, q14 @ ^= IV
1278 vld1.8 {q10}, [r0]!
1279 veor q1, q1, q8
1280 veor q6, q6, q9
1281 vld1.8 {q15}, [r0]!
1282 veor q4, q4, q10
Adam Langleye9ada862015-05-11 17:20:37 -07001283 vst1.8 {q0,q1}, [r1]! @ write output
Adam Langleyd9e397b2015-01-22 14:27:53 -08001284 vst1.8 {q6}, [r1]!
1285 vst1.8 {q4}, [r1]!
1286 b .Lcbc_dec_done
1287.align 4
1288.Lcbc_dec_three:
1289 sub r0, r0, #0x30
1290 bl _bsaes_decrypt8
1291 vldmia r9, {q14} @ reload IV
Adam Langleye9ada862015-05-11 17:20:37 -07001292 vld1.8 {q8,q9}, [r0]! @ reload input
Adam Langleyd9e397b2015-01-22 14:27:53 -08001293 veor q0, q0, q14 @ ^= IV
1294 vld1.8 {q15}, [r0]!
1295 veor q1, q1, q8
1296 veor q6, q6, q9
Adam Langleye9ada862015-05-11 17:20:37 -07001297 vst1.8 {q0,q1}, [r1]! @ write output
Adam Langleyd9e397b2015-01-22 14:27:53 -08001298 vst1.8 {q6}, [r1]!
1299 b .Lcbc_dec_done
1300.align 4
1301.Lcbc_dec_two:
1302 sub r0, r0, #0x20
1303 bl _bsaes_decrypt8
1304 vldmia r9, {q14} @ reload IV
1305 vld1.8 {q8}, [r0]! @ reload input
1306 veor q0, q0, q14 @ ^= IV
1307 vld1.8 {q15}, [r0]! @ reload input
1308 veor q1, q1, q8
Adam Langleye9ada862015-05-11 17:20:37 -07001309 vst1.8 {q0,q1}, [r1]! @ write output
Adam Langleyd9e397b2015-01-22 14:27:53 -08001310 b .Lcbc_dec_done
1311.align 4
1312.Lcbc_dec_one:
1313 sub r0, r0, #0x10
1314 mov r10, r1 @ save original out pointer
1315 mov r1, r9 @ use the iv scratch space as out buffer
1316 mov r2, r3
1317 vmov q4,q15 @ just in case ensure that IV
1318 vmov q5,q0 @ and input are preserved
1319 bl AES_decrypt
Robert Sloan6f79a502017-04-03 09:16:40 -07001320 vld1.8 {q0}, [r9] @ load result
Adam Langleyd9e397b2015-01-22 14:27:53 -08001321 veor q0, q0, q4 @ ^= IV
1322 vmov q15, q5 @ q5 holds input
1323 vst1.8 {q0}, [r10] @ write output
1324
1325.Lcbc_dec_done:
1326#ifndef BSAES_ASM_EXTENDED_KEY
1327 vmov.i32 q0, #0
1328 vmov.i32 q1, #0
Adam Langleye9ada862015-05-11 17:20:37 -07001329.Lcbc_dec_bzero:@ wipe key schedule [if any]
1330 vstmia sp!, {q0,q1}
1331 cmp sp, r9
1332 bne .Lcbc_dec_bzero
Adam Langleyd9e397b2015-01-22 14:27:53 -08001333#endif
1334
1335 mov sp, r9
1336 add sp, #0x10 @ add sp,r9,#0x10 is no good for thumb
1337 vst1.8 {q15}, [r8] @ return IV
1338 VFP_ABI_POP
Adam Langleye9ada862015-05-11 17:20:37 -07001339 ldmia sp!, {r4,r5,r6,r7,r8,r9,r10, pc}
Adam Langleyd9e397b2015-01-22 14:27:53 -08001340.size bsaes_cbc_encrypt,.-bsaes_cbc_encrypt
Adam Langleye9ada862015-05-11 17:20:37 -07001341
1342.globl bsaes_ctr32_encrypt_blocks
Adam Langleyd9e397b2015-01-22 14:27:53 -08001343.hidden bsaes_ctr32_encrypt_blocks
1344.type bsaes_ctr32_encrypt_blocks,%function
1345.align 5
1346bsaes_ctr32_encrypt_blocks:
1347 cmp r2, #8 @ use plain AES for
1348 blo .Lctr_enc_short @ small sizes
1349
1350 mov ip, sp
Adam Langleye9ada862015-05-11 17:20:37 -07001351 stmdb sp!, {r4,r5,r6,r7,r8,r9,r10, lr}
Adam Langleyd9e397b2015-01-22 14:27:53 -08001352 VFP_ABI_PUSH
1353 ldr r8, [ip] @ ctr is 1st arg on the stack
1354 sub sp, sp, #0x10 @ scratch space to carry over the ctr
1355 mov r9, sp @ save sp
1356
1357 ldr r10, [r3, #240] @ get # of rounds
1358#ifndef BSAES_ASM_EXTENDED_KEY
1359 @ allocate the key schedule on the stack
1360 sub r12, sp, r10, lsl#7 @ 128 bytes per inner round key
1361 add r12, #96 @ size of bit-sliced key schedule
1362
1363 @ populate the key schedule
1364 mov r4, r3 @ pass key
1365 mov r5, r10 @ pass # of rounds
1366 mov sp, r12 @ sp is sp
1367 bl _bsaes_key_convert
1368 veor q7,q7,q15 @ fix up last round key
1369 vstmia r12, {q7} @ save last round key
1370
1371 vld1.8 {q0}, [r8] @ load counter
Adam Langleye9ada862015-05-11 17:20:37 -07001372#ifdef __APPLE__
Adam Langleyf4e42722015-06-04 17:45:09 -07001373 mov r8, #:lower16:(.LREVM0SR-.LM0)
Adam Langleye9ada862015-05-11 17:20:37 -07001374 add r8, r6, r8
1375#else
Adam Langleyd9e397b2015-01-22 14:27:53 -08001376 add r8, r6, #.LREVM0SR-.LM0 @ borrow r8
Adam Langleye9ada862015-05-11 17:20:37 -07001377#endif
Adam Langleyd9e397b2015-01-22 14:27:53 -08001378 vldmia sp, {q4} @ load round0 key
1379#else
1380 ldr r12, [r3, #244]
1381 eors r12, #1
1382 beq 0f
1383
1384 @ populate the key schedule
1385 str r12, [r3, #244]
1386 mov r4, r3 @ pass key
1387 mov r5, r10 @ pass # of rounds
1388 add r12, r3, #248 @ pass key schedule
1389 bl _bsaes_key_convert
1390 veor q7,q7,q15 @ fix up last round key
1391 vstmia r12, {q7} @ save last round key
1392
1393.align 2
Adam Langleye9ada862015-05-11 17:20:37 -07001394 add r12, r3, #248
Adam Langleyd9e397b2015-01-22 14:27:53 -08001395 vld1.8 {q0}, [r8] @ load counter
1396 adrl r8, .LREVM0SR @ borrow r8
1397 vldmia r12, {q4} @ load round0 key
1398 sub sp, #0x10 @ place for adjusted round0 key
1399#endif
1400
1401 vmov.i32 q8,#1 @ compose 1<<96
Adam Langleye9ada862015-05-11 17:20:37 -07001402 veor q9,q9,q9
Adam Langleyd9e397b2015-01-22 14:27:53 -08001403 vrev32.8 q0,q0
Adam Langleye9ada862015-05-11 17:20:37 -07001404 vext.8 q8,q9,q8,#4
Adam Langleyd9e397b2015-01-22 14:27:53 -08001405 vrev32.8 q4,q4
1406 vadd.u32 q9,q8,q8 @ compose 2<<96
1407 vstmia sp, {q4} @ save adjusted round0 key
1408 b .Lctr_enc_loop
1409
1410.align 4
1411.Lctr_enc_loop:
1412 vadd.u32 q10, q8, q9 @ compose 3<<96
1413 vadd.u32 q1, q0, q8 @ +1
1414 vadd.u32 q2, q0, q9 @ +2
1415 vadd.u32 q3, q0, q10 @ +3
1416 vadd.u32 q4, q1, q10
1417 vadd.u32 q5, q2, q10
1418 vadd.u32 q6, q3, q10
1419 vadd.u32 q7, q4, q10
1420 vadd.u32 q10, q5, q10 @ next counter
1421
1422 @ Borrow prologue from _bsaes_encrypt8 to use the opportunity
1423 @ to flip byte order in 32-bit counter
1424
Adam Langleye9ada862015-05-11 17:20:37 -07001425 vldmia sp, {q9} @ load round0 key
Adam Langleyd9e397b2015-01-22 14:27:53 -08001426#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07001427 add r4, sp, #0x10 @ pass next round key
Adam Langleyd9e397b2015-01-22 14:27:53 -08001428#else
Adam Langleye9ada862015-05-11 17:20:37 -07001429 add r4, r3, #264
Adam Langleyd9e397b2015-01-22 14:27:53 -08001430#endif
Adam Langleye9ada862015-05-11 17:20:37 -07001431 vldmia r8, {q8} @ .LREVM0SR
1432 mov r5, r10 @ pass rounds
1433 vstmia r9, {q10} @ save next counter
1434#ifdef __APPLE__
Adam Langleyf4e42722015-06-04 17:45:09 -07001435 mov r6, #:lower16:(.LREVM0SR-.LSR)
Adam Langleye9ada862015-05-11 17:20:37 -07001436 sub r6, r8, r6
1437#else
1438 sub r6, r8, #.LREVM0SR-.LSR @ pass constants
1439#endif
Adam Langleyd9e397b2015-01-22 14:27:53 -08001440
Adam Langleye9ada862015-05-11 17:20:37 -07001441 bl _bsaes_encrypt8_alt
Adam Langleyd9e397b2015-01-22 14:27:53 -08001442
Adam Langleye9ada862015-05-11 17:20:37 -07001443 subs r2, r2, #8
1444 blo .Lctr_enc_loop_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08001445
Adam Langleye9ada862015-05-11 17:20:37 -07001446 vld1.8 {q8,q9}, [r0]! @ load input
1447 vld1.8 {q10,q11}, [r0]!
1448 veor q0, q8
1449 veor q1, q9
1450 vld1.8 {q12,q13}, [r0]!
1451 veor q4, q10
1452 veor q6, q11
1453 vld1.8 {q14,q15}, [r0]!
1454 veor q3, q12
1455 vst1.8 {q0,q1}, [r1]! @ write output
1456 veor q7, q13
1457 veor q2, q14
1458 vst1.8 {q4}, [r1]!
1459 veor q5, q15
1460 vst1.8 {q6}, [r1]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001461 vmov.i32 q8, #1 @ compose 1<<96
Adam Langleye9ada862015-05-11 17:20:37 -07001462 vst1.8 {q3}, [r1]!
1463 veor q9, q9, q9
1464 vst1.8 {q7}, [r1]!
1465 vext.8 q8, q9, q8, #4
1466 vst1.8 {q2}, [r1]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001467 vadd.u32 q9,q8,q8 @ compose 2<<96
Adam Langleye9ada862015-05-11 17:20:37 -07001468 vst1.8 {q5}, [r1]!
1469 vldmia r9, {q0} @ load counter
Adam Langleyd9e397b2015-01-22 14:27:53 -08001470
Adam Langleye9ada862015-05-11 17:20:37 -07001471 bne .Lctr_enc_loop
1472 b .Lctr_enc_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08001473
1474.align 4
1475.Lctr_enc_loop_done:
Adam Langleye9ada862015-05-11 17:20:37 -07001476 add r2, r2, #8
1477 vld1.8 {q8}, [r0]! @ load input
1478 veor q0, q8
1479 vst1.8 {q0}, [r1]! @ write output
1480 cmp r2, #2
1481 blo .Lctr_enc_done
1482 vld1.8 {q9}, [r0]!
1483 veor q1, q9
1484 vst1.8 {q1}, [r1]!
1485 beq .Lctr_enc_done
1486 vld1.8 {q10}, [r0]!
1487 veor q4, q10
1488 vst1.8 {q4}, [r1]!
1489 cmp r2, #4
1490 blo .Lctr_enc_done
1491 vld1.8 {q11}, [r0]!
1492 veor q6, q11
1493 vst1.8 {q6}, [r1]!
1494 beq .Lctr_enc_done
1495 vld1.8 {q12}, [r0]!
1496 veor q3, q12
1497 vst1.8 {q3}, [r1]!
1498 cmp r2, #6
1499 blo .Lctr_enc_done
1500 vld1.8 {q13}, [r0]!
1501 veor q7, q13
1502 vst1.8 {q7}, [r1]!
1503 beq .Lctr_enc_done
1504 vld1.8 {q14}, [r0]
1505 veor q2, q14
1506 vst1.8 {q2}, [r1]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001507
1508.Lctr_enc_done:
1509 vmov.i32 q0, #0
1510 vmov.i32 q1, #0
1511#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07001512.Lctr_enc_bzero:@ wipe key schedule [if any]
1513 vstmia sp!, {q0,q1}
1514 cmp sp, r9
1515 bne .Lctr_enc_bzero
Adam Langleyd9e397b2015-01-22 14:27:53 -08001516#else
Adam Langleye9ada862015-05-11 17:20:37 -07001517 vstmia sp, {q0,q1}
Adam Langleyd9e397b2015-01-22 14:27:53 -08001518#endif
1519
1520 mov sp, r9
1521 add sp, #0x10 @ add sp,r9,#0x10 is no good for thumb
1522 VFP_ABI_POP
Adam Langleye9ada862015-05-11 17:20:37 -07001523 ldmia sp!, {r4,r5,r6,r7,r8,r9,r10, pc} @ return
Adam Langleyd9e397b2015-01-22 14:27:53 -08001524
1525.align 4
1526.Lctr_enc_short:
1527 ldr ip, [sp] @ ctr pointer is passed on stack
Adam Langleye9ada862015-05-11 17:20:37 -07001528 stmdb sp!, {r4,r5,r6,r7,r8, lr}
Adam Langleyd9e397b2015-01-22 14:27:53 -08001529
1530 mov r4, r0 @ copy arguments
1531 mov r5, r1
1532 mov r6, r2
1533 mov r7, r3
Adam Langleye9ada862015-05-11 17:20:37 -07001534 ldr r8, [ip, #12] @ load counter .LSW
Adam Langleyd9e397b2015-01-22 14:27:53 -08001535 vld1.8 {q1}, [ip] @ load whole counter value
1536#ifdef __ARMEL__
1537 rev r8, r8
1538#endif
1539 sub sp, sp, #0x10
Adam Langleye9ada862015-05-11 17:20:37 -07001540 vst1.8 {q1}, [sp] @ copy counter value
Adam Langleyd9e397b2015-01-22 14:27:53 -08001541 sub sp, sp, #0x10
1542
1543.Lctr_enc_short_loop:
1544 add r0, sp, #0x10 @ input counter value
1545 mov r1, sp @ output on the stack
1546 mov r2, r7 @ key
1547
1548 bl AES_encrypt
1549
1550 vld1.8 {q0}, [r4]! @ load input
Adam Langleye9ada862015-05-11 17:20:37 -07001551 vld1.8 {q1}, [sp] @ load encrypted counter
Adam Langleyd9e397b2015-01-22 14:27:53 -08001552 add r8, r8, #1
1553#ifdef __ARMEL__
1554 rev r0, r8
1555 str r0, [sp, #0x1c] @ next counter value
1556#else
1557 str r8, [sp, #0x1c] @ next counter value
1558#endif
1559 veor q0,q0,q1
1560 vst1.8 {q0}, [r5]! @ store output
1561 subs r6, r6, #1
1562 bne .Lctr_enc_short_loop
1563
1564 vmov.i32 q0, #0
1565 vmov.i32 q1, #0
Adam Langleye9ada862015-05-11 17:20:37 -07001566 vstmia sp!, {q0,q1}
Adam Langleyd9e397b2015-01-22 14:27:53 -08001567
Adam Langleye9ada862015-05-11 17:20:37 -07001568 ldmia sp!, {r4,r5,r6,r7,r8, pc}
Adam Langleyd9e397b2015-01-22 14:27:53 -08001569.size bsaes_ctr32_encrypt_blocks,.-bsaes_ctr32_encrypt_blocks
1570.globl bsaes_xts_encrypt
1571.hidden bsaes_xts_encrypt
1572.type bsaes_xts_encrypt,%function
1573.align 4
1574bsaes_xts_encrypt:
1575 mov ip, sp
Adam Langleye9ada862015-05-11 17:20:37 -07001576 stmdb sp!, {r4,r5,r6,r7,r8,r9,r10, lr} @ 0x20
Adam Langleyd9e397b2015-01-22 14:27:53 -08001577 VFP_ABI_PUSH
1578 mov r6, sp @ future r3
1579
1580 mov r7, r0
1581 mov r8, r1
1582 mov r9, r2
1583 mov r10, r3
1584
1585 sub r0, sp, #0x10 @ 0x10
1586 bic r0, #0xf @ align at 16 bytes
1587 mov sp, r0
1588
1589#ifdef XTS_CHAIN_TWEAK
1590 ldr r0, [ip] @ pointer to input tweak
1591#else
1592 @ generate initial tweak
1593 ldr r0, [ip, #4] @ iv[]
1594 mov r1, sp
1595 ldr r2, [ip, #0] @ key2
1596 bl AES_encrypt
1597 mov r0,sp @ pointer to initial tweak
1598#endif
1599
1600 ldr r1, [r10, #240] @ get # of rounds
1601 mov r3, r6
1602#ifndef BSAES_ASM_EXTENDED_KEY
1603 @ allocate the key schedule on the stack
1604 sub r12, sp, r1, lsl#7 @ 128 bytes per inner round key
1605 @ add r12, #96 @ size of bit-sliced key schedule
1606 sub r12, #48 @ place for tweak[9]
1607
1608 @ populate the key schedule
1609 mov r4, r10 @ pass key
1610 mov r5, r1 @ pass # of rounds
1611 mov sp, r12
1612 add r12, #0x90 @ pass key schedule
1613 bl _bsaes_key_convert
1614 veor q7, q7, q15 @ fix up last round key
1615 vstmia r12, {q7} @ save last round key
1616#else
1617 ldr r12, [r10, #244]
1618 eors r12, #1
1619 beq 0f
1620
1621 str r12, [r10, #244]
1622 mov r4, r10 @ pass key
1623 mov r5, r1 @ pass # of rounds
1624 add r12, r10, #248 @ pass key schedule
1625 bl _bsaes_key_convert
1626 veor q7, q7, q15 @ fix up last round key
1627 vstmia r12, {q7}
1628
1629.align 2
Adam Langleye9ada862015-05-11 17:20:37 -07001630 sub sp, #0x90 @ place for tweak[9]
Adam Langleyd9e397b2015-01-22 14:27:53 -08001631#endif
1632
1633 vld1.8 {q8}, [r0] @ initial tweak
1634 adr r2, .Lxts_magic
1635
1636 subs r9, #0x80
1637 blo .Lxts_enc_short
1638 b .Lxts_enc_loop
1639
1640.align 4
1641.Lxts_enc_loop:
Adam Langleye9ada862015-05-11 17:20:37 -07001642 vldmia r2, {q5} @ load XTS magic
Adam Langleyd9e397b2015-01-22 14:27:53 -08001643 vshr.s64 q6, q8, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001644 mov r0, sp
1645 vand q6, q6, q5
Adam Langleyd9e397b2015-01-22 14:27:53 -08001646 vadd.u64 q9, q8, q8
Adam Langleye9ada862015-05-11 17:20:37 -07001647 vst1.64 {q8}, [r0,:128]!
1648 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08001649 vshr.s64 q7, q9, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001650 veor q9, q9, q6
1651 vand q7, q7, q5
Adam Langleyd9e397b2015-01-22 14:27:53 -08001652 vadd.u64 q10, q9, q9
Adam Langleye9ada862015-05-11 17:20:37 -07001653 vst1.64 {q9}, [r0,:128]!
1654 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08001655 vshr.s64 q6, q10, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001656 veor q10, q10, q7
1657 vand q6, q6, q5
1658 vld1.8 {q0}, [r7]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001659 vadd.u64 q11, q10, q10
Adam Langleye9ada862015-05-11 17:20:37 -07001660 vst1.64 {q10}, [r0,:128]!
1661 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08001662 vshr.s64 q7, q11, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001663 veor q11, q11, q6
1664 vand q7, q7, q5
1665 vld1.8 {q1}, [r7]!
1666 veor q0, q0, q8
Adam Langleyd9e397b2015-01-22 14:27:53 -08001667 vadd.u64 q12, q11, q11
Adam Langleye9ada862015-05-11 17:20:37 -07001668 vst1.64 {q11}, [r0,:128]!
1669 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08001670 vshr.s64 q6, q12, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001671 veor q12, q12, q7
1672 vand q6, q6, q5
1673 vld1.8 {q2}, [r7]!
1674 veor q1, q1, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -08001675 vadd.u64 q13, q12, q12
Adam Langleye9ada862015-05-11 17:20:37 -07001676 vst1.64 {q12}, [r0,:128]!
1677 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08001678 vshr.s64 q7, q13, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001679 veor q13, q13, q6
1680 vand q7, q7, q5
1681 vld1.8 {q3}, [r7]!
1682 veor q2, q2, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -08001683 vadd.u64 q14, q13, q13
Adam Langleye9ada862015-05-11 17:20:37 -07001684 vst1.64 {q13}, [r0,:128]!
1685 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08001686 vshr.s64 q6, q14, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001687 veor q14, q14, q7
1688 vand q6, q6, q5
1689 vld1.8 {q4}, [r7]!
1690 veor q3, q3, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -08001691 vadd.u64 q15, q14, q14
Adam Langleye9ada862015-05-11 17:20:37 -07001692 vst1.64 {q14}, [r0,:128]!
1693 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08001694 vshr.s64 q7, q15, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001695 veor q15, q15, q6
1696 vand q7, q7, q5
1697 vld1.8 {q5}, [r7]!
1698 veor q4, q4, q12
Adam Langleyd9e397b2015-01-22 14:27:53 -08001699 vadd.u64 q8, q15, q15
Adam Langleye9ada862015-05-11 17:20:37 -07001700 vst1.64 {q15}, [r0,:128]!
1701 vswp d15,d14
1702 veor q8, q8, q7
1703 vst1.64 {q8}, [r0,:128] @ next round tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08001704
Adam Langleye9ada862015-05-11 17:20:37 -07001705 vld1.8 {q6,q7}, [r7]!
1706 veor q5, q5, q13
Adam Langleyd9e397b2015-01-22 14:27:53 -08001707#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07001708 add r4, sp, #0x90 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08001709#else
Adam Langleye9ada862015-05-11 17:20:37 -07001710 add r4, r10, #248 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08001711#endif
Adam Langleye9ada862015-05-11 17:20:37 -07001712 veor q6, q6, q14
1713 mov r5, r1 @ pass rounds
1714 veor q7, q7, q15
1715 mov r0, sp
Adam Langleyd9e397b2015-01-22 14:27:53 -08001716
Adam Langleye9ada862015-05-11 17:20:37 -07001717 bl _bsaes_encrypt8
Adam Langleyd9e397b2015-01-22 14:27:53 -08001718
Adam Langleye9ada862015-05-11 17:20:37 -07001719 vld1.64 {q8,q9}, [r0,:128]!
1720 vld1.64 {q10,q11}, [r0,:128]!
1721 veor q0, q0, q8
1722 vld1.64 {q12,q13}, [r0,:128]!
1723 veor q1, q1, q9
1724 veor q8, q4, q10
1725 vst1.8 {q0,q1}, [r8]!
1726 veor q9, q6, q11
1727 vld1.64 {q14,q15}, [r0,:128]!
1728 veor q10, q3, q12
1729 vst1.8 {q8,q9}, [r8]!
1730 veor q11, q7, q13
1731 veor q12, q2, q14
1732 vst1.8 {q10,q11}, [r8]!
1733 veor q13, q5, q15
1734 vst1.8 {q12,q13}, [r8]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001735
Adam Langleye9ada862015-05-11 17:20:37 -07001736 vld1.64 {q8}, [r0,:128] @ next round tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08001737
Adam Langleye9ada862015-05-11 17:20:37 -07001738 subs r9, #0x80
1739 bpl .Lxts_enc_loop
Adam Langleyd9e397b2015-01-22 14:27:53 -08001740
1741.Lxts_enc_short:
Adam Langleye9ada862015-05-11 17:20:37 -07001742 adds r9, #0x70
1743 bmi .Lxts_enc_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08001744
Adam Langleye9ada862015-05-11 17:20:37 -07001745 vldmia r2, {q5} @ load XTS magic
Adam Langleyd9e397b2015-01-22 14:27:53 -08001746 vshr.s64 q7, q8, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001747 mov r0, sp
1748 vand q7, q7, q5
Adam Langleyd9e397b2015-01-22 14:27:53 -08001749 vadd.u64 q9, q8, q8
Adam Langleye9ada862015-05-11 17:20:37 -07001750 vst1.64 {q8}, [r0,:128]!
1751 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08001752 vshr.s64 q6, q9, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001753 veor q9, q9, q7
1754 vand q6, q6, q5
Adam Langleyd9e397b2015-01-22 14:27:53 -08001755 vadd.u64 q10, q9, q9
Adam Langleye9ada862015-05-11 17:20:37 -07001756 vst1.64 {q9}, [r0,:128]!
1757 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08001758 vshr.s64 q7, q10, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001759 veor q10, q10, q6
1760 vand q7, q7, q5
1761 vld1.8 {q0}, [r7]!
1762 subs r9, #0x10
1763 bmi .Lxts_enc_1
Adam Langleyd9e397b2015-01-22 14:27:53 -08001764 vadd.u64 q11, q10, q10
Adam Langleye9ada862015-05-11 17:20:37 -07001765 vst1.64 {q10}, [r0,:128]!
1766 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08001767 vshr.s64 q6, q11, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001768 veor q11, q11, q7
1769 vand q6, q6, q5
1770 vld1.8 {q1}, [r7]!
1771 subs r9, #0x10
1772 bmi .Lxts_enc_2
1773 veor q0, q0, q8
Adam Langleyd9e397b2015-01-22 14:27:53 -08001774 vadd.u64 q12, q11, q11
Adam Langleye9ada862015-05-11 17:20:37 -07001775 vst1.64 {q11}, [r0,:128]!
1776 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08001777 vshr.s64 q7, q12, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001778 veor q12, q12, q6
1779 vand q7, q7, q5
1780 vld1.8 {q2}, [r7]!
1781 subs r9, #0x10
1782 bmi .Lxts_enc_3
1783 veor q1, q1, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -08001784 vadd.u64 q13, q12, q12
Adam Langleye9ada862015-05-11 17:20:37 -07001785 vst1.64 {q12}, [r0,:128]!
1786 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08001787 vshr.s64 q6, q13, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001788 veor q13, q13, q7
1789 vand q6, q6, q5
1790 vld1.8 {q3}, [r7]!
1791 subs r9, #0x10
1792 bmi .Lxts_enc_4
1793 veor q2, q2, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -08001794 vadd.u64 q14, q13, q13
Adam Langleye9ada862015-05-11 17:20:37 -07001795 vst1.64 {q13}, [r0,:128]!
1796 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08001797 vshr.s64 q7, q14, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001798 veor q14, q14, q6
1799 vand q7, q7, q5
1800 vld1.8 {q4}, [r7]!
1801 subs r9, #0x10
1802 bmi .Lxts_enc_5
1803 veor q3, q3, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -08001804 vadd.u64 q15, q14, q14
Adam Langleye9ada862015-05-11 17:20:37 -07001805 vst1.64 {q14}, [r0,:128]!
1806 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08001807 vshr.s64 q6, q15, #63
Adam Langleye9ada862015-05-11 17:20:37 -07001808 veor q15, q15, q7
1809 vand q6, q6, q5
1810 vld1.8 {q5}, [r7]!
1811 subs r9, #0x10
1812 bmi .Lxts_enc_6
1813 veor q4, q4, q12
1814 sub r9, #0x10
1815 vst1.64 {q15}, [r0,:128] @ next round tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08001816
Adam Langleye9ada862015-05-11 17:20:37 -07001817 vld1.8 {q6}, [r7]!
1818 veor q5, q5, q13
Adam Langleyd9e397b2015-01-22 14:27:53 -08001819#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07001820 add r4, sp, #0x90 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08001821#else
Adam Langleye9ada862015-05-11 17:20:37 -07001822 add r4, r10, #248 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08001823#endif
Adam Langleye9ada862015-05-11 17:20:37 -07001824 veor q6, q6, q14
1825 mov r5, r1 @ pass rounds
1826 mov r0, sp
Adam Langleyd9e397b2015-01-22 14:27:53 -08001827
Adam Langleye9ada862015-05-11 17:20:37 -07001828 bl _bsaes_encrypt8
Adam Langleyd9e397b2015-01-22 14:27:53 -08001829
Adam Langleye9ada862015-05-11 17:20:37 -07001830 vld1.64 {q8,q9}, [r0,:128]!
1831 vld1.64 {q10,q11}, [r0,:128]!
1832 veor q0, q0, q8
1833 vld1.64 {q12,q13}, [r0,:128]!
1834 veor q1, q1, q9
1835 veor q8, q4, q10
1836 vst1.8 {q0,q1}, [r8]!
1837 veor q9, q6, q11
1838 vld1.64 {q14}, [r0,:128]!
1839 veor q10, q3, q12
1840 vst1.8 {q8,q9}, [r8]!
1841 veor q11, q7, q13
1842 veor q12, q2, q14
1843 vst1.8 {q10,q11}, [r8]!
1844 vst1.8 {q12}, [r8]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001845
Adam Langleye9ada862015-05-11 17:20:37 -07001846 vld1.64 {q8}, [r0,:128] @ next round tweak
1847 b .Lxts_enc_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08001848.align 4
1849.Lxts_enc_6:
Adam Langleye9ada862015-05-11 17:20:37 -07001850 veor q4, q4, q12
Adam Langleyd9e397b2015-01-22 14:27:53 -08001851#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07001852 add r4, sp, #0x90 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08001853#else
Adam Langleye9ada862015-05-11 17:20:37 -07001854 add r4, r10, #248 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08001855#endif
Adam Langleye9ada862015-05-11 17:20:37 -07001856 veor q5, q5, q13
1857 mov r5, r1 @ pass rounds
1858 mov r0, sp
Adam Langleyd9e397b2015-01-22 14:27:53 -08001859
Adam Langleye9ada862015-05-11 17:20:37 -07001860 bl _bsaes_encrypt8
Adam Langleyd9e397b2015-01-22 14:27:53 -08001861
Adam Langleye9ada862015-05-11 17:20:37 -07001862 vld1.64 {q8,q9}, [r0,:128]!
1863 vld1.64 {q10,q11}, [r0,:128]!
1864 veor q0, q0, q8
1865 vld1.64 {q12,q13}, [r0,:128]!
1866 veor q1, q1, q9
1867 veor q8, q4, q10
1868 vst1.8 {q0,q1}, [r8]!
1869 veor q9, q6, q11
1870 veor q10, q3, q12
1871 vst1.8 {q8,q9}, [r8]!
1872 veor q11, q7, q13
1873 vst1.8 {q10,q11}, [r8]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001874
Adam Langleye9ada862015-05-11 17:20:37 -07001875 vld1.64 {q8}, [r0,:128] @ next round tweak
1876 b .Lxts_enc_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08001877
1878@ put this in range for both ARM and Thumb mode adr instructions
1879.align 5
1880.Lxts_magic:
Adam Langleye9ada862015-05-11 17:20:37 -07001881.quad 1, 0x87
Adam Langleyd9e397b2015-01-22 14:27:53 -08001882
1883.align 5
1884.Lxts_enc_5:
Adam Langleye9ada862015-05-11 17:20:37 -07001885 veor q3, q3, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -08001886#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07001887 add r4, sp, #0x90 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08001888#else
Adam Langleye9ada862015-05-11 17:20:37 -07001889 add r4, r10, #248 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08001890#endif
Adam Langleye9ada862015-05-11 17:20:37 -07001891 veor q4, q4, q12
1892 mov r5, r1 @ pass rounds
1893 mov r0, sp
Adam Langleyd9e397b2015-01-22 14:27:53 -08001894
Adam Langleye9ada862015-05-11 17:20:37 -07001895 bl _bsaes_encrypt8
Adam Langleyd9e397b2015-01-22 14:27:53 -08001896
Adam Langleye9ada862015-05-11 17:20:37 -07001897 vld1.64 {q8,q9}, [r0,:128]!
1898 vld1.64 {q10,q11}, [r0,:128]!
1899 veor q0, q0, q8
1900 vld1.64 {q12}, [r0,:128]!
1901 veor q1, q1, q9
1902 veor q8, q4, q10
1903 vst1.8 {q0,q1}, [r8]!
1904 veor q9, q6, q11
1905 veor q10, q3, q12
1906 vst1.8 {q8,q9}, [r8]!
1907 vst1.8 {q10}, [r8]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001908
Adam Langleye9ada862015-05-11 17:20:37 -07001909 vld1.64 {q8}, [r0,:128] @ next round tweak
1910 b .Lxts_enc_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08001911.align 4
1912.Lxts_enc_4:
Adam Langleye9ada862015-05-11 17:20:37 -07001913 veor q2, q2, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -08001914#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07001915 add r4, sp, #0x90 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08001916#else
Adam Langleye9ada862015-05-11 17:20:37 -07001917 add r4, r10, #248 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08001918#endif
Adam Langleye9ada862015-05-11 17:20:37 -07001919 veor q3, q3, q11
1920 mov r5, r1 @ pass rounds
1921 mov r0, sp
Adam Langleyd9e397b2015-01-22 14:27:53 -08001922
Adam Langleye9ada862015-05-11 17:20:37 -07001923 bl _bsaes_encrypt8
Adam Langleyd9e397b2015-01-22 14:27:53 -08001924
Adam Langleye9ada862015-05-11 17:20:37 -07001925 vld1.64 {q8,q9}, [r0,:128]!
1926 vld1.64 {q10,q11}, [r0,:128]!
1927 veor q0, q0, q8
1928 veor q1, q1, q9
1929 veor q8, q4, q10
1930 vst1.8 {q0,q1}, [r8]!
1931 veor q9, q6, q11
1932 vst1.8 {q8,q9}, [r8]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001933
Adam Langleye9ada862015-05-11 17:20:37 -07001934 vld1.64 {q8}, [r0,:128] @ next round tweak
1935 b .Lxts_enc_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08001936.align 4
1937.Lxts_enc_3:
Adam Langleye9ada862015-05-11 17:20:37 -07001938 veor q1, q1, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -08001939#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07001940 add r4, sp, #0x90 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08001941#else
Adam Langleye9ada862015-05-11 17:20:37 -07001942 add r4, r10, #248 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08001943#endif
Adam Langleye9ada862015-05-11 17:20:37 -07001944 veor q2, q2, q10
1945 mov r5, r1 @ pass rounds
1946 mov r0, sp
Adam Langleyd9e397b2015-01-22 14:27:53 -08001947
Adam Langleye9ada862015-05-11 17:20:37 -07001948 bl _bsaes_encrypt8
Adam Langleyd9e397b2015-01-22 14:27:53 -08001949
Adam Langleye9ada862015-05-11 17:20:37 -07001950 vld1.64 {q8,q9}, [r0,:128]!
1951 vld1.64 {q10}, [r0,:128]!
1952 veor q0, q0, q8
1953 veor q1, q1, q9
1954 veor q8, q4, q10
1955 vst1.8 {q0,q1}, [r8]!
1956 vst1.8 {q8}, [r8]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001957
Adam Langleye9ada862015-05-11 17:20:37 -07001958 vld1.64 {q8}, [r0,:128] @ next round tweak
1959 b .Lxts_enc_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08001960.align 4
1961.Lxts_enc_2:
Adam Langleye9ada862015-05-11 17:20:37 -07001962 veor q0, q0, q8
Adam Langleyd9e397b2015-01-22 14:27:53 -08001963#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07001964 add r4, sp, #0x90 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08001965#else
Adam Langleye9ada862015-05-11 17:20:37 -07001966 add r4, r10, #248 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08001967#endif
Adam Langleye9ada862015-05-11 17:20:37 -07001968 veor q1, q1, q9
1969 mov r5, r1 @ pass rounds
1970 mov r0, sp
Adam Langleyd9e397b2015-01-22 14:27:53 -08001971
Adam Langleye9ada862015-05-11 17:20:37 -07001972 bl _bsaes_encrypt8
Adam Langleyd9e397b2015-01-22 14:27:53 -08001973
Adam Langleye9ada862015-05-11 17:20:37 -07001974 vld1.64 {q8,q9}, [r0,:128]!
1975 veor q0, q0, q8
1976 veor q1, q1, q9
1977 vst1.8 {q0,q1}, [r8]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08001978
Adam Langleye9ada862015-05-11 17:20:37 -07001979 vld1.64 {q8}, [r0,:128] @ next round tweak
1980 b .Lxts_enc_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08001981.align 4
1982.Lxts_enc_1:
Adam Langleye9ada862015-05-11 17:20:37 -07001983 mov r0, sp
David Benjaminc895d6b2016-08-11 13:26:41 -04001984 veor q0, q0, q8
Adam Langleye9ada862015-05-11 17:20:37 -07001985 mov r1, sp
1986 vst1.8 {q0}, [sp,:128]
1987 mov r2, r10
1988 mov r4, r3 @ preserve fp
Adam Langleyd9e397b2015-01-22 14:27:53 -08001989
Adam Langleye9ada862015-05-11 17:20:37 -07001990 bl AES_encrypt
Adam Langleyd9e397b2015-01-22 14:27:53 -08001991
Adam Langleye9ada862015-05-11 17:20:37 -07001992 vld1.8 {q0}, [sp,:128]
1993 veor q0, q0, q8
1994 vst1.8 {q0}, [r8]!
1995 mov r3, r4
Adam Langleyd9e397b2015-01-22 14:27:53 -08001996
Adam Langleye9ada862015-05-11 17:20:37 -07001997 vmov q8, q9 @ next round tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08001998
1999.Lxts_enc_done:
2000#ifndef XTS_CHAIN_TWEAK
Adam Langleye9ada862015-05-11 17:20:37 -07002001 adds r9, #0x10
2002 beq .Lxts_enc_ret
2003 sub r6, r8, #0x10
Adam Langleyd9e397b2015-01-22 14:27:53 -08002004
2005.Lxts_enc_steal:
Adam Langleye9ada862015-05-11 17:20:37 -07002006 ldrb r0, [r7], #1
2007 ldrb r1, [r8, #-0x10]
2008 strb r0, [r8, #-0x10]
2009 strb r1, [r8], #1
Adam Langleyd9e397b2015-01-22 14:27:53 -08002010
Adam Langleye9ada862015-05-11 17:20:37 -07002011 subs r9, #1
2012 bhi .Lxts_enc_steal
Adam Langleyd9e397b2015-01-22 14:27:53 -08002013
Adam Langleye9ada862015-05-11 17:20:37 -07002014 vld1.8 {q0}, [r6]
2015 mov r0, sp
2016 veor q0, q0, q8
2017 mov r1, sp
2018 vst1.8 {q0}, [sp,:128]
2019 mov r2, r10
2020 mov r4, r3 @ preserve fp
Adam Langleyd9e397b2015-01-22 14:27:53 -08002021
Adam Langleye9ada862015-05-11 17:20:37 -07002022 bl AES_encrypt
Adam Langleyd9e397b2015-01-22 14:27:53 -08002023
Adam Langleye9ada862015-05-11 17:20:37 -07002024 vld1.8 {q0}, [sp,:128]
2025 veor q0, q0, q8
2026 vst1.8 {q0}, [r6]
2027 mov r3, r4
Adam Langleyd9e397b2015-01-22 14:27:53 -08002028#endif
2029
2030.Lxts_enc_ret:
Adam Langleye9ada862015-05-11 17:20:37 -07002031 bic r0, r3, #0xf
Adam Langleyd9e397b2015-01-22 14:27:53 -08002032 vmov.i32 q0, #0
2033 vmov.i32 q1, #0
2034#ifdef XTS_CHAIN_TWEAK
Adam Langleye9ada862015-05-11 17:20:37 -07002035 ldr r1, [r3, #0x20+VFP_ABI_FRAME] @ chain tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08002036#endif
Adam Langleye9ada862015-05-11 17:20:37 -07002037.Lxts_enc_bzero:@ wipe key schedule [if any]
2038 vstmia sp!, {q0,q1}
2039 cmp sp, r0
2040 bne .Lxts_enc_bzero
Adam Langleyd9e397b2015-01-22 14:27:53 -08002041
Adam Langleye9ada862015-05-11 17:20:37 -07002042 mov sp, r3
Adam Langleyd9e397b2015-01-22 14:27:53 -08002043#ifdef XTS_CHAIN_TWEAK
Adam Langleye9ada862015-05-11 17:20:37 -07002044 vst1.8 {q8}, [r1]
Adam Langleyd9e397b2015-01-22 14:27:53 -08002045#endif
2046 VFP_ABI_POP
Adam Langleye9ada862015-05-11 17:20:37 -07002047 ldmia sp!, {r4,r5,r6,r7,r8,r9,r10, pc} @ return
Adam Langleyd9e397b2015-01-22 14:27:53 -08002048
2049.size bsaes_xts_encrypt,.-bsaes_xts_encrypt
2050
2051.globl bsaes_xts_decrypt
2052.hidden bsaes_xts_decrypt
2053.type bsaes_xts_decrypt,%function
2054.align 4
2055bsaes_xts_decrypt:
2056 mov ip, sp
Adam Langleye9ada862015-05-11 17:20:37 -07002057 stmdb sp!, {r4,r5,r6,r7,r8,r9,r10, lr} @ 0x20
Adam Langleyd9e397b2015-01-22 14:27:53 -08002058 VFP_ABI_PUSH
2059 mov r6, sp @ future r3
2060
2061 mov r7, r0
2062 mov r8, r1
2063 mov r9, r2
2064 mov r10, r3
2065
2066 sub r0, sp, #0x10 @ 0x10
2067 bic r0, #0xf @ align at 16 bytes
2068 mov sp, r0
2069
2070#ifdef XTS_CHAIN_TWEAK
2071 ldr r0, [ip] @ pointer to input tweak
2072#else
2073 @ generate initial tweak
2074 ldr r0, [ip, #4] @ iv[]
2075 mov r1, sp
2076 ldr r2, [ip, #0] @ key2
2077 bl AES_encrypt
2078 mov r0, sp @ pointer to initial tweak
2079#endif
2080
2081 ldr r1, [r10, #240] @ get # of rounds
2082 mov r3, r6
2083#ifndef BSAES_ASM_EXTENDED_KEY
2084 @ allocate the key schedule on the stack
2085 sub r12, sp, r1, lsl#7 @ 128 bytes per inner round key
2086 @ add r12, #96 @ size of bit-sliced key schedule
2087 sub r12, #48 @ place for tweak[9]
2088
2089 @ populate the key schedule
2090 mov r4, r10 @ pass key
2091 mov r5, r1 @ pass # of rounds
2092 mov sp, r12
2093 add r12, #0x90 @ pass key schedule
2094 bl _bsaes_key_convert
2095 add r4, sp, #0x90
2096 vldmia r4, {q6}
2097 vstmia r12, {q15} @ save last round key
2098 veor q7, q7, q6 @ fix up round 0 key
2099 vstmia r4, {q7}
2100#else
2101 ldr r12, [r10, #244]
2102 eors r12, #1
2103 beq 0f
2104
2105 str r12, [r10, #244]
2106 mov r4, r10 @ pass key
2107 mov r5, r1 @ pass # of rounds
2108 add r12, r10, #248 @ pass key schedule
2109 bl _bsaes_key_convert
2110 add r4, r10, #248
2111 vldmia r4, {q6}
2112 vstmia r12, {q15} @ save last round key
2113 veor q7, q7, q6 @ fix up round 0 key
2114 vstmia r4, {q7}
2115
2116.align 2
Adam Langleye9ada862015-05-11 17:20:37 -07002117 sub sp, #0x90 @ place for tweak[9]
Adam Langleyd9e397b2015-01-22 14:27:53 -08002118#endif
2119 vld1.8 {q8}, [r0] @ initial tweak
2120 adr r2, .Lxts_magic
2121
Adam Langleye9ada862015-05-11 17:20:37 -07002122#ifndef XTS_CHAIN_TWEAK
Adam Langleyd9e397b2015-01-22 14:27:53 -08002123 tst r9, #0xf @ if not multiple of 16
2124 it ne @ Thumb2 thing, sanity check in ARM
2125 subne r9, #0x10 @ subtract another 16 bytes
Adam Langleye9ada862015-05-11 17:20:37 -07002126#endif
Adam Langleyd9e397b2015-01-22 14:27:53 -08002127 subs r9, #0x80
2128
2129 blo .Lxts_dec_short
2130 b .Lxts_dec_loop
2131
2132.align 4
2133.Lxts_dec_loop:
Adam Langleye9ada862015-05-11 17:20:37 -07002134 vldmia r2, {q5} @ load XTS magic
Adam Langleyd9e397b2015-01-22 14:27:53 -08002135 vshr.s64 q6, q8, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002136 mov r0, sp
2137 vand q6, q6, q5
Adam Langleyd9e397b2015-01-22 14:27:53 -08002138 vadd.u64 q9, q8, q8
Adam Langleye9ada862015-05-11 17:20:37 -07002139 vst1.64 {q8}, [r0,:128]!
2140 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08002141 vshr.s64 q7, q9, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002142 veor q9, q9, q6
2143 vand q7, q7, q5
Adam Langleyd9e397b2015-01-22 14:27:53 -08002144 vadd.u64 q10, q9, q9
Adam Langleye9ada862015-05-11 17:20:37 -07002145 vst1.64 {q9}, [r0,:128]!
2146 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08002147 vshr.s64 q6, q10, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002148 veor q10, q10, q7
2149 vand q6, q6, q5
2150 vld1.8 {q0}, [r7]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08002151 vadd.u64 q11, q10, q10
Adam Langleye9ada862015-05-11 17:20:37 -07002152 vst1.64 {q10}, [r0,:128]!
2153 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08002154 vshr.s64 q7, q11, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002155 veor q11, q11, q6
2156 vand q7, q7, q5
2157 vld1.8 {q1}, [r7]!
2158 veor q0, q0, q8
Adam Langleyd9e397b2015-01-22 14:27:53 -08002159 vadd.u64 q12, q11, q11
Adam Langleye9ada862015-05-11 17:20:37 -07002160 vst1.64 {q11}, [r0,:128]!
2161 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08002162 vshr.s64 q6, q12, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002163 veor q12, q12, q7
2164 vand q6, q6, q5
2165 vld1.8 {q2}, [r7]!
2166 veor q1, q1, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -08002167 vadd.u64 q13, q12, q12
Adam Langleye9ada862015-05-11 17:20:37 -07002168 vst1.64 {q12}, [r0,:128]!
2169 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08002170 vshr.s64 q7, q13, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002171 veor q13, q13, q6
2172 vand q7, q7, q5
2173 vld1.8 {q3}, [r7]!
2174 veor q2, q2, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -08002175 vadd.u64 q14, q13, q13
Adam Langleye9ada862015-05-11 17:20:37 -07002176 vst1.64 {q13}, [r0,:128]!
2177 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08002178 vshr.s64 q6, q14, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002179 veor q14, q14, q7
2180 vand q6, q6, q5
2181 vld1.8 {q4}, [r7]!
2182 veor q3, q3, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -08002183 vadd.u64 q15, q14, q14
Adam Langleye9ada862015-05-11 17:20:37 -07002184 vst1.64 {q14}, [r0,:128]!
2185 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08002186 vshr.s64 q7, q15, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002187 veor q15, q15, q6
2188 vand q7, q7, q5
2189 vld1.8 {q5}, [r7]!
2190 veor q4, q4, q12
Adam Langleyd9e397b2015-01-22 14:27:53 -08002191 vadd.u64 q8, q15, q15
Adam Langleye9ada862015-05-11 17:20:37 -07002192 vst1.64 {q15}, [r0,:128]!
2193 vswp d15,d14
2194 veor q8, q8, q7
2195 vst1.64 {q8}, [r0,:128] @ next round tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08002196
Adam Langleye9ada862015-05-11 17:20:37 -07002197 vld1.8 {q6,q7}, [r7]!
2198 veor q5, q5, q13
Adam Langleyd9e397b2015-01-22 14:27:53 -08002199#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07002200 add r4, sp, #0x90 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002201#else
Adam Langleye9ada862015-05-11 17:20:37 -07002202 add r4, r10, #248 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002203#endif
Adam Langleye9ada862015-05-11 17:20:37 -07002204 veor q6, q6, q14
2205 mov r5, r1 @ pass rounds
2206 veor q7, q7, q15
2207 mov r0, sp
Adam Langleyd9e397b2015-01-22 14:27:53 -08002208
Adam Langleye9ada862015-05-11 17:20:37 -07002209 bl _bsaes_decrypt8
Adam Langleyd9e397b2015-01-22 14:27:53 -08002210
Adam Langleye9ada862015-05-11 17:20:37 -07002211 vld1.64 {q8,q9}, [r0,:128]!
2212 vld1.64 {q10,q11}, [r0,:128]!
2213 veor q0, q0, q8
2214 vld1.64 {q12,q13}, [r0,:128]!
2215 veor q1, q1, q9
2216 veor q8, q6, q10
2217 vst1.8 {q0,q1}, [r8]!
2218 veor q9, q4, q11
2219 vld1.64 {q14,q15}, [r0,:128]!
2220 veor q10, q2, q12
2221 vst1.8 {q8,q9}, [r8]!
2222 veor q11, q7, q13
2223 veor q12, q3, q14
2224 vst1.8 {q10,q11}, [r8]!
2225 veor q13, q5, q15
2226 vst1.8 {q12,q13}, [r8]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08002227
Adam Langleye9ada862015-05-11 17:20:37 -07002228 vld1.64 {q8}, [r0,:128] @ next round tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08002229
Adam Langleye9ada862015-05-11 17:20:37 -07002230 subs r9, #0x80
2231 bpl .Lxts_dec_loop
Adam Langleyd9e397b2015-01-22 14:27:53 -08002232
2233.Lxts_dec_short:
Adam Langleye9ada862015-05-11 17:20:37 -07002234 adds r9, #0x70
2235 bmi .Lxts_dec_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08002236
Adam Langleye9ada862015-05-11 17:20:37 -07002237 vldmia r2, {q5} @ load XTS magic
Adam Langleyd9e397b2015-01-22 14:27:53 -08002238 vshr.s64 q7, q8, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002239 mov r0, sp
2240 vand q7, q7, q5
Adam Langleyd9e397b2015-01-22 14:27:53 -08002241 vadd.u64 q9, q8, q8
Adam Langleye9ada862015-05-11 17:20:37 -07002242 vst1.64 {q8}, [r0,:128]!
2243 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08002244 vshr.s64 q6, q9, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002245 veor q9, q9, q7
2246 vand q6, q6, q5
Adam Langleyd9e397b2015-01-22 14:27:53 -08002247 vadd.u64 q10, q9, q9
Adam Langleye9ada862015-05-11 17:20:37 -07002248 vst1.64 {q9}, [r0,:128]!
2249 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08002250 vshr.s64 q7, q10, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002251 veor q10, q10, q6
2252 vand q7, q7, q5
2253 vld1.8 {q0}, [r7]!
2254 subs r9, #0x10
2255 bmi .Lxts_dec_1
Adam Langleyd9e397b2015-01-22 14:27:53 -08002256 vadd.u64 q11, q10, q10
Adam Langleye9ada862015-05-11 17:20:37 -07002257 vst1.64 {q10}, [r0,:128]!
2258 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08002259 vshr.s64 q6, q11, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002260 veor q11, q11, q7
2261 vand q6, q6, q5
2262 vld1.8 {q1}, [r7]!
2263 subs r9, #0x10
2264 bmi .Lxts_dec_2
2265 veor q0, q0, q8
Adam Langleyd9e397b2015-01-22 14:27:53 -08002266 vadd.u64 q12, q11, q11
Adam Langleye9ada862015-05-11 17:20:37 -07002267 vst1.64 {q11}, [r0,:128]!
2268 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08002269 vshr.s64 q7, q12, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002270 veor q12, q12, q6
2271 vand q7, q7, q5
2272 vld1.8 {q2}, [r7]!
2273 subs r9, #0x10
2274 bmi .Lxts_dec_3
2275 veor q1, q1, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -08002276 vadd.u64 q13, q12, q12
Adam Langleye9ada862015-05-11 17:20:37 -07002277 vst1.64 {q12}, [r0,:128]!
2278 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08002279 vshr.s64 q6, q13, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002280 veor q13, q13, q7
2281 vand q6, q6, q5
2282 vld1.8 {q3}, [r7]!
2283 subs r9, #0x10
2284 bmi .Lxts_dec_4
2285 veor q2, q2, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -08002286 vadd.u64 q14, q13, q13
Adam Langleye9ada862015-05-11 17:20:37 -07002287 vst1.64 {q13}, [r0,:128]!
2288 vswp d13,d12
Adam Langleyd9e397b2015-01-22 14:27:53 -08002289 vshr.s64 q7, q14, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002290 veor q14, q14, q6
2291 vand q7, q7, q5
2292 vld1.8 {q4}, [r7]!
2293 subs r9, #0x10
2294 bmi .Lxts_dec_5
2295 veor q3, q3, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -08002296 vadd.u64 q15, q14, q14
Adam Langleye9ada862015-05-11 17:20:37 -07002297 vst1.64 {q14}, [r0,:128]!
2298 vswp d15,d14
Adam Langleyd9e397b2015-01-22 14:27:53 -08002299 vshr.s64 q6, q15, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002300 veor q15, q15, q7
2301 vand q6, q6, q5
2302 vld1.8 {q5}, [r7]!
2303 subs r9, #0x10
2304 bmi .Lxts_dec_6
2305 veor q4, q4, q12
2306 sub r9, #0x10
2307 vst1.64 {q15}, [r0,:128] @ next round tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08002308
Adam Langleye9ada862015-05-11 17:20:37 -07002309 vld1.8 {q6}, [r7]!
2310 veor q5, q5, q13
Adam Langleyd9e397b2015-01-22 14:27:53 -08002311#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07002312 add r4, sp, #0x90 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002313#else
Adam Langleye9ada862015-05-11 17:20:37 -07002314 add r4, r10, #248 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002315#endif
Adam Langleye9ada862015-05-11 17:20:37 -07002316 veor q6, q6, q14
2317 mov r5, r1 @ pass rounds
2318 mov r0, sp
Adam Langleyd9e397b2015-01-22 14:27:53 -08002319
Adam Langleye9ada862015-05-11 17:20:37 -07002320 bl _bsaes_decrypt8
Adam Langleyd9e397b2015-01-22 14:27:53 -08002321
Adam Langleye9ada862015-05-11 17:20:37 -07002322 vld1.64 {q8,q9}, [r0,:128]!
2323 vld1.64 {q10,q11}, [r0,:128]!
2324 veor q0, q0, q8
2325 vld1.64 {q12,q13}, [r0,:128]!
2326 veor q1, q1, q9
2327 veor q8, q6, q10
2328 vst1.8 {q0,q1}, [r8]!
2329 veor q9, q4, q11
2330 vld1.64 {q14}, [r0,:128]!
2331 veor q10, q2, q12
2332 vst1.8 {q8,q9}, [r8]!
2333 veor q11, q7, q13
2334 veor q12, q3, q14
2335 vst1.8 {q10,q11}, [r8]!
2336 vst1.8 {q12}, [r8]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08002337
Adam Langleye9ada862015-05-11 17:20:37 -07002338 vld1.64 {q8}, [r0,:128] @ next round tweak
2339 b .Lxts_dec_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08002340.align 4
2341.Lxts_dec_6:
Adam Langleye9ada862015-05-11 17:20:37 -07002342 vst1.64 {q14}, [r0,:128] @ next round tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08002343
Adam Langleye9ada862015-05-11 17:20:37 -07002344 veor q4, q4, q12
Adam Langleyd9e397b2015-01-22 14:27:53 -08002345#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07002346 add r4, sp, #0x90 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002347#else
Adam Langleye9ada862015-05-11 17:20:37 -07002348 add r4, r10, #248 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002349#endif
Adam Langleye9ada862015-05-11 17:20:37 -07002350 veor q5, q5, q13
2351 mov r5, r1 @ pass rounds
2352 mov r0, sp
Adam Langleyd9e397b2015-01-22 14:27:53 -08002353
Adam Langleye9ada862015-05-11 17:20:37 -07002354 bl _bsaes_decrypt8
Adam Langleyd9e397b2015-01-22 14:27:53 -08002355
Adam Langleye9ada862015-05-11 17:20:37 -07002356 vld1.64 {q8,q9}, [r0,:128]!
2357 vld1.64 {q10,q11}, [r0,:128]!
2358 veor q0, q0, q8
2359 vld1.64 {q12,q13}, [r0,:128]!
2360 veor q1, q1, q9
2361 veor q8, q6, q10
2362 vst1.8 {q0,q1}, [r8]!
2363 veor q9, q4, q11
2364 veor q10, q2, q12
2365 vst1.8 {q8,q9}, [r8]!
2366 veor q11, q7, q13
2367 vst1.8 {q10,q11}, [r8]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08002368
Adam Langleye9ada862015-05-11 17:20:37 -07002369 vld1.64 {q8}, [r0,:128] @ next round tweak
2370 b .Lxts_dec_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08002371.align 4
2372.Lxts_dec_5:
Adam Langleye9ada862015-05-11 17:20:37 -07002373 veor q3, q3, q11
Adam Langleyd9e397b2015-01-22 14:27:53 -08002374#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07002375 add r4, sp, #0x90 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002376#else
Adam Langleye9ada862015-05-11 17:20:37 -07002377 add r4, r10, #248 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002378#endif
Adam Langleye9ada862015-05-11 17:20:37 -07002379 veor q4, q4, q12
2380 mov r5, r1 @ pass rounds
2381 mov r0, sp
Adam Langleyd9e397b2015-01-22 14:27:53 -08002382
Adam Langleye9ada862015-05-11 17:20:37 -07002383 bl _bsaes_decrypt8
Adam Langleyd9e397b2015-01-22 14:27:53 -08002384
Adam Langleye9ada862015-05-11 17:20:37 -07002385 vld1.64 {q8,q9}, [r0,:128]!
2386 vld1.64 {q10,q11}, [r0,:128]!
2387 veor q0, q0, q8
2388 vld1.64 {q12}, [r0,:128]!
2389 veor q1, q1, q9
2390 veor q8, q6, q10
2391 vst1.8 {q0,q1}, [r8]!
2392 veor q9, q4, q11
2393 veor q10, q2, q12
2394 vst1.8 {q8,q9}, [r8]!
2395 vst1.8 {q10}, [r8]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08002396
Adam Langleye9ada862015-05-11 17:20:37 -07002397 vld1.64 {q8}, [r0,:128] @ next round tweak
2398 b .Lxts_dec_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08002399.align 4
2400.Lxts_dec_4:
Adam Langleye9ada862015-05-11 17:20:37 -07002401 veor q2, q2, q10
Adam Langleyd9e397b2015-01-22 14:27:53 -08002402#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07002403 add r4, sp, #0x90 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002404#else
Adam Langleye9ada862015-05-11 17:20:37 -07002405 add r4, r10, #248 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002406#endif
Adam Langleye9ada862015-05-11 17:20:37 -07002407 veor q3, q3, q11
2408 mov r5, r1 @ pass rounds
2409 mov r0, sp
Adam Langleyd9e397b2015-01-22 14:27:53 -08002410
Adam Langleye9ada862015-05-11 17:20:37 -07002411 bl _bsaes_decrypt8
Adam Langleyd9e397b2015-01-22 14:27:53 -08002412
Adam Langleye9ada862015-05-11 17:20:37 -07002413 vld1.64 {q8,q9}, [r0,:128]!
2414 vld1.64 {q10,q11}, [r0,:128]!
2415 veor q0, q0, q8
2416 veor q1, q1, q9
2417 veor q8, q6, q10
2418 vst1.8 {q0,q1}, [r8]!
2419 veor q9, q4, q11
2420 vst1.8 {q8,q9}, [r8]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08002421
Adam Langleye9ada862015-05-11 17:20:37 -07002422 vld1.64 {q8}, [r0,:128] @ next round tweak
2423 b .Lxts_dec_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08002424.align 4
2425.Lxts_dec_3:
Adam Langleye9ada862015-05-11 17:20:37 -07002426 veor q1, q1, q9
Adam Langleyd9e397b2015-01-22 14:27:53 -08002427#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07002428 add r4, sp, #0x90 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002429#else
Adam Langleye9ada862015-05-11 17:20:37 -07002430 add r4, r10, #248 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002431#endif
Adam Langleye9ada862015-05-11 17:20:37 -07002432 veor q2, q2, q10
2433 mov r5, r1 @ pass rounds
2434 mov r0, sp
Adam Langleyd9e397b2015-01-22 14:27:53 -08002435
Adam Langleye9ada862015-05-11 17:20:37 -07002436 bl _bsaes_decrypt8
Adam Langleyd9e397b2015-01-22 14:27:53 -08002437
Adam Langleye9ada862015-05-11 17:20:37 -07002438 vld1.64 {q8,q9}, [r0,:128]!
2439 vld1.64 {q10}, [r0,:128]!
2440 veor q0, q0, q8
2441 veor q1, q1, q9
2442 veor q8, q6, q10
2443 vst1.8 {q0,q1}, [r8]!
2444 vst1.8 {q8}, [r8]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08002445
Adam Langleye9ada862015-05-11 17:20:37 -07002446 vld1.64 {q8}, [r0,:128] @ next round tweak
2447 b .Lxts_dec_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08002448.align 4
2449.Lxts_dec_2:
Adam Langleye9ada862015-05-11 17:20:37 -07002450 veor q0, q0, q8
Adam Langleyd9e397b2015-01-22 14:27:53 -08002451#ifndef BSAES_ASM_EXTENDED_KEY
Adam Langleye9ada862015-05-11 17:20:37 -07002452 add r4, sp, #0x90 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002453#else
Adam Langleye9ada862015-05-11 17:20:37 -07002454 add r4, r10, #248 @ pass key schedule
Adam Langleyd9e397b2015-01-22 14:27:53 -08002455#endif
Adam Langleye9ada862015-05-11 17:20:37 -07002456 veor q1, q1, q9
2457 mov r5, r1 @ pass rounds
2458 mov r0, sp
Adam Langleyd9e397b2015-01-22 14:27:53 -08002459
Adam Langleye9ada862015-05-11 17:20:37 -07002460 bl _bsaes_decrypt8
Adam Langleyd9e397b2015-01-22 14:27:53 -08002461
Adam Langleye9ada862015-05-11 17:20:37 -07002462 vld1.64 {q8,q9}, [r0,:128]!
2463 veor q0, q0, q8
2464 veor q1, q1, q9
2465 vst1.8 {q0,q1}, [r8]!
Adam Langleyd9e397b2015-01-22 14:27:53 -08002466
Adam Langleye9ada862015-05-11 17:20:37 -07002467 vld1.64 {q8}, [r0,:128] @ next round tweak
2468 b .Lxts_dec_done
Adam Langleyd9e397b2015-01-22 14:27:53 -08002469.align 4
2470.Lxts_dec_1:
Adam Langleye9ada862015-05-11 17:20:37 -07002471 mov r0, sp
David Benjaminc895d6b2016-08-11 13:26:41 -04002472 veor q0, q0, q8
Adam Langleye9ada862015-05-11 17:20:37 -07002473 mov r1, sp
2474 vst1.8 {q0}, [sp,:128]
David Benjaminc895d6b2016-08-11 13:26:41 -04002475 mov r5, r2 @ preserve magic
Adam Langleye9ada862015-05-11 17:20:37 -07002476 mov r2, r10
2477 mov r4, r3 @ preserve fp
Adam Langleyd9e397b2015-01-22 14:27:53 -08002478
Adam Langleye9ada862015-05-11 17:20:37 -07002479 bl AES_decrypt
Adam Langleyd9e397b2015-01-22 14:27:53 -08002480
Adam Langleye9ada862015-05-11 17:20:37 -07002481 vld1.8 {q0}, [sp,:128]
2482 veor q0, q0, q8
2483 vst1.8 {q0}, [r8]!
2484 mov r3, r4
2485 mov r2, r5
Adam Langleyd9e397b2015-01-22 14:27:53 -08002486
Adam Langleye9ada862015-05-11 17:20:37 -07002487 vmov q8, q9 @ next round tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08002488
2489.Lxts_dec_done:
2490#ifndef XTS_CHAIN_TWEAK
Adam Langleye9ada862015-05-11 17:20:37 -07002491 adds r9, #0x10
2492 beq .Lxts_dec_ret
Adam Langleyd9e397b2015-01-22 14:27:53 -08002493
2494 @ calculate one round of extra tweak for the stolen ciphertext
Adam Langleye9ada862015-05-11 17:20:37 -07002495 vldmia r2, {q5}
Adam Langleyd9e397b2015-01-22 14:27:53 -08002496 vshr.s64 q6, q8, #63
Adam Langleye9ada862015-05-11 17:20:37 -07002497 vand q6, q6, q5
Adam Langleyd9e397b2015-01-22 14:27:53 -08002498 vadd.u64 q9, q8, q8
Adam Langleye9ada862015-05-11 17:20:37 -07002499 vswp d13,d12
2500 veor q9, q9, q6
Adam Langleyd9e397b2015-01-22 14:27:53 -08002501
2502 @ perform the final decryption with the last tweak value
Adam Langleye9ada862015-05-11 17:20:37 -07002503 vld1.8 {q0}, [r7]!
2504 mov r0, sp
2505 veor q0, q0, q9
2506 mov r1, sp
2507 vst1.8 {q0}, [sp,:128]
2508 mov r2, r10
2509 mov r4, r3 @ preserve fp
Adam Langleyd9e397b2015-01-22 14:27:53 -08002510
Adam Langleye9ada862015-05-11 17:20:37 -07002511 bl AES_decrypt
Adam Langleyd9e397b2015-01-22 14:27:53 -08002512
Adam Langleye9ada862015-05-11 17:20:37 -07002513 vld1.8 {q0}, [sp,:128]
2514 veor q0, q0, q9
2515 vst1.8 {q0}, [r8]
Adam Langleyd9e397b2015-01-22 14:27:53 -08002516
Adam Langleye9ada862015-05-11 17:20:37 -07002517 mov r6, r8
Adam Langleyd9e397b2015-01-22 14:27:53 -08002518.Lxts_dec_steal:
Adam Langleye9ada862015-05-11 17:20:37 -07002519 ldrb r1, [r8]
2520 ldrb r0, [r7], #1
2521 strb r1, [r8, #0x10]
2522 strb r0, [r8], #1
Adam Langleyd9e397b2015-01-22 14:27:53 -08002523
Adam Langleye9ada862015-05-11 17:20:37 -07002524 subs r9, #1
2525 bhi .Lxts_dec_steal
Adam Langleyd9e397b2015-01-22 14:27:53 -08002526
Adam Langleye9ada862015-05-11 17:20:37 -07002527 vld1.8 {q0}, [r6]
2528 mov r0, sp
2529 veor q0, q8
2530 mov r1, sp
2531 vst1.8 {q0}, [sp,:128]
2532 mov r2, r10
Adam Langleyd9e397b2015-01-22 14:27:53 -08002533
Adam Langleye9ada862015-05-11 17:20:37 -07002534 bl AES_decrypt
Adam Langleyd9e397b2015-01-22 14:27:53 -08002535
Adam Langleye9ada862015-05-11 17:20:37 -07002536 vld1.8 {q0}, [sp,:128]
2537 veor q0, q0, q8
2538 vst1.8 {q0}, [r6]
2539 mov r3, r4
Adam Langleyd9e397b2015-01-22 14:27:53 -08002540#endif
2541
2542.Lxts_dec_ret:
Adam Langleye9ada862015-05-11 17:20:37 -07002543 bic r0, r3, #0xf
Adam Langleyd9e397b2015-01-22 14:27:53 -08002544 vmov.i32 q0, #0
2545 vmov.i32 q1, #0
2546#ifdef XTS_CHAIN_TWEAK
Adam Langleye9ada862015-05-11 17:20:37 -07002547 ldr r1, [r3, #0x20+VFP_ABI_FRAME] @ chain tweak
Adam Langleyd9e397b2015-01-22 14:27:53 -08002548#endif
Adam Langleye9ada862015-05-11 17:20:37 -07002549.Lxts_dec_bzero:@ wipe key schedule [if any]
2550 vstmia sp!, {q0,q1}
2551 cmp sp, r0
2552 bne .Lxts_dec_bzero
Adam Langleyd9e397b2015-01-22 14:27:53 -08002553
Adam Langleye9ada862015-05-11 17:20:37 -07002554 mov sp, r3
Adam Langleyd9e397b2015-01-22 14:27:53 -08002555#ifdef XTS_CHAIN_TWEAK
Adam Langleye9ada862015-05-11 17:20:37 -07002556 vst1.8 {q8}, [r1]
Adam Langleyd9e397b2015-01-22 14:27:53 -08002557#endif
2558 VFP_ABI_POP
Adam Langleye9ada862015-05-11 17:20:37 -07002559 ldmia sp!, {r4,r5,r6,r7,r8,r9,r10, pc} @ return
Adam Langleyd9e397b2015-01-22 14:27:53 -08002560
2561.size bsaes_xts_decrypt,.-bsaes_xts_decrypt
2562#endif
David Benjamin4969cc92016-04-22 15:02:23 -04002563#endif