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