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