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