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