Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/crypto/openssl/arm/bsaes-armv7.S
39482 views
1
/* Do not modify. This file is auto-generated from bsaes-armv7.pl. */
2
@ Copyright 2012-2023 The OpenSSL Project Authors. All Rights Reserved.
3
@
4
@ Licensed under the Apache License 2.0 (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
9
10
@ ====================================================================
11
@ Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
12
@ project. The module is, however, dual licensed under OpenSSL and
13
@ CRYPTOGAMS licenses depending on where you obtain it. For further
14
@ details see http://www.openssl.org/~appro/cryptogams/.
15
@
16
@ Specific modes and adaptation for Linux kernel by Ard Biesheuvel
17
@ of Linaro.
18
@ ====================================================================
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
51
@ Add CBC, CTR and XTS subroutines and adapt for kernel use; courtesy of Ard.
52
53
@ $output is the last argument if it looks like a file (it has an extension)
54
@ $flavour is the first argument if it doesn't look like a file
55
#ifndef __KERNEL__
56
# include "arm_arch.h"
57
58
# define VFP_ABI_PUSH vstmdb sp!,{d8-d15}
59
# define VFP_ABI_POP vldmia sp!,{d8-d15}
60
# define VFP_ABI_FRAME 0x40
61
#else
62
# define VFP_ABI_PUSH
63
# define VFP_ABI_POP
64
# define VFP_ABI_FRAME 0
65
# define BSAES_ASM_EXTENDED_KEY
66
# define XTS_CHAIN_TWEAK
67
# define __ARM_ARCH__ __LINUX_ARM_ARCH__
68
# define __ARM_MAX_ARCH__ 7
69
#endif
70
71
#ifdef __thumb__
72
# define adrl adr
73
#endif
74
75
#if __ARM_MAX_ARCH__>=7
76
.arch armv7-a
77
.fpu neon
78
79
.syntax unified @ ARMv7-capable assembler is expected to handle this
80
#if defined(__thumb2__) && !defined(__APPLE__)
81
.thumb
82
#else
83
.code 32
84
# undef __thumb2__
85
#endif
86
87
.text
88
89
.type _bsaes_decrypt8,%function
90
.align 4
91
_bsaes_decrypt8:
92
adr r6,.
93
vldmia r4!, {q9} @ round 0 key
94
#if defined(__thumb2__) || defined(__APPLE__)
95
adr r6,.LM0ISR
96
#else
97
add r6,r6,#.LM0ISR-_bsaes_decrypt8
98
#endif
99
100
vldmia r6!, {q8} @ .LM0ISR
101
veor q10, q0, q9 @ xor with round0 key
102
veor q11, q1, q9
103
vtbl.8 d0, {q10}, d16
104
vtbl.8 d1, {q10}, d17
105
veor q12, q2, q9
106
vtbl.8 d2, {q11}, d16
107
vtbl.8 d3, {q11}, d17
108
veor q13, q3, q9
109
vtbl.8 d4, {q12}, d16
110
vtbl.8 d5, {q12}, d17
111
veor q14, q4, q9
112
vtbl.8 d6, {q13}, d16
113
vtbl.8 d7, {q13}, d17
114
veor q15, q5, q9
115
vtbl.8 d8, {q14}, d16
116
vtbl.8 d9, {q14}, d17
117
veor q10, q6, q9
118
vtbl.8 d10, {q15}, d16
119
vtbl.8 d11, {q15}, d17
120
veor q11, q7, q9
121
vtbl.8 d12, {q10}, d16
122
vtbl.8 d13, {q10}, d17
123
vtbl.8 d14, {q11}, d16
124
vtbl.8 d15, {q11}, d17
125
vmov.i8 q8,#0x55 @ compose .LBS0
126
vmov.i8 q9,#0x33 @ compose .LBS1
127
vshr.u64 q10, q6, #1
128
vshr.u64 q11, q4, #1
129
veor q10, q10, q7
130
veor q11, q11, q5
131
vand q10, q10, q8
132
vand q11, q11, q8
133
veor q7, q7, q10
134
vshl.u64 q10, q10, #1
135
veor q5, q5, q11
136
vshl.u64 q11, q11, #1
137
veor q6, q6, q10
138
veor q4, q4, q11
139
vshr.u64 q10, q2, #1
140
vshr.u64 q11, q0, #1
141
veor q10, q10, q3
142
veor q11, q11, q1
143
vand q10, q10, q8
144
vand q11, q11, q8
145
veor q3, q3, q10
146
vshl.u64 q10, q10, #1
147
veor q1, q1, q11
148
vshl.u64 q11, q11, #1
149
veor q2, q2, q10
150
veor q0, q0, q11
151
vmov.i8 q8,#0x0f @ compose .LBS2
152
vshr.u64 q10, q5, #2
153
vshr.u64 q11, q4, #2
154
veor q10, q10, q7
155
veor q11, q11, q6
156
vand q10, q10, q9
157
vand q11, q11, q9
158
veor q7, q7, q10
159
vshl.u64 q10, q10, #2
160
veor q6, q6, q11
161
vshl.u64 q11, q11, #2
162
veor q5, q5, q10
163
veor q4, q4, q11
164
vshr.u64 q10, q1, #2
165
vshr.u64 q11, q0, #2
166
veor q10, q10, q3
167
veor q11, q11, q2
168
vand q10, q10, q9
169
vand q11, q11, q9
170
veor q3, q3, q10
171
vshl.u64 q10, q10, #2
172
veor q2, q2, q11
173
vshl.u64 q11, q11, #2
174
veor q1, q1, q10
175
veor q0, q0, q11
176
vshr.u64 q10, q3, #4
177
vshr.u64 q11, q2, #4
178
veor q10, q10, q7
179
veor q11, q11, q6
180
vand q10, q10, q8
181
vand q11, q11, q8
182
veor q7, q7, q10
183
vshl.u64 q10, q10, #4
184
veor q6, q6, q11
185
vshl.u64 q11, q11, #4
186
veor q3, q3, q10
187
veor q2, q2, q11
188
vshr.u64 q10, q1, #4
189
vshr.u64 q11, q0, #4
190
veor q10, q10, q5
191
veor q11, q11, q4
192
vand q10, q10, q8
193
vand q11, q11, q8
194
veor q5, q5, q10
195
vshl.u64 q10, q10, #4
196
veor q4, q4, q11
197
vshl.u64 q11, q11, #4
198
veor q1, q1, q10
199
veor q0, q0, q11
200
sub r5,r5,#1
201
b .Ldec_sbox
202
.align 4
203
.Ldec_loop:
204
vldmia r4!, {q8,q9,q10,q11}
205
veor q8, q8, q0
206
veor q9, q9, q1
207
vtbl.8 d0, {q8}, d24
208
vtbl.8 d1, {q8}, d25
209
vldmia r4!, {q8}
210
veor q10, q10, q2
211
vtbl.8 d2, {q9}, d24
212
vtbl.8 d3, {q9}, d25
213
vldmia r4!, {q9}
214
veor q11, q11, q3
215
vtbl.8 d4, {q10}, d24
216
vtbl.8 d5, {q10}, d25
217
vldmia r4!, {q10}
218
vtbl.8 d6, {q11}, d24
219
vtbl.8 d7, {q11}, d25
220
vldmia r4!, {q11}
221
veor q8, q8, q4
222
veor q9, q9, q5
223
vtbl.8 d8, {q8}, d24
224
vtbl.8 d9, {q8}, d25
225
veor q10, q10, q6
226
vtbl.8 d10, {q9}, d24
227
vtbl.8 d11, {q9}, d25
228
veor q11, q11, q7
229
vtbl.8 d12, {q10}, d24
230
vtbl.8 d13, {q10}, d25
231
vtbl.8 d14, {q11}, d24
232
vtbl.8 d15, {q11}, d25
233
.Ldec_sbox:
234
veor q1, q1, q4
235
veor q3, q3, q4
236
237
veor q4, q4, q7
238
veor q1, q1, q6
239
veor q2, q2, q7
240
veor q6, q6, q4
241
242
veor q0, q0, q1
243
veor q2, q2, q5
244
veor q7, q7, q6
245
veor q3, q3, q0
246
veor q5, q5, q0
247
veor q1, q1, q3
248
veor q11, q3, q0
249
veor q10, q7, q4
250
veor q9, q1, q6
251
veor q13, q4, q0
252
vmov q8, q10
253
veor q12, q5, q2
254
255
vorr q10, q10, q9
256
veor q15, q11, q8
257
vand q14, q11, q12
258
vorr q11, q11, q12
259
veor q12, q12, q9
260
vand q8, q8, q9
261
veor q9, q6, q2
262
vand q15, q15, q12
263
vand q13, q13, q9
264
veor q9, q3, q7
265
veor q12, q1, q5
266
veor q11, q11, q13
267
veor q10, q10, q13
268
vand q13, q9, q12
269
vorr q9, q9, q12
270
veor q11, q11, q15
271
veor q8, q8, q13
272
veor q10, q10, q14
273
veor q9, q9, q15
274
veor q8, q8, q14
275
vand q12, q4, q6
276
veor q9, q9, q14
277
vand q13, q0, q2
278
vand q14, q7, q1
279
vorr q15, q3, q5
280
veor q11, q11, q12
281
veor q9, q9, q14
282
veor q8, q8, q15
283
veor q10, q10, q13
284
285
@ Inv_GF16 0, 1, 2, 3, s0, s1, s2, s3
286
287
@ new smaller inversion
288
289
vand q14, q11, q9
290
vmov q12, q8
291
292
veor q13, q10, q14
293
veor q15, q8, q14
294
veor q14, q8, q14 @ q14=q15
295
296
vbsl q13, q9, q8
297
vbsl q15, q11, q10
298
veor q11, q11, q10
299
300
vbsl q12, q13, q14
301
vbsl q8, q14, q13
302
303
vand q14, q12, q15
304
veor q9, q9, q8
305
306
veor q14, q14, q11
307
veor q12, q5, q2
308
veor q8, q1, q6
309
veor q10, q15, q14
310
vand q10, q10, q5
311
veor q5, q5, q1
312
vand q11, q1, q15
313
vand q5, q5, q14
314
veor q1, q11, q10
315
veor q5, q5, q11
316
veor q15, q15, q13
317
veor q14, q14, q9
318
veor q11, q15, q14
319
veor q10, q13, q9
320
vand q11, q11, q12
321
vand q10, q10, q2
322
veor q12, q12, q8
323
veor q2, q2, q6
324
vand q8, q8, q15
325
vand q6, q6, q13
326
vand q12, q12, q14
327
vand q2, q2, q9
328
veor q8, q8, q12
329
veor q2, q2, q6
330
veor q12, q12, q11
331
veor q6, q6, q10
332
veor q5, q5, q12
333
veor q2, q2, q12
334
veor q1, q1, q8
335
veor q6, q6, q8
336
337
veor q12, q3, q0
338
veor q8, q7, q4
339
veor q11, q15, q14
340
veor q10, q13, q9
341
vand q11, q11, q12
342
vand q10, q10, q0
343
veor q12, q12, q8
344
veor q0, q0, q4
345
vand q8, q8, q15
346
vand q4, q4, q13
347
vand q12, q12, q14
348
vand q0, q0, q9
349
veor q8, q8, q12
350
veor q0, q0, q4
351
veor q12, q12, q11
352
veor q4, q4, q10
353
veor q15, q15, q13
354
veor q14, q14, q9
355
veor q10, q15, q14
356
vand q10, q10, q3
357
veor q3, q3, q7
358
vand q11, q7, q15
359
vand q3, q3, q14
360
veor q7, q11, q10
361
veor q3, q3, q11
362
veor q3, q3, q12
363
veor q0, q0, q12
364
veor q7, q7, q8
365
veor q4, q4, q8
366
veor q1, q1, q7
367
veor q6, q6, q5
368
369
veor q4, q4, q1
370
veor q2, q2, q7
371
veor q5, q5, q7
372
veor q4, q4, q2
373
veor q7, q7, q0
374
veor q4, q4, q5
375
veor q3, q3, q6
376
veor q6, q6, q1
377
veor q3, q3, q4
378
379
veor q4, q4, q0
380
veor q7, q7, q3
381
subs r5,r5,#1
382
bcc .Ldec_done
383
@ multiplication by 0x05-0x00-0x04-0x00
384
vext.8 q8, q0, q0, #8
385
vext.8 q14, q3, q3, #8
386
vext.8 q15, q5, q5, #8
387
veor q8, q8, q0
388
vext.8 q9, q1, q1, #8
389
veor q14, q14, q3
390
vext.8 q10, q6, q6, #8
391
veor q15, q15, q5
392
vext.8 q11, q4, q4, #8
393
veor q9, q9, q1
394
vext.8 q12, q2, q2, #8
395
veor q10, q10, q6
396
vext.8 q13, q7, q7, #8
397
veor q11, q11, q4
398
veor q12, q12, q2
399
veor q13, q13, q7
400
401
veor q0, q0, q14
402
veor q1, q1, q14
403
veor q6, q6, q8
404
veor q2, q2, q10
405
veor q4, q4, q9
406
veor q1, q1, q15
407
veor q6, q6, q15
408
veor q2, q2, q14
409
veor q7, q7, q11
410
veor q4, q4, q14
411
veor q3, q3, q12
412
veor q2, q2, q15
413
veor q7, q7, q15
414
veor q5, q5, q13
415
vext.8 q8, q0, q0, #12 @ x0 <<< 32
416
vext.8 q9, q1, q1, #12
417
veor q0, q0, q8 @ x0 ^ (x0 <<< 32)
418
vext.8 q10, q6, q6, #12
419
veor q1, q1, q9
420
vext.8 q11, q4, q4, #12
421
veor q6, q6, q10
422
vext.8 q12, q2, q2, #12
423
veor q4, q4, q11
424
vext.8 q13, q7, q7, #12
425
veor q2, q2, q12
426
vext.8 q14, q3, q3, #12
427
veor q7, q7, q13
428
vext.8 q15, q5, q5, #12
429
veor q3, q3, q14
430
431
veor q9, q9, q0
432
veor q5, q5, q15
433
vext.8 q0, q0, q0, #8 @ (x0 ^ (x0 <<< 32)) <<< 64)
434
veor q10, q10, q1
435
veor q8, q8, q5
436
veor q9, q9, q5
437
vext.8 q1, q1, q1, #8
438
veor q13, q13, q2
439
veor q0, q0, q8
440
veor q14, q14, q7
441
veor q1, q1, q9
442
vext.8 q8, q2, q2, #8
443
veor q12, q12, q4
444
vext.8 q9, q7, q7, #8
445
veor q15, q15, q3
446
vext.8 q2, q4, q4, #8
447
veor q11, q11, q6
448
vext.8 q7, q5, q5, #8
449
veor q12, q12, q5
450
vext.8 q4, q3, q3, #8
451
veor q11, q11, q5
452
vext.8 q3, q6, q6, #8
453
veor q5, q9, q13
454
veor q11, q11, q2
455
veor q7, q7, q15
456
veor q6, q4, q14
457
veor q4, q8, q12
458
veor q2, q3, q10
459
vmov q3, q11
460
@ vmov q5, q9
461
vldmia r6, {q12} @ .LISR
462
ite eq @ Thumb2 thing, sanity check in ARM
463
addeq r6,r6,#0x10
464
bne .Ldec_loop
465
vldmia r6, {q12} @ .LISRM0
466
b .Ldec_loop
467
.align 4
468
.Ldec_done:
469
vmov.i8 q8,#0x55 @ compose .LBS0
470
vmov.i8 q9,#0x33 @ compose .LBS1
471
vshr.u64 q10, q3, #1
472
vshr.u64 q11, q2, #1
473
veor q10, q10, q5
474
veor q11, q11, q7
475
vand q10, q10, q8
476
vand q11, q11, q8
477
veor q5, q5, q10
478
vshl.u64 q10, q10, #1
479
veor q7, q7, q11
480
vshl.u64 q11, q11, #1
481
veor q3, q3, q10
482
veor q2, q2, q11
483
vshr.u64 q10, q6, #1
484
vshr.u64 q11, q0, #1
485
veor q10, q10, q4
486
veor q11, q11, q1
487
vand q10, q10, q8
488
vand q11, q11, q8
489
veor q4, q4, q10
490
vshl.u64 q10, q10, #1
491
veor q1, q1, q11
492
vshl.u64 q11, q11, #1
493
veor q6, q6, q10
494
veor q0, q0, q11
495
vmov.i8 q8,#0x0f @ compose .LBS2
496
vshr.u64 q10, q7, #2
497
vshr.u64 q11, q2, #2
498
veor q10, q10, q5
499
veor q11, q11, q3
500
vand q10, q10, q9
501
vand q11, q11, q9
502
veor q5, q5, q10
503
vshl.u64 q10, q10, #2
504
veor q3, q3, q11
505
vshl.u64 q11, q11, #2
506
veor q7, q7, q10
507
veor q2, q2, q11
508
vshr.u64 q10, q1, #2
509
vshr.u64 q11, q0, #2
510
veor q10, q10, q4
511
veor q11, q11, q6
512
vand q10, q10, q9
513
vand q11, q11, q9
514
veor q4, q4, q10
515
vshl.u64 q10, q10, #2
516
veor q6, q6, q11
517
vshl.u64 q11, q11, #2
518
veor q1, q1, q10
519
veor q0, q0, q11
520
vshr.u64 q10, q4, #4
521
vshr.u64 q11, q6, #4
522
veor q10, q10, q5
523
veor q11, q11, q3
524
vand q10, q10, q8
525
vand q11, q11, q8
526
veor q5, q5, q10
527
vshl.u64 q10, q10, #4
528
veor q3, q3, q11
529
vshl.u64 q11, q11, #4
530
veor q4, q4, q10
531
veor q6, q6, q11
532
vshr.u64 q10, q1, #4
533
vshr.u64 q11, q0, #4
534
veor q10, q10, q7
535
veor q11, q11, q2
536
vand q10, q10, q8
537
vand q11, q11, q8
538
veor q7, q7, q10
539
vshl.u64 q10, q10, #4
540
veor q2, q2, q11
541
vshl.u64 q11, q11, #4
542
veor q1, q1, q10
543
veor q0, q0, q11
544
vldmia r4, {q8} @ last round key
545
veor q6, q6, q8
546
veor q4, q4, q8
547
veor q2, q2, q8
548
veor q7, q7, q8
549
veor q3, q3, q8
550
veor q5, q5, q8
551
veor q0, q0, q8
552
veor q1, q1, q8
553
bx lr
554
.size _bsaes_decrypt8,.-_bsaes_decrypt8
555
556
.type _bsaes_const,%object
557
.align 6
558
_bsaes_const:
559
.LM0ISR:@ InvShiftRows constants
560
.quad 0x0a0e0206070b0f03, 0x0004080c0d010509
561
.LISR:
562
.quad 0x0504070602010003, 0x0f0e0d0c080b0a09
563
.LISRM0:
564
.quad 0x01040b0e0205080f, 0x0306090c00070a0d
565
.LM0SR:@ ShiftRows constants
566
.quad 0x0a0e02060f03070b, 0x0004080c05090d01
567
.LSR:
568
.quad 0x0504070600030201, 0x0f0e0d0c0a09080b
569
.LSRM0:
570
.quad 0x0304090e00050a0f, 0x01060b0c0207080d
571
.LM0:
572
.quad 0x02060a0e03070b0f, 0x0004080c0105090d
573
.LREVM0SR:
574
.quad 0x090d01050c000408, 0x03070b0f060a0e02
575
.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
576
.align 2
577
.align 6
578
.size _bsaes_const,.-_bsaes_const
579
580
.type _bsaes_encrypt8,%function
581
.align 4
582
_bsaes_encrypt8:
583
adr r6,.
584
vldmia r4!, {q9} @ round 0 key
585
#if defined(__thumb2__) || defined(__APPLE__)
586
adr r6,.LM0SR
587
#else
588
sub r6,r6,#_bsaes_encrypt8-.LM0SR
589
#endif
590
591
vldmia r6!, {q8} @ .LM0SR
592
_bsaes_encrypt8_alt:
593
veor q10, q0, q9 @ xor with round0 key
594
veor q11, q1, q9
595
vtbl.8 d0, {q10}, d16
596
vtbl.8 d1, {q10}, d17
597
veor q12, q2, q9
598
vtbl.8 d2, {q11}, d16
599
vtbl.8 d3, {q11}, d17
600
veor q13, q3, q9
601
vtbl.8 d4, {q12}, d16
602
vtbl.8 d5, {q12}, d17
603
veor q14, q4, q9
604
vtbl.8 d6, {q13}, d16
605
vtbl.8 d7, {q13}, d17
606
veor q15, q5, q9
607
vtbl.8 d8, {q14}, d16
608
vtbl.8 d9, {q14}, d17
609
veor q10, q6, q9
610
vtbl.8 d10, {q15}, d16
611
vtbl.8 d11, {q15}, d17
612
veor q11, q7, q9
613
vtbl.8 d12, {q10}, d16
614
vtbl.8 d13, {q10}, d17
615
vtbl.8 d14, {q11}, d16
616
vtbl.8 d15, {q11}, d17
617
_bsaes_encrypt8_bitslice:
618
vmov.i8 q8,#0x55 @ compose .LBS0
619
vmov.i8 q9,#0x33 @ compose .LBS1
620
vshr.u64 q10, q6, #1
621
vshr.u64 q11, q4, #1
622
veor q10, q10, q7
623
veor q11, q11, q5
624
vand q10, q10, q8
625
vand q11, q11, q8
626
veor q7, q7, q10
627
vshl.u64 q10, q10, #1
628
veor q5, q5, q11
629
vshl.u64 q11, q11, #1
630
veor q6, q6, q10
631
veor q4, q4, q11
632
vshr.u64 q10, q2, #1
633
vshr.u64 q11, q0, #1
634
veor q10, q10, q3
635
veor q11, q11, q1
636
vand q10, q10, q8
637
vand q11, q11, q8
638
veor q3, q3, q10
639
vshl.u64 q10, q10, #1
640
veor q1, q1, q11
641
vshl.u64 q11, q11, #1
642
veor q2, q2, q10
643
veor q0, q0, q11
644
vmov.i8 q8,#0x0f @ compose .LBS2
645
vshr.u64 q10, q5, #2
646
vshr.u64 q11, q4, #2
647
veor q10, q10, q7
648
veor q11, q11, q6
649
vand q10, q10, q9
650
vand q11, q11, q9
651
veor q7, q7, q10
652
vshl.u64 q10, q10, #2
653
veor q6, q6, q11
654
vshl.u64 q11, q11, #2
655
veor q5, q5, q10
656
veor q4, q4, q11
657
vshr.u64 q10, q1, #2
658
vshr.u64 q11, q0, #2
659
veor q10, q10, q3
660
veor q11, q11, q2
661
vand q10, q10, q9
662
vand q11, q11, q9
663
veor q3, q3, q10
664
vshl.u64 q10, q10, #2
665
veor q2, q2, q11
666
vshl.u64 q11, q11, #2
667
veor q1, q1, q10
668
veor q0, q0, q11
669
vshr.u64 q10, q3, #4
670
vshr.u64 q11, q2, #4
671
veor q10, q10, q7
672
veor q11, q11, q6
673
vand q10, q10, q8
674
vand q11, q11, q8
675
veor q7, q7, q10
676
vshl.u64 q10, q10, #4
677
veor q6, q6, q11
678
vshl.u64 q11, q11, #4
679
veor q3, q3, q10
680
veor q2, q2, q11
681
vshr.u64 q10, q1, #4
682
vshr.u64 q11, q0, #4
683
veor q10, q10, q5
684
veor q11, q11, q4
685
vand q10, q10, q8
686
vand q11, q11, q8
687
veor q5, q5, q10
688
vshl.u64 q10, q10, #4
689
veor q4, q4, q11
690
vshl.u64 q11, q11, #4
691
veor q1, q1, q10
692
veor q0, q0, q11
693
sub r5,r5,#1
694
b .Lenc_sbox
695
.align 4
696
.Lenc_loop:
697
vldmia r4!, {q8,q9,q10,q11}
698
veor q8, q8, q0
699
veor q9, q9, q1
700
vtbl.8 d0, {q8}, d24
701
vtbl.8 d1, {q8}, d25
702
vldmia r4!, {q8}
703
veor q10, q10, q2
704
vtbl.8 d2, {q9}, d24
705
vtbl.8 d3, {q9}, d25
706
vldmia r4!, {q9}
707
veor q11, q11, q3
708
vtbl.8 d4, {q10}, d24
709
vtbl.8 d5, {q10}, d25
710
vldmia r4!, {q10}
711
vtbl.8 d6, {q11}, d24
712
vtbl.8 d7, {q11}, d25
713
vldmia r4!, {q11}
714
veor q8, q8, q4
715
veor q9, q9, q5
716
vtbl.8 d8, {q8}, d24
717
vtbl.8 d9, {q8}, d25
718
veor q10, q10, q6
719
vtbl.8 d10, {q9}, d24
720
vtbl.8 d11, {q9}, d25
721
veor q11, q11, q7
722
vtbl.8 d12, {q10}, d24
723
vtbl.8 d13, {q10}, d25
724
vtbl.8 d14, {q11}, d24
725
vtbl.8 d15, {q11}, d25
726
.Lenc_sbox:
727
veor q2, q2, q1
728
veor q5, q5, q6
729
veor q3, q3, q0
730
veor q6, q6, q2
731
veor q5, q5, q0
732
733
veor q6, q6, q3
734
veor q3, q3, q7
735
veor q7, q7, q5
736
veor q3, q3, q4
737
veor q4, q4, q5
738
739
veor q2, q2, q7
740
veor q3, q3, q1
741
veor q1, q1, q5
742
veor q11, q7, q4
743
veor q10, q1, q2
744
veor q9, q5, q3
745
veor q13, q2, q4
746
vmov q8, q10
747
veor q12, q6, q0
748
749
vorr q10, q10, q9
750
veor q15, q11, q8
751
vand q14, q11, q12
752
vorr q11, q11, q12
753
veor q12, q12, q9
754
vand q8, q8, q9
755
veor q9, q3, q0
756
vand q15, q15, q12
757
vand q13, q13, q9
758
veor q9, q7, q1
759
veor q12, q5, q6
760
veor q11, q11, q13
761
veor q10, q10, q13
762
vand q13, q9, q12
763
vorr q9, q9, q12
764
veor q11, q11, q15
765
veor q8, q8, q13
766
veor q10, q10, q14
767
veor q9, q9, q15
768
veor q8, q8, q14
769
vand q12, q2, q3
770
veor q9, q9, q14
771
vand q13, q4, q0
772
vand q14, q1, q5
773
vorr q15, q7, q6
774
veor q11, q11, q12
775
veor q9, q9, q14
776
veor q8, q8, q15
777
veor q10, q10, q13
778
779
@ Inv_GF16 0, 1, 2, 3, s0, s1, s2, s3
780
781
@ new smaller inversion
782
783
vand q14, q11, q9
784
vmov q12, q8
785
786
veor q13, q10, q14
787
veor q15, q8, q14
788
veor q14, q8, q14 @ q14=q15
789
790
vbsl q13, q9, q8
791
vbsl q15, q11, q10
792
veor q11, q11, q10
793
794
vbsl q12, q13, q14
795
vbsl q8, q14, q13
796
797
vand q14, q12, q15
798
veor q9, q9, q8
799
800
veor q14, q14, q11
801
veor q12, q6, q0
802
veor q8, q5, q3
803
veor q10, q15, q14
804
vand q10, q10, q6
805
veor q6, q6, q5
806
vand q11, q5, q15
807
vand q6, q6, q14
808
veor q5, q11, q10
809
veor q6, q6, q11
810
veor q15, q15, q13
811
veor q14, q14, q9
812
veor q11, q15, q14
813
veor q10, q13, q9
814
vand q11, q11, q12
815
vand q10, q10, q0
816
veor q12, q12, q8
817
veor q0, q0, q3
818
vand q8, q8, q15
819
vand q3, q3, q13
820
vand q12, q12, q14
821
vand q0, q0, q9
822
veor q8, q8, q12
823
veor q0, q0, q3
824
veor q12, q12, q11
825
veor q3, q3, q10
826
veor q6, q6, q12
827
veor q0, q0, q12
828
veor q5, q5, q8
829
veor q3, q3, q8
830
831
veor q12, q7, q4
832
veor q8, q1, q2
833
veor q11, q15, q14
834
veor q10, q13, q9
835
vand q11, q11, q12
836
vand q10, q10, q4
837
veor q12, q12, q8
838
veor q4, q4, q2
839
vand q8, q8, q15
840
vand q2, q2, q13
841
vand q12, q12, q14
842
vand q4, q4, q9
843
veor q8, q8, q12
844
veor q4, q4, q2
845
veor q12, q12, q11
846
veor q2, q2, q10
847
veor q15, q15, q13
848
veor q14, q14, q9
849
veor q10, q15, q14
850
vand q10, q10, q7
851
veor q7, q7, q1
852
vand q11, q1, q15
853
vand q7, q7, q14
854
veor q1, q11, q10
855
veor q7, q7, q11
856
veor q7, q7, q12
857
veor q4, q4, q12
858
veor q1, q1, q8
859
veor q2, q2, q8
860
veor q7, q7, q0
861
veor q1, q1, q6
862
veor q6, q6, q0
863
veor q4, q4, q7
864
veor q0, q0, q1
865
866
veor q1, q1, q5
867
veor q5, q5, q2
868
veor q2, q2, q3
869
veor q3, q3, q5
870
veor q4, q4, q5
871
872
veor q6, q6, q3
873
subs r5,r5,#1
874
bcc .Lenc_done
875
vext.8 q8, q0, q0, #12 @ x0 <<< 32
876
vext.8 q9, q1, q1, #12
877
veor q0, q0, q8 @ x0 ^ (x0 <<< 32)
878
vext.8 q10, q4, q4, #12
879
veor q1, q1, q9
880
vext.8 q11, q6, q6, #12
881
veor q4, q4, q10
882
vext.8 q12, q3, q3, #12
883
veor q6, q6, q11
884
vext.8 q13, q7, q7, #12
885
veor q3, q3, q12
886
vext.8 q14, q2, q2, #12
887
veor q7, q7, q13
888
vext.8 q15, q5, q5, #12
889
veor q2, q2, q14
890
891
veor q9, q9, q0
892
veor q5, q5, q15
893
vext.8 q0, q0, q0, #8 @ (x0 ^ (x0 <<< 32)) <<< 64)
894
veor q10, q10, q1
895
veor q8, q8, q5
896
veor q9, q9, q5
897
vext.8 q1, q1, q1, #8
898
veor q13, q13, q3
899
veor q0, q0, q8
900
veor q14, q14, q7
901
veor q1, q1, q9
902
vext.8 q8, q3, q3, #8
903
veor q12, q12, q6
904
vext.8 q9, q7, q7, #8
905
veor q15, q15, q2
906
vext.8 q3, q6, q6, #8
907
veor q11, q11, q4
908
vext.8 q7, q5, q5, #8
909
veor q12, q12, q5
910
vext.8 q6, q2, q2, #8
911
veor q11, q11, q5
912
vext.8 q2, q4, q4, #8
913
veor q5, q9, q13
914
veor q4, q8, q12
915
veor q3, q3, q11
916
veor q7, q7, q15
917
veor q6, q6, q14
918
@ vmov q4, q8
919
veor q2, q2, q10
920
@ vmov q5, q9
921
vldmia r6, {q12} @ .LSR
922
ite eq @ Thumb2 thing, samity check in ARM
923
addeq r6,r6,#0x10
924
bne .Lenc_loop
925
vldmia r6, {q12} @ .LSRM0
926
b .Lenc_loop
927
.align 4
928
.Lenc_done:
929
vmov.i8 q8,#0x55 @ compose .LBS0
930
vmov.i8 q9,#0x33 @ compose .LBS1
931
vshr.u64 q10, q2, #1
932
vshr.u64 q11, q3, #1
933
veor q10, q10, q5
934
veor q11, q11, q7
935
vand q10, q10, q8
936
vand q11, q11, q8
937
veor q5, q5, q10
938
vshl.u64 q10, q10, #1
939
veor q7, q7, q11
940
vshl.u64 q11, q11, #1
941
veor q2, q2, q10
942
veor q3, q3, q11
943
vshr.u64 q10, q4, #1
944
vshr.u64 q11, q0, #1
945
veor q10, q10, q6
946
veor q11, q11, q1
947
vand q10, q10, q8
948
vand q11, q11, q8
949
veor q6, q6, q10
950
vshl.u64 q10, q10, #1
951
veor q1, q1, q11
952
vshl.u64 q11, q11, #1
953
veor q4, q4, q10
954
veor q0, q0, q11
955
vmov.i8 q8,#0x0f @ compose .LBS2
956
vshr.u64 q10, q7, #2
957
vshr.u64 q11, q3, #2
958
veor q10, q10, q5
959
veor q11, q11, q2
960
vand q10, q10, q9
961
vand q11, q11, q9
962
veor q5, q5, q10
963
vshl.u64 q10, q10, #2
964
veor q2, q2, q11
965
vshl.u64 q11, q11, #2
966
veor q7, q7, q10
967
veor q3, q3, q11
968
vshr.u64 q10, q1, #2
969
vshr.u64 q11, q0, #2
970
veor q10, q10, q6
971
veor q11, q11, q4
972
vand q10, q10, q9
973
vand q11, q11, q9
974
veor q6, q6, q10
975
vshl.u64 q10, q10, #2
976
veor q4, q4, q11
977
vshl.u64 q11, q11, #2
978
veor q1, q1, q10
979
veor q0, q0, q11
980
vshr.u64 q10, q6, #4
981
vshr.u64 q11, q4, #4
982
veor q10, q10, q5
983
veor q11, q11, q2
984
vand q10, q10, q8
985
vand q11, q11, q8
986
veor q5, q5, q10
987
vshl.u64 q10, q10, #4
988
veor q2, q2, q11
989
vshl.u64 q11, q11, #4
990
veor q6, q6, q10
991
veor q4, q4, q11
992
vshr.u64 q10, q1, #4
993
vshr.u64 q11, q0, #4
994
veor q10, q10, q7
995
veor q11, q11, q3
996
vand q10, q10, q8
997
vand q11, q11, q8
998
veor q7, q7, q10
999
vshl.u64 q10, q10, #4
1000
veor q3, q3, q11
1001
vshl.u64 q11, q11, #4
1002
veor q1, q1, q10
1003
veor q0, q0, q11
1004
vldmia r4, {q8} @ last round key
1005
veor q4, q4, q8
1006
veor q6, q6, q8
1007
veor q3, q3, q8
1008
veor q7, q7, q8
1009
veor q2, q2, q8
1010
veor q5, q5, q8
1011
veor q0, q0, q8
1012
veor q1, q1, q8
1013
bx lr
1014
.size _bsaes_encrypt8,.-_bsaes_encrypt8
1015
.type _bsaes_key_convert,%function
1016
.align 4
1017
_bsaes_key_convert:
1018
adr r6,.
1019
vld1.8 {q7}, [r4]! @ load round 0 key
1020
#if defined(__thumb2__) || defined(__APPLE__)
1021
adr r6,.LM0
1022
#else
1023
sub r6,r6,#_bsaes_key_convert-.LM0
1024
#endif
1025
vld1.8 {q15}, [r4]! @ load round 1 key
1026
1027
vmov.i8 q8, #0x01 @ bit masks
1028
vmov.i8 q9, #0x02
1029
vmov.i8 q10, #0x04
1030
vmov.i8 q11, #0x08
1031
vmov.i8 q12, #0x10
1032
vmov.i8 q13, #0x20
1033
vldmia r6, {q14} @ .LM0
1034
1035
#ifdef __ARMEL__
1036
vrev32.8 q7, q7
1037
vrev32.8 q15, q15
1038
#endif
1039
sub r5,r5,#1
1040
vstmia r12!, {q7} @ save round 0 key
1041
b .Lkey_loop
1042
1043
.align 4
1044
.Lkey_loop:
1045
vtbl.8 d14,{q15},d28
1046
vtbl.8 d15,{q15},d29
1047
vmov.i8 q6, #0x40
1048
vmov.i8 q15, #0x80
1049
1050
vtst.8 q0, q7, q8
1051
vtst.8 q1, q7, q9
1052
vtst.8 q2, q7, q10
1053
vtst.8 q3, q7, q11
1054
vtst.8 q4, q7, q12
1055
vtst.8 q5, q7, q13
1056
vtst.8 q6, q7, q6
1057
vtst.8 q7, q7, q15
1058
vld1.8 {q15}, [r4]! @ load next round key
1059
vmvn q0, q0 @ "pnot"
1060
vmvn q1, q1
1061
vmvn q5, q5
1062
vmvn q6, q6
1063
#ifdef __ARMEL__
1064
vrev32.8 q15, q15
1065
#endif
1066
subs r5,r5,#1
1067
vstmia r12!,{q0,q1,q2,q3,q4,q5,q6,q7} @ write bit-sliced round key
1068
bne .Lkey_loop
1069
1070
vmov.i8 q7,#0x63 @ compose .L63
1071
@ don't save last round key
1072
bx lr
1073
.size _bsaes_key_convert,.-_bsaes_key_convert
1074
1075
1076
1077
.globl ossl_bsaes_cbc_encrypt
1078
.type ossl_bsaes_cbc_encrypt,%function
1079
.align 5
1080
ossl_bsaes_cbc_encrypt:
1081
#ifndef __KERNEL__
1082
cmp r2, #128
1083
#ifndef __thumb__
1084
blo AES_cbc_encrypt
1085
#else
1086
bhs .Lcbc_do_bsaes
1087
b AES_cbc_encrypt
1088
.Lcbc_do_bsaes:
1089
#endif
1090
#endif
1091
1092
@ it is up to the caller to make sure we are called with enc == 0
1093
1094
mov ip, sp
1095
stmdb sp!, {r4,r5,r6,r7,r8,r9,r10, lr}
1096
VFP_ABI_PUSH
1097
ldr r8, [ip] @ IV is 1st arg on the stack
1098
mov r2, r2, lsr#4 @ len in 16 byte blocks
1099
sub sp, #0x10 @ scratch space to carry over the IV
1100
mov r9, sp @ save sp
1101
1102
ldr r10, [r3, #240] @ get # of rounds
1103
#ifndef BSAES_ASM_EXTENDED_KEY
1104
@ allocate the key schedule on the stack
1105
sub r12, sp, r10, lsl#7 @ 128 bytes per inner round key
1106
add r12, #96 @ sifze of bit-slices key schedule
1107
1108
@ populate the key schedule
1109
mov r4, r3 @ pass key
1110
mov r5, r10 @ pass # of rounds
1111
mov sp, r12 @ sp is sp
1112
bl _bsaes_key_convert
1113
vldmia sp, {q6}
1114
vstmia r12, {q15} @ save last round key
1115
veor q7, q7, q6 @ fix up round 0 key
1116
vstmia sp, {q7}
1117
#else
1118
ldr r12, [r3, #244]
1119
eors r12, #1
1120
beq 0f
1121
1122
@ populate the key schedule
1123
str r12, [r3, #244]
1124
mov r4, r3 @ pass key
1125
mov r5, r10 @ pass # of rounds
1126
add r12, r3, #248 @ pass key schedule
1127
bl _bsaes_key_convert
1128
add r4, r3, #248
1129
vldmia r4, {q6}
1130
vstmia r12, {q15} @ save last round key
1131
veor q7, q7, q6 @ fix up round 0 key
1132
vstmia r4, {q7}
1133
1134
.align 2
1135
0:
1136
#endif
1137
1138
vld1.8 {q15}, [r8] @ load IV
1139
b .Lcbc_dec_loop
1140
1141
.align 4
1142
.Lcbc_dec_loop:
1143
subs r2, r2, #0x8
1144
bmi .Lcbc_dec_loop_finish
1145
1146
vld1.8 {q0,q1}, [r0]! @ load input
1147
vld1.8 {q2,q3}, [r0]!
1148
#ifndef BSAES_ASM_EXTENDED_KEY
1149
mov r4, sp @ pass the key
1150
#else
1151
add r4, r3, #248
1152
#endif
1153
vld1.8 {q4,q5}, [r0]!
1154
mov r5, r10
1155
vld1.8 {q6,q7}, [r0]
1156
sub r0, r0, #0x60
1157
vstmia r9, {q15} @ put aside IV
1158
1159
bl _bsaes_decrypt8
1160
1161
vldmia r9, {q14} @ reload IV
1162
vld1.8 {q8,q9}, [r0]! @ reload input
1163
veor q0, q0, q14 @ ^= IV
1164
vld1.8 {q10,q11}, [r0]!
1165
veor q1, q1, q8
1166
veor q6, q6, q9
1167
vld1.8 {q12,q13}, [r0]!
1168
veor q4, q4, q10
1169
veor q2, q2, q11
1170
vld1.8 {q14,q15}, [r0]!
1171
veor q7, q7, q12
1172
vst1.8 {q0,q1}, [r1]! @ write output
1173
veor q3, q3, q13
1174
vst1.8 {q6}, [r1]!
1175
veor q5, q5, q14
1176
vst1.8 {q4}, [r1]!
1177
vst1.8 {q2}, [r1]!
1178
vst1.8 {q7}, [r1]!
1179
vst1.8 {q3}, [r1]!
1180
vst1.8 {q5}, [r1]!
1181
1182
b .Lcbc_dec_loop
1183
1184
.Lcbc_dec_loop_finish:
1185
adds r2, r2, #8
1186
beq .Lcbc_dec_done
1187
1188
vld1.8 {q0}, [r0]! @ load input
1189
cmp r2, #2
1190
blo .Lcbc_dec_one
1191
vld1.8 {q1}, [r0]!
1192
#ifndef BSAES_ASM_EXTENDED_KEY
1193
mov r4, sp @ pass the key
1194
#else
1195
add r4, r3, #248
1196
#endif
1197
mov r5, r10
1198
vstmia r9, {q15} @ put aside IV
1199
beq .Lcbc_dec_two
1200
vld1.8 {q2}, [r0]!
1201
cmp r2, #4
1202
blo .Lcbc_dec_three
1203
vld1.8 {q3}, [r0]!
1204
beq .Lcbc_dec_four
1205
vld1.8 {q4}, [r0]!
1206
cmp r2, #6
1207
blo .Lcbc_dec_five
1208
vld1.8 {q5}, [r0]!
1209
beq .Lcbc_dec_six
1210
vld1.8 {q6}, [r0]!
1211
sub r0, r0, #0x70
1212
1213
bl _bsaes_decrypt8
1214
1215
vldmia r9, {q14} @ reload IV
1216
vld1.8 {q8,q9}, [r0]! @ reload input
1217
veor q0, q0, q14 @ ^= IV
1218
vld1.8 {q10,q11}, [r0]!
1219
veor q1, q1, q8
1220
veor q6, q6, q9
1221
vld1.8 {q12,q13}, [r0]!
1222
veor q4, q4, q10
1223
veor q2, q2, q11
1224
vld1.8 {q15}, [r0]!
1225
veor q7, q7, q12
1226
vst1.8 {q0,q1}, [r1]! @ write output
1227
veor q3, q3, q13
1228
vst1.8 {q6}, [r1]!
1229
vst1.8 {q4}, [r1]!
1230
vst1.8 {q2}, [r1]!
1231
vst1.8 {q7}, [r1]!
1232
vst1.8 {q3}, [r1]!
1233
b .Lcbc_dec_done
1234
.align 4
1235
.Lcbc_dec_six:
1236
sub r0, r0, #0x60
1237
bl _bsaes_decrypt8
1238
vldmia r9,{q14} @ reload IV
1239
vld1.8 {q8,q9}, [r0]! @ reload input
1240
veor q0, q0, q14 @ ^= IV
1241
vld1.8 {q10,q11}, [r0]!
1242
veor q1, q1, q8
1243
veor q6, q6, q9
1244
vld1.8 {q12}, [r0]!
1245
veor q4, q4, q10
1246
veor q2, q2, q11
1247
vld1.8 {q15}, [r0]!
1248
veor q7, q7, q12
1249
vst1.8 {q0,q1}, [r1]! @ write output
1250
vst1.8 {q6}, [r1]!
1251
vst1.8 {q4}, [r1]!
1252
vst1.8 {q2}, [r1]!
1253
vst1.8 {q7}, [r1]!
1254
b .Lcbc_dec_done
1255
.align 4
1256
.Lcbc_dec_five:
1257
sub r0, r0, #0x50
1258
bl _bsaes_decrypt8
1259
vldmia r9, {q14} @ reload IV
1260
vld1.8 {q8,q9}, [r0]! @ reload input
1261
veor q0, q0, q14 @ ^= IV
1262
vld1.8 {q10,q11}, [r0]!
1263
veor q1, q1, q8
1264
veor q6, q6, q9
1265
vld1.8 {q15}, [r0]!
1266
veor q4, q4, q10
1267
vst1.8 {q0,q1}, [r1]! @ write output
1268
veor q2, q2, q11
1269
vst1.8 {q6}, [r1]!
1270
vst1.8 {q4}, [r1]!
1271
vst1.8 {q2}, [r1]!
1272
b .Lcbc_dec_done
1273
.align 4
1274
.Lcbc_dec_four:
1275
sub r0, r0, #0x40
1276
bl _bsaes_decrypt8
1277
vldmia r9, {q14} @ reload IV
1278
vld1.8 {q8,q9}, [r0]! @ reload input
1279
veor q0, q0, q14 @ ^= IV
1280
vld1.8 {q10}, [r0]!
1281
veor q1, q1, q8
1282
veor q6, q6, q9
1283
vld1.8 {q15}, [r0]!
1284
veor q4, q4, q10
1285
vst1.8 {q0,q1}, [r1]! @ write output
1286
vst1.8 {q6}, [r1]!
1287
vst1.8 {q4}, [r1]!
1288
b .Lcbc_dec_done
1289
.align 4
1290
.Lcbc_dec_three:
1291
sub r0, r0, #0x30
1292
bl _bsaes_decrypt8
1293
vldmia r9, {q14} @ reload IV
1294
vld1.8 {q8,q9}, [r0]! @ reload input
1295
veor q0, q0, q14 @ ^= IV
1296
vld1.8 {q15}, [r0]!
1297
veor q1, q1, q8
1298
veor q6, q6, q9
1299
vst1.8 {q0,q1}, [r1]! @ write output
1300
vst1.8 {q6}, [r1]!
1301
b .Lcbc_dec_done
1302
.align 4
1303
.Lcbc_dec_two:
1304
sub r0, r0, #0x20
1305
bl _bsaes_decrypt8
1306
vldmia r9, {q14} @ reload IV
1307
vld1.8 {q8}, [r0]! @ reload input
1308
veor q0, q0, q14 @ ^= IV
1309
vld1.8 {q15}, [r0]! @ reload input
1310
veor q1, q1, q8
1311
vst1.8 {q0,q1}, [r1]! @ write output
1312
b .Lcbc_dec_done
1313
.align 4
1314
.Lcbc_dec_one:
1315
sub r0, r0, #0x10
1316
mov r10, r1 @ save original out pointer
1317
mov r1, r9 @ use the iv scratch space as out buffer
1318
mov r2, r3
1319
vmov q4,q15 @ just in case ensure that IV
1320
vmov q5,q0 @ and input are preserved
1321
bl AES_decrypt
1322
vld1.8 {q0}, [r9] @ load result
1323
veor q0, q0, q4 @ ^= IV
1324
vmov q15, q5 @ q5 holds input
1325
vst1.8 {q0}, [r10] @ write output
1326
1327
.Lcbc_dec_done:
1328
#ifndef BSAES_ASM_EXTENDED_KEY
1329
vmov.i32 q0, #0
1330
vmov.i32 q1, #0
1331
.Lcbc_dec_bzero:@ wipe key schedule [if any]
1332
vstmia sp!, {q0,q1}
1333
cmp sp, r9
1334
bne .Lcbc_dec_bzero
1335
#endif
1336
1337
mov sp, r9
1338
add sp, #0x10 @ add sp,r9,#0x10 is no good for thumb
1339
vst1.8 {q15}, [r8] @ return IV
1340
VFP_ABI_POP
1341
ldmia sp!, {r4,r5,r6,r7,r8,r9,r10, pc}
1342
.size ossl_bsaes_cbc_encrypt,.-ossl_bsaes_cbc_encrypt
1343
1344
.globl ossl_bsaes_ctr32_encrypt_blocks
1345
.type ossl_bsaes_ctr32_encrypt_blocks,%function
1346
.align 5
1347
ossl_bsaes_ctr32_encrypt_blocks:
1348
cmp r2, #8 @ use plain AES for
1349
blo .Lctr_enc_short @ small sizes
1350
1351
mov ip, sp
1352
stmdb sp!, {r4,r5,r6,r7,r8,r9,r10, lr}
1353
VFP_ABI_PUSH
1354
ldr r8, [ip] @ ctr is 1st arg on the stack
1355
sub sp, sp, #0x10 @ scratch space to carry over the ctr
1356
mov r9, sp @ save sp
1357
1358
ldr r10, [r3, #240] @ get # of rounds
1359
#ifndef BSAES_ASM_EXTENDED_KEY
1360
@ allocate the key schedule on the stack
1361
sub r12, sp, r10, lsl#7 @ 128 bytes per inner round key
1362
add r12, #96 @ size of bit-sliced key schedule
1363
1364
@ populate the key schedule
1365
mov r4, r3 @ pass key
1366
mov r5, r10 @ pass # of rounds
1367
mov sp, r12 @ sp is sp
1368
bl _bsaes_key_convert
1369
veor q7,q7,q15 @ fix up last round key
1370
vstmia r12, {q7} @ save last round key
1371
1372
vld1.8 {q0}, [r8] @ load counter
1373
#ifdef __APPLE__
1374
mov r8, #:lower16:(.LREVM0SR-.LM0)
1375
add r8, r6, r8
1376
#else
1377
add r8, r6, #.LREVM0SR-.LM0 @ borrow r8
1378
#endif
1379
vldmia sp, {q4} @ load round0 key
1380
#else
1381
ldr r12, [r3, #244]
1382
eors r12, #1
1383
beq 0f
1384
1385
@ populate the key schedule
1386
str r12, [r3, #244]
1387
mov r4, r3 @ pass key
1388
mov r5, r10 @ pass # of rounds
1389
add r12, r3, #248 @ pass key schedule
1390
bl _bsaes_key_convert
1391
veor q7,q7,q15 @ fix up last round key
1392
vstmia r12, {q7} @ save last round key
1393
1394
.align 2
1395
0: add r12, r3, #248
1396
vld1.8 {q0}, [r8] @ load counter
1397
add r8, r6, #.LREVM0SR-.LM0 @ borrow r8
1398
vldmia r12, {q4} @ load round0 key
1399
sub sp, #0x10 @ place for adjusted round0 key
1400
#endif
1401
1402
vmov.i32 q8,#1 @ compose 1<<96
1403
veor q9,q9,q9
1404
vrev32.8 q0,q0
1405
vext.8 q8,q9,q8,#4
1406
vrev32.8 q4,q4
1407
vadd.u32 q9,q8,q8 @ compose 2<<96
1408
vstmia sp, {q4} @ save adjusted round0 key
1409
b .Lctr_enc_loop
1410
1411
.align 4
1412
.Lctr_enc_loop:
1413
vadd.u32 q10, q8, q9 @ compose 3<<96
1414
vadd.u32 q1, q0, q8 @ +1
1415
vadd.u32 q2, q0, q9 @ +2
1416
vadd.u32 q3, q0, q10 @ +3
1417
vadd.u32 q4, q1, q10
1418
vadd.u32 q5, q2, q10
1419
vadd.u32 q6, q3, q10
1420
vadd.u32 q7, q4, q10
1421
vadd.u32 q10, q5, q10 @ next counter
1422
1423
@ Borrow prologue from _bsaes_encrypt8 to use the opportunity
1424
@ to flip byte order in 32-bit counter
1425
1426
vldmia sp, {q9} @ load round0 key
1427
#ifndef BSAES_ASM_EXTENDED_KEY
1428
add r4, sp, #0x10 @ pass next round key
1429
#else
1430
add r4, r3, #264
1431
#endif
1432
vldmia r8, {q8} @ .LREVM0SR
1433
mov r5, r10 @ pass rounds
1434
vstmia r9, {q10} @ save next counter
1435
#ifdef __APPLE__
1436
mov r6, #:lower16:(.LREVM0SR-.LSR)
1437
sub r6, r8, r6
1438
#else
1439
sub r6, r8, #.LREVM0SR-.LSR @ pass constants
1440
#endif
1441
1442
bl _bsaes_encrypt8_alt
1443
1444
subs r2, r2, #8
1445
blo .Lctr_enc_loop_done
1446
1447
vld1.8 {q8,q9}, [r0]! @ load input
1448
vld1.8 {q10,q11}, [r0]!
1449
veor q0, q8
1450
veor q1, q9
1451
vld1.8 {q12,q13}, [r0]!
1452
veor q4, q10
1453
veor q6, q11
1454
vld1.8 {q14,q15}, [r0]!
1455
veor q3, q12
1456
vst1.8 {q0,q1}, [r1]! @ write output
1457
veor q7, q13
1458
veor q2, q14
1459
vst1.8 {q4}, [r1]!
1460
veor q5, q15
1461
vst1.8 {q6}, [r1]!
1462
vmov.i32 q8, #1 @ compose 1<<96
1463
vst1.8 {q3}, [r1]!
1464
veor q9, q9, q9
1465
vst1.8 {q7}, [r1]!
1466
vext.8 q8, q9, q8, #4
1467
vst1.8 {q2}, [r1]!
1468
vadd.u32 q9,q8,q8 @ compose 2<<96
1469
vst1.8 {q5}, [r1]!
1470
vldmia r9, {q0} @ load counter
1471
1472
bne .Lctr_enc_loop
1473
b .Lctr_enc_done
1474
1475
.align 4
1476
.Lctr_enc_loop_done:
1477
add r2, r2, #8
1478
vld1.8 {q8}, [r0]! @ load input
1479
veor q0, q8
1480
vst1.8 {q0}, [r1]! @ write output
1481
cmp r2, #2
1482
blo .Lctr_enc_done
1483
vld1.8 {q9}, [r0]!
1484
veor q1, q9
1485
vst1.8 {q1}, [r1]!
1486
beq .Lctr_enc_done
1487
vld1.8 {q10}, [r0]!
1488
veor q4, q10
1489
vst1.8 {q4}, [r1]!
1490
cmp r2, #4
1491
blo .Lctr_enc_done
1492
vld1.8 {q11}, [r0]!
1493
veor q6, q11
1494
vst1.8 {q6}, [r1]!
1495
beq .Lctr_enc_done
1496
vld1.8 {q12}, [r0]!
1497
veor q3, q12
1498
vst1.8 {q3}, [r1]!
1499
cmp r2, #6
1500
blo .Lctr_enc_done
1501
vld1.8 {q13}, [r0]!
1502
veor q7, q13
1503
vst1.8 {q7}, [r1]!
1504
beq .Lctr_enc_done
1505
vld1.8 {q14}, [r0]
1506
veor q2, q14
1507
vst1.8 {q2}, [r1]!
1508
1509
.Lctr_enc_done:
1510
vmov.i32 q0, #0
1511
vmov.i32 q1, #0
1512
#ifndef BSAES_ASM_EXTENDED_KEY
1513
.Lctr_enc_bzero:@ wipe key schedule [if any]
1514
vstmia sp!, {q0,q1}
1515
cmp sp, r9
1516
bne .Lctr_enc_bzero
1517
#else
1518
vstmia sp, {q0,q1}
1519
#endif
1520
1521
mov sp, r9
1522
add sp, #0x10 @ add sp,r9,#0x10 is no good for thumb
1523
VFP_ABI_POP
1524
ldmia sp!, {r4,r5,r6,r7,r8,r9,r10, pc} @ return
1525
1526
.align 4
1527
.Lctr_enc_short:
1528
ldr ip, [sp] @ ctr pointer is passed on stack
1529
stmdb sp!, {r4,r5,r6,r7,r8, lr}
1530
1531
mov r4, r0 @ copy arguments
1532
mov r5, r1
1533
mov r6, r2
1534
mov r7, r3
1535
ldr r8, [ip, #12] @ load counter .LSW
1536
vld1.8 {q1}, [ip] @ load whole counter value
1537
#ifdef __ARMEL__
1538
rev r8, r8
1539
#endif
1540
sub sp, sp, #0x10
1541
vst1.8 {q1}, [sp] @ copy counter value
1542
sub sp, sp, #0x10
1543
1544
.Lctr_enc_short_loop:
1545
add r0, sp, #0x10 @ input counter value
1546
mov r1, sp @ output on the stack
1547
mov r2, r7 @ key
1548
1549
bl AES_encrypt
1550
1551
vld1.8 {q0}, [r4]! @ load input
1552
vld1.8 {q1}, [sp] @ load encrypted counter
1553
add r8, r8, #1
1554
#ifdef __ARMEL__
1555
rev r0, r8
1556
str r0, [sp, #0x1c] @ next counter value
1557
#else
1558
str r8, [sp, #0x1c] @ next counter value
1559
#endif
1560
veor q0,q0,q1
1561
vst1.8 {q0}, [r5]! @ store output
1562
subs r6, r6, #1
1563
bne .Lctr_enc_short_loop
1564
1565
vmov.i32 q0, #0
1566
vmov.i32 q1, #0
1567
vstmia sp!, {q0,q1}
1568
1569
ldmia sp!, {r4,r5,r6,r7,r8, pc}
1570
.size ossl_bsaes_ctr32_encrypt_blocks,.-ossl_bsaes_ctr32_encrypt_blocks
1571
.globl ossl_bsaes_xts_encrypt
1572
.type ossl_bsaes_xts_encrypt,%function
1573
.align 4
1574
ossl_bsaes_xts_encrypt:
1575
mov ip, sp
1576
stmdb sp!, {r4,r5,r6,r7,r8,r9,r10, lr} @ 0x20
1577
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
1630
0: sub sp, #0x90 @ place for tweak[9]
1631
#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:
1642
vldmia r2, {q5} @ load XTS magic
1643
vshr.s64 q6, q8, #63
1644
mov r0, sp
1645
vand q6, q6, q5
1646
vadd.u64 q9, q8, q8
1647
vst1.64 {q8}, [r0,:128]!
1648
vswp d13,d12
1649
vshr.s64 q7, q9, #63
1650
veor q9, q9, q6
1651
vand q7, q7, q5
1652
vadd.u64 q10, q9, q9
1653
vst1.64 {q9}, [r0,:128]!
1654
vswp d15,d14
1655
vshr.s64 q6, q10, #63
1656
veor q10, q10, q7
1657
vand q6, q6, q5
1658
vld1.8 {q0}, [r7]!
1659
vadd.u64 q11, q10, q10
1660
vst1.64 {q10}, [r0,:128]!
1661
vswp d13,d12
1662
vshr.s64 q7, q11, #63
1663
veor q11, q11, q6
1664
vand q7, q7, q5
1665
vld1.8 {q1}, [r7]!
1666
veor q0, q0, q8
1667
vadd.u64 q12, q11, q11
1668
vst1.64 {q11}, [r0,:128]!
1669
vswp d15,d14
1670
vshr.s64 q6, q12, #63
1671
veor q12, q12, q7
1672
vand q6, q6, q5
1673
vld1.8 {q2}, [r7]!
1674
veor q1, q1, q9
1675
vadd.u64 q13, q12, q12
1676
vst1.64 {q12}, [r0,:128]!
1677
vswp d13,d12
1678
vshr.s64 q7, q13, #63
1679
veor q13, q13, q6
1680
vand q7, q7, q5
1681
vld1.8 {q3}, [r7]!
1682
veor q2, q2, q10
1683
vadd.u64 q14, q13, q13
1684
vst1.64 {q13}, [r0,:128]!
1685
vswp d15,d14
1686
vshr.s64 q6, q14, #63
1687
veor q14, q14, q7
1688
vand q6, q6, q5
1689
vld1.8 {q4}, [r7]!
1690
veor q3, q3, q11
1691
vadd.u64 q15, q14, q14
1692
vst1.64 {q14}, [r0,:128]!
1693
vswp d13,d12
1694
vshr.s64 q7, q15, #63
1695
veor q15, q15, q6
1696
vand q7, q7, q5
1697
vld1.8 {q5}, [r7]!
1698
veor q4, q4, q12
1699
vadd.u64 q8, q15, q15
1700
vst1.64 {q15}, [r0,:128]!
1701
vswp d15,d14
1702
veor q8, q8, q7
1703
vst1.64 {q8}, [r0,:128] @ next round tweak
1704
1705
vld1.8 {q6,q7}, [r7]!
1706
veor q5, q5, q13
1707
#ifndef BSAES_ASM_EXTENDED_KEY
1708
add r4, sp, #0x90 @ pass key schedule
1709
#else
1710
add r4, r10, #248 @ pass key schedule
1711
#endif
1712
veor q6, q6, q14
1713
mov r5, r1 @ pass rounds
1714
veor q7, q7, q15
1715
mov r0, sp
1716
1717
bl _bsaes_encrypt8
1718
1719
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]!
1735
1736
vld1.64 {q8}, [r0,:128] @ next round tweak
1737
1738
subs r9, #0x80
1739
bpl .Lxts_enc_loop
1740
1741
.Lxts_enc_short:
1742
adds r9, #0x70
1743
bmi .Lxts_enc_done
1744
1745
vldmia r2, {q5} @ load XTS magic
1746
vshr.s64 q7, q8, #63
1747
mov r0, sp
1748
vand q7, q7, q5
1749
vadd.u64 q9, q8, q8
1750
vst1.64 {q8}, [r0,:128]!
1751
vswp d15,d14
1752
vshr.s64 q6, q9, #63
1753
veor q9, q9, q7
1754
vand q6, q6, q5
1755
vadd.u64 q10, q9, q9
1756
vst1.64 {q9}, [r0,:128]!
1757
vswp d13,d12
1758
vshr.s64 q7, q10, #63
1759
veor q10, q10, q6
1760
vand q7, q7, q5
1761
vld1.8 {q0}, [r7]!
1762
subs r9, #0x10
1763
bmi .Lxts_enc_1
1764
vadd.u64 q11, q10, q10
1765
vst1.64 {q10}, [r0,:128]!
1766
vswp d15,d14
1767
vshr.s64 q6, q11, #63
1768
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
1774
vadd.u64 q12, q11, q11
1775
vst1.64 {q11}, [r0,:128]!
1776
vswp d13,d12
1777
vshr.s64 q7, q12, #63
1778
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
1784
vadd.u64 q13, q12, q12
1785
vst1.64 {q12}, [r0,:128]!
1786
vswp d15,d14
1787
vshr.s64 q6, q13, #63
1788
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
1794
vadd.u64 q14, q13, q13
1795
vst1.64 {q13}, [r0,:128]!
1796
vswp d13,d12
1797
vshr.s64 q7, q14, #63
1798
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
1804
vadd.u64 q15, q14, q14
1805
vst1.64 {q14}, [r0,:128]!
1806
vswp d15,d14
1807
vshr.s64 q6, q15, #63
1808
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
1816
1817
vld1.8 {q6}, [r7]!
1818
veor q5, q5, q13
1819
#ifndef BSAES_ASM_EXTENDED_KEY
1820
add r4, sp, #0x90 @ pass key schedule
1821
#else
1822
add r4, r10, #248 @ pass key schedule
1823
#endif
1824
veor q6, q6, q14
1825
mov r5, r1 @ pass rounds
1826
mov r0, sp
1827
1828
bl _bsaes_encrypt8
1829
1830
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]!
1845
1846
vld1.64 {q8}, [r0,:128] @ next round tweak
1847
b .Lxts_enc_done
1848
.align 4
1849
.Lxts_enc_6:
1850
veor q4, q4, q12
1851
#ifndef BSAES_ASM_EXTENDED_KEY
1852
add r4, sp, #0x90 @ pass key schedule
1853
#else
1854
add r4, r10, #248 @ pass key schedule
1855
#endif
1856
veor q5, q5, q13
1857
mov r5, r1 @ pass rounds
1858
mov r0, sp
1859
1860
bl _bsaes_encrypt8
1861
1862
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]!
1874
1875
vld1.64 {q8}, [r0,:128] @ next round tweak
1876
b .Lxts_enc_done
1877
1878
@ put this in range for both ARM and Thumb mode adr instructions
1879
.align 5
1880
.Lxts_magic:
1881
.quad 1, 0x87
1882
1883
.align 5
1884
.Lxts_enc_5:
1885
veor q3, q3, q11
1886
#ifndef BSAES_ASM_EXTENDED_KEY
1887
add r4, sp, #0x90 @ pass key schedule
1888
#else
1889
add r4, r10, #248 @ pass key schedule
1890
#endif
1891
veor q4, q4, q12
1892
mov r5, r1 @ pass rounds
1893
mov r0, sp
1894
1895
bl _bsaes_encrypt8
1896
1897
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]!
1908
1909
vld1.64 {q8}, [r0,:128] @ next round tweak
1910
b .Lxts_enc_done
1911
.align 4
1912
.Lxts_enc_4:
1913
veor q2, q2, q10
1914
#ifndef BSAES_ASM_EXTENDED_KEY
1915
add r4, sp, #0x90 @ pass key schedule
1916
#else
1917
add r4, r10, #248 @ pass key schedule
1918
#endif
1919
veor q3, q3, q11
1920
mov r5, r1 @ pass rounds
1921
mov r0, sp
1922
1923
bl _bsaes_encrypt8
1924
1925
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]!
1933
1934
vld1.64 {q8}, [r0,:128] @ next round tweak
1935
b .Lxts_enc_done
1936
.align 4
1937
.Lxts_enc_3:
1938
veor q1, q1, q9
1939
#ifndef BSAES_ASM_EXTENDED_KEY
1940
add r4, sp, #0x90 @ pass key schedule
1941
#else
1942
add r4, r10, #248 @ pass key schedule
1943
#endif
1944
veor q2, q2, q10
1945
mov r5, r1 @ pass rounds
1946
mov r0, sp
1947
1948
bl _bsaes_encrypt8
1949
1950
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]!
1957
1958
vld1.64 {q8}, [r0,:128] @ next round tweak
1959
b .Lxts_enc_done
1960
.align 4
1961
.Lxts_enc_2:
1962
veor q0, q0, q8
1963
#ifndef BSAES_ASM_EXTENDED_KEY
1964
add r4, sp, #0x90 @ pass key schedule
1965
#else
1966
add r4, r10, #248 @ pass key schedule
1967
#endif
1968
veor q1, q1, q9
1969
mov r5, r1 @ pass rounds
1970
mov r0, sp
1971
1972
bl _bsaes_encrypt8
1973
1974
vld1.64 {q8,q9}, [r0,:128]!
1975
veor q0, q0, q8
1976
veor q1, q1, q9
1977
vst1.8 {q0,q1}, [r8]!
1978
1979
vld1.64 {q8}, [r0,:128] @ next round tweak
1980
b .Lxts_enc_done
1981
.align 4
1982
.Lxts_enc_1:
1983
mov r0, sp
1984
veor q0, q0, q8
1985
mov r1, sp
1986
vst1.8 {q0}, [sp,:128]
1987
mov r2, r10
1988
mov r4, r3 @ preserve fp
1989
1990
bl AES_encrypt
1991
1992
vld1.8 {q0}, [sp,:128]
1993
veor q0, q0, q8
1994
vst1.8 {q0}, [r8]!
1995
mov r3, r4
1996
1997
vmov q8, q9 @ next round tweak
1998
1999
.Lxts_enc_done:
2000
#ifndef XTS_CHAIN_TWEAK
2001
adds r9, #0x10
2002
beq .Lxts_enc_ret
2003
sub r6, r8, #0x10
2004
2005
.Lxts_enc_steal:
2006
ldrb r0, [r7], #1
2007
ldrb r1, [r8, #-0x10]
2008
strb r0, [r8, #-0x10]
2009
strb r1, [r8], #1
2010
2011
subs r9, #1
2012
bhi .Lxts_enc_steal
2013
2014
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
2021
2022
bl AES_encrypt
2023
2024
vld1.8 {q0}, [sp,:128]
2025
veor q0, q0, q8
2026
vst1.8 {q0}, [r6]
2027
mov r3, r4
2028
#endif
2029
2030
.Lxts_enc_ret:
2031
bic r0, r3, #0xf
2032
vmov.i32 q0, #0
2033
vmov.i32 q1, #0
2034
#ifdef XTS_CHAIN_TWEAK
2035
ldr r1, [r3, #0x20+VFP_ABI_FRAME] @ chain tweak
2036
#endif
2037
.Lxts_enc_bzero:@ wipe key schedule [if any]
2038
vstmia sp!, {q0,q1}
2039
cmp sp, r0
2040
bne .Lxts_enc_bzero
2041
2042
mov sp, r3
2043
#ifdef XTS_CHAIN_TWEAK
2044
vst1.8 {q8}, [r1]
2045
#endif
2046
VFP_ABI_POP
2047
ldmia sp!, {r4,r5,r6,r7,r8,r9,r10, pc} @ return
2048
2049
.size ossl_bsaes_xts_encrypt,.-ossl_bsaes_xts_encrypt
2050
2051
.globl ossl_bsaes_xts_decrypt
2052
.type ossl_bsaes_xts_decrypt,%function
2053
.align 4
2054
ossl_bsaes_xts_decrypt:
2055
mov ip, sp
2056
stmdb sp!, {r4,r5,r6,r7,r8,r9,r10, lr} @ 0x20
2057
VFP_ABI_PUSH
2058
mov r6, sp @ future r3
2059
2060
mov r7, r0
2061
mov r8, r1
2062
mov r9, r2
2063
mov r10, r3
2064
2065
sub r0, sp, #0x10 @ 0x10
2066
bic r0, #0xf @ align at 16 bytes
2067
mov sp, r0
2068
2069
#ifdef XTS_CHAIN_TWEAK
2070
ldr r0, [ip] @ pointer to input tweak
2071
#else
2072
@ generate initial tweak
2073
ldr r0, [ip, #4] @ iv[]
2074
mov r1, sp
2075
ldr r2, [ip, #0] @ key2
2076
bl AES_encrypt
2077
mov r0, sp @ pointer to initial tweak
2078
#endif
2079
2080
ldr r1, [r10, #240] @ get # of rounds
2081
mov r3, r6
2082
#ifndef BSAES_ASM_EXTENDED_KEY
2083
@ allocate the key schedule on the stack
2084
sub r12, sp, r1, lsl#7 @ 128 bytes per inner round key
2085
@ add r12, #96 @ size of bit-sliced key schedule
2086
sub r12, #48 @ place for tweak[9]
2087
2088
@ populate the key schedule
2089
mov r4, r10 @ pass key
2090
mov r5, r1 @ pass # of rounds
2091
mov sp, r12
2092
add r12, #0x90 @ pass key schedule
2093
bl _bsaes_key_convert
2094
add r4, sp, #0x90
2095
vldmia r4, {q6}
2096
vstmia r12, {q15} @ save last round key
2097
veor q7, q7, q6 @ fix up round 0 key
2098
vstmia r4, {q7}
2099
#else
2100
ldr r12, [r10, #244]
2101
eors r12, #1
2102
beq 0f
2103
2104
str r12, [r10, #244]
2105
mov r4, r10 @ pass key
2106
mov r5, r1 @ pass # of rounds
2107
add r12, r10, #248 @ pass key schedule
2108
bl _bsaes_key_convert
2109
add r4, r10, #248
2110
vldmia r4, {q6}
2111
vstmia r12, {q15} @ save last round key
2112
veor q7, q7, q6 @ fix up round 0 key
2113
vstmia r4, {q7}
2114
2115
.align 2
2116
0: sub sp, #0x90 @ place for tweak[9]
2117
#endif
2118
vld1.8 {q8}, [r0] @ initial tweak
2119
adr r2, .Lxts_magic
2120
2121
#ifndef XTS_CHAIN_TWEAK
2122
tst r9, #0xf @ if not multiple of 16
2123
it ne @ Thumb2 thing, sanity check in ARM
2124
subne r9, #0x10 @ subtract another 16 bytes
2125
#endif
2126
subs r9, #0x80
2127
2128
blo .Lxts_dec_short
2129
b .Lxts_dec_loop
2130
2131
.align 4
2132
.Lxts_dec_loop:
2133
vldmia r2, {q5} @ load XTS magic
2134
vshr.s64 q6, q8, #63
2135
mov r0, sp
2136
vand q6, q6, q5
2137
vadd.u64 q9, q8, q8
2138
vst1.64 {q8}, [r0,:128]!
2139
vswp d13,d12
2140
vshr.s64 q7, q9, #63
2141
veor q9, q9, q6
2142
vand q7, q7, q5
2143
vadd.u64 q10, q9, q9
2144
vst1.64 {q9}, [r0,:128]!
2145
vswp d15,d14
2146
vshr.s64 q6, q10, #63
2147
veor q10, q10, q7
2148
vand q6, q6, q5
2149
vld1.8 {q0}, [r7]!
2150
vadd.u64 q11, q10, q10
2151
vst1.64 {q10}, [r0,:128]!
2152
vswp d13,d12
2153
vshr.s64 q7, q11, #63
2154
veor q11, q11, q6
2155
vand q7, q7, q5
2156
vld1.8 {q1}, [r7]!
2157
veor q0, q0, q8
2158
vadd.u64 q12, q11, q11
2159
vst1.64 {q11}, [r0,:128]!
2160
vswp d15,d14
2161
vshr.s64 q6, q12, #63
2162
veor q12, q12, q7
2163
vand q6, q6, q5
2164
vld1.8 {q2}, [r7]!
2165
veor q1, q1, q9
2166
vadd.u64 q13, q12, q12
2167
vst1.64 {q12}, [r0,:128]!
2168
vswp d13,d12
2169
vshr.s64 q7, q13, #63
2170
veor q13, q13, q6
2171
vand q7, q7, q5
2172
vld1.8 {q3}, [r7]!
2173
veor q2, q2, q10
2174
vadd.u64 q14, q13, q13
2175
vst1.64 {q13}, [r0,:128]!
2176
vswp d15,d14
2177
vshr.s64 q6, q14, #63
2178
veor q14, q14, q7
2179
vand q6, q6, q5
2180
vld1.8 {q4}, [r7]!
2181
veor q3, q3, q11
2182
vadd.u64 q15, q14, q14
2183
vst1.64 {q14}, [r0,:128]!
2184
vswp d13,d12
2185
vshr.s64 q7, q15, #63
2186
veor q15, q15, q6
2187
vand q7, q7, q5
2188
vld1.8 {q5}, [r7]!
2189
veor q4, q4, q12
2190
vadd.u64 q8, q15, q15
2191
vst1.64 {q15}, [r0,:128]!
2192
vswp d15,d14
2193
veor q8, q8, q7
2194
vst1.64 {q8}, [r0,:128] @ next round tweak
2195
2196
vld1.8 {q6,q7}, [r7]!
2197
veor q5, q5, q13
2198
#ifndef BSAES_ASM_EXTENDED_KEY
2199
add r4, sp, #0x90 @ pass key schedule
2200
#else
2201
add r4, r10, #248 @ pass key schedule
2202
#endif
2203
veor q6, q6, q14
2204
mov r5, r1 @ pass rounds
2205
veor q7, q7, q15
2206
mov r0, sp
2207
2208
bl _bsaes_decrypt8
2209
2210
vld1.64 {q8,q9}, [r0,:128]!
2211
vld1.64 {q10,q11}, [r0,:128]!
2212
veor q0, q0, q8
2213
vld1.64 {q12,q13}, [r0,:128]!
2214
veor q1, q1, q9
2215
veor q8, q6, q10
2216
vst1.8 {q0,q1}, [r8]!
2217
veor q9, q4, q11
2218
vld1.64 {q14,q15}, [r0,:128]!
2219
veor q10, q2, q12
2220
vst1.8 {q8,q9}, [r8]!
2221
veor q11, q7, q13
2222
veor q12, q3, q14
2223
vst1.8 {q10,q11}, [r8]!
2224
veor q13, q5, q15
2225
vst1.8 {q12,q13}, [r8]!
2226
2227
vld1.64 {q8}, [r0,:128] @ next round tweak
2228
2229
subs r9, #0x80
2230
bpl .Lxts_dec_loop
2231
2232
.Lxts_dec_short:
2233
adds r9, #0x70
2234
bmi .Lxts_dec_done
2235
2236
vldmia r2, {q5} @ load XTS magic
2237
vshr.s64 q7, q8, #63
2238
mov r0, sp
2239
vand q7, q7, q5
2240
vadd.u64 q9, q8, q8
2241
vst1.64 {q8}, [r0,:128]!
2242
vswp d15,d14
2243
vshr.s64 q6, q9, #63
2244
veor q9, q9, q7
2245
vand q6, q6, q5
2246
vadd.u64 q10, q9, q9
2247
vst1.64 {q9}, [r0,:128]!
2248
vswp d13,d12
2249
vshr.s64 q7, q10, #63
2250
veor q10, q10, q6
2251
vand q7, q7, q5
2252
vld1.8 {q0}, [r7]!
2253
subs r9, #0x10
2254
bmi .Lxts_dec_1
2255
vadd.u64 q11, q10, q10
2256
vst1.64 {q10}, [r0,:128]!
2257
vswp d15,d14
2258
vshr.s64 q6, q11, #63
2259
veor q11, q11, q7
2260
vand q6, q6, q5
2261
vld1.8 {q1}, [r7]!
2262
subs r9, #0x10
2263
bmi .Lxts_dec_2
2264
veor q0, q0, q8
2265
vadd.u64 q12, q11, q11
2266
vst1.64 {q11}, [r0,:128]!
2267
vswp d13,d12
2268
vshr.s64 q7, q12, #63
2269
veor q12, q12, q6
2270
vand q7, q7, q5
2271
vld1.8 {q2}, [r7]!
2272
subs r9, #0x10
2273
bmi .Lxts_dec_3
2274
veor q1, q1, q9
2275
vadd.u64 q13, q12, q12
2276
vst1.64 {q12}, [r0,:128]!
2277
vswp d15,d14
2278
vshr.s64 q6, q13, #63
2279
veor q13, q13, q7
2280
vand q6, q6, q5
2281
vld1.8 {q3}, [r7]!
2282
subs r9, #0x10
2283
bmi .Lxts_dec_4
2284
veor q2, q2, q10
2285
vadd.u64 q14, q13, q13
2286
vst1.64 {q13}, [r0,:128]!
2287
vswp d13,d12
2288
vshr.s64 q7, q14, #63
2289
veor q14, q14, q6
2290
vand q7, q7, q5
2291
vld1.8 {q4}, [r7]!
2292
subs r9, #0x10
2293
bmi .Lxts_dec_5
2294
veor q3, q3, q11
2295
vadd.u64 q15, q14, q14
2296
vst1.64 {q14}, [r0,:128]!
2297
vswp d15,d14
2298
vshr.s64 q6, q15, #63
2299
veor q15, q15, q7
2300
vand q6, q6, q5
2301
vld1.8 {q5}, [r7]!
2302
subs r9, #0x10
2303
bmi .Lxts_dec_6
2304
veor q4, q4, q12
2305
sub r9, #0x10
2306
vst1.64 {q15}, [r0,:128] @ next round tweak
2307
2308
vld1.8 {q6}, [r7]!
2309
veor q5, q5, q13
2310
#ifndef BSAES_ASM_EXTENDED_KEY
2311
add r4, sp, #0x90 @ pass key schedule
2312
#else
2313
add r4, r10, #248 @ pass key schedule
2314
#endif
2315
veor q6, q6, q14
2316
mov r5, r1 @ pass rounds
2317
mov r0, sp
2318
2319
bl _bsaes_decrypt8
2320
2321
vld1.64 {q8,q9}, [r0,:128]!
2322
vld1.64 {q10,q11}, [r0,:128]!
2323
veor q0, q0, q8
2324
vld1.64 {q12,q13}, [r0,:128]!
2325
veor q1, q1, q9
2326
veor q8, q6, q10
2327
vst1.8 {q0,q1}, [r8]!
2328
veor q9, q4, q11
2329
vld1.64 {q14}, [r0,:128]!
2330
veor q10, q2, q12
2331
vst1.8 {q8,q9}, [r8]!
2332
veor q11, q7, q13
2333
veor q12, q3, q14
2334
vst1.8 {q10,q11}, [r8]!
2335
vst1.8 {q12}, [r8]!
2336
2337
vld1.64 {q8}, [r0,:128] @ next round tweak
2338
b .Lxts_dec_done
2339
.align 4
2340
.Lxts_dec_6:
2341
vst1.64 {q14}, [r0,:128] @ next round tweak
2342
2343
veor q4, q4, q12
2344
#ifndef BSAES_ASM_EXTENDED_KEY
2345
add r4, sp, #0x90 @ pass key schedule
2346
#else
2347
add r4, r10, #248 @ pass key schedule
2348
#endif
2349
veor q5, q5, q13
2350
mov r5, r1 @ pass rounds
2351
mov r0, sp
2352
2353
bl _bsaes_decrypt8
2354
2355
vld1.64 {q8,q9}, [r0,:128]!
2356
vld1.64 {q10,q11}, [r0,:128]!
2357
veor q0, q0, q8
2358
vld1.64 {q12,q13}, [r0,:128]!
2359
veor q1, q1, q9
2360
veor q8, q6, q10
2361
vst1.8 {q0,q1}, [r8]!
2362
veor q9, q4, q11
2363
veor q10, q2, q12
2364
vst1.8 {q8,q9}, [r8]!
2365
veor q11, q7, q13
2366
vst1.8 {q10,q11}, [r8]!
2367
2368
vld1.64 {q8}, [r0,:128] @ next round tweak
2369
b .Lxts_dec_done
2370
.align 4
2371
.Lxts_dec_5:
2372
veor q3, q3, q11
2373
#ifndef BSAES_ASM_EXTENDED_KEY
2374
add r4, sp, #0x90 @ pass key schedule
2375
#else
2376
add r4, r10, #248 @ pass key schedule
2377
#endif
2378
veor q4, q4, q12
2379
mov r5, r1 @ pass rounds
2380
mov r0, sp
2381
2382
bl _bsaes_decrypt8
2383
2384
vld1.64 {q8,q9}, [r0,:128]!
2385
vld1.64 {q10,q11}, [r0,:128]!
2386
veor q0, q0, q8
2387
vld1.64 {q12}, [r0,:128]!
2388
veor q1, q1, q9
2389
veor q8, q6, q10
2390
vst1.8 {q0,q1}, [r8]!
2391
veor q9, q4, q11
2392
veor q10, q2, q12
2393
vst1.8 {q8,q9}, [r8]!
2394
vst1.8 {q10}, [r8]!
2395
2396
vld1.64 {q8}, [r0,:128] @ next round tweak
2397
b .Lxts_dec_done
2398
.align 4
2399
.Lxts_dec_4:
2400
veor q2, q2, q10
2401
#ifndef BSAES_ASM_EXTENDED_KEY
2402
add r4, sp, #0x90 @ pass key schedule
2403
#else
2404
add r4, r10, #248 @ pass key schedule
2405
#endif
2406
veor q3, q3, q11
2407
mov r5, r1 @ pass rounds
2408
mov r0, sp
2409
2410
bl _bsaes_decrypt8
2411
2412
vld1.64 {q8,q9}, [r0,:128]!
2413
vld1.64 {q10,q11}, [r0,:128]!
2414
veor q0, q0, q8
2415
veor q1, q1, q9
2416
veor q8, q6, q10
2417
vst1.8 {q0,q1}, [r8]!
2418
veor q9, q4, q11
2419
vst1.8 {q8,q9}, [r8]!
2420
2421
vld1.64 {q8}, [r0,:128] @ next round tweak
2422
b .Lxts_dec_done
2423
.align 4
2424
.Lxts_dec_3:
2425
veor q1, q1, q9
2426
#ifndef BSAES_ASM_EXTENDED_KEY
2427
add r4, sp, #0x90 @ pass key schedule
2428
#else
2429
add r4, r10, #248 @ pass key schedule
2430
#endif
2431
veor q2, q2, q10
2432
mov r5, r1 @ pass rounds
2433
mov r0, sp
2434
2435
bl _bsaes_decrypt8
2436
2437
vld1.64 {q8,q9}, [r0,:128]!
2438
vld1.64 {q10}, [r0,:128]!
2439
veor q0, q0, q8
2440
veor q1, q1, q9
2441
veor q8, q6, q10
2442
vst1.8 {q0,q1}, [r8]!
2443
vst1.8 {q8}, [r8]!
2444
2445
vld1.64 {q8}, [r0,:128] @ next round tweak
2446
b .Lxts_dec_done
2447
.align 4
2448
.Lxts_dec_2:
2449
veor q0, q0, q8
2450
#ifndef BSAES_ASM_EXTENDED_KEY
2451
add r4, sp, #0x90 @ pass key schedule
2452
#else
2453
add r4, r10, #248 @ pass key schedule
2454
#endif
2455
veor q1, q1, q9
2456
mov r5, r1 @ pass rounds
2457
mov r0, sp
2458
2459
bl _bsaes_decrypt8
2460
2461
vld1.64 {q8,q9}, [r0,:128]!
2462
veor q0, q0, q8
2463
veor q1, q1, q9
2464
vst1.8 {q0,q1}, [r8]!
2465
2466
vld1.64 {q8}, [r0,:128] @ next round tweak
2467
b .Lxts_dec_done
2468
.align 4
2469
.Lxts_dec_1:
2470
mov r0, sp
2471
veor q0, q0, q8
2472
mov r1, sp
2473
vst1.8 {q0}, [sp,:128]
2474
mov r5, r2 @ preserve magic
2475
mov r2, r10
2476
mov r4, r3 @ preserve fp
2477
2478
bl AES_decrypt
2479
2480
vld1.8 {q0}, [sp,:128]
2481
veor q0, q0, q8
2482
vst1.8 {q0}, [r8]!
2483
mov r3, r4
2484
mov r2, r5
2485
2486
vmov q8, q9 @ next round tweak
2487
2488
.Lxts_dec_done:
2489
#ifndef XTS_CHAIN_TWEAK
2490
adds r9, #0x10
2491
beq .Lxts_dec_ret
2492
2493
@ calculate one round of extra tweak for the stolen ciphertext
2494
vldmia r2, {q5}
2495
vshr.s64 q6, q8, #63
2496
vand q6, q6, q5
2497
vadd.u64 q9, q8, q8
2498
vswp d13,d12
2499
veor q9, q9, q6
2500
2501
@ perform the final decryption with the last tweak value
2502
vld1.8 {q0}, [r7]!
2503
mov r0, sp
2504
veor q0, q0, q9
2505
mov r1, sp
2506
vst1.8 {q0}, [sp,:128]
2507
mov r2, r10
2508
mov r4, r3 @ preserve fp
2509
2510
bl AES_decrypt
2511
2512
vld1.8 {q0}, [sp,:128]
2513
veor q0, q0, q9
2514
vst1.8 {q0}, [r8]
2515
2516
mov r6, r8
2517
.Lxts_dec_steal:
2518
ldrb r1, [r8]
2519
ldrb r0, [r7], #1
2520
strb r1, [r8, #0x10]
2521
strb r0, [r8], #1
2522
2523
subs r9, #1
2524
bhi .Lxts_dec_steal
2525
2526
vld1.8 {q0}, [r6]
2527
mov r0, sp
2528
veor q0, q8
2529
mov r1, sp
2530
vst1.8 {q0}, [sp,:128]
2531
mov r2, r10
2532
2533
bl AES_decrypt
2534
2535
vld1.8 {q0}, [sp,:128]
2536
veor q0, q0, q8
2537
vst1.8 {q0}, [r6]
2538
mov r3, r4
2539
#endif
2540
2541
.Lxts_dec_ret:
2542
bic r0, r3, #0xf
2543
vmov.i32 q0, #0
2544
vmov.i32 q1, #0
2545
#ifdef XTS_CHAIN_TWEAK
2546
ldr r1, [r3, #0x20+VFP_ABI_FRAME] @ chain tweak
2547
#endif
2548
.Lxts_dec_bzero:@ wipe key schedule [if any]
2549
vstmia sp!, {q0,q1}
2550
cmp sp, r0
2551
bne .Lxts_dec_bzero
2552
2553
mov sp, r3
2554
#ifdef XTS_CHAIN_TWEAK
2555
vst1.8 {q8}, [r1]
2556
#endif
2557
VFP_ABI_POP
2558
ldmia sp!, {r4,r5,r6,r7,r8,r9,r10, pc} @ return
2559
2560
.size ossl_bsaes_xts_decrypt,.-ossl_bsaes_xts_decrypt
2561
#endif
2562
2563