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