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