1*8fb009dcSAndroid Build Coastguard Worker// This file is generated from a similarly-named Perl script in the BoringSSL 2*8fb009dcSAndroid Build Coastguard Worker// source tree. Do not edit by hand. 3*8fb009dcSAndroid Build Coastguard Worker 4*8fb009dcSAndroid Build Coastguard Worker#include <openssl/asm_base.h> 5*8fb009dcSAndroid Build Coastguard Worker 6*8fb009dcSAndroid Build Coastguard Worker#if !defined(OPENSSL_NO_ASM) && defined(OPENSSL_AARCH64) && defined(_WIN32) 7*8fb009dcSAndroid Build Coastguard Worker#include <openssl/arm_arch.h> 8*8fb009dcSAndroid Build Coastguard Worker 9*8fb009dcSAndroid Build Coastguard Worker#if __ARM_MAX_ARCH__>=7 10*8fb009dcSAndroid Build Coastguard Worker.text 11*8fb009dcSAndroid Build Coastguard Worker.arch armv8-a+crypto 12*8fb009dcSAndroid Build Coastguard Worker.section .rodata 13*8fb009dcSAndroid Build Coastguard Worker.align 5 14*8fb009dcSAndroid Build Coastguard WorkerLrcon: 15*8fb009dcSAndroid Build Coastguard Worker.long 0x01,0x01,0x01,0x01 16*8fb009dcSAndroid Build Coastguard Worker.long 0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d // rotate-n-splat 17*8fb009dcSAndroid Build Coastguard Worker.long 0x1b,0x1b,0x1b,0x1b 18*8fb009dcSAndroid Build Coastguard Worker 19*8fb009dcSAndroid Build Coastguard Worker.text 20*8fb009dcSAndroid Build Coastguard Worker 21*8fb009dcSAndroid Build Coastguard Worker.globl aes_hw_set_encrypt_key 22*8fb009dcSAndroid Build Coastguard Worker 23*8fb009dcSAndroid Build Coastguard Worker.def aes_hw_set_encrypt_key 24*8fb009dcSAndroid Build Coastguard Worker .type 32 25*8fb009dcSAndroid Build Coastguard Worker.endef 26*8fb009dcSAndroid Build Coastguard Worker.align 5 27*8fb009dcSAndroid Build Coastguard Workeraes_hw_set_encrypt_key: 28*8fb009dcSAndroid Build Coastguard WorkerLenc_key: 29*8fb009dcSAndroid Build Coastguard Worker // Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later. 30*8fb009dcSAndroid Build Coastguard Worker AARCH64_VALID_CALL_TARGET 31*8fb009dcSAndroid Build Coastguard Worker stp x29,x30,[sp,#-16]! 32*8fb009dcSAndroid Build Coastguard Worker add x29,sp,#0 33*8fb009dcSAndroid Build Coastguard Worker mov x3,#-2 34*8fb009dcSAndroid Build Coastguard Worker cmp w1,#128 35*8fb009dcSAndroid Build Coastguard Worker b.lt Lenc_key_abort 36*8fb009dcSAndroid Build Coastguard Worker cmp w1,#256 37*8fb009dcSAndroid Build Coastguard Worker b.gt Lenc_key_abort 38*8fb009dcSAndroid Build Coastguard Worker tst w1,#0x3f 39*8fb009dcSAndroid Build Coastguard Worker b.ne Lenc_key_abort 40*8fb009dcSAndroid Build Coastguard Worker 41*8fb009dcSAndroid Build Coastguard Worker adrp x3,Lrcon 42*8fb009dcSAndroid Build Coastguard Worker add x3,x3,:lo12:Lrcon 43*8fb009dcSAndroid Build Coastguard Worker cmp w1,#192 44*8fb009dcSAndroid Build Coastguard Worker 45*8fb009dcSAndroid Build Coastguard Worker eor v0.16b,v0.16b,v0.16b 46*8fb009dcSAndroid Build Coastguard Worker ld1 {v3.16b},[x0],#16 47*8fb009dcSAndroid Build Coastguard Worker mov w1,#8 // reuse w1 48*8fb009dcSAndroid Build Coastguard Worker ld1 {v1.4s,v2.4s},[x3],#32 49*8fb009dcSAndroid Build Coastguard Worker 50*8fb009dcSAndroid Build Coastguard Worker b.lt Loop128 51*8fb009dcSAndroid Build Coastguard Worker b.eq L192 52*8fb009dcSAndroid Build Coastguard Worker b L256 53*8fb009dcSAndroid Build Coastguard Worker 54*8fb009dcSAndroid Build Coastguard Worker.align 4 55*8fb009dcSAndroid Build Coastguard WorkerLoop128: 56*8fb009dcSAndroid Build Coastguard Worker tbl v6.16b,{v3.16b},v2.16b 57*8fb009dcSAndroid Build Coastguard Worker ext v5.16b,v0.16b,v3.16b,#12 58*8fb009dcSAndroid Build Coastguard Worker st1 {v3.4s},[x2],#16 59*8fb009dcSAndroid Build Coastguard Worker aese v6.16b,v0.16b 60*8fb009dcSAndroid Build Coastguard Worker subs w1,w1,#1 61*8fb009dcSAndroid Build Coastguard Worker 62*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v5.16b 63*8fb009dcSAndroid Build Coastguard Worker ext v5.16b,v0.16b,v5.16b,#12 64*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v5.16b 65*8fb009dcSAndroid Build Coastguard Worker ext v5.16b,v0.16b,v5.16b,#12 66*8fb009dcSAndroid Build Coastguard Worker eor v6.16b,v6.16b,v1.16b 67*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v5.16b 68*8fb009dcSAndroid Build Coastguard Worker shl v1.16b,v1.16b,#1 69*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v6.16b 70*8fb009dcSAndroid Build Coastguard Worker b.ne Loop128 71*8fb009dcSAndroid Build Coastguard Worker 72*8fb009dcSAndroid Build Coastguard Worker ld1 {v1.4s},[x3] 73*8fb009dcSAndroid Build Coastguard Worker 74*8fb009dcSAndroid Build Coastguard Worker tbl v6.16b,{v3.16b},v2.16b 75*8fb009dcSAndroid Build Coastguard Worker ext v5.16b,v0.16b,v3.16b,#12 76*8fb009dcSAndroid Build Coastguard Worker st1 {v3.4s},[x2],#16 77*8fb009dcSAndroid Build Coastguard Worker aese v6.16b,v0.16b 78*8fb009dcSAndroid Build Coastguard Worker 79*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v5.16b 80*8fb009dcSAndroid Build Coastguard Worker ext v5.16b,v0.16b,v5.16b,#12 81*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v5.16b 82*8fb009dcSAndroid Build Coastguard Worker ext v5.16b,v0.16b,v5.16b,#12 83*8fb009dcSAndroid Build Coastguard Worker eor v6.16b,v6.16b,v1.16b 84*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v5.16b 85*8fb009dcSAndroid Build Coastguard Worker shl v1.16b,v1.16b,#1 86*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v6.16b 87*8fb009dcSAndroid Build Coastguard Worker 88*8fb009dcSAndroid Build Coastguard Worker tbl v6.16b,{v3.16b},v2.16b 89*8fb009dcSAndroid Build Coastguard Worker ext v5.16b,v0.16b,v3.16b,#12 90*8fb009dcSAndroid Build Coastguard Worker st1 {v3.4s},[x2],#16 91*8fb009dcSAndroid Build Coastguard Worker aese v6.16b,v0.16b 92*8fb009dcSAndroid Build Coastguard Worker 93*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v5.16b 94*8fb009dcSAndroid Build Coastguard Worker ext v5.16b,v0.16b,v5.16b,#12 95*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v5.16b 96*8fb009dcSAndroid Build Coastguard Worker ext v5.16b,v0.16b,v5.16b,#12 97*8fb009dcSAndroid Build Coastguard Worker eor v6.16b,v6.16b,v1.16b 98*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v5.16b 99*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v6.16b 100*8fb009dcSAndroid Build Coastguard Worker st1 {v3.4s},[x2] 101*8fb009dcSAndroid Build Coastguard Worker add x2,x2,#0x50 102*8fb009dcSAndroid Build Coastguard Worker 103*8fb009dcSAndroid Build Coastguard Worker mov w12,#10 104*8fb009dcSAndroid Build Coastguard Worker b Ldone 105*8fb009dcSAndroid Build Coastguard Worker 106*8fb009dcSAndroid Build Coastguard Worker.align 4 107*8fb009dcSAndroid Build Coastguard WorkerL192: 108*8fb009dcSAndroid Build Coastguard Worker ld1 {v4.8b},[x0],#8 109*8fb009dcSAndroid Build Coastguard Worker movi v6.16b,#8 // borrow v6.16b 110*8fb009dcSAndroid Build Coastguard Worker st1 {v3.4s},[x2],#16 111*8fb009dcSAndroid Build Coastguard Worker sub v2.16b,v2.16b,v6.16b // adjust the mask 112*8fb009dcSAndroid Build Coastguard Worker 113*8fb009dcSAndroid Build Coastguard WorkerLoop192: 114*8fb009dcSAndroid Build Coastguard Worker tbl v6.16b,{v4.16b},v2.16b 115*8fb009dcSAndroid Build Coastguard Worker ext v5.16b,v0.16b,v3.16b,#12 116*8fb009dcSAndroid Build Coastguard Worker st1 {v4.8b},[x2],#8 117*8fb009dcSAndroid Build Coastguard Worker aese v6.16b,v0.16b 118*8fb009dcSAndroid Build Coastguard Worker subs w1,w1,#1 119*8fb009dcSAndroid Build Coastguard Worker 120*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v5.16b 121*8fb009dcSAndroid Build Coastguard Worker ext v5.16b,v0.16b,v5.16b,#12 122*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v5.16b 123*8fb009dcSAndroid Build Coastguard Worker ext v5.16b,v0.16b,v5.16b,#12 124*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v5.16b 125*8fb009dcSAndroid Build Coastguard Worker 126*8fb009dcSAndroid Build Coastguard Worker dup v5.4s,v3.s[3] 127*8fb009dcSAndroid Build Coastguard Worker eor v5.16b,v5.16b,v4.16b 128*8fb009dcSAndroid Build Coastguard Worker eor v6.16b,v6.16b,v1.16b 129*8fb009dcSAndroid Build Coastguard Worker ext v4.16b,v0.16b,v4.16b,#12 130*8fb009dcSAndroid Build Coastguard Worker shl v1.16b,v1.16b,#1 131*8fb009dcSAndroid Build Coastguard Worker eor v4.16b,v4.16b,v5.16b 132*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v6.16b 133*8fb009dcSAndroid Build Coastguard Worker eor v4.16b,v4.16b,v6.16b 134*8fb009dcSAndroid Build Coastguard Worker st1 {v3.4s},[x2],#16 135*8fb009dcSAndroid Build Coastguard Worker b.ne Loop192 136*8fb009dcSAndroid Build Coastguard Worker 137*8fb009dcSAndroid Build Coastguard Worker mov w12,#12 138*8fb009dcSAndroid Build Coastguard Worker add x2,x2,#0x20 139*8fb009dcSAndroid Build Coastguard Worker b Ldone 140*8fb009dcSAndroid Build Coastguard Worker 141*8fb009dcSAndroid Build Coastguard Worker.align 4 142*8fb009dcSAndroid Build Coastguard WorkerL256: 143*8fb009dcSAndroid Build Coastguard Worker ld1 {v4.16b},[x0] 144*8fb009dcSAndroid Build Coastguard Worker mov w1,#7 145*8fb009dcSAndroid Build Coastguard Worker mov w12,#14 146*8fb009dcSAndroid Build Coastguard Worker st1 {v3.4s},[x2],#16 147*8fb009dcSAndroid Build Coastguard Worker 148*8fb009dcSAndroid Build Coastguard WorkerLoop256: 149*8fb009dcSAndroid Build Coastguard Worker tbl v6.16b,{v4.16b},v2.16b 150*8fb009dcSAndroid Build Coastguard Worker ext v5.16b,v0.16b,v3.16b,#12 151*8fb009dcSAndroid Build Coastguard Worker st1 {v4.4s},[x2],#16 152*8fb009dcSAndroid Build Coastguard Worker aese v6.16b,v0.16b 153*8fb009dcSAndroid Build Coastguard Worker subs w1,w1,#1 154*8fb009dcSAndroid Build Coastguard Worker 155*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v5.16b 156*8fb009dcSAndroid Build Coastguard Worker ext v5.16b,v0.16b,v5.16b,#12 157*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v5.16b 158*8fb009dcSAndroid Build Coastguard Worker ext v5.16b,v0.16b,v5.16b,#12 159*8fb009dcSAndroid Build Coastguard Worker eor v6.16b,v6.16b,v1.16b 160*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v5.16b 161*8fb009dcSAndroid Build Coastguard Worker shl v1.16b,v1.16b,#1 162*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v6.16b 163*8fb009dcSAndroid Build Coastguard Worker st1 {v3.4s},[x2],#16 164*8fb009dcSAndroid Build Coastguard Worker b.eq Ldone 165*8fb009dcSAndroid Build Coastguard Worker 166*8fb009dcSAndroid Build Coastguard Worker dup v6.4s,v3.s[3] // just splat 167*8fb009dcSAndroid Build Coastguard Worker ext v5.16b,v0.16b,v4.16b,#12 168*8fb009dcSAndroid Build Coastguard Worker aese v6.16b,v0.16b 169*8fb009dcSAndroid Build Coastguard Worker 170*8fb009dcSAndroid Build Coastguard Worker eor v4.16b,v4.16b,v5.16b 171*8fb009dcSAndroid Build Coastguard Worker ext v5.16b,v0.16b,v5.16b,#12 172*8fb009dcSAndroid Build Coastguard Worker eor v4.16b,v4.16b,v5.16b 173*8fb009dcSAndroid Build Coastguard Worker ext v5.16b,v0.16b,v5.16b,#12 174*8fb009dcSAndroid Build Coastguard Worker eor v4.16b,v4.16b,v5.16b 175*8fb009dcSAndroid Build Coastguard Worker 176*8fb009dcSAndroid Build Coastguard Worker eor v4.16b,v4.16b,v6.16b 177*8fb009dcSAndroid Build Coastguard Worker b Loop256 178*8fb009dcSAndroid Build Coastguard Worker 179*8fb009dcSAndroid Build Coastguard WorkerLdone: 180*8fb009dcSAndroid Build Coastguard Worker str w12,[x2] 181*8fb009dcSAndroid Build Coastguard Worker mov x3,#0 182*8fb009dcSAndroid Build Coastguard Worker 183*8fb009dcSAndroid Build Coastguard WorkerLenc_key_abort: 184*8fb009dcSAndroid Build Coastguard Worker mov x0,x3 // return value 185*8fb009dcSAndroid Build Coastguard Worker ldr x29,[sp],#16 186*8fb009dcSAndroid Build Coastguard Worker ret 187*8fb009dcSAndroid Build Coastguard Worker 188*8fb009dcSAndroid Build Coastguard Worker 189*8fb009dcSAndroid Build Coastguard Worker.globl aes_hw_set_decrypt_key 190*8fb009dcSAndroid Build Coastguard Worker 191*8fb009dcSAndroid Build Coastguard Worker.def aes_hw_set_decrypt_key 192*8fb009dcSAndroid Build Coastguard Worker .type 32 193*8fb009dcSAndroid Build Coastguard Worker.endef 194*8fb009dcSAndroid Build Coastguard Worker.align 5 195*8fb009dcSAndroid Build Coastguard Workeraes_hw_set_decrypt_key: 196*8fb009dcSAndroid Build Coastguard Worker AARCH64_SIGN_LINK_REGISTER 197*8fb009dcSAndroid Build Coastguard Worker stp x29,x30,[sp,#-16]! 198*8fb009dcSAndroid Build Coastguard Worker add x29,sp,#0 199*8fb009dcSAndroid Build Coastguard Worker bl Lenc_key 200*8fb009dcSAndroid Build Coastguard Worker 201*8fb009dcSAndroid Build Coastguard Worker cmp x0,#0 202*8fb009dcSAndroid Build Coastguard Worker b.ne Ldec_key_abort 203*8fb009dcSAndroid Build Coastguard Worker 204*8fb009dcSAndroid Build Coastguard Worker sub x2,x2,#240 // restore original x2 205*8fb009dcSAndroid Build Coastguard Worker mov x4,#-16 206*8fb009dcSAndroid Build Coastguard Worker add x0,x2,x12,lsl#4 // end of key schedule 207*8fb009dcSAndroid Build Coastguard Worker 208*8fb009dcSAndroid Build Coastguard Worker ld1 {v0.4s},[x2] 209*8fb009dcSAndroid Build Coastguard Worker ld1 {v1.4s},[x0] 210*8fb009dcSAndroid Build Coastguard Worker st1 {v0.4s},[x0],x4 211*8fb009dcSAndroid Build Coastguard Worker st1 {v1.4s},[x2],#16 212*8fb009dcSAndroid Build Coastguard Worker 213*8fb009dcSAndroid Build Coastguard WorkerLoop_imc: 214*8fb009dcSAndroid Build Coastguard Worker ld1 {v0.4s},[x2] 215*8fb009dcSAndroid Build Coastguard Worker ld1 {v1.4s},[x0] 216*8fb009dcSAndroid Build Coastguard Worker aesimc v0.16b,v0.16b 217*8fb009dcSAndroid Build Coastguard Worker aesimc v1.16b,v1.16b 218*8fb009dcSAndroid Build Coastguard Worker st1 {v0.4s},[x0],x4 219*8fb009dcSAndroid Build Coastguard Worker st1 {v1.4s},[x2],#16 220*8fb009dcSAndroid Build Coastguard Worker cmp x0,x2 221*8fb009dcSAndroid Build Coastguard Worker b.hi Loop_imc 222*8fb009dcSAndroid Build Coastguard Worker 223*8fb009dcSAndroid Build Coastguard Worker ld1 {v0.4s},[x2] 224*8fb009dcSAndroid Build Coastguard Worker aesimc v0.16b,v0.16b 225*8fb009dcSAndroid Build Coastguard Worker st1 {v0.4s},[x0] 226*8fb009dcSAndroid Build Coastguard Worker 227*8fb009dcSAndroid Build Coastguard Worker eor x0,x0,x0 // return value 228*8fb009dcSAndroid Build Coastguard WorkerLdec_key_abort: 229*8fb009dcSAndroid Build Coastguard Worker ldp x29,x30,[sp],#16 230*8fb009dcSAndroid Build Coastguard Worker AARCH64_VALIDATE_LINK_REGISTER 231*8fb009dcSAndroid Build Coastguard Worker ret 232*8fb009dcSAndroid Build Coastguard Worker 233*8fb009dcSAndroid Build Coastguard Worker.globl aes_hw_encrypt 234*8fb009dcSAndroid Build Coastguard Worker 235*8fb009dcSAndroid Build Coastguard Worker.def aes_hw_encrypt 236*8fb009dcSAndroid Build Coastguard Worker .type 32 237*8fb009dcSAndroid Build Coastguard Worker.endef 238*8fb009dcSAndroid Build Coastguard Worker.align 5 239*8fb009dcSAndroid Build Coastguard Workeraes_hw_encrypt: 240*8fb009dcSAndroid Build Coastguard Worker AARCH64_VALID_CALL_TARGET 241*8fb009dcSAndroid Build Coastguard Worker ldr w3,[x2,#240] 242*8fb009dcSAndroid Build Coastguard Worker ld1 {v0.4s},[x2],#16 243*8fb009dcSAndroid Build Coastguard Worker ld1 {v2.16b},[x0] 244*8fb009dcSAndroid Build Coastguard Worker sub w3,w3,#2 245*8fb009dcSAndroid Build Coastguard Worker ld1 {v1.4s},[x2],#16 246*8fb009dcSAndroid Build Coastguard Worker 247*8fb009dcSAndroid Build Coastguard WorkerLoop_enc: 248*8fb009dcSAndroid Build Coastguard Worker aese v2.16b,v0.16b 249*8fb009dcSAndroid Build Coastguard Worker aesmc v2.16b,v2.16b 250*8fb009dcSAndroid Build Coastguard Worker ld1 {v0.4s},[x2],#16 251*8fb009dcSAndroid Build Coastguard Worker subs w3,w3,#2 252*8fb009dcSAndroid Build Coastguard Worker aese v2.16b,v1.16b 253*8fb009dcSAndroid Build Coastguard Worker aesmc v2.16b,v2.16b 254*8fb009dcSAndroid Build Coastguard Worker ld1 {v1.4s},[x2],#16 255*8fb009dcSAndroid Build Coastguard Worker b.gt Loop_enc 256*8fb009dcSAndroid Build Coastguard Worker 257*8fb009dcSAndroid Build Coastguard Worker aese v2.16b,v0.16b 258*8fb009dcSAndroid Build Coastguard Worker aesmc v2.16b,v2.16b 259*8fb009dcSAndroid Build Coastguard Worker ld1 {v0.4s},[x2] 260*8fb009dcSAndroid Build Coastguard Worker aese v2.16b,v1.16b 261*8fb009dcSAndroid Build Coastguard Worker eor v2.16b,v2.16b,v0.16b 262*8fb009dcSAndroid Build Coastguard Worker 263*8fb009dcSAndroid Build Coastguard Worker st1 {v2.16b},[x1] 264*8fb009dcSAndroid Build Coastguard Worker ret 265*8fb009dcSAndroid Build Coastguard Worker 266*8fb009dcSAndroid Build Coastguard Worker.globl aes_hw_decrypt 267*8fb009dcSAndroid Build Coastguard Worker 268*8fb009dcSAndroid Build Coastguard Worker.def aes_hw_decrypt 269*8fb009dcSAndroid Build Coastguard Worker .type 32 270*8fb009dcSAndroid Build Coastguard Worker.endef 271*8fb009dcSAndroid Build Coastguard Worker.align 5 272*8fb009dcSAndroid Build Coastguard Workeraes_hw_decrypt: 273*8fb009dcSAndroid Build Coastguard Worker AARCH64_VALID_CALL_TARGET 274*8fb009dcSAndroid Build Coastguard Worker ldr w3,[x2,#240] 275*8fb009dcSAndroid Build Coastguard Worker ld1 {v0.4s},[x2],#16 276*8fb009dcSAndroid Build Coastguard Worker ld1 {v2.16b},[x0] 277*8fb009dcSAndroid Build Coastguard Worker sub w3,w3,#2 278*8fb009dcSAndroid Build Coastguard Worker ld1 {v1.4s},[x2],#16 279*8fb009dcSAndroid Build Coastguard Worker 280*8fb009dcSAndroid Build Coastguard WorkerLoop_dec: 281*8fb009dcSAndroid Build Coastguard Worker aesd v2.16b,v0.16b 282*8fb009dcSAndroid Build Coastguard Worker aesimc v2.16b,v2.16b 283*8fb009dcSAndroid Build Coastguard Worker ld1 {v0.4s},[x2],#16 284*8fb009dcSAndroid Build Coastguard Worker subs w3,w3,#2 285*8fb009dcSAndroid Build Coastguard Worker aesd v2.16b,v1.16b 286*8fb009dcSAndroid Build Coastguard Worker aesimc v2.16b,v2.16b 287*8fb009dcSAndroid Build Coastguard Worker ld1 {v1.4s},[x2],#16 288*8fb009dcSAndroid Build Coastguard Worker b.gt Loop_dec 289*8fb009dcSAndroid Build Coastguard Worker 290*8fb009dcSAndroid Build Coastguard Worker aesd v2.16b,v0.16b 291*8fb009dcSAndroid Build Coastguard Worker aesimc v2.16b,v2.16b 292*8fb009dcSAndroid Build Coastguard Worker ld1 {v0.4s},[x2] 293*8fb009dcSAndroid Build Coastguard Worker aesd v2.16b,v1.16b 294*8fb009dcSAndroid Build Coastguard Worker eor v2.16b,v2.16b,v0.16b 295*8fb009dcSAndroid Build Coastguard Worker 296*8fb009dcSAndroid Build Coastguard Worker st1 {v2.16b},[x1] 297*8fb009dcSAndroid Build Coastguard Worker ret 298*8fb009dcSAndroid Build Coastguard Worker 299*8fb009dcSAndroid Build Coastguard Worker.globl aes_hw_cbc_encrypt 300*8fb009dcSAndroid Build Coastguard Worker 301*8fb009dcSAndroid Build Coastguard Worker.def aes_hw_cbc_encrypt 302*8fb009dcSAndroid Build Coastguard Worker .type 32 303*8fb009dcSAndroid Build Coastguard Worker.endef 304*8fb009dcSAndroid Build Coastguard Worker.align 5 305*8fb009dcSAndroid Build Coastguard Workeraes_hw_cbc_encrypt: 306*8fb009dcSAndroid Build Coastguard Worker // Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later. 307*8fb009dcSAndroid Build Coastguard Worker AARCH64_VALID_CALL_TARGET 308*8fb009dcSAndroid Build Coastguard Worker stp x29,x30,[sp,#-16]! 309*8fb009dcSAndroid Build Coastguard Worker add x29,sp,#0 310*8fb009dcSAndroid Build Coastguard Worker subs x2,x2,#16 311*8fb009dcSAndroid Build Coastguard Worker mov x8,#16 312*8fb009dcSAndroid Build Coastguard Worker b.lo Lcbc_abort 313*8fb009dcSAndroid Build Coastguard Worker csel x8,xzr,x8,eq 314*8fb009dcSAndroid Build Coastguard Worker 315*8fb009dcSAndroid Build Coastguard Worker cmp w5,#0 // en- or decrypting? 316*8fb009dcSAndroid Build Coastguard Worker ldr w5,[x3,#240] 317*8fb009dcSAndroid Build Coastguard Worker and x2,x2,#-16 318*8fb009dcSAndroid Build Coastguard Worker ld1 {v6.16b},[x4] 319*8fb009dcSAndroid Build Coastguard Worker ld1 {v0.16b},[x0],x8 320*8fb009dcSAndroid Build Coastguard Worker 321*8fb009dcSAndroid Build Coastguard Worker ld1 {v16.4s,v17.4s},[x3] // load key schedule... 322*8fb009dcSAndroid Build Coastguard Worker sub w5,w5,#6 323*8fb009dcSAndroid Build Coastguard Worker add x7,x3,x5,lsl#4 // pointer to last 7 round keys 324*8fb009dcSAndroid Build Coastguard Worker sub w5,w5,#2 325*8fb009dcSAndroid Build Coastguard Worker ld1 {v18.4s,v19.4s},[x7],#32 326*8fb009dcSAndroid Build Coastguard Worker ld1 {v20.4s,v21.4s},[x7],#32 327*8fb009dcSAndroid Build Coastguard Worker ld1 {v22.4s,v23.4s},[x7],#32 328*8fb009dcSAndroid Build Coastguard Worker ld1 {v7.4s},[x7] 329*8fb009dcSAndroid Build Coastguard Worker 330*8fb009dcSAndroid Build Coastguard Worker add x7,x3,#32 331*8fb009dcSAndroid Build Coastguard Worker mov w6,w5 332*8fb009dcSAndroid Build Coastguard Worker b.eq Lcbc_dec 333*8fb009dcSAndroid Build Coastguard Worker 334*8fb009dcSAndroid Build Coastguard Worker cmp w5,#2 335*8fb009dcSAndroid Build Coastguard Worker eor v0.16b,v0.16b,v6.16b 336*8fb009dcSAndroid Build Coastguard Worker eor v5.16b,v16.16b,v7.16b 337*8fb009dcSAndroid Build Coastguard Worker b.eq Lcbc_enc128 338*8fb009dcSAndroid Build Coastguard Worker 339*8fb009dcSAndroid Build Coastguard Worker ld1 {v2.4s,v3.4s},[x7] 340*8fb009dcSAndroid Build Coastguard Worker add x7,x3,#16 341*8fb009dcSAndroid Build Coastguard Worker add x6,x3,#16*4 342*8fb009dcSAndroid Build Coastguard Worker add x12,x3,#16*5 343*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v16.16b 344*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 345*8fb009dcSAndroid Build Coastguard Worker add x14,x3,#16*6 346*8fb009dcSAndroid Build Coastguard Worker add x3,x3,#16*7 347*8fb009dcSAndroid Build Coastguard Worker b Lenter_cbc_enc 348*8fb009dcSAndroid Build Coastguard Worker 349*8fb009dcSAndroid Build Coastguard Worker.align 4 350*8fb009dcSAndroid Build Coastguard WorkerLoop_cbc_enc: 351*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v16.16b 352*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 353*8fb009dcSAndroid Build Coastguard Worker st1 {v6.16b},[x1],#16 354*8fb009dcSAndroid Build Coastguard WorkerLenter_cbc_enc: 355*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v17.16b 356*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 357*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v2.16b 358*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 359*8fb009dcSAndroid Build Coastguard Worker ld1 {v16.4s},[x6] 360*8fb009dcSAndroid Build Coastguard Worker cmp w5,#4 361*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v3.16b 362*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 363*8fb009dcSAndroid Build Coastguard Worker ld1 {v17.4s},[x12] 364*8fb009dcSAndroid Build Coastguard Worker b.eq Lcbc_enc192 365*8fb009dcSAndroid Build Coastguard Worker 366*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v16.16b 367*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 368*8fb009dcSAndroid Build Coastguard Worker ld1 {v16.4s},[x14] 369*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v17.16b 370*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 371*8fb009dcSAndroid Build Coastguard Worker ld1 {v17.4s},[x3] 372*8fb009dcSAndroid Build Coastguard Worker nop 373*8fb009dcSAndroid Build Coastguard Worker 374*8fb009dcSAndroid Build Coastguard WorkerLcbc_enc192: 375*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v16.16b 376*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 377*8fb009dcSAndroid Build Coastguard Worker subs x2,x2,#16 378*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v17.16b 379*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 380*8fb009dcSAndroid Build Coastguard Worker csel x8,xzr,x8,eq 381*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v18.16b 382*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 383*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v19.16b 384*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 385*8fb009dcSAndroid Build Coastguard Worker ld1 {v16.16b},[x0],x8 386*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v20.16b 387*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 388*8fb009dcSAndroid Build Coastguard Worker eor v16.16b,v16.16b,v5.16b 389*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v21.16b 390*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 391*8fb009dcSAndroid Build Coastguard Worker ld1 {v17.4s},[x7] // re-pre-load rndkey[1] 392*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v22.16b 393*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 394*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v23.16b 395*8fb009dcSAndroid Build Coastguard Worker eor v6.16b,v0.16b,v7.16b 396*8fb009dcSAndroid Build Coastguard Worker b.hs Loop_cbc_enc 397*8fb009dcSAndroid Build Coastguard Worker 398*8fb009dcSAndroid Build Coastguard Worker st1 {v6.16b},[x1],#16 399*8fb009dcSAndroid Build Coastguard Worker b Lcbc_done 400*8fb009dcSAndroid Build Coastguard Worker 401*8fb009dcSAndroid Build Coastguard Worker.align 5 402*8fb009dcSAndroid Build Coastguard WorkerLcbc_enc128: 403*8fb009dcSAndroid Build Coastguard Worker ld1 {v2.4s,v3.4s},[x7] 404*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v16.16b 405*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 406*8fb009dcSAndroid Build Coastguard Worker b Lenter_cbc_enc128 407*8fb009dcSAndroid Build Coastguard WorkerLoop_cbc_enc128: 408*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v16.16b 409*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 410*8fb009dcSAndroid Build Coastguard Worker st1 {v6.16b},[x1],#16 411*8fb009dcSAndroid Build Coastguard WorkerLenter_cbc_enc128: 412*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v17.16b 413*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 414*8fb009dcSAndroid Build Coastguard Worker subs x2,x2,#16 415*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v2.16b 416*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 417*8fb009dcSAndroid Build Coastguard Worker csel x8,xzr,x8,eq 418*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v3.16b 419*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 420*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v18.16b 421*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 422*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v19.16b 423*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 424*8fb009dcSAndroid Build Coastguard Worker ld1 {v16.16b},[x0],x8 425*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v20.16b 426*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 427*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v21.16b 428*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 429*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v22.16b 430*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 431*8fb009dcSAndroid Build Coastguard Worker eor v16.16b,v16.16b,v5.16b 432*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v23.16b 433*8fb009dcSAndroid Build Coastguard Worker eor v6.16b,v0.16b,v7.16b 434*8fb009dcSAndroid Build Coastguard Worker b.hs Loop_cbc_enc128 435*8fb009dcSAndroid Build Coastguard Worker 436*8fb009dcSAndroid Build Coastguard Worker st1 {v6.16b},[x1],#16 437*8fb009dcSAndroid Build Coastguard Worker b Lcbc_done 438*8fb009dcSAndroid Build Coastguard Worker.align 5 439*8fb009dcSAndroid Build Coastguard WorkerLcbc_dec: 440*8fb009dcSAndroid Build Coastguard Worker ld1 {v18.16b},[x0],#16 441*8fb009dcSAndroid Build Coastguard Worker subs x2,x2,#32 // bias 442*8fb009dcSAndroid Build Coastguard Worker add w6,w5,#2 443*8fb009dcSAndroid Build Coastguard Worker orr v3.16b,v0.16b,v0.16b 444*8fb009dcSAndroid Build Coastguard Worker orr v1.16b,v0.16b,v0.16b 445*8fb009dcSAndroid Build Coastguard Worker orr v19.16b,v18.16b,v18.16b 446*8fb009dcSAndroid Build Coastguard Worker b.lo Lcbc_dec_tail 447*8fb009dcSAndroid Build Coastguard Worker 448*8fb009dcSAndroid Build Coastguard Worker orr v1.16b,v18.16b,v18.16b 449*8fb009dcSAndroid Build Coastguard Worker ld1 {v18.16b},[x0],#16 450*8fb009dcSAndroid Build Coastguard Worker orr v2.16b,v0.16b,v0.16b 451*8fb009dcSAndroid Build Coastguard Worker orr v3.16b,v1.16b,v1.16b 452*8fb009dcSAndroid Build Coastguard Worker orr v19.16b,v18.16b,v18.16b 453*8fb009dcSAndroid Build Coastguard Worker 454*8fb009dcSAndroid Build Coastguard WorkerLoop3x_cbc_dec: 455*8fb009dcSAndroid Build Coastguard Worker aesd v0.16b,v16.16b 456*8fb009dcSAndroid Build Coastguard Worker aesimc v0.16b,v0.16b 457*8fb009dcSAndroid Build Coastguard Worker aesd v1.16b,v16.16b 458*8fb009dcSAndroid Build Coastguard Worker aesimc v1.16b,v1.16b 459*8fb009dcSAndroid Build Coastguard Worker aesd v18.16b,v16.16b 460*8fb009dcSAndroid Build Coastguard Worker aesimc v18.16b,v18.16b 461*8fb009dcSAndroid Build Coastguard Worker ld1 {v16.4s},[x7],#16 462*8fb009dcSAndroid Build Coastguard Worker subs w6,w6,#2 463*8fb009dcSAndroid Build Coastguard Worker aesd v0.16b,v17.16b 464*8fb009dcSAndroid Build Coastguard Worker aesimc v0.16b,v0.16b 465*8fb009dcSAndroid Build Coastguard Worker aesd v1.16b,v17.16b 466*8fb009dcSAndroid Build Coastguard Worker aesimc v1.16b,v1.16b 467*8fb009dcSAndroid Build Coastguard Worker aesd v18.16b,v17.16b 468*8fb009dcSAndroid Build Coastguard Worker aesimc v18.16b,v18.16b 469*8fb009dcSAndroid Build Coastguard Worker ld1 {v17.4s},[x7],#16 470*8fb009dcSAndroid Build Coastguard Worker b.gt Loop3x_cbc_dec 471*8fb009dcSAndroid Build Coastguard Worker 472*8fb009dcSAndroid Build Coastguard Worker aesd v0.16b,v16.16b 473*8fb009dcSAndroid Build Coastguard Worker aesimc v0.16b,v0.16b 474*8fb009dcSAndroid Build Coastguard Worker aesd v1.16b,v16.16b 475*8fb009dcSAndroid Build Coastguard Worker aesimc v1.16b,v1.16b 476*8fb009dcSAndroid Build Coastguard Worker aesd v18.16b,v16.16b 477*8fb009dcSAndroid Build Coastguard Worker aesimc v18.16b,v18.16b 478*8fb009dcSAndroid Build Coastguard Worker eor v4.16b,v6.16b,v7.16b 479*8fb009dcSAndroid Build Coastguard Worker subs x2,x2,#0x30 480*8fb009dcSAndroid Build Coastguard Worker eor v5.16b,v2.16b,v7.16b 481*8fb009dcSAndroid Build Coastguard Worker csel x6,x2,x6,lo // x6, w6, is zero at this point 482*8fb009dcSAndroid Build Coastguard Worker aesd v0.16b,v17.16b 483*8fb009dcSAndroid Build Coastguard Worker aesimc v0.16b,v0.16b 484*8fb009dcSAndroid Build Coastguard Worker aesd v1.16b,v17.16b 485*8fb009dcSAndroid Build Coastguard Worker aesimc v1.16b,v1.16b 486*8fb009dcSAndroid Build Coastguard Worker aesd v18.16b,v17.16b 487*8fb009dcSAndroid Build Coastguard Worker aesimc v18.16b,v18.16b 488*8fb009dcSAndroid Build Coastguard Worker eor v17.16b,v3.16b,v7.16b 489*8fb009dcSAndroid Build Coastguard Worker add x0,x0,x6 // x0 is adjusted in such way that 490*8fb009dcSAndroid Build Coastguard Worker // at exit from the loop v1.16b-v18.16b 491*8fb009dcSAndroid Build Coastguard Worker // are loaded with last "words" 492*8fb009dcSAndroid Build Coastguard Worker orr v6.16b,v19.16b,v19.16b 493*8fb009dcSAndroid Build Coastguard Worker mov x7,x3 494*8fb009dcSAndroid Build Coastguard Worker aesd v0.16b,v20.16b 495*8fb009dcSAndroid Build Coastguard Worker aesimc v0.16b,v0.16b 496*8fb009dcSAndroid Build Coastguard Worker aesd v1.16b,v20.16b 497*8fb009dcSAndroid Build Coastguard Worker aesimc v1.16b,v1.16b 498*8fb009dcSAndroid Build Coastguard Worker aesd v18.16b,v20.16b 499*8fb009dcSAndroid Build Coastguard Worker aesimc v18.16b,v18.16b 500*8fb009dcSAndroid Build Coastguard Worker ld1 {v2.16b},[x0],#16 501*8fb009dcSAndroid Build Coastguard Worker aesd v0.16b,v21.16b 502*8fb009dcSAndroid Build Coastguard Worker aesimc v0.16b,v0.16b 503*8fb009dcSAndroid Build Coastguard Worker aesd v1.16b,v21.16b 504*8fb009dcSAndroid Build Coastguard Worker aesimc v1.16b,v1.16b 505*8fb009dcSAndroid Build Coastguard Worker aesd v18.16b,v21.16b 506*8fb009dcSAndroid Build Coastguard Worker aesimc v18.16b,v18.16b 507*8fb009dcSAndroid Build Coastguard Worker ld1 {v3.16b},[x0],#16 508*8fb009dcSAndroid Build Coastguard Worker aesd v0.16b,v22.16b 509*8fb009dcSAndroid Build Coastguard Worker aesimc v0.16b,v0.16b 510*8fb009dcSAndroid Build Coastguard Worker aesd v1.16b,v22.16b 511*8fb009dcSAndroid Build Coastguard Worker aesimc v1.16b,v1.16b 512*8fb009dcSAndroid Build Coastguard Worker aesd v18.16b,v22.16b 513*8fb009dcSAndroid Build Coastguard Worker aesimc v18.16b,v18.16b 514*8fb009dcSAndroid Build Coastguard Worker ld1 {v19.16b},[x0],#16 515*8fb009dcSAndroid Build Coastguard Worker aesd v0.16b,v23.16b 516*8fb009dcSAndroid Build Coastguard Worker aesd v1.16b,v23.16b 517*8fb009dcSAndroid Build Coastguard Worker aesd v18.16b,v23.16b 518*8fb009dcSAndroid Build Coastguard Worker ld1 {v16.4s},[x7],#16 // re-pre-load rndkey[0] 519*8fb009dcSAndroid Build Coastguard Worker add w6,w5,#2 520*8fb009dcSAndroid Build Coastguard Worker eor v4.16b,v4.16b,v0.16b 521*8fb009dcSAndroid Build Coastguard Worker eor v5.16b,v5.16b,v1.16b 522*8fb009dcSAndroid Build Coastguard Worker eor v18.16b,v18.16b,v17.16b 523*8fb009dcSAndroid Build Coastguard Worker ld1 {v17.4s},[x7],#16 // re-pre-load rndkey[1] 524*8fb009dcSAndroid Build Coastguard Worker st1 {v4.16b},[x1],#16 525*8fb009dcSAndroid Build Coastguard Worker orr v0.16b,v2.16b,v2.16b 526*8fb009dcSAndroid Build Coastguard Worker st1 {v5.16b},[x1],#16 527*8fb009dcSAndroid Build Coastguard Worker orr v1.16b,v3.16b,v3.16b 528*8fb009dcSAndroid Build Coastguard Worker st1 {v18.16b},[x1],#16 529*8fb009dcSAndroid Build Coastguard Worker orr v18.16b,v19.16b,v19.16b 530*8fb009dcSAndroid Build Coastguard Worker b.hs Loop3x_cbc_dec 531*8fb009dcSAndroid Build Coastguard Worker 532*8fb009dcSAndroid Build Coastguard Worker cmn x2,#0x30 533*8fb009dcSAndroid Build Coastguard Worker b.eq Lcbc_done 534*8fb009dcSAndroid Build Coastguard Worker nop 535*8fb009dcSAndroid Build Coastguard Worker 536*8fb009dcSAndroid Build Coastguard WorkerLcbc_dec_tail: 537*8fb009dcSAndroid Build Coastguard Worker aesd v1.16b,v16.16b 538*8fb009dcSAndroid Build Coastguard Worker aesimc v1.16b,v1.16b 539*8fb009dcSAndroid Build Coastguard Worker aesd v18.16b,v16.16b 540*8fb009dcSAndroid Build Coastguard Worker aesimc v18.16b,v18.16b 541*8fb009dcSAndroid Build Coastguard Worker ld1 {v16.4s},[x7],#16 542*8fb009dcSAndroid Build Coastguard Worker subs w6,w6,#2 543*8fb009dcSAndroid Build Coastguard Worker aesd v1.16b,v17.16b 544*8fb009dcSAndroid Build Coastguard Worker aesimc v1.16b,v1.16b 545*8fb009dcSAndroid Build Coastguard Worker aesd v18.16b,v17.16b 546*8fb009dcSAndroid Build Coastguard Worker aesimc v18.16b,v18.16b 547*8fb009dcSAndroid Build Coastguard Worker ld1 {v17.4s},[x7],#16 548*8fb009dcSAndroid Build Coastguard Worker b.gt Lcbc_dec_tail 549*8fb009dcSAndroid Build Coastguard Worker 550*8fb009dcSAndroid Build Coastguard Worker aesd v1.16b,v16.16b 551*8fb009dcSAndroid Build Coastguard Worker aesimc v1.16b,v1.16b 552*8fb009dcSAndroid Build Coastguard Worker aesd v18.16b,v16.16b 553*8fb009dcSAndroid Build Coastguard Worker aesimc v18.16b,v18.16b 554*8fb009dcSAndroid Build Coastguard Worker aesd v1.16b,v17.16b 555*8fb009dcSAndroid Build Coastguard Worker aesimc v1.16b,v1.16b 556*8fb009dcSAndroid Build Coastguard Worker aesd v18.16b,v17.16b 557*8fb009dcSAndroid Build Coastguard Worker aesimc v18.16b,v18.16b 558*8fb009dcSAndroid Build Coastguard Worker aesd v1.16b,v20.16b 559*8fb009dcSAndroid Build Coastguard Worker aesimc v1.16b,v1.16b 560*8fb009dcSAndroid Build Coastguard Worker aesd v18.16b,v20.16b 561*8fb009dcSAndroid Build Coastguard Worker aesimc v18.16b,v18.16b 562*8fb009dcSAndroid Build Coastguard Worker cmn x2,#0x20 563*8fb009dcSAndroid Build Coastguard Worker aesd v1.16b,v21.16b 564*8fb009dcSAndroid Build Coastguard Worker aesimc v1.16b,v1.16b 565*8fb009dcSAndroid Build Coastguard Worker aesd v18.16b,v21.16b 566*8fb009dcSAndroid Build Coastguard Worker aesimc v18.16b,v18.16b 567*8fb009dcSAndroid Build Coastguard Worker eor v5.16b,v6.16b,v7.16b 568*8fb009dcSAndroid Build Coastguard Worker aesd v1.16b,v22.16b 569*8fb009dcSAndroid Build Coastguard Worker aesimc v1.16b,v1.16b 570*8fb009dcSAndroid Build Coastguard Worker aesd v18.16b,v22.16b 571*8fb009dcSAndroid Build Coastguard Worker aesimc v18.16b,v18.16b 572*8fb009dcSAndroid Build Coastguard Worker eor v17.16b,v3.16b,v7.16b 573*8fb009dcSAndroid Build Coastguard Worker aesd v1.16b,v23.16b 574*8fb009dcSAndroid Build Coastguard Worker aesd v18.16b,v23.16b 575*8fb009dcSAndroid Build Coastguard Worker b.eq Lcbc_dec_one 576*8fb009dcSAndroid Build Coastguard Worker eor v5.16b,v5.16b,v1.16b 577*8fb009dcSAndroid Build Coastguard Worker eor v17.16b,v17.16b,v18.16b 578*8fb009dcSAndroid Build Coastguard Worker orr v6.16b,v19.16b,v19.16b 579*8fb009dcSAndroid Build Coastguard Worker st1 {v5.16b},[x1],#16 580*8fb009dcSAndroid Build Coastguard Worker st1 {v17.16b},[x1],#16 581*8fb009dcSAndroid Build Coastguard Worker b Lcbc_done 582*8fb009dcSAndroid Build Coastguard Worker 583*8fb009dcSAndroid Build Coastguard WorkerLcbc_dec_one: 584*8fb009dcSAndroid Build Coastguard Worker eor v5.16b,v5.16b,v18.16b 585*8fb009dcSAndroid Build Coastguard Worker orr v6.16b,v19.16b,v19.16b 586*8fb009dcSAndroid Build Coastguard Worker st1 {v5.16b},[x1],#16 587*8fb009dcSAndroid Build Coastguard Worker 588*8fb009dcSAndroid Build Coastguard WorkerLcbc_done: 589*8fb009dcSAndroid Build Coastguard Worker st1 {v6.16b},[x4] 590*8fb009dcSAndroid Build Coastguard WorkerLcbc_abort: 591*8fb009dcSAndroid Build Coastguard Worker ldr x29,[sp],#16 592*8fb009dcSAndroid Build Coastguard Worker ret 593*8fb009dcSAndroid Build Coastguard Worker 594*8fb009dcSAndroid Build Coastguard Worker.globl aes_hw_ctr32_encrypt_blocks 595*8fb009dcSAndroid Build Coastguard Worker 596*8fb009dcSAndroid Build Coastguard Worker.def aes_hw_ctr32_encrypt_blocks 597*8fb009dcSAndroid Build Coastguard Worker .type 32 598*8fb009dcSAndroid Build Coastguard Worker.endef 599*8fb009dcSAndroid Build Coastguard Worker.align 5 600*8fb009dcSAndroid Build Coastguard Workeraes_hw_ctr32_encrypt_blocks: 601*8fb009dcSAndroid Build Coastguard Worker // Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later. 602*8fb009dcSAndroid Build Coastguard Worker AARCH64_VALID_CALL_TARGET 603*8fb009dcSAndroid Build Coastguard Worker stp x29,x30,[sp,#-16]! 604*8fb009dcSAndroid Build Coastguard Worker add x29,sp,#0 605*8fb009dcSAndroid Build Coastguard Worker ldr w5,[x3,#240] 606*8fb009dcSAndroid Build Coastguard Worker 607*8fb009dcSAndroid Build Coastguard Worker ldr w8, [x4, #12] 608*8fb009dcSAndroid Build Coastguard Worker ld1 {v0.4s},[x4] 609*8fb009dcSAndroid Build Coastguard Worker 610*8fb009dcSAndroid Build Coastguard Worker ld1 {v16.4s,v17.4s},[x3] // load key schedule... 611*8fb009dcSAndroid Build Coastguard Worker sub w5,w5,#4 612*8fb009dcSAndroid Build Coastguard Worker mov x12,#16 613*8fb009dcSAndroid Build Coastguard Worker cmp x2,#2 614*8fb009dcSAndroid Build Coastguard Worker add x7,x3,x5,lsl#4 // pointer to last 5 round keys 615*8fb009dcSAndroid Build Coastguard Worker sub w5,w5,#2 616*8fb009dcSAndroid Build Coastguard Worker ld1 {v20.4s,v21.4s},[x7],#32 617*8fb009dcSAndroid Build Coastguard Worker ld1 {v22.4s,v23.4s},[x7],#32 618*8fb009dcSAndroid Build Coastguard Worker ld1 {v7.4s},[x7] 619*8fb009dcSAndroid Build Coastguard Worker add x7,x3,#32 620*8fb009dcSAndroid Build Coastguard Worker mov w6,w5 621*8fb009dcSAndroid Build Coastguard Worker csel x12,xzr,x12,lo 622*8fb009dcSAndroid Build Coastguard Worker 623*8fb009dcSAndroid Build Coastguard Worker // ARM Cortex-A57 and Cortex-A72 cores running in 32-bit mode are 624*8fb009dcSAndroid Build Coastguard Worker // affected by silicon errata #1742098 [0] and #1655431 [1], 625*8fb009dcSAndroid Build Coastguard Worker // respectively, where the second instruction of an aese/aesmc 626*8fb009dcSAndroid Build Coastguard Worker // instruction pair may execute twice if an interrupt is taken right 627*8fb009dcSAndroid Build Coastguard Worker // after the first instruction consumes an input register of which a 628*8fb009dcSAndroid Build Coastguard Worker // single 32-bit lane has been updated the last time it was modified. 629*8fb009dcSAndroid Build Coastguard Worker // 630*8fb009dcSAndroid Build Coastguard Worker // This function uses a counter in one 32-bit lane. The vmov lines 631*8fb009dcSAndroid Build Coastguard Worker // could write to v1.16b and v18.16b directly, but that trips this bugs. 632*8fb009dcSAndroid Build Coastguard Worker // We write to v6.16b and copy to the final register as a workaround. 633*8fb009dcSAndroid Build Coastguard Worker // 634*8fb009dcSAndroid Build Coastguard Worker // [0] ARM-EPM-049219 v23 Cortex-A57 MPCore Software Developers Errata Notice 635*8fb009dcSAndroid Build Coastguard Worker // [1] ARM-EPM-012079 v11.0 Cortex-A72 MPCore Software Developers Errata Notice 636*8fb009dcSAndroid Build Coastguard Worker#ifndef __AARCH64EB__ 637*8fb009dcSAndroid Build Coastguard Worker rev w8, w8 638*8fb009dcSAndroid Build Coastguard Worker#endif 639*8fb009dcSAndroid Build Coastguard Worker add w10, w8, #1 640*8fb009dcSAndroid Build Coastguard Worker orr v6.16b,v0.16b,v0.16b 641*8fb009dcSAndroid Build Coastguard Worker rev w10, w10 642*8fb009dcSAndroid Build Coastguard Worker mov v6.s[3],w10 643*8fb009dcSAndroid Build Coastguard Worker add w8, w8, #2 644*8fb009dcSAndroid Build Coastguard Worker orr v1.16b,v6.16b,v6.16b 645*8fb009dcSAndroid Build Coastguard Worker b.ls Lctr32_tail 646*8fb009dcSAndroid Build Coastguard Worker rev w12, w8 647*8fb009dcSAndroid Build Coastguard Worker mov v6.s[3],w12 648*8fb009dcSAndroid Build Coastguard Worker sub x2,x2,#3 // bias 649*8fb009dcSAndroid Build Coastguard Worker orr v18.16b,v6.16b,v6.16b 650*8fb009dcSAndroid Build Coastguard Worker b Loop3x_ctr32 651*8fb009dcSAndroid Build Coastguard Worker 652*8fb009dcSAndroid Build Coastguard Worker.align 4 653*8fb009dcSAndroid Build Coastguard WorkerLoop3x_ctr32: 654*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v16.16b 655*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 656*8fb009dcSAndroid Build Coastguard Worker aese v1.16b,v16.16b 657*8fb009dcSAndroid Build Coastguard Worker aesmc v1.16b,v1.16b 658*8fb009dcSAndroid Build Coastguard Worker aese v18.16b,v16.16b 659*8fb009dcSAndroid Build Coastguard Worker aesmc v18.16b,v18.16b 660*8fb009dcSAndroid Build Coastguard Worker ld1 {v16.4s},[x7],#16 661*8fb009dcSAndroid Build Coastguard Worker subs w6,w6,#2 662*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v17.16b 663*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 664*8fb009dcSAndroid Build Coastguard Worker aese v1.16b,v17.16b 665*8fb009dcSAndroid Build Coastguard Worker aesmc v1.16b,v1.16b 666*8fb009dcSAndroid Build Coastguard Worker aese v18.16b,v17.16b 667*8fb009dcSAndroid Build Coastguard Worker aesmc v18.16b,v18.16b 668*8fb009dcSAndroid Build Coastguard Worker ld1 {v17.4s},[x7],#16 669*8fb009dcSAndroid Build Coastguard Worker b.gt Loop3x_ctr32 670*8fb009dcSAndroid Build Coastguard Worker 671*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v16.16b 672*8fb009dcSAndroid Build Coastguard Worker aesmc v4.16b,v0.16b 673*8fb009dcSAndroid Build Coastguard Worker aese v1.16b,v16.16b 674*8fb009dcSAndroid Build Coastguard Worker aesmc v5.16b,v1.16b 675*8fb009dcSAndroid Build Coastguard Worker ld1 {v2.16b},[x0],#16 676*8fb009dcSAndroid Build Coastguard Worker add w9,w8,#1 677*8fb009dcSAndroid Build Coastguard Worker aese v18.16b,v16.16b 678*8fb009dcSAndroid Build Coastguard Worker aesmc v18.16b,v18.16b 679*8fb009dcSAndroid Build Coastguard Worker ld1 {v3.16b},[x0],#16 680*8fb009dcSAndroid Build Coastguard Worker rev w9,w9 681*8fb009dcSAndroid Build Coastguard Worker aese v4.16b,v17.16b 682*8fb009dcSAndroid Build Coastguard Worker aesmc v4.16b,v4.16b 683*8fb009dcSAndroid Build Coastguard Worker aese v5.16b,v17.16b 684*8fb009dcSAndroid Build Coastguard Worker aesmc v5.16b,v5.16b 685*8fb009dcSAndroid Build Coastguard Worker ld1 {v19.16b},[x0],#16 686*8fb009dcSAndroid Build Coastguard Worker mov x7,x3 687*8fb009dcSAndroid Build Coastguard Worker aese v18.16b,v17.16b 688*8fb009dcSAndroid Build Coastguard Worker aesmc v17.16b,v18.16b 689*8fb009dcSAndroid Build Coastguard Worker aese v4.16b,v20.16b 690*8fb009dcSAndroid Build Coastguard Worker aesmc v4.16b,v4.16b 691*8fb009dcSAndroid Build Coastguard Worker aese v5.16b,v20.16b 692*8fb009dcSAndroid Build Coastguard Worker aesmc v5.16b,v5.16b 693*8fb009dcSAndroid Build Coastguard Worker eor v2.16b,v2.16b,v7.16b 694*8fb009dcSAndroid Build Coastguard Worker add w10,w8,#2 695*8fb009dcSAndroid Build Coastguard Worker aese v17.16b,v20.16b 696*8fb009dcSAndroid Build Coastguard Worker aesmc v17.16b,v17.16b 697*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v7.16b 698*8fb009dcSAndroid Build Coastguard Worker add w8,w8,#3 699*8fb009dcSAndroid Build Coastguard Worker aese v4.16b,v21.16b 700*8fb009dcSAndroid Build Coastguard Worker aesmc v4.16b,v4.16b 701*8fb009dcSAndroid Build Coastguard Worker aese v5.16b,v21.16b 702*8fb009dcSAndroid Build Coastguard Worker aesmc v5.16b,v5.16b 703*8fb009dcSAndroid Build Coastguard Worker // Note the logic to update v0.16b, v1.16b, and v1.16b is written to work 704*8fb009dcSAndroid Build Coastguard Worker // around a bug in ARM Cortex-A57 and Cortex-A72 cores running in 705*8fb009dcSAndroid Build Coastguard Worker // 32-bit mode. See the comment above. 706*8fb009dcSAndroid Build Coastguard Worker eor v19.16b,v19.16b,v7.16b 707*8fb009dcSAndroid Build Coastguard Worker mov v6.s[3], w9 708*8fb009dcSAndroid Build Coastguard Worker aese v17.16b,v21.16b 709*8fb009dcSAndroid Build Coastguard Worker aesmc v17.16b,v17.16b 710*8fb009dcSAndroid Build Coastguard Worker orr v0.16b,v6.16b,v6.16b 711*8fb009dcSAndroid Build Coastguard Worker rev w10,w10 712*8fb009dcSAndroid Build Coastguard Worker aese v4.16b,v22.16b 713*8fb009dcSAndroid Build Coastguard Worker aesmc v4.16b,v4.16b 714*8fb009dcSAndroid Build Coastguard Worker mov v6.s[3], w10 715*8fb009dcSAndroid Build Coastguard Worker rev w12,w8 716*8fb009dcSAndroid Build Coastguard Worker aese v5.16b,v22.16b 717*8fb009dcSAndroid Build Coastguard Worker aesmc v5.16b,v5.16b 718*8fb009dcSAndroid Build Coastguard Worker orr v1.16b,v6.16b,v6.16b 719*8fb009dcSAndroid Build Coastguard Worker mov v6.s[3], w12 720*8fb009dcSAndroid Build Coastguard Worker aese v17.16b,v22.16b 721*8fb009dcSAndroid Build Coastguard Worker aesmc v17.16b,v17.16b 722*8fb009dcSAndroid Build Coastguard Worker orr v18.16b,v6.16b,v6.16b 723*8fb009dcSAndroid Build Coastguard Worker subs x2,x2,#3 724*8fb009dcSAndroid Build Coastguard Worker aese v4.16b,v23.16b 725*8fb009dcSAndroid Build Coastguard Worker aese v5.16b,v23.16b 726*8fb009dcSAndroid Build Coastguard Worker aese v17.16b,v23.16b 727*8fb009dcSAndroid Build Coastguard Worker 728*8fb009dcSAndroid Build Coastguard Worker eor v2.16b,v2.16b,v4.16b 729*8fb009dcSAndroid Build Coastguard Worker ld1 {v16.4s},[x7],#16 // re-pre-load rndkey[0] 730*8fb009dcSAndroid Build Coastguard Worker st1 {v2.16b},[x1],#16 731*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v5.16b 732*8fb009dcSAndroid Build Coastguard Worker mov w6,w5 733*8fb009dcSAndroid Build Coastguard Worker st1 {v3.16b},[x1],#16 734*8fb009dcSAndroid Build Coastguard Worker eor v19.16b,v19.16b,v17.16b 735*8fb009dcSAndroid Build Coastguard Worker ld1 {v17.4s},[x7],#16 // re-pre-load rndkey[1] 736*8fb009dcSAndroid Build Coastguard Worker st1 {v19.16b},[x1],#16 737*8fb009dcSAndroid Build Coastguard Worker b.hs Loop3x_ctr32 738*8fb009dcSAndroid Build Coastguard Worker 739*8fb009dcSAndroid Build Coastguard Worker adds x2,x2,#3 740*8fb009dcSAndroid Build Coastguard Worker b.eq Lctr32_done 741*8fb009dcSAndroid Build Coastguard Worker cmp x2,#1 742*8fb009dcSAndroid Build Coastguard Worker mov x12,#16 743*8fb009dcSAndroid Build Coastguard Worker csel x12,xzr,x12,eq 744*8fb009dcSAndroid Build Coastguard Worker 745*8fb009dcSAndroid Build Coastguard WorkerLctr32_tail: 746*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v16.16b 747*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 748*8fb009dcSAndroid Build Coastguard Worker aese v1.16b,v16.16b 749*8fb009dcSAndroid Build Coastguard Worker aesmc v1.16b,v1.16b 750*8fb009dcSAndroid Build Coastguard Worker ld1 {v16.4s},[x7],#16 751*8fb009dcSAndroid Build Coastguard Worker subs w6,w6,#2 752*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v17.16b 753*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 754*8fb009dcSAndroid Build Coastguard Worker aese v1.16b,v17.16b 755*8fb009dcSAndroid Build Coastguard Worker aesmc v1.16b,v1.16b 756*8fb009dcSAndroid Build Coastguard Worker ld1 {v17.4s},[x7],#16 757*8fb009dcSAndroid Build Coastguard Worker b.gt Lctr32_tail 758*8fb009dcSAndroid Build Coastguard Worker 759*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v16.16b 760*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 761*8fb009dcSAndroid Build Coastguard Worker aese v1.16b,v16.16b 762*8fb009dcSAndroid Build Coastguard Worker aesmc v1.16b,v1.16b 763*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v17.16b 764*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 765*8fb009dcSAndroid Build Coastguard Worker aese v1.16b,v17.16b 766*8fb009dcSAndroid Build Coastguard Worker aesmc v1.16b,v1.16b 767*8fb009dcSAndroid Build Coastguard Worker ld1 {v2.16b},[x0],x12 768*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v20.16b 769*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 770*8fb009dcSAndroid Build Coastguard Worker aese v1.16b,v20.16b 771*8fb009dcSAndroid Build Coastguard Worker aesmc v1.16b,v1.16b 772*8fb009dcSAndroid Build Coastguard Worker ld1 {v3.16b},[x0] 773*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v21.16b 774*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 775*8fb009dcSAndroid Build Coastguard Worker aese v1.16b,v21.16b 776*8fb009dcSAndroid Build Coastguard Worker aesmc v1.16b,v1.16b 777*8fb009dcSAndroid Build Coastguard Worker eor v2.16b,v2.16b,v7.16b 778*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v22.16b 779*8fb009dcSAndroid Build Coastguard Worker aesmc v0.16b,v0.16b 780*8fb009dcSAndroid Build Coastguard Worker aese v1.16b,v22.16b 781*8fb009dcSAndroid Build Coastguard Worker aesmc v1.16b,v1.16b 782*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v7.16b 783*8fb009dcSAndroid Build Coastguard Worker aese v0.16b,v23.16b 784*8fb009dcSAndroid Build Coastguard Worker aese v1.16b,v23.16b 785*8fb009dcSAndroid Build Coastguard Worker 786*8fb009dcSAndroid Build Coastguard Worker cmp x2,#1 787*8fb009dcSAndroid Build Coastguard Worker eor v2.16b,v2.16b,v0.16b 788*8fb009dcSAndroid Build Coastguard Worker eor v3.16b,v3.16b,v1.16b 789*8fb009dcSAndroid Build Coastguard Worker st1 {v2.16b},[x1],#16 790*8fb009dcSAndroid Build Coastguard Worker b.eq Lctr32_done 791*8fb009dcSAndroid Build Coastguard Worker st1 {v3.16b},[x1] 792*8fb009dcSAndroid Build Coastguard Worker 793*8fb009dcSAndroid Build Coastguard WorkerLctr32_done: 794*8fb009dcSAndroid Build Coastguard Worker ldr x29,[sp],#16 795*8fb009dcSAndroid Build Coastguard Worker ret 796*8fb009dcSAndroid Build Coastguard Worker 797*8fb009dcSAndroid Build Coastguard Worker#endif 798*8fb009dcSAndroid Build Coastguard Worker#endif // !OPENSSL_NO_ASM && defined(OPENSSL_AARCH64) && defined(_WIN32) 799