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_ARM) && defined(__ELF__) 7*8fb009dcSAndroid Build Coastguard Worker@ Copyright 2012-2016 The OpenSSL Project Authors. All Rights Reserved. 8*8fb009dcSAndroid Build Coastguard Worker@ 9*8fb009dcSAndroid Build Coastguard Worker@ Licensed under the OpenSSL license (the "License"). You may not use 10*8fb009dcSAndroid Build Coastguard Worker@ this file except in compliance with the License. You can obtain a copy 11*8fb009dcSAndroid Build Coastguard Worker@ in the file LICENSE in the source distribution or at 12*8fb009dcSAndroid Build Coastguard Worker@ https://www.openssl.org/source/license.html 13*8fb009dcSAndroid Build Coastguard Worker 14*8fb009dcSAndroid Build Coastguard Worker 15*8fb009dcSAndroid Build Coastguard Worker@ ==================================================================== 16*8fb009dcSAndroid Build Coastguard Worker@ Written by Andy Polyakov <appro@openssl.org> for the OpenSSL 17*8fb009dcSAndroid Build Coastguard Worker@ project. The module is, however, dual licensed under OpenSSL and 18*8fb009dcSAndroid Build Coastguard Worker@ CRYPTOGAMS licenses depending on where you obtain it. For further 19*8fb009dcSAndroid Build Coastguard Worker@ details see http://www.openssl.org/~appro/cryptogams/. 20*8fb009dcSAndroid Build Coastguard Worker@ 21*8fb009dcSAndroid Build Coastguard Worker@ Specific modes and adaptation for Linux kernel by Ard Biesheuvel 22*8fb009dcSAndroid Build Coastguard Worker@ of Linaro. Permission to use under GPL terms is granted. 23*8fb009dcSAndroid Build Coastguard Worker@ ==================================================================== 24*8fb009dcSAndroid Build Coastguard Worker 25*8fb009dcSAndroid Build Coastguard Worker@ Bit-sliced AES for ARM NEON 26*8fb009dcSAndroid Build Coastguard Worker@ 27*8fb009dcSAndroid Build Coastguard Worker@ February 2012. 28*8fb009dcSAndroid Build Coastguard Worker@ 29*8fb009dcSAndroid Build Coastguard Worker@ This implementation is direct adaptation of bsaes-x86_64 module for 30*8fb009dcSAndroid Build Coastguard Worker@ ARM NEON. Except that this module is endian-neutral [in sense that 31*8fb009dcSAndroid Build Coastguard Worker@ it can be compiled for either endianness] by courtesy of vld1.8's 32*8fb009dcSAndroid Build Coastguard Worker@ neutrality. Initial version doesn't implement interface to OpenSSL, 33*8fb009dcSAndroid Build Coastguard Worker@ only low-level primitives and unsupported entry points, just enough 34*8fb009dcSAndroid Build Coastguard Worker@ to collect performance results, which for Cortex-A8 core are: 35*8fb009dcSAndroid Build Coastguard Worker@ 36*8fb009dcSAndroid Build Coastguard Worker@ encrypt 19.5 cycles per byte processed with 128-bit key 37*8fb009dcSAndroid Build Coastguard Worker@ decrypt 22.1 cycles per byte processed with 128-bit key 38*8fb009dcSAndroid Build Coastguard Worker@ key conv. 440 cycles per 128-bit key/0.18 of 8x block 39*8fb009dcSAndroid Build Coastguard Worker@ 40*8fb009dcSAndroid Build Coastguard Worker@ Snapdragon S4 encrypts byte in 17.6 cycles and decrypts in 19.7, 41*8fb009dcSAndroid Build Coastguard Worker@ which is [much] worse than anticipated (for further details see 42*8fb009dcSAndroid Build Coastguard Worker@ http://www.openssl.org/~appro/Snapdragon-S4.html). 43*8fb009dcSAndroid Build Coastguard Worker@ 44*8fb009dcSAndroid Build Coastguard Worker@ Cortex-A15 manages in 14.2/16.1 cycles [when integer-only code 45*8fb009dcSAndroid Build Coastguard Worker@ manages in 20.0 cycles]. 46*8fb009dcSAndroid Build Coastguard Worker@ 47*8fb009dcSAndroid Build Coastguard Worker@ When comparing to x86_64 results keep in mind that NEON unit is 48*8fb009dcSAndroid Build Coastguard Worker@ [mostly] single-issue and thus can't [fully] benefit from 49*8fb009dcSAndroid Build Coastguard Worker@ instruction-level parallelism. And when comparing to aes-armv4 50*8fb009dcSAndroid Build Coastguard Worker@ results keep in mind key schedule conversion overhead (see 51*8fb009dcSAndroid Build Coastguard Worker@ bsaes-x86_64.pl for further details)... 52*8fb009dcSAndroid Build Coastguard Worker@ 53*8fb009dcSAndroid Build Coastguard Worker@ <[email protected]> 54*8fb009dcSAndroid Build Coastguard Worker 55*8fb009dcSAndroid Build Coastguard Worker@ April-August 2013 56*8fb009dcSAndroid Build Coastguard Worker@ Add CBC, CTR and XTS subroutines and adapt for kernel use; courtesy of Ard. 57*8fb009dcSAndroid Build Coastguard Worker 58*8fb009dcSAndroid Build Coastguard Worker#ifndef __KERNEL__ 59*8fb009dcSAndroid Build Coastguard Worker# include <openssl/arm_arch.h> 60*8fb009dcSAndroid Build Coastguard Worker 61*8fb009dcSAndroid Build Coastguard Worker# define VFP_ABI_PUSH vstmdb sp!,{d8-d15} 62*8fb009dcSAndroid Build Coastguard Worker# define VFP_ABI_POP vldmia sp!,{d8-d15} 63*8fb009dcSAndroid Build Coastguard Worker# define VFP_ABI_FRAME 0x40 64*8fb009dcSAndroid Build Coastguard Worker#else 65*8fb009dcSAndroid Build Coastguard Worker# define VFP_ABI_PUSH 66*8fb009dcSAndroid Build Coastguard Worker# define VFP_ABI_POP 67*8fb009dcSAndroid Build Coastguard Worker# define VFP_ABI_FRAME 0 68*8fb009dcSAndroid Build Coastguard Worker# define BSAES_ASM_EXTENDED_KEY 69*8fb009dcSAndroid Build Coastguard Worker# define XTS_CHAIN_TWEAK 70*8fb009dcSAndroid Build Coastguard Worker# define __ARM_MAX_ARCH__ 7 71*8fb009dcSAndroid Build Coastguard Worker#endif 72*8fb009dcSAndroid Build Coastguard Worker 73*8fb009dcSAndroid Build Coastguard Worker#ifdef __thumb__ 74*8fb009dcSAndroid Build Coastguard Worker# define adrl adr 75*8fb009dcSAndroid Build Coastguard Worker#endif 76*8fb009dcSAndroid Build Coastguard Worker 77*8fb009dcSAndroid Build Coastguard Worker#if __ARM_MAX_ARCH__>=7 78*8fb009dcSAndroid Build Coastguard Worker.arch armv7-a 79*8fb009dcSAndroid Build Coastguard Worker.fpu neon 80*8fb009dcSAndroid Build Coastguard Worker 81*8fb009dcSAndroid Build Coastguard Worker.text 82*8fb009dcSAndroid Build Coastguard Worker.syntax unified @ ARMv7-capable assembler is expected to handle this 83*8fb009dcSAndroid Build Coastguard Worker#if defined(__thumb2__) && !defined(__APPLE__) 84*8fb009dcSAndroid Build Coastguard Worker.thumb 85*8fb009dcSAndroid Build Coastguard Worker#else 86*8fb009dcSAndroid Build Coastguard Worker.code 32 87*8fb009dcSAndroid Build Coastguard Worker# undef __thumb2__ 88*8fb009dcSAndroid Build Coastguard Worker#endif 89*8fb009dcSAndroid Build Coastguard Worker 90*8fb009dcSAndroid Build Coastguard Worker.type _bsaes_decrypt8,%function 91*8fb009dcSAndroid Build Coastguard Worker.align 4 92*8fb009dcSAndroid Build Coastguard Worker_bsaes_decrypt8: 93*8fb009dcSAndroid Build Coastguard Worker adr r6,. 94*8fb009dcSAndroid Build Coastguard Worker vldmia r4!, {q9} @ round 0 key 95*8fb009dcSAndroid Build Coastguard Worker#if defined(__thumb2__) || defined(__APPLE__) 96*8fb009dcSAndroid Build Coastguard Worker adr r6,.LM0ISR 97*8fb009dcSAndroid Build Coastguard Worker#else 98*8fb009dcSAndroid Build Coastguard Worker add r6,r6,#.LM0ISR-_bsaes_decrypt8 99*8fb009dcSAndroid Build Coastguard Worker#endif 100*8fb009dcSAndroid Build Coastguard Worker 101*8fb009dcSAndroid Build Coastguard Worker vldmia r6!, {q8} @ .LM0ISR 102*8fb009dcSAndroid Build Coastguard Worker veor q10, q0, q9 @ xor with round0 key 103*8fb009dcSAndroid Build Coastguard Worker veor q11, q1, q9 104*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d0, {q10}, d16 105*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d1, {q10}, d17 106*8fb009dcSAndroid Build Coastguard Worker veor q12, q2, q9 107*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d2, {q11}, d16 108*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d3, {q11}, d17 109*8fb009dcSAndroid Build Coastguard Worker veor q13, q3, q9 110*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d4, {q12}, d16 111*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d5, {q12}, d17 112*8fb009dcSAndroid Build Coastguard Worker veor q14, q4, q9 113*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d6, {q13}, d16 114*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d7, {q13}, d17 115*8fb009dcSAndroid Build Coastguard Worker veor q15, q5, q9 116*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d8, {q14}, d16 117*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d9, {q14}, d17 118*8fb009dcSAndroid Build Coastguard Worker veor q10, q6, q9 119*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d10, {q15}, d16 120*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d11, {q15}, d17 121*8fb009dcSAndroid Build Coastguard Worker veor q11, q7, q9 122*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d12, {q10}, d16 123*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d13, {q10}, d17 124*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d14, {q11}, d16 125*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d15, {q11}, d17 126*8fb009dcSAndroid Build Coastguard Worker vmov.i8 q8,#0x55 @ compose .LBS0 127*8fb009dcSAndroid Build Coastguard Worker vmov.i8 q9,#0x33 @ compose .LBS1 128*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q10, q6, #1 129*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q11, q4, #1 130*8fb009dcSAndroid Build Coastguard Worker veor q10, q10, q7 131*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q5 132*8fb009dcSAndroid Build Coastguard Worker vand q10, q10, q8 133*8fb009dcSAndroid Build Coastguard Worker vand q11, q11, q8 134*8fb009dcSAndroid Build Coastguard Worker veor q7, q7, q10 135*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q10, q10, #1 136*8fb009dcSAndroid Build Coastguard Worker veor q5, q5, q11 137*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q11, q11, #1 138*8fb009dcSAndroid Build Coastguard Worker veor q6, q6, q10 139*8fb009dcSAndroid Build Coastguard Worker veor q4, q4, q11 140*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q10, q2, #1 141*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q11, q0, #1 142*8fb009dcSAndroid Build Coastguard Worker veor q10, q10, q3 143*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q1 144*8fb009dcSAndroid Build Coastguard Worker vand q10, q10, q8 145*8fb009dcSAndroid Build Coastguard Worker vand q11, q11, q8 146*8fb009dcSAndroid Build Coastguard Worker veor q3, q3, q10 147*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q10, q10, #1 148*8fb009dcSAndroid Build Coastguard Worker veor q1, q1, q11 149*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q11, q11, #1 150*8fb009dcSAndroid Build Coastguard Worker veor q2, q2, q10 151*8fb009dcSAndroid Build Coastguard Worker veor q0, q0, q11 152*8fb009dcSAndroid Build Coastguard Worker vmov.i8 q8,#0x0f @ compose .LBS2 153*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q10, q5, #2 154*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q11, q4, #2 155*8fb009dcSAndroid Build Coastguard Worker veor q10, q10, q7 156*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q6 157*8fb009dcSAndroid Build Coastguard Worker vand q10, q10, q9 158*8fb009dcSAndroid Build Coastguard Worker vand q11, q11, q9 159*8fb009dcSAndroid Build Coastguard Worker veor q7, q7, q10 160*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q10, q10, #2 161*8fb009dcSAndroid Build Coastguard Worker veor q6, q6, q11 162*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q11, q11, #2 163*8fb009dcSAndroid Build Coastguard Worker veor q5, q5, q10 164*8fb009dcSAndroid Build Coastguard Worker veor q4, q4, q11 165*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q10, q1, #2 166*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q11, q0, #2 167*8fb009dcSAndroid Build Coastguard Worker veor q10, q10, q3 168*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q2 169*8fb009dcSAndroid Build Coastguard Worker vand q10, q10, q9 170*8fb009dcSAndroid Build Coastguard Worker vand q11, q11, q9 171*8fb009dcSAndroid Build Coastguard Worker veor q3, q3, q10 172*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q10, q10, #2 173*8fb009dcSAndroid Build Coastguard Worker veor q2, q2, q11 174*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q11, q11, #2 175*8fb009dcSAndroid Build Coastguard Worker veor q1, q1, q10 176*8fb009dcSAndroid Build Coastguard Worker veor q0, q0, q11 177*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q10, q3, #4 178*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q11, q2, #4 179*8fb009dcSAndroid Build Coastguard Worker veor q10, q10, q7 180*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q6 181*8fb009dcSAndroid Build Coastguard Worker vand q10, q10, q8 182*8fb009dcSAndroid Build Coastguard Worker vand q11, q11, q8 183*8fb009dcSAndroid Build Coastguard Worker veor q7, q7, q10 184*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q10, q10, #4 185*8fb009dcSAndroid Build Coastguard Worker veor q6, q6, q11 186*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q11, q11, #4 187*8fb009dcSAndroid Build Coastguard Worker veor q3, q3, q10 188*8fb009dcSAndroid Build Coastguard Worker veor q2, q2, q11 189*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q10, q1, #4 190*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q11, q0, #4 191*8fb009dcSAndroid Build Coastguard Worker veor q10, q10, q5 192*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q4 193*8fb009dcSAndroid Build Coastguard Worker vand q10, q10, q8 194*8fb009dcSAndroid Build Coastguard Worker vand q11, q11, q8 195*8fb009dcSAndroid Build Coastguard Worker veor q5, q5, q10 196*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q10, q10, #4 197*8fb009dcSAndroid Build Coastguard Worker veor q4, q4, q11 198*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q11, q11, #4 199*8fb009dcSAndroid Build Coastguard Worker veor q1, q1, q10 200*8fb009dcSAndroid Build Coastguard Worker veor q0, q0, q11 201*8fb009dcSAndroid Build Coastguard Worker sub r5,r5,#1 202*8fb009dcSAndroid Build Coastguard Worker b .Ldec_sbox 203*8fb009dcSAndroid Build Coastguard Worker.align 4 204*8fb009dcSAndroid Build Coastguard Worker.Ldec_loop: 205*8fb009dcSAndroid Build Coastguard Worker vldmia r4!, {q8,q9,q10,q11} 206*8fb009dcSAndroid Build Coastguard Worker veor q8, q8, q0 207*8fb009dcSAndroid Build Coastguard Worker veor q9, q9, q1 208*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d0, {q8}, d24 209*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d1, {q8}, d25 210*8fb009dcSAndroid Build Coastguard Worker vldmia r4!, {q8} 211*8fb009dcSAndroid Build Coastguard Worker veor q10, q10, q2 212*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d2, {q9}, d24 213*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d3, {q9}, d25 214*8fb009dcSAndroid Build Coastguard Worker vldmia r4!, {q9} 215*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q3 216*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d4, {q10}, d24 217*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d5, {q10}, d25 218*8fb009dcSAndroid Build Coastguard Worker vldmia r4!, {q10} 219*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d6, {q11}, d24 220*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d7, {q11}, d25 221*8fb009dcSAndroid Build Coastguard Worker vldmia r4!, {q11} 222*8fb009dcSAndroid Build Coastguard Worker veor q8, q8, q4 223*8fb009dcSAndroid Build Coastguard Worker veor q9, q9, q5 224*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d8, {q8}, d24 225*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d9, {q8}, d25 226*8fb009dcSAndroid Build Coastguard Worker veor q10, q10, q6 227*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d10, {q9}, d24 228*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d11, {q9}, d25 229*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q7 230*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d12, {q10}, d24 231*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d13, {q10}, d25 232*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d14, {q11}, d24 233*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d15, {q11}, d25 234*8fb009dcSAndroid Build Coastguard Worker.Ldec_sbox: 235*8fb009dcSAndroid Build Coastguard Worker veor q1, q1, q4 236*8fb009dcSAndroid Build Coastguard Worker veor q3, q3, q4 237*8fb009dcSAndroid Build Coastguard Worker 238*8fb009dcSAndroid Build Coastguard Worker veor q4, q4, q7 239*8fb009dcSAndroid Build Coastguard Worker veor q1, q1, q6 240*8fb009dcSAndroid Build Coastguard Worker veor q2, q2, q7 241*8fb009dcSAndroid Build Coastguard Worker veor q6, q6, q4 242*8fb009dcSAndroid Build Coastguard Worker 243*8fb009dcSAndroid Build Coastguard Worker veor q0, q0, q1 244*8fb009dcSAndroid Build Coastguard Worker veor q2, q2, q5 245*8fb009dcSAndroid Build Coastguard Worker veor q7, q7, q6 246*8fb009dcSAndroid Build Coastguard Worker veor q3, q3, q0 247*8fb009dcSAndroid Build Coastguard Worker veor q5, q5, q0 248*8fb009dcSAndroid Build Coastguard Worker veor q1, q1, q3 249*8fb009dcSAndroid Build Coastguard Worker veor q11, q3, q0 250*8fb009dcSAndroid Build Coastguard Worker veor q10, q7, q4 251*8fb009dcSAndroid Build Coastguard Worker veor q9, q1, q6 252*8fb009dcSAndroid Build Coastguard Worker veor q13, q4, q0 253*8fb009dcSAndroid Build Coastguard Worker vmov q8, q10 254*8fb009dcSAndroid Build Coastguard Worker veor q12, q5, q2 255*8fb009dcSAndroid Build Coastguard Worker 256*8fb009dcSAndroid Build Coastguard Worker vorr q10, q10, q9 257*8fb009dcSAndroid Build Coastguard Worker veor q15, q11, q8 258*8fb009dcSAndroid Build Coastguard Worker vand q14, q11, q12 259*8fb009dcSAndroid Build Coastguard Worker vorr q11, q11, q12 260*8fb009dcSAndroid Build Coastguard Worker veor q12, q12, q9 261*8fb009dcSAndroid Build Coastguard Worker vand q8, q8, q9 262*8fb009dcSAndroid Build Coastguard Worker veor q9, q6, q2 263*8fb009dcSAndroid Build Coastguard Worker vand q15, q15, q12 264*8fb009dcSAndroid Build Coastguard Worker vand q13, q13, q9 265*8fb009dcSAndroid Build Coastguard Worker veor q9, q3, q7 266*8fb009dcSAndroid Build Coastguard Worker veor q12, q1, q5 267*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q13 268*8fb009dcSAndroid Build Coastguard Worker veor q10, q10, q13 269*8fb009dcSAndroid Build Coastguard Worker vand q13, q9, q12 270*8fb009dcSAndroid Build Coastguard Worker vorr q9, q9, q12 271*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q15 272*8fb009dcSAndroid Build Coastguard Worker veor q8, q8, q13 273*8fb009dcSAndroid Build Coastguard Worker veor q10, q10, q14 274*8fb009dcSAndroid Build Coastguard Worker veor q9, q9, q15 275*8fb009dcSAndroid Build Coastguard Worker veor q8, q8, q14 276*8fb009dcSAndroid Build Coastguard Worker vand q12, q4, q6 277*8fb009dcSAndroid Build Coastguard Worker veor q9, q9, q14 278*8fb009dcSAndroid Build Coastguard Worker vand q13, q0, q2 279*8fb009dcSAndroid Build Coastguard Worker vand q14, q7, q1 280*8fb009dcSAndroid Build Coastguard Worker vorr q15, q3, q5 281*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q12 282*8fb009dcSAndroid Build Coastguard Worker veor q9, q9, q14 283*8fb009dcSAndroid Build Coastguard Worker veor q8, q8, q15 284*8fb009dcSAndroid Build Coastguard Worker veor q10, q10, q13 285*8fb009dcSAndroid Build Coastguard Worker 286*8fb009dcSAndroid Build Coastguard Worker @ Inv_GF16 0, 1, 2, 3, s0, s1, s2, s3 287*8fb009dcSAndroid Build Coastguard Worker 288*8fb009dcSAndroid Build Coastguard Worker @ new smaller inversion 289*8fb009dcSAndroid Build Coastguard Worker 290*8fb009dcSAndroid Build Coastguard Worker vand q14, q11, q9 291*8fb009dcSAndroid Build Coastguard Worker vmov q12, q8 292*8fb009dcSAndroid Build Coastguard Worker 293*8fb009dcSAndroid Build Coastguard Worker veor q13, q10, q14 294*8fb009dcSAndroid Build Coastguard Worker veor q15, q8, q14 295*8fb009dcSAndroid Build Coastguard Worker veor q14, q8, q14 @ q14=q15 296*8fb009dcSAndroid Build Coastguard Worker 297*8fb009dcSAndroid Build Coastguard Worker vbsl q13, q9, q8 298*8fb009dcSAndroid Build Coastguard Worker vbsl q15, q11, q10 299*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q10 300*8fb009dcSAndroid Build Coastguard Worker 301*8fb009dcSAndroid Build Coastguard Worker vbsl q12, q13, q14 302*8fb009dcSAndroid Build Coastguard Worker vbsl q8, q14, q13 303*8fb009dcSAndroid Build Coastguard Worker 304*8fb009dcSAndroid Build Coastguard Worker vand q14, q12, q15 305*8fb009dcSAndroid Build Coastguard Worker veor q9, q9, q8 306*8fb009dcSAndroid Build Coastguard Worker 307*8fb009dcSAndroid Build Coastguard Worker veor q14, q14, q11 308*8fb009dcSAndroid Build Coastguard Worker veor q12, q5, q2 309*8fb009dcSAndroid Build Coastguard Worker veor q8, q1, q6 310*8fb009dcSAndroid Build Coastguard Worker veor q10, q15, q14 311*8fb009dcSAndroid Build Coastguard Worker vand q10, q10, q5 312*8fb009dcSAndroid Build Coastguard Worker veor q5, q5, q1 313*8fb009dcSAndroid Build Coastguard Worker vand q11, q1, q15 314*8fb009dcSAndroid Build Coastguard Worker vand q5, q5, q14 315*8fb009dcSAndroid Build Coastguard Worker veor q1, q11, q10 316*8fb009dcSAndroid Build Coastguard Worker veor q5, q5, q11 317*8fb009dcSAndroid Build Coastguard Worker veor q15, q15, q13 318*8fb009dcSAndroid Build Coastguard Worker veor q14, q14, q9 319*8fb009dcSAndroid Build Coastguard Worker veor q11, q15, q14 320*8fb009dcSAndroid Build Coastguard Worker veor q10, q13, q9 321*8fb009dcSAndroid Build Coastguard Worker vand q11, q11, q12 322*8fb009dcSAndroid Build Coastguard Worker vand q10, q10, q2 323*8fb009dcSAndroid Build Coastguard Worker veor q12, q12, q8 324*8fb009dcSAndroid Build Coastguard Worker veor q2, q2, q6 325*8fb009dcSAndroid Build Coastguard Worker vand q8, q8, q15 326*8fb009dcSAndroid Build Coastguard Worker vand q6, q6, q13 327*8fb009dcSAndroid Build Coastguard Worker vand q12, q12, q14 328*8fb009dcSAndroid Build Coastguard Worker vand q2, q2, q9 329*8fb009dcSAndroid Build Coastguard Worker veor q8, q8, q12 330*8fb009dcSAndroid Build Coastguard Worker veor q2, q2, q6 331*8fb009dcSAndroid Build Coastguard Worker veor q12, q12, q11 332*8fb009dcSAndroid Build Coastguard Worker veor q6, q6, q10 333*8fb009dcSAndroid Build Coastguard Worker veor q5, q5, q12 334*8fb009dcSAndroid Build Coastguard Worker veor q2, q2, q12 335*8fb009dcSAndroid Build Coastguard Worker veor q1, q1, q8 336*8fb009dcSAndroid Build Coastguard Worker veor q6, q6, q8 337*8fb009dcSAndroid Build Coastguard Worker 338*8fb009dcSAndroid Build Coastguard Worker veor q12, q3, q0 339*8fb009dcSAndroid Build Coastguard Worker veor q8, q7, q4 340*8fb009dcSAndroid Build Coastguard Worker veor q11, q15, q14 341*8fb009dcSAndroid Build Coastguard Worker veor q10, q13, q9 342*8fb009dcSAndroid Build Coastguard Worker vand q11, q11, q12 343*8fb009dcSAndroid Build Coastguard Worker vand q10, q10, q0 344*8fb009dcSAndroid Build Coastguard Worker veor q12, q12, q8 345*8fb009dcSAndroid Build Coastguard Worker veor q0, q0, q4 346*8fb009dcSAndroid Build Coastguard Worker vand q8, q8, q15 347*8fb009dcSAndroid Build Coastguard Worker vand q4, q4, q13 348*8fb009dcSAndroid Build Coastguard Worker vand q12, q12, q14 349*8fb009dcSAndroid Build Coastguard Worker vand q0, q0, q9 350*8fb009dcSAndroid Build Coastguard Worker veor q8, q8, q12 351*8fb009dcSAndroid Build Coastguard Worker veor q0, q0, q4 352*8fb009dcSAndroid Build Coastguard Worker veor q12, q12, q11 353*8fb009dcSAndroid Build Coastguard Worker veor q4, q4, q10 354*8fb009dcSAndroid Build Coastguard Worker veor q15, q15, q13 355*8fb009dcSAndroid Build Coastguard Worker veor q14, q14, q9 356*8fb009dcSAndroid Build Coastguard Worker veor q10, q15, q14 357*8fb009dcSAndroid Build Coastguard Worker vand q10, q10, q3 358*8fb009dcSAndroid Build Coastguard Worker veor q3, q3, q7 359*8fb009dcSAndroid Build Coastguard Worker vand q11, q7, q15 360*8fb009dcSAndroid Build Coastguard Worker vand q3, q3, q14 361*8fb009dcSAndroid Build Coastguard Worker veor q7, q11, q10 362*8fb009dcSAndroid Build Coastguard Worker veor q3, q3, q11 363*8fb009dcSAndroid Build Coastguard Worker veor q3, q3, q12 364*8fb009dcSAndroid Build Coastguard Worker veor q0, q0, q12 365*8fb009dcSAndroid Build Coastguard Worker veor q7, q7, q8 366*8fb009dcSAndroid Build Coastguard Worker veor q4, q4, q8 367*8fb009dcSAndroid Build Coastguard Worker veor q1, q1, q7 368*8fb009dcSAndroid Build Coastguard Worker veor q6, q6, q5 369*8fb009dcSAndroid Build Coastguard Worker 370*8fb009dcSAndroid Build Coastguard Worker veor q4, q4, q1 371*8fb009dcSAndroid Build Coastguard Worker veor q2, q2, q7 372*8fb009dcSAndroid Build Coastguard Worker veor q5, q5, q7 373*8fb009dcSAndroid Build Coastguard Worker veor q4, q4, q2 374*8fb009dcSAndroid Build Coastguard Worker veor q7, q7, q0 375*8fb009dcSAndroid Build Coastguard Worker veor q4, q4, q5 376*8fb009dcSAndroid Build Coastguard Worker veor q3, q3, q6 377*8fb009dcSAndroid Build Coastguard Worker veor q6, q6, q1 378*8fb009dcSAndroid Build Coastguard Worker veor q3, q3, q4 379*8fb009dcSAndroid Build Coastguard Worker 380*8fb009dcSAndroid Build Coastguard Worker veor q4, q4, q0 381*8fb009dcSAndroid Build Coastguard Worker veor q7, q7, q3 382*8fb009dcSAndroid Build Coastguard Worker subs r5,r5,#1 383*8fb009dcSAndroid Build Coastguard Worker bcc .Ldec_done 384*8fb009dcSAndroid Build Coastguard Worker @ multiplication by 0x05-0x00-0x04-0x00 385*8fb009dcSAndroid Build Coastguard Worker vext.8 q8, q0, q0, #8 386*8fb009dcSAndroid Build Coastguard Worker vext.8 q14, q3, q3, #8 387*8fb009dcSAndroid Build Coastguard Worker vext.8 q15, q5, q5, #8 388*8fb009dcSAndroid Build Coastguard Worker veor q8, q8, q0 389*8fb009dcSAndroid Build Coastguard Worker vext.8 q9, q1, q1, #8 390*8fb009dcSAndroid Build Coastguard Worker veor q14, q14, q3 391*8fb009dcSAndroid Build Coastguard Worker vext.8 q10, q6, q6, #8 392*8fb009dcSAndroid Build Coastguard Worker veor q15, q15, q5 393*8fb009dcSAndroid Build Coastguard Worker vext.8 q11, q4, q4, #8 394*8fb009dcSAndroid Build Coastguard Worker veor q9, q9, q1 395*8fb009dcSAndroid Build Coastguard Worker vext.8 q12, q2, q2, #8 396*8fb009dcSAndroid Build Coastguard Worker veor q10, q10, q6 397*8fb009dcSAndroid Build Coastguard Worker vext.8 q13, q7, q7, #8 398*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q4 399*8fb009dcSAndroid Build Coastguard Worker veor q12, q12, q2 400*8fb009dcSAndroid Build Coastguard Worker veor q13, q13, q7 401*8fb009dcSAndroid Build Coastguard Worker 402*8fb009dcSAndroid Build Coastguard Worker veor q0, q0, q14 403*8fb009dcSAndroid Build Coastguard Worker veor q1, q1, q14 404*8fb009dcSAndroid Build Coastguard Worker veor q6, q6, q8 405*8fb009dcSAndroid Build Coastguard Worker veor q2, q2, q10 406*8fb009dcSAndroid Build Coastguard Worker veor q4, q4, q9 407*8fb009dcSAndroid Build Coastguard Worker veor q1, q1, q15 408*8fb009dcSAndroid Build Coastguard Worker veor q6, q6, q15 409*8fb009dcSAndroid Build Coastguard Worker veor q2, q2, q14 410*8fb009dcSAndroid Build Coastguard Worker veor q7, q7, q11 411*8fb009dcSAndroid Build Coastguard Worker veor q4, q4, q14 412*8fb009dcSAndroid Build Coastguard Worker veor q3, q3, q12 413*8fb009dcSAndroid Build Coastguard Worker veor q2, q2, q15 414*8fb009dcSAndroid Build Coastguard Worker veor q7, q7, q15 415*8fb009dcSAndroid Build Coastguard Worker veor q5, q5, q13 416*8fb009dcSAndroid Build Coastguard Worker vext.8 q8, q0, q0, #12 @ x0 <<< 32 417*8fb009dcSAndroid Build Coastguard Worker vext.8 q9, q1, q1, #12 418*8fb009dcSAndroid Build Coastguard Worker veor q0, q0, q8 @ x0 ^ (x0 <<< 32) 419*8fb009dcSAndroid Build Coastguard Worker vext.8 q10, q6, q6, #12 420*8fb009dcSAndroid Build Coastguard Worker veor q1, q1, q9 421*8fb009dcSAndroid Build Coastguard Worker vext.8 q11, q4, q4, #12 422*8fb009dcSAndroid Build Coastguard Worker veor q6, q6, q10 423*8fb009dcSAndroid Build Coastguard Worker vext.8 q12, q2, q2, #12 424*8fb009dcSAndroid Build Coastguard Worker veor q4, q4, q11 425*8fb009dcSAndroid Build Coastguard Worker vext.8 q13, q7, q7, #12 426*8fb009dcSAndroid Build Coastguard Worker veor q2, q2, q12 427*8fb009dcSAndroid Build Coastguard Worker vext.8 q14, q3, q3, #12 428*8fb009dcSAndroid Build Coastguard Worker veor q7, q7, q13 429*8fb009dcSAndroid Build Coastguard Worker vext.8 q15, q5, q5, #12 430*8fb009dcSAndroid Build Coastguard Worker veor q3, q3, q14 431*8fb009dcSAndroid Build Coastguard Worker 432*8fb009dcSAndroid Build Coastguard Worker veor q9, q9, q0 433*8fb009dcSAndroid Build Coastguard Worker veor q5, q5, q15 434*8fb009dcSAndroid Build Coastguard Worker vext.8 q0, q0, q0, #8 @ (x0 ^ (x0 <<< 32)) <<< 64) 435*8fb009dcSAndroid Build Coastguard Worker veor q10, q10, q1 436*8fb009dcSAndroid Build Coastguard Worker veor q8, q8, q5 437*8fb009dcSAndroid Build Coastguard Worker veor q9, q9, q5 438*8fb009dcSAndroid Build Coastguard Worker vext.8 q1, q1, q1, #8 439*8fb009dcSAndroid Build Coastguard Worker veor q13, q13, q2 440*8fb009dcSAndroid Build Coastguard Worker veor q0, q0, q8 441*8fb009dcSAndroid Build Coastguard Worker veor q14, q14, q7 442*8fb009dcSAndroid Build Coastguard Worker veor q1, q1, q9 443*8fb009dcSAndroid Build Coastguard Worker vext.8 q8, q2, q2, #8 444*8fb009dcSAndroid Build Coastguard Worker veor q12, q12, q4 445*8fb009dcSAndroid Build Coastguard Worker vext.8 q9, q7, q7, #8 446*8fb009dcSAndroid Build Coastguard Worker veor q15, q15, q3 447*8fb009dcSAndroid Build Coastguard Worker vext.8 q2, q4, q4, #8 448*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q6 449*8fb009dcSAndroid Build Coastguard Worker vext.8 q7, q5, q5, #8 450*8fb009dcSAndroid Build Coastguard Worker veor q12, q12, q5 451*8fb009dcSAndroid Build Coastguard Worker vext.8 q4, q3, q3, #8 452*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q5 453*8fb009dcSAndroid Build Coastguard Worker vext.8 q3, q6, q6, #8 454*8fb009dcSAndroid Build Coastguard Worker veor q5, q9, q13 455*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q2 456*8fb009dcSAndroid Build Coastguard Worker veor q7, q7, q15 457*8fb009dcSAndroid Build Coastguard Worker veor q6, q4, q14 458*8fb009dcSAndroid Build Coastguard Worker veor q4, q8, q12 459*8fb009dcSAndroid Build Coastguard Worker veor q2, q3, q10 460*8fb009dcSAndroid Build Coastguard Worker vmov q3, q11 461*8fb009dcSAndroid Build Coastguard Worker @ vmov q5, q9 462*8fb009dcSAndroid Build Coastguard Worker vldmia r6, {q12} @ .LISR 463*8fb009dcSAndroid Build Coastguard Worker ite eq @ Thumb2 thing, sanity check in ARM 464*8fb009dcSAndroid Build Coastguard Worker addeq r6,r6,#0x10 465*8fb009dcSAndroid Build Coastguard Worker bne .Ldec_loop 466*8fb009dcSAndroid Build Coastguard Worker vldmia r6, {q12} @ .LISRM0 467*8fb009dcSAndroid Build Coastguard Worker b .Ldec_loop 468*8fb009dcSAndroid Build Coastguard Worker.align 4 469*8fb009dcSAndroid Build Coastguard Worker.Ldec_done: 470*8fb009dcSAndroid Build Coastguard Worker vmov.i8 q8,#0x55 @ compose .LBS0 471*8fb009dcSAndroid Build Coastguard Worker vmov.i8 q9,#0x33 @ compose .LBS1 472*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q10, q3, #1 473*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q11, q2, #1 474*8fb009dcSAndroid Build Coastguard Worker veor q10, q10, q5 475*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q7 476*8fb009dcSAndroid Build Coastguard Worker vand q10, q10, q8 477*8fb009dcSAndroid Build Coastguard Worker vand q11, q11, q8 478*8fb009dcSAndroid Build Coastguard Worker veor q5, q5, q10 479*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q10, q10, #1 480*8fb009dcSAndroid Build Coastguard Worker veor q7, q7, q11 481*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q11, q11, #1 482*8fb009dcSAndroid Build Coastguard Worker veor q3, q3, q10 483*8fb009dcSAndroid Build Coastguard Worker veor q2, q2, q11 484*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q10, q6, #1 485*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q11, q0, #1 486*8fb009dcSAndroid Build Coastguard Worker veor q10, q10, q4 487*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q1 488*8fb009dcSAndroid Build Coastguard Worker vand q10, q10, q8 489*8fb009dcSAndroid Build Coastguard Worker vand q11, q11, q8 490*8fb009dcSAndroid Build Coastguard Worker veor q4, q4, q10 491*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q10, q10, #1 492*8fb009dcSAndroid Build Coastguard Worker veor q1, q1, q11 493*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q11, q11, #1 494*8fb009dcSAndroid Build Coastguard Worker veor q6, q6, q10 495*8fb009dcSAndroid Build Coastguard Worker veor q0, q0, q11 496*8fb009dcSAndroid Build Coastguard Worker vmov.i8 q8,#0x0f @ compose .LBS2 497*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q10, q7, #2 498*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q11, q2, #2 499*8fb009dcSAndroid Build Coastguard Worker veor q10, q10, q5 500*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q3 501*8fb009dcSAndroid Build Coastguard Worker vand q10, q10, q9 502*8fb009dcSAndroid Build Coastguard Worker vand q11, q11, q9 503*8fb009dcSAndroid Build Coastguard Worker veor q5, q5, q10 504*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q10, q10, #2 505*8fb009dcSAndroid Build Coastguard Worker veor q3, q3, q11 506*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q11, q11, #2 507*8fb009dcSAndroid Build Coastguard Worker veor q7, q7, q10 508*8fb009dcSAndroid Build Coastguard Worker veor q2, q2, q11 509*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q10, q1, #2 510*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q11, q0, #2 511*8fb009dcSAndroid Build Coastguard Worker veor q10, q10, q4 512*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q6 513*8fb009dcSAndroid Build Coastguard Worker vand q10, q10, q9 514*8fb009dcSAndroid Build Coastguard Worker vand q11, q11, q9 515*8fb009dcSAndroid Build Coastguard Worker veor q4, q4, q10 516*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q10, q10, #2 517*8fb009dcSAndroid Build Coastguard Worker veor q6, q6, q11 518*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q11, q11, #2 519*8fb009dcSAndroid Build Coastguard Worker veor q1, q1, q10 520*8fb009dcSAndroid Build Coastguard Worker veor q0, q0, q11 521*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q10, q4, #4 522*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q11, q6, #4 523*8fb009dcSAndroid Build Coastguard Worker veor q10, q10, q5 524*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q3 525*8fb009dcSAndroid Build Coastguard Worker vand q10, q10, q8 526*8fb009dcSAndroid Build Coastguard Worker vand q11, q11, q8 527*8fb009dcSAndroid Build Coastguard Worker veor q5, q5, q10 528*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q10, q10, #4 529*8fb009dcSAndroid Build Coastguard Worker veor q3, q3, q11 530*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q11, q11, #4 531*8fb009dcSAndroid Build Coastguard Worker veor q4, q4, q10 532*8fb009dcSAndroid Build Coastguard Worker veor q6, q6, q11 533*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q10, q1, #4 534*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q11, q0, #4 535*8fb009dcSAndroid Build Coastguard Worker veor q10, q10, q7 536*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q2 537*8fb009dcSAndroid Build Coastguard Worker vand q10, q10, q8 538*8fb009dcSAndroid Build Coastguard Worker vand q11, q11, q8 539*8fb009dcSAndroid Build Coastguard Worker veor q7, q7, q10 540*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q10, q10, #4 541*8fb009dcSAndroid Build Coastguard Worker veor q2, q2, q11 542*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q11, q11, #4 543*8fb009dcSAndroid Build Coastguard Worker veor q1, q1, q10 544*8fb009dcSAndroid Build Coastguard Worker veor q0, q0, q11 545*8fb009dcSAndroid Build Coastguard Worker vldmia r4, {q8} @ last round key 546*8fb009dcSAndroid Build Coastguard Worker veor q6, q6, q8 547*8fb009dcSAndroid Build Coastguard Worker veor q4, q4, q8 548*8fb009dcSAndroid Build Coastguard Worker veor q2, q2, q8 549*8fb009dcSAndroid Build Coastguard Worker veor q7, q7, q8 550*8fb009dcSAndroid Build Coastguard Worker veor q3, q3, q8 551*8fb009dcSAndroid Build Coastguard Worker veor q5, q5, q8 552*8fb009dcSAndroid Build Coastguard Worker veor q0, q0, q8 553*8fb009dcSAndroid Build Coastguard Worker veor q1, q1, q8 554*8fb009dcSAndroid Build Coastguard Worker bx lr 555*8fb009dcSAndroid Build Coastguard Worker.size _bsaes_decrypt8,.-_bsaes_decrypt8 556*8fb009dcSAndroid Build Coastguard Worker 557*8fb009dcSAndroid Build Coastguard Worker.type _bsaes_const,%object 558*8fb009dcSAndroid Build Coastguard Worker.align 6 559*8fb009dcSAndroid Build Coastguard Worker_bsaes_const: 560*8fb009dcSAndroid Build Coastguard Worker.LM0ISR:@ InvShiftRows constants 561*8fb009dcSAndroid Build Coastguard Worker.quad 0x0a0e0206070b0f03, 0x0004080c0d010509 562*8fb009dcSAndroid Build Coastguard Worker.LISR: 563*8fb009dcSAndroid Build Coastguard Worker.quad 0x0504070602010003, 0x0f0e0d0c080b0a09 564*8fb009dcSAndroid Build Coastguard Worker.LISRM0: 565*8fb009dcSAndroid Build Coastguard Worker.quad 0x01040b0e0205080f, 0x0306090c00070a0d 566*8fb009dcSAndroid Build Coastguard Worker.LM0SR:@ ShiftRows constants 567*8fb009dcSAndroid Build Coastguard Worker.quad 0x0a0e02060f03070b, 0x0004080c05090d01 568*8fb009dcSAndroid Build Coastguard Worker.LSR: 569*8fb009dcSAndroid Build Coastguard Worker.quad 0x0504070600030201, 0x0f0e0d0c0a09080b 570*8fb009dcSAndroid Build Coastguard Worker.LSRM0: 571*8fb009dcSAndroid Build Coastguard Worker.quad 0x0304090e00050a0f, 0x01060b0c0207080d 572*8fb009dcSAndroid Build Coastguard Worker.LM0: 573*8fb009dcSAndroid Build Coastguard Worker.quad 0x02060a0e03070b0f, 0x0004080c0105090d 574*8fb009dcSAndroid Build Coastguard Worker.LREVM0SR: 575*8fb009dcSAndroid Build Coastguard Worker.quad 0x090d01050c000408, 0x03070b0f060a0e02 576*8fb009dcSAndroid Build Coastguard Worker.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*8fb009dcSAndroid Build Coastguard Worker.align 2 578*8fb009dcSAndroid Build Coastguard Worker.align 6 579*8fb009dcSAndroid Build Coastguard Worker.size _bsaes_const,.-_bsaes_const 580*8fb009dcSAndroid Build Coastguard Worker 581*8fb009dcSAndroid Build Coastguard Worker.type _bsaes_encrypt8,%function 582*8fb009dcSAndroid Build Coastguard Worker.align 4 583*8fb009dcSAndroid Build Coastguard Worker_bsaes_encrypt8: 584*8fb009dcSAndroid Build Coastguard Worker adr r6,. 585*8fb009dcSAndroid Build Coastguard Worker vldmia r4!, {q9} @ round 0 key 586*8fb009dcSAndroid Build Coastguard Worker#if defined(__thumb2__) || defined(__APPLE__) 587*8fb009dcSAndroid Build Coastguard Worker adr r6,.LM0SR 588*8fb009dcSAndroid Build Coastguard Worker#else 589*8fb009dcSAndroid Build Coastguard Worker sub r6,r6,#_bsaes_encrypt8-.LM0SR 590*8fb009dcSAndroid Build Coastguard Worker#endif 591*8fb009dcSAndroid Build Coastguard Worker 592*8fb009dcSAndroid Build Coastguard Worker vldmia r6!, {q8} @ .LM0SR 593*8fb009dcSAndroid Build Coastguard Worker_bsaes_encrypt8_alt: 594*8fb009dcSAndroid Build Coastguard Worker veor q10, q0, q9 @ xor with round0 key 595*8fb009dcSAndroid Build Coastguard Worker veor q11, q1, q9 596*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d0, {q10}, d16 597*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d1, {q10}, d17 598*8fb009dcSAndroid Build Coastguard Worker veor q12, q2, q9 599*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d2, {q11}, d16 600*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d3, {q11}, d17 601*8fb009dcSAndroid Build Coastguard Worker veor q13, q3, q9 602*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d4, {q12}, d16 603*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d5, {q12}, d17 604*8fb009dcSAndroid Build Coastguard Worker veor q14, q4, q9 605*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d6, {q13}, d16 606*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d7, {q13}, d17 607*8fb009dcSAndroid Build Coastguard Worker veor q15, q5, q9 608*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d8, {q14}, d16 609*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d9, {q14}, d17 610*8fb009dcSAndroid Build Coastguard Worker veor q10, q6, q9 611*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d10, {q15}, d16 612*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d11, {q15}, d17 613*8fb009dcSAndroid Build Coastguard Worker veor q11, q7, q9 614*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d12, {q10}, d16 615*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d13, {q10}, d17 616*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d14, {q11}, d16 617*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d15, {q11}, d17 618*8fb009dcSAndroid Build Coastguard Worker_bsaes_encrypt8_bitslice: 619*8fb009dcSAndroid Build Coastguard Worker vmov.i8 q8,#0x55 @ compose .LBS0 620*8fb009dcSAndroid Build Coastguard Worker vmov.i8 q9,#0x33 @ compose .LBS1 621*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q10, q6, #1 622*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q11, q4, #1 623*8fb009dcSAndroid Build Coastguard Worker veor q10, q10, q7 624*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q5 625*8fb009dcSAndroid Build Coastguard Worker vand q10, q10, q8 626*8fb009dcSAndroid Build Coastguard Worker vand q11, q11, q8 627*8fb009dcSAndroid Build Coastguard Worker veor q7, q7, q10 628*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q10, q10, #1 629*8fb009dcSAndroid Build Coastguard Worker veor q5, q5, q11 630*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q11, q11, #1 631*8fb009dcSAndroid Build Coastguard Worker veor q6, q6, q10 632*8fb009dcSAndroid Build Coastguard Worker veor q4, q4, q11 633*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q10, q2, #1 634*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q11, q0, #1 635*8fb009dcSAndroid Build Coastguard Worker veor q10, q10, q3 636*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q1 637*8fb009dcSAndroid Build Coastguard Worker vand q10, q10, q8 638*8fb009dcSAndroid Build Coastguard Worker vand q11, q11, q8 639*8fb009dcSAndroid Build Coastguard Worker veor q3, q3, q10 640*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q10, q10, #1 641*8fb009dcSAndroid Build Coastguard Worker veor q1, q1, q11 642*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q11, q11, #1 643*8fb009dcSAndroid Build Coastguard Worker veor q2, q2, q10 644*8fb009dcSAndroid Build Coastguard Worker veor q0, q0, q11 645*8fb009dcSAndroid Build Coastguard Worker vmov.i8 q8,#0x0f @ compose .LBS2 646*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q10, q5, #2 647*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q11, q4, #2 648*8fb009dcSAndroid Build Coastguard Worker veor q10, q10, q7 649*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q6 650*8fb009dcSAndroid Build Coastguard Worker vand q10, q10, q9 651*8fb009dcSAndroid Build Coastguard Worker vand q11, q11, q9 652*8fb009dcSAndroid Build Coastguard Worker veor q7, q7, q10 653*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q10, q10, #2 654*8fb009dcSAndroid Build Coastguard Worker veor q6, q6, q11 655*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q11, q11, #2 656*8fb009dcSAndroid Build Coastguard Worker veor q5, q5, q10 657*8fb009dcSAndroid Build Coastguard Worker veor q4, q4, q11 658*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q10, q1, #2 659*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q11, q0, #2 660*8fb009dcSAndroid Build Coastguard Worker veor q10, q10, q3 661*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q2 662*8fb009dcSAndroid Build Coastguard Worker vand q10, q10, q9 663*8fb009dcSAndroid Build Coastguard Worker vand q11, q11, q9 664*8fb009dcSAndroid Build Coastguard Worker veor q3, q3, q10 665*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q10, q10, #2 666*8fb009dcSAndroid Build Coastguard Worker veor q2, q2, q11 667*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q11, q11, #2 668*8fb009dcSAndroid Build Coastguard Worker veor q1, q1, q10 669*8fb009dcSAndroid Build Coastguard Worker veor q0, q0, q11 670*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q10, q3, #4 671*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q11, q2, #4 672*8fb009dcSAndroid Build Coastguard Worker veor q10, q10, q7 673*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q6 674*8fb009dcSAndroid Build Coastguard Worker vand q10, q10, q8 675*8fb009dcSAndroid Build Coastguard Worker vand q11, q11, q8 676*8fb009dcSAndroid Build Coastguard Worker veor q7, q7, q10 677*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q10, q10, #4 678*8fb009dcSAndroid Build Coastguard Worker veor q6, q6, q11 679*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q11, q11, #4 680*8fb009dcSAndroid Build Coastguard Worker veor q3, q3, q10 681*8fb009dcSAndroid Build Coastguard Worker veor q2, q2, q11 682*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q10, q1, #4 683*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q11, q0, #4 684*8fb009dcSAndroid Build Coastguard Worker veor q10, q10, q5 685*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q4 686*8fb009dcSAndroid Build Coastguard Worker vand q10, q10, q8 687*8fb009dcSAndroid Build Coastguard Worker vand q11, q11, q8 688*8fb009dcSAndroid Build Coastguard Worker veor q5, q5, q10 689*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q10, q10, #4 690*8fb009dcSAndroid Build Coastguard Worker veor q4, q4, q11 691*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q11, q11, #4 692*8fb009dcSAndroid Build Coastguard Worker veor q1, q1, q10 693*8fb009dcSAndroid Build Coastguard Worker veor q0, q0, q11 694*8fb009dcSAndroid Build Coastguard Worker sub r5,r5,#1 695*8fb009dcSAndroid Build Coastguard Worker b .Lenc_sbox 696*8fb009dcSAndroid Build Coastguard Worker.align 4 697*8fb009dcSAndroid Build Coastguard Worker.Lenc_loop: 698*8fb009dcSAndroid Build Coastguard Worker vldmia r4!, {q8,q9,q10,q11} 699*8fb009dcSAndroid Build Coastguard Worker veor q8, q8, q0 700*8fb009dcSAndroid Build Coastguard Worker veor q9, q9, q1 701*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d0, {q8}, d24 702*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d1, {q8}, d25 703*8fb009dcSAndroid Build Coastguard Worker vldmia r4!, {q8} 704*8fb009dcSAndroid Build Coastguard Worker veor q10, q10, q2 705*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d2, {q9}, d24 706*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d3, {q9}, d25 707*8fb009dcSAndroid Build Coastguard Worker vldmia r4!, {q9} 708*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q3 709*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d4, {q10}, d24 710*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d5, {q10}, d25 711*8fb009dcSAndroid Build Coastguard Worker vldmia r4!, {q10} 712*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d6, {q11}, d24 713*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d7, {q11}, d25 714*8fb009dcSAndroid Build Coastguard Worker vldmia r4!, {q11} 715*8fb009dcSAndroid Build Coastguard Worker veor q8, q8, q4 716*8fb009dcSAndroid Build Coastguard Worker veor q9, q9, q5 717*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d8, {q8}, d24 718*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d9, {q8}, d25 719*8fb009dcSAndroid Build Coastguard Worker veor q10, q10, q6 720*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d10, {q9}, d24 721*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d11, {q9}, d25 722*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q7 723*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d12, {q10}, d24 724*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d13, {q10}, d25 725*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d14, {q11}, d24 726*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d15, {q11}, d25 727*8fb009dcSAndroid Build Coastguard Worker.Lenc_sbox: 728*8fb009dcSAndroid Build Coastguard Worker veor q2, q2, q1 729*8fb009dcSAndroid Build Coastguard Worker veor q5, q5, q6 730*8fb009dcSAndroid Build Coastguard Worker veor q3, q3, q0 731*8fb009dcSAndroid Build Coastguard Worker veor q6, q6, q2 732*8fb009dcSAndroid Build Coastguard Worker veor q5, q5, q0 733*8fb009dcSAndroid Build Coastguard Worker 734*8fb009dcSAndroid Build Coastguard Worker veor q6, q6, q3 735*8fb009dcSAndroid Build Coastguard Worker veor q3, q3, q7 736*8fb009dcSAndroid Build Coastguard Worker veor q7, q7, q5 737*8fb009dcSAndroid Build Coastguard Worker veor q3, q3, q4 738*8fb009dcSAndroid Build Coastguard Worker veor q4, q4, q5 739*8fb009dcSAndroid Build Coastguard Worker 740*8fb009dcSAndroid Build Coastguard Worker veor q2, q2, q7 741*8fb009dcSAndroid Build Coastguard Worker veor q3, q3, q1 742*8fb009dcSAndroid Build Coastguard Worker veor q1, q1, q5 743*8fb009dcSAndroid Build Coastguard Worker veor q11, q7, q4 744*8fb009dcSAndroid Build Coastguard Worker veor q10, q1, q2 745*8fb009dcSAndroid Build Coastguard Worker veor q9, q5, q3 746*8fb009dcSAndroid Build Coastguard Worker veor q13, q2, q4 747*8fb009dcSAndroid Build Coastguard Worker vmov q8, q10 748*8fb009dcSAndroid Build Coastguard Worker veor q12, q6, q0 749*8fb009dcSAndroid Build Coastguard Worker 750*8fb009dcSAndroid Build Coastguard Worker vorr q10, q10, q9 751*8fb009dcSAndroid Build Coastguard Worker veor q15, q11, q8 752*8fb009dcSAndroid Build Coastguard Worker vand q14, q11, q12 753*8fb009dcSAndroid Build Coastguard Worker vorr q11, q11, q12 754*8fb009dcSAndroid Build Coastguard Worker veor q12, q12, q9 755*8fb009dcSAndroid Build Coastguard Worker vand q8, q8, q9 756*8fb009dcSAndroid Build Coastguard Worker veor q9, q3, q0 757*8fb009dcSAndroid Build Coastguard Worker vand q15, q15, q12 758*8fb009dcSAndroid Build Coastguard Worker vand q13, q13, q9 759*8fb009dcSAndroid Build Coastguard Worker veor q9, q7, q1 760*8fb009dcSAndroid Build Coastguard Worker veor q12, q5, q6 761*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q13 762*8fb009dcSAndroid Build Coastguard Worker veor q10, q10, q13 763*8fb009dcSAndroid Build Coastguard Worker vand q13, q9, q12 764*8fb009dcSAndroid Build Coastguard Worker vorr q9, q9, q12 765*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q15 766*8fb009dcSAndroid Build Coastguard Worker veor q8, q8, q13 767*8fb009dcSAndroid Build Coastguard Worker veor q10, q10, q14 768*8fb009dcSAndroid Build Coastguard Worker veor q9, q9, q15 769*8fb009dcSAndroid Build Coastguard Worker veor q8, q8, q14 770*8fb009dcSAndroid Build Coastguard Worker vand q12, q2, q3 771*8fb009dcSAndroid Build Coastguard Worker veor q9, q9, q14 772*8fb009dcSAndroid Build Coastguard Worker vand q13, q4, q0 773*8fb009dcSAndroid Build Coastguard Worker vand q14, q1, q5 774*8fb009dcSAndroid Build Coastguard Worker vorr q15, q7, q6 775*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q12 776*8fb009dcSAndroid Build Coastguard Worker veor q9, q9, q14 777*8fb009dcSAndroid Build Coastguard Worker veor q8, q8, q15 778*8fb009dcSAndroid Build Coastguard Worker veor q10, q10, q13 779*8fb009dcSAndroid Build Coastguard Worker 780*8fb009dcSAndroid Build Coastguard Worker @ Inv_GF16 0, 1, 2, 3, s0, s1, s2, s3 781*8fb009dcSAndroid Build Coastguard Worker 782*8fb009dcSAndroid Build Coastguard Worker @ new smaller inversion 783*8fb009dcSAndroid Build Coastguard Worker 784*8fb009dcSAndroid Build Coastguard Worker vand q14, q11, q9 785*8fb009dcSAndroid Build Coastguard Worker vmov q12, q8 786*8fb009dcSAndroid Build Coastguard Worker 787*8fb009dcSAndroid Build Coastguard Worker veor q13, q10, q14 788*8fb009dcSAndroid Build Coastguard Worker veor q15, q8, q14 789*8fb009dcSAndroid Build Coastguard Worker veor q14, q8, q14 @ q14=q15 790*8fb009dcSAndroid Build Coastguard Worker 791*8fb009dcSAndroid Build Coastguard Worker vbsl q13, q9, q8 792*8fb009dcSAndroid Build Coastguard Worker vbsl q15, q11, q10 793*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q10 794*8fb009dcSAndroid Build Coastguard Worker 795*8fb009dcSAndroid Build Coastguard Worker vbsl q12, q13, q14 796*8fb009dcSAndroid Build Coastguard Worker vbsl q8, q14, q13 797*8fb009dcSAndroid Build Coastguard Worker 798*8fb009dcSAndroid Build Coastguard Worker vand q14, q12, q15 799*8fb009dcSAndroid Build Coastguard Worker veor q9, q9, q8 800*8fb009dcSAndroid Build Coastguard Worker 801*8fb009dcSAndroid Build Coastguard Worker veor q14, q14, q11 802*8fb009dcSAndroid Build Coastguard Worker veor q12, q6, q0 803*8fb009dcSAndroid Build Coastguard Worker veor q8, q5, q3 804*8fb009dcSAndroid Build Coastguard Worker veor q10, q15, q14 805*8fb009dcSAndroid Build Coastguard Worker vand q10, q10, q6 806*8fb009dcSAndroid Build Coastguard Worker veor q6, q6, q5 807*8fb009dcSAndroid Build Coastguard Worker vand q11, q5, q15 808*8fb009dcSAndroid Build Coastguard Worker vand q6, q6, q14 809*8fb009dcSAndroid Build Coastguard Worker veor q5, q11, q10 810*8fb009dcSAndroid Build Coastguard Worker veor q6, q6, q11 811*8fb009dcSAndroid Build Coastguard Worker veor q15, q15, q13 812*8fb009dcSAndroid Build Coastguard Worker veor q14, q14, q9 813*8fb009dcSAndroid Build Coastguard Worker veor q11, q15, q14 814*8fb009dcSAndroid Build Coastguard Worker veor q10, q13, q9 815*8fb009dcSAndroid Build Coastguard Worker vand q11, q11, q12 816*8fb009dcSAndroid Build Coastguard Worker vand q10, q10, q0 817*8fb009dcSAndroid Build Coastguard Worker veor q12, q12, q8 818*8fb009dcSAndroid Build Coastguard Worker veor q0, q0, q3 819*8fb009dcSAndroid Build Coastguard Worker vand q8, q8, q15 820*8fb009dcSAndroid Build Coastguard Worker vand q3, q3, q13 821*8fb009dcSAndroid Build Coastguard Worker vand q12, q12, q14 822*8fb009dcSAndroid Build Coastguard Worker vand q0, q0, q9 823*8fb009dcSAndroid Build Coastguard Worker veor q8, q8, q12 824*8fb009dcSAndroid Build Coastguard Worker veor q0, q0, q3 825*8fb009dcSAndroid Build Coastguard Worker veor q12, q12, q11 826*8fb009dcSAndroid Build Coastguard Worker veor q3, q3, q10 827*8fb009dcSAndroid Build Coastguard Worker veor q6, q6, q12 828*8fb009dcSAndroid Build Coastguard Worker veor q0, q0, q12 829*8fb009dcSAndroid Build Coastguard Worker veor q5, q5, q8 830*8fb009dcSAndroid Build Coastguard Worker veor q3, q3, q8 831*8fb009dcSAndroid Build Coastguard Worker 832*8fb009dcSAndroid Build Coastguard Worker veor q12, q7, q4 833*8fb009dcSAndroid Build Coastguard Worker veor q8, q1, q2 834*8fb009dcSAndroid Build Coastguard Worker veor q11, q15, q14 835*8fb009dcSAndroid Build Coastguard Worker veor q10, q13, q9 836*8fb009dcSAndroid Build Coastguard Worker vand q11, q11, q12 837*8fb009dcSAndroid Build Coastguard Worker vand q10, q10, q4 838*8fb009dcSAndroid Build Coastguard Worker veor q12, q12, q8 839*8fb009dcSAndroid Build Coastguard Worker veor q4, q4, q2 840*8fb009dcSAndroid Build Coastguard Worker vand q8, q8, q15 841*8fb009dcSAndroid Build Coastguard Worker vand q2, q2, q13 842*8fb009dcSAndroid Build Coastguard Worker vand q12, q12, q14 843*8fb009dcSAndroid Build Coastguard Worker vand q4, q4, q9 844*8fb009dcSAndroid Build Coastguard Worker veor q8, q8, q12 845*8fb009dcSAndroid Build Coastguard Worker veor q4, q4, q2 846*8fb009dcSAndroid Build Coastguard Worker veor q12, q12, q11 847*8fb009dcSAndroid Build Coastguard Worker veor q2, q2, q10 848*8fb009dcSAndroid Build Coastguard Worker veor q15, q15, q13 849*8fb009dcSAndroid Build Coastguard Worker veor q14, q14, q9 850*8fb009dcSAndroid Build Coastguard Worker veor q10, q15, q14 851*8fb009dcSAndroid Build Coastguard Worker vand q10, q10, q7 852*8fb009dcSAndroid Build Coastguard Worker veor q7, q7, q1 853*8fb009dcSAndroid Build Coastguard Worker vand q11, q1, q15 854*8fb009dcSAndroid Build Coastguard Worker vand q7, q7, q14 855*8fb009dcSAndroid Build Coastguard Worker veor q1, q11, q10 856*8fb009dcSAndroid Build Coastguard Worker veor q7, q7, q11 857*8fb009dcSAndroid Build Coastguard Worker veor q7, q7, q12 858*8fb009dcSAndroid Build Coastguard Worker veor q4, q4, q12 859*8fb009dcSAndroid Build Coastguard Worker veor q1, q1, q8 860*8fb009dcSAndroid Build Coastguard Worker veor q2, q2, q8 861*8fb009dcSAndroid Build Coastguard Worker veor q7, q7, q0 862*8fb009dcSAndroid Build Coastguard Worker veor q1, q1, q6 863*8fb009dcSAndroid Build Coastguard Worker veor q6, q6, q0 864*8fb009dcSAndroid Build Coastguard Worker veor q4, q4, q7 865*8fb009dcSAndroid Build Coastguard Worker veor q0, q0, q1 866*8fb009dcSAndroid Build Coastguard Worker 867*8fb009dcSAndroid Build Coastguard Worker veor q1, q1, q5 868*8fb009dcSAndroid Build Coastguard Worker veor q5, q5, q2 869*8fb009dcSAndroid Build Coastguard Worker veor q2, q2, q3 870*8fb009dcSAndroid Build Coastguard Worker veor q3, q3, q5 871*8fb009dcSAndroid Build Coastguard Worker veor q4, q4, q5 872*8fb009dcSAndroid Build Coastguard Worker 873*8fb009dcSAndroid Build Coastguard Worker veor q6, q6, q3 874*8fb009dcSAndroid Build Coastguard Worker subs r5,r5,#1 875*8fb009dcSAndroid Build Coastguard Worker bcc .Lenc_done 876*8fb009dcSAndroid Build Coastguard Worker vext.8 q8, q0, q0, #12 @ x0 <<< 32 877*8fb009dcSAndroid Build Coastguard Worker vext.8 q9, q1, q1, #12 878*8fb009dcSAndroid Build Coastguard Worker veor q0, q0, q8 @ x0 ^ (x0 <<< 32) 879*8fb009dcSAndroid Build Coastguard Worker vext.8 q10, q4, q4, #12 880*8fb009dcSAndroid Build Coastguard Worker veor q1, q1, q9 881*8fb009dcSAndroid Build Coastguard Worker vext.8 q11, q6, q6, #12 882*8fb009dcSAndroid Build Coastguard Worker veor q4, q4, q10 883*8fb009dcSAndroid Build Coastguard Worker vext.8 q12, q3, q3, #12 884*8fb009dcSAndroid Build Coastguard Worker veor q6, q6, q11 885*8fb009dcSAndroid Build Coastguard Worker vext.8 q13, q7, q7, #12 886*8fb009dcSAndroid Build Coastguard Worker veor q3, q3, q12 887*8fb009dcSAndroid Build Coastguard Worker vext.8 q14, q2, q2, #12 888*8fb009dcSAndroid Build Coastguard Worker veor q7, q7, q13 889*8fb009dcSAndroid Build Coastguard Worker vext.8 q15, q5, q5, #12 890*8fb009dcSAndroid Build Coastguard Worker veor q2, q2, q14 891*8fb009dcSAndroid Build Coastguard Worker 892*8fb009dcSAndroid Build Coastguard Worker veor q9, q9, q0 893*8fb009dcSAndroid Build Coastguard Worker veor q5, q5, q15 894*8fb009dcSAndroid Build Coastguard Worker vext.8 q0, q0, q0, #8 @ (x0 ^ (x0 <<< 32)) <<< 64) 895*8fb009dcSAndroid Build Coastguard Worker veor q10, q10, q1 896*8fb009dcSAndroid Build Coastguard Worker veor q8, q8, q5 897*8fb009dcSAndroid Build Coastguard Worker veor q9, q9, q5 898*8fb009dcSAndroid Build Coastguard Worker vext.8 q1, q1, q1, #8 899*8fb009dcSAndroid Build Coastguard Worker veor q13, q13, q3 900*8fb009dcSAndroid Build Coastguard Worker veor q0, q0, q8 901*8fb009dcSAndroid Build Coastguard Worker veor q14, q14, q7 902*8fb009dcSAndroid Build Coastguard Worker veor q1, q1, q9 903*8fb009dcSAndroid Build Coastguard Worker vext.8 q8, q3, q3, #8 904*8fb009dcSAndroid Build Coastguard Worker veor q12, q12, q6 905*8fb009dcSAndroid Build Coastguard Worker vext.8 q9, q7, q7, #8 906*8fb009dcSAndroid Build Coastguard Worker veor q15, q15, q2 907*8fb009dcSAndroid Build Coastguard Worker vext.8 q3, q6, q6, #8 908*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q4 909*8fb009dcSAndroid Build Coastguard Worker vext.8 q7, q5, q5, #8 910*8fb009dcSAndroid Build Coastguard Worker veor q12, q12, q5 911*8fb009dcSAndroid Build Coastguard Worker vext.8 q6, q2, q2, #8 912*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q5 913*8fb009dcSAndroid Build Coastguard Worker vext.8 q2, q4, q4, #8 914*8fb009dcSAndroid Build Coastguard Worker veor q5, q9, q13 915*8fb009dcSAndroid Build Coastguard Worker veor q4, q8, q12 916*8fb009dcSAndroid Build Coastguard Worker veor q3, q3, q11 917*8fb009dcSAndroid Build Coastguard Worker veor q7, q7, q15 918*8fb009dcSAndroid Build Coastguard Worker veor q6, q6, q14 919*8fb009dcSAndroid Build Coastguard Worker @ vmov q4, q8 920*8fb009dcSAndroid Build Coastguard Worker veor q2, q2, q10 921*8fb009dcSAndroid Build Coastguard Worker @ vmov q5, q9 922*8fb009dcSAndroid Build Coastguard Worker vldmia r6, {q12} @ .LSR 923*8fb009dcSAndroid Build Coastguard Worker ite eq @ Thumb2 thing, samity check in ARM 924*8fb009dcSAndroid Build Coastguard Worker addeq r6,r6,#0x10 925*8fb009dcSAndroid Build Coastguard Worker bne .Lenc_loop 926*8fb009dcSAndroid Build Coastguard Worker vldmia r6, {q12} @ .LSRM0 927*8fb009dcSAndroid Build Coastguard Worker b .Lenc_loop 928*8fb009dcSAndroid Build Coastguard Worker.align 4 929*8fb009dcSAndroid Build Coastguard Worker.Lenc_done: 930*8fb009dcSAndroid Build Coastguard Worker vmov.i8 q8,#0x55 @ compose .LBS0 931*8fb009dcSAndroid Build Coastguard Worker vmov.i8 q9,#0x33 @ compose .LBS1 932*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q10, q2, #1 933*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q11, q3, #1 934*8fb009dcSAndroid Build Coastguard Worker veor q10, q10, q5 935*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q7 936*8fb009dcSAndroid Build Coastguard Worker vand q10, q10, q8 937*8fb009dcSAndroid Build Coastguard Worker vand q11, q11, q8 938*8fb009dcSAndroid Build Coastguard Worker veor q5, q5, q10 939*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q10, q10, #1 940*8fb009dcSAndroid Build Coastguard Worker veor q7, q7, q11 941*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q11, q11, #1 942*8fb009dcSAndroid Build Coastguard Worker veor q2, q2, q10 943*8fb009dcSAndroid Build Coastguard Worker veor q3, q3, q11 944*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q10, q4, #1 945*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q11, q0, #1 946*8fb009dcSAndroid Build Coastguard Worker veor q10, q10, q6 947*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q1 948*8fb009dcSAndroid Build Coastguard Worker vand q10, q10, q8 949*8fb009dcSAndroid Build Coastguard Worker vand q11, q11, q8 950*8fb009dcSAndroid Build Coastguard Worker veor q6, q6, q10 951*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q10, q10, #1 952*8fb009dcSAndroid Build Coastguard Worker veor q1, q1, q11 953*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q11, q11, #1 954*8fb009dcSAndroid Build Coastguard Worker veor q4, q4, q10 955*8fb009dcSAndroid Build Coastguard Worker veor q0, q0, q11 956*8fb009dcSAndroid Build Coastguard Worker vmov.i8 q8,#0x0f @ compose .LBS2 957*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q10, q7, #2 958*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q11, q3, #2 959*8fb009dcSAndroid Build Coastguard Worker veor q10, q10, q5 960*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q2 961*8fb009dcSAndroid Build Coastguard Worker vand q10, q10, q9 962*8fb009dcSAndroid Build Coastguard Worker vand q11, q11, q9 963*8fb009dcSAndroid Build Coastguard Worker veor q5, q5, q10 964*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q10, q10, #2 965*8fb009dcSAndroid Build Coastguard Worker veor q2, q2, q11 966*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q11, q11, #2 967*8fb009dcSAndroid Build Coastguard Worker veor q7, q7, q10 968*8fb009dcSAndroid Build Coastguard Worker veor q3, q3, q11 969*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q10, q1, #2 970*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q11, q0, #2 971*8fb009dcSAndroid Build Coastguard Worker veor q10, q10, q6 972*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q4 973*8fb009dcSAndroid Build Coastguard Worker vand q10, q10, q9 974*8fb009dcSAndroid Build Coastguard Worker vand q11, q11, q9 975*8fb009dcSAndroid Build Coastguard Worker veor q6, q6, q10 976*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q10, q10, #2 977*8fb009dcSAndroid Build Coastguard Worker veor q4, q4, q11 978*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q11, q11, #2 979*8fb009dcSAndroid Build Coastguard Worker veor q1, q1, q10 980*8fb009dcSAndroid Build Coastguard Worker veor q0, q0, q11 981*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q10, q6, #4 982*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q11, q4, #4 983*8fb009dcSAndroid Build Coastguard Worker veor q10, q10, q5 984*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q2 985*8fb009dcSAndroid Build Coastguard Worker vand q10, q10, q8 986*8fb009dcSAndroid Build Coastguard Worker vand q11, q11, q8 987*8fb009dcSAndroid Build Coastguard Worker veor q5, q5, q10 988*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q10, q10, #4 989*8fb009dcSAndroid Build Coastguard Worker veor q2, q2, q11 990*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q11, q11, #4 991*8fb009dcSAndroid Build Coastguard Worker veor q6, q6, q10 992*8fb009dcSAndroid Build Coastguard Worker veor q4, q4, q11 993*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q10, q1, #4 994*8fb009dcSAndroid Build Coastguard Worker vshr.u64 q11, q0, #4 995*8fb009dcSAndroid Build Coastguard Worker veor q10, q10, q7 996*8fb009dcSAndroid Build Coastguard Worker veor q11, q11, q3 997*8fb009dcSAndroid Build Coastguard Worker vand q10, q10, q8 998*8fb009dcSAndroid Build Coastguard Worker vand q11, q11, q8 999*8fb009dcSAndroid Build Coastguard Worker veor q7, q7, q10 1000*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q10, q10, #4 1001*8fb009dcSAndroid Build Coastguard Worker veor q3, q3, q11 1002*8fb009dcSAndroid Build Coastguard Worker vshl.u64 q11, q11, #4 1003*8fb009dcSAndroid Build Coastguard Worker veor q1, q1, q10 1004*8fb009dcSAndroid Build Coastguard Worker veor q0, q0, q11 1005*8fb009dcSAndroid Build Coastguard Worker vldmia r4, {q8} @ last round key 1006*8fb009dcSAndroid Build Coastguard Worker veor q4, q4, q8 1007*8fb009dcSAndroid Build Coastguard Worker veor q6, q6, q8 1008*8fb009dcSAndroid Build Coastguard Worker veor q3, q3, q8 1009*8fb009dcSAndroid Build Coastguard Worker veor q7, q7, q8 1010*8fb009dcSAndroid Build Coastguard Worker veor q2, q2, q8 1011*8fb009dcSAndroid Build Coastguard Worker veor q5, q5, q8 1012*8fb009dcSAndroid Build Coastguard Worker veor q0, q0, q8 1013*8fb009dcSAndroid Build Coastguard Worker veor q1, q1, q8 1014*8fb009dcSAndroid Build Coastguard Worker bx lr 1015*8fb009dcSAndroid Build Coastguard Worker.size _bsaes_encrypt8,.-_bsaes_encrypt8 1016*8fb009dcSAndroid Build Coastguard Worker.type _bsaes_key_convert,%function 1017*8fb009dcSAndroid Build Coastguard Worker.align 4 1018*8fb009dcSAndroid Build Coastguard Worker_bsaes_key_convert: 1019*8fb009dcSAndroid Build Coastguard Worker adr r6,. 1020*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q7}, [r4]! @ load round 0 key 1021*8fb009dcSAndroid Build Coastguard Worker#if defined(__thumb2__) || defined(__APPLE__) 1022*8fb009dcSAndroid Build Coastguard Worker adr r6,.LM0 1023*8fb009dcSAndroid Build Coastguard Worker#else 1024*8fb009dcSAndroid Build Coastguard Worker sub r6,r6,#_bsaes_key_convert-.LM0 1025*8fb009dcSAndroid Build Coastguard Worker#endif 1026*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q15}, [r4]! @ load round 1 key 1027*8fb009dcSAndroid Build Coastguard Worker 1028*8fb009dcSAndroid Build Coastguard Worker vmov.i8 q8, #0x01 @ bit masks 1029*8fb009dcSAndroid Build Coastguard Worker vmov.i8 q9, #0x02 1030*8fb009dcSAndroid Build Coastguard Worker vmov.i8 q10, #0x04 1031*8fb009dcSAndroid Build Coastguard Worker vmov.i8 q11, #0x08 1032*8fb009dcSAndroid Build Coastguard Worker vmov.i8 q12, #0x10 1033*8fb009dcSAndroid Build Coastguard Worker vmov.i8 q13, #0x20 1034*8fb009dcSAndroid Build Coastguard Worker vldmia r6, {q14} @ .LM0 1035*8fb009dcSAndroid Build Coastguard Worker 1036*8fb009dcSAndroid Build Coastguard Worker#ifdef __ARMEL__ 1037*8fb009dcSAndroid Build Coastguard Worker vrev32.8 q7, q7 1038*8fb009dcSAndroid Build Coastguard Worker vrev32.8 q15, q15 1039*8fb009dcSAndroid Build Coastguard Worker#endif 1040*8fb009dcSAndroid Build Coastguard Worker sub r5,r5,#1 1041*8fb009dcSAndroid Build Coastguard Worker vstmia r12!, {q7} @ save round 0 key 1042*8fb009dcSAndroid Build Coastguard Worker b .Lkey_loop 1043*8fb009dcSAndroid Build Coastguard Worker 1044*8fb009dcSAndroid Build Coastguard Worker.align 4 1045*8fb009dcSAndroid Build Coastguard Worker.Lkey_loop: 1046*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d14,{q15},d28 1047*8fb009dcSAndroid Build Coastguard Worker vtbl.8 d15,{q15},d29 1048*8fb009dcSAndroid Build Coastguard Worker vmov.i8 q6, #0x40 1049*8fb009dcSAndroid Build Coastguard Worker vmov.i8 q15, #0x80 1050*8fb009dcSAndroid Build Coastguard Worker 1051*8fb009dcSAndroid Build Coastguard Worker vtst.8 q0, q7, q8 1052*8fb009dcSAndroid Build Coastguard Worker vtst.8 q1, q7, q9 1053*8fb009dcSAndroid Build Coastguard Worker vtst.8 q2, q7, q10 1054*8fb009dcSAndroid Build Coastguard Worker vtst.8 q3, q7, q11 1055*8fb009dcSAndroid Build Coastguard Worker vtst.8 q4, q7, q12 1056*8fb009dcSAndroid Build Coastguard Worker vtst.8 q5, q7, q13 1057*8fb009dcSAndroid Build Coastguard Worker vtst.8 q6, q7, q6 1058*8fb009dcSAndroid Build Coastguard Worker vtst.8 q7, q7, q15 1059*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q15}, [r4]! @ load next round key 1060*8fb009dcSAndroid Build Coastguard Worker vmvn q0, q0 @ "pnot" 1061*8fb009dcSAndroid Build Coastguard Worker vmvn q1, q1 1062*8fb009dcSAndroid Build Coastguard Worker vmvn q5, q5 1063*8fb009dcSAndroid Build Coastguard Worker vmvn q6, q6 1064*8fb009dcSAndroid Build Coastguard Worker#ifdef __ARMEL__ 1065*8fb009dcSAndroid Build Coastguard Worker vrev32.8 q15, q15 1066*8fb009dcSAndroid Build Coastguard Worker#endif 1067*8fb009dcSAndroid Build Coastguard Worker subs r5,r5,#1 1068*8fb009dcSAndroid Build Coastguard Worker vstmia r12!,{q0,q1,q2,q3,q4,q5,q6,q7} @ write bit-sliced round key 1069*8fb009dcSAndroid Build Coastguard Worker bne .Lkey_loop 1070*8fb009dcSAndroid Build Coastguard Worker 1071*8fb009dcSAndroid Build Coastguard Worker vmov.i8 q7,#0x63 @ compose .L63 1072*8fb009dcSAndroid Build Coastguard Worker @ don't save last round key 1073*8fb009dcSAndroid Build Coastguard Worker bx lr 1074*8fb009dcSAndroid Build Coastguard Worker.size _bsaes_key_convert,.-_bsaes_key_convert 1075*8fb009dcSAndroid Build Coastguard Worker.globl bsaes_cbc_encrypt 1076*8fb009dcSAndroid Build Coastguard Worker.hidden bsaes_cbc_encrypt 1077*8fb009dcSAndroid Build Coastguard Worker.type bsaes_cbc_encrypt,%function 1078*8fb009dcSAndroid Build Coastguard Worker.align 5 1079*8fb009dcSAndroid Build Coastguard Workerbsaes_cbc_encrypt: 1080*8fb009dcSAndroid Build Coastguard Worker @ In OpenSSL, this function had a fallback to aes_nohw_cbc_encrypt for 1081*8fb009dcSAndroid Build Coastguard Worker @ short inputs. We patch this out, using bsaes for all input sizes. 1082*8fb009dcSAndroid Build Coastguard Worker 1083*8fb009dcSAndroid Build Coastguard Worker @ it is up to the caller to make sure we are called with enc == 0 1084*8fb009dcSAndroid Build Coastguard Worker 1085*8fb009dcSAndroid Build Coastguard Worker mov ip, sp 1086*8fb009dcSAndroid Build Coastguard Worker stmdb sp!, {r4,r5,r6,r7,r8,r9,r10, lr} 1087*8fb009dcSAndroid Build Coastguard Worker VFP_ABI_PUSH 1088*8fb009dcSAndroid Build Coastguard Worker ldr r8, [ip] @ IV is 1st arg on the stack 1089*8fb009dcSAndroid Build Coastguard Worker mov r2, r2, lsr#4 @ len in 16 byte blocks 1090*8fb009dcSAndroid Build Coastguard Worker sub sp, #0x10 @ scratch space to carry over the IV 1091*8fb009dcSAndroid Build Coastguard Worker mov r9, sp @ save sp 1092*8fb009dcSAndroid Build Coastguard Worker 1093*8fb009dcSAndroid Build Coastguard Worker ldr r10, [r3, #240] @ get # of rounds 1094*8fb009dcSAndroid Build Coastguard Worker#ifndef BSAES_ASM_EXTENDED_KEY 1095*8fb009dcSAndroid Build Coastguard Worker @ allocate the key schedule on the stack 1096*8fb009dcSAndroid Build Coastguard Worker sub r12, sp, r10, lsl#7 @ 128 bytes per inner round key 1097*8fb009dcSAndroid Build Coastguard Worker add r12, #96 @ sifze of bit-slices key schedule 1098*8fb009dcSAndroid Build Coastguard Worker 1099*8fb009dcSAndroid Build Coastguard Worker @ populate the key schedule 1100*8fb009dcSAndroid Build Coastguard Worker mov r4, r3 @ pass key 1101*8fb009dcSAndroid Build Coastguard Worker mov r5, r10 @ pass # of rounds 1102*8fb009dcSAndroid Build Coastguard Worker mov sp, r12 @ sp is sp 1103*8fb009dcSAndroid Build Coastguard Worker bl _bsaes_key_convert 1104*8fb009dcSAndroid Build Coastguard Worker vldmia sp, {q6} 1105*8fb009dcSAndroid Build Coastguard Worker vstmia r12, {q15} @ save last round key 1106*8fb009dcSAndroid Build Coastguard Worker veor q7, q7, q6 @ fix up round 0 key 1107*8fb009dcSAndroid Build Coastguard Worker vstmia sp, {q7} 1108*8fb009dcSAndroid Build Coastguard Worker#else 1109*8fb009dcSAndroid Build Coastguard Worker ldr r12, [r3, #244] 1110*8fb009dcSAndroid Build Coastguard Worker eors r12, #1 1111*8fb009dcSAndroid Build Coastguard Worker beq 0f 1112*8fb009dcSAndroid Build Coastguard Worker 1113*8fb009dcSAndroid Build Coastguard Worker @ populate the key schedule 1114*8fb009dcSAndroid Build Coastguard Worker str r12, [r3, #244] 1115*8fb009dcSAndroid Build Coastguard Worker mov r4, r3 @ pass key 1116*8fb009dcSAndroid Build Coastguard Worker mov r5, r10 @ pass # of rounds 1117*8fb009dcSAndroid Build Coastguard Worker add r12, r3, #248 @ pass key schedule 1118*8fb009dcSAndroid Build Coastguard Worker bl _bsaes_key_convert 1119*8fb009dcSAndroid Build Coastguard Worker add r4, r3, #248 1120*8fb009dcSAndroid Build Coastguard Worker vldmia r4, {q6} 1121*8fb009dcSAndroid Build Coastguard Worker vstmia r12, {q15} @ save last round key 1122*8fb009dcSAndroid Build Coastguard Worker veor q7, q7, q6 @ fix up round 0 key 1123*8fb009dcSAndroid Build Coastguard Worker vstmia r4, {q7} 1124*8fb009dcSAndroid Build Coastguard Worker 1125*8fb009dcSAndroid Build Coastguard Worker.align 2 1126*8fb009dcSAndroid Build Coastguard Worker 1127*8fb009dcSAndroid Build Coastguard Worker#endif 1128*8fb009dcSAndroid Build Coastguard Worker 1129*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q15}, [r8] @ load IV 1130*8fb009dcSAndroid Build Coastguard Worker b .Lcbc_dec_loop 1131*8fb009dcSAndroid Build Coastguard Worker 1132*8fb009dcSAndroid Build Coastguard Worker.align 4 1133*8fb009dcSAndroid Build Coastguard Worker.Lcbc_dec_loop: 1134*8fb009dcSAndroid Build Coastguard Worker subs r2, r2, #0x8 1135*8fb009dcSAndroid Build Coastguard Worker bmi .Lcbc_dec_loop_finish 1136*8fb009dcSAndroid Build Coastguard Worker 1137*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q0,q1}, [r0]! @ load input 1138*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q2,q3}, [r0]! 1139*8fb009dcSAndroid Build Coastguard Worker#ifndef BSAES_ASM_EXTENDED_KEY 1140*8fb009dcSAndroid Build Coastguard Worker mov r4, sp @ pass the key 1141*8fb009dcSAndroid Build Coastguard Worker#else 1142*8fb009dcSAndroid Build Coastguard Worker add r4, r3, #248 1143*8fb009dcSAndroid Build Coastguard Worker#endif 1144*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q4,q5}, [r0]! 1145*8fb009dcSAndroid Build Coastguard Worker mov r5, r10 1146*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q6,q7}, [r0] 1147*8fb009dcSAndroid Build Coastguard Worker sub r0, r0, #0x60 1148*8fb009dcSAndroid Build Coastguard Worker vstmia r9, {q15} @ put aside IV 1149*8fb009dcSAndroid Build Coastguard Worker 1150*8fb009dcSAndroid Build Coastguard Worker bl _bsaes_decrypt8 1151*8fb009dcSAndroid Build Coastguard Worker 1152*8fb009dcSAndroid Build Coastguard Worker vldmia r9, {q14} @ reload IV 1153*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q8,q9}, [r0]! @ reload input 1154*8fb009dcSAndroid Build Coastguard Worker veor q0, q0, q14 @ ^= IV 1155*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q10,q11}, [r0]! 1156*8fb009dcSAndroid Build Coastguard Worker veor q1, q1, q8 1157*8fb009dcSAndroid Build Coastguard Worker veor q6, q6, q9 1158*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q12,q13}, [r0]! 1159*8fb009dcSAndroid Build Coastguard Worker veor q4, q4, q10 1160*8fb009dcSAndroid Build Coastguard Worker veor q2, q2, q11 1161*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q14,q15}, [r0]! 1162*8fb009dcSAndroid Build Coastguard Worker veor q7, q7, q12 1163*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q0,q1}, [r1]! @ write output 1164*8fb009dcSAndroid Build Coastguard Worker veor q3, q3, q13 1165*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q6}, [r1]! 1166*8fb009dcSAndroid Build Coastguard Worker veor q5, q5, q14 1167*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q4}, [r1]! 1168*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q2}, [r1]! 1169*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q7}, [r1]! 1170*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q3}, [r1]! 1171*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q5}, [r1]! 1172*8fb009dcSAndroid Build Coastguard Worker 1173*8fb009dcSAndroid Build Coastguard Worker b .Lcbc_dec_loop 1174*8fb009dcSAndroid Build Coastguard Worker 1175*8fb009dcSAndroid Build Coastguard Worker.Lcbc_dec_loop_finish: 1176*8fb009dcSAndroid Build Coastguard Worker adds r2, r2, #8 1177*8fb009dcSAndroid Build Coastguard Worker beq .Lcbc_dec_done 1178*8fb009dcSAndroid Build Coastguard Worker 1179*8fb009dcSAndroid Build Coastguard Worker @ Set up most parameters for the _bsaes_decrypt8 call. 1180*8fb009dcSAndroid Build Coastguard Worker#ifndef BSAES_ASM_EXTENDED_KEY 1181*8fb009dcSAndroid Build Coastguard Worker mov r4, sp @ pass the key 1182*8fb009dcSAndroid Build Coastguard Worker#else 1183*8fb009dcSAndroid Build Coastguard Worker add r4, r3, #248 1184*8fb009dcSAndroid Build Coastguard Worker#endif 1185*8fb009dcSAndroid Build Coastguard Worker mov r5, r10 1186*8fb009dcSAndroid Build Coastguard Worker vstmia r9, {q15} @ put aside IV 1187*8fb009dcSAndroid Build Coastguard Worker 1188*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q0}, [r0]! @ load input 1189*8fb009dcSAndroid Build Coastguard Worker cmp r2, #2 1190*8fb009dcSAndroid Build Coastguard Worker blo .Lcbc_dec_one 1191*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q1}, [r0]! 1192*8fb009dcSAndroid Build Coastguard Worker beq .Lcbc_dec_two 1193*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q2}, [r0]! 1194*8fb009dcSAndroid Build Coastguard Worker cmp r2, #4 1195*8fb009dcSAndroid Build Coastguard Worker blo .Lcbc_dec_three 1196*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q3}, [r0]! 1197*8fb009dcSAndroid Build Coastguard Worker beq .Lcbc_dec_four 1198*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q4}, [r0]! 1199*8fb009dcSAndroid Build Coastguard Worker cmp r2, #6 1200*8fb009dcSAndroid Build Coastguard Worker blo .Lcbc_dec_five 1201*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q5}, [r0]! 1202*8fb009dcSAndroid Build Coastguard Worker beq .Lcbc_dec_six 1203*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q6}, [r0]! 1204*8fb009dcSAndroid Build Coastguard Worker sub r0, r0, #0x70 1205*8fb009dcSAndroid Build Coastguard Worker 1206*8fb009dcSAndroid Build Coastguard Worker bl _bsaes_decrypt8 1207*8fb009dcSAndroid Build Coastguard Worker 1208*8fb009dcSAndroid Build Coastguard Worker vldmia r9, {q14} @ reload IV 1209*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q8,q9}, [r0]! @ reload input 1210*8fb009dcSAndroid Build Coastguard Worker veor q0, q0, q14 @ ^= IV 1211*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q10,q11}, [r0]! 1212*8fb009dcSAndroid Build Coastguard Worker veor q1, q1, q8 1213*8fb009dcSAndroid Build Coastguard Worker veor q6, q6, q9 1214*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q12,q13}, [r0]! 1215*8fb009dcSAndroid Build Coastguard Worker veor q4, q4, q10 1216*8fb009dcSAndroid Build Coastguard Worker veor q2, q2, q11 1217*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q15}, [r0]! 1218*8fb009dcSAndroid Build Coastguard Worker veor q7, q7, q12 1219*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q0,q1}, [r1]! @ write output 1220*8fb009dcSAndroid Build Coastguard Worker veor q3, q3, q13 1221*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q6}, [r1]! 1222*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q4}, [r1]! 1223*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q2}, [r1]! 1224*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q7}, [r1]! 1225*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q3}, [r1]! 1226*8fb009dcSAndroid Build Coastguard Worker b .Lcbc_dec_done 1227*8fb009dcSAndroid Build Coastguard Worker.align 4 1228*8fb009dcSAndroid Build Coastguard Worker.Lcbc_dec_six: 1229*8fb009dcSAndroid Build Coastguard Worker sub r0, r0, #0x60 1230*8fb009dcSAndroid Build Coastguard Worker bl _bsaes_decrypt8 1231*8fb009dcSAndroid Build Coastguard Worker vldmia r9,{q14} @ reload IV 1232*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q8,q9}, [r0]! @ reload input 1233*8fb009dcSAndroid Build Coastguard Worker veor q0, q0, q14 @ ^= IV 1234*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q10,q11}, [r0]! 1235*8fb009dcSAndroid Build Coastguard Worker veor q1, q1, q8 1236*8fb009dcSAndroid Build Coastguard Worker veor q6, q6, q9 1237*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q12}, [r0]! 1238*8fb009dcSAndroid Build Coastguard Worker veor q4, q4, q10 1239*8fb009dcSAndroid Build Coastguard Worker veor q2, q2, q11 1240*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q15}, [r0]! 1241*8fb009dcSAndroid Build Coastguard Worker veor q7, q7, q12 1242*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q0,q1}, [r1]! @ write output 1243*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q6}, [r1]! 1244*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q4}, [r1]! 1245*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q2}, [r1]! 1246*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q7}, [r1]! 1247*8fb009dcSAndroid Build Coastguard Worker b .Lcbc_dec_done 1248*8fb009dcSAndroid Build Coastguard Worker.align 4 1249*8fb009dcSAndroid Build Coastguard Worker.Lcbc_dec_five: 1250*8fb009dcSAndroid Build Coastguard Worker sub r0, r0, #0x50 1251*8fb009dcSAndroid Build Coastguard Worker bl _bsaes_decrypt8 1252*8fb009dcSAndroid Build Coastguard Worker vldmia r9, {q14} @ reload IV 1253*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q8,q9}, [r0]! @ reload input 1254*8fb009dcSAndroid Build Coastguard Worker veor q0, q0, q14 @ ^= IV 1255*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q10,q11}, [r0]! 1256*8fb009dcSAndroid Build Coastguard Worker veor q1, q1, q8 1257*8fb009dcSAndroid Build Coastguard Worker veor q6, q6, q9 1258*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q15}, [r0]! 1259*8fb009dcSAndroid Build Coastguard Worker veor q4, q4, q10 1260*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q0,q1}, [r1]! @ write output 1261*8fb009dcSAndroid Build Coastguard Worker veor q2, q2, q11 1262*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q6}, [r1]! 1263*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q4}, [r1]! 1264*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q2}, [r1]! 1265*8fb009dcSAndroid Build Coastguard Worker b .Lcbc_dec_done 1266*8fb009dcSAndroid Build Coastguard Worker.align 4 1267*8fb009dcSAndroid Build Coastguard Worker.Lcbc_dec_four: 1268*8fb009dcSAndroid Build Coastguard Worker sub r0, r0, #0x40 1269*8fb009dcSAndroid Build Coastguard Worker bl _bsaes_decrypt8 1270*8fb009dcSAndroid Build Coastguard Worker vldmia r9, {q14} @ reload IV 1271*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q8,q9}, [r0]! @ reload input 1272*8fb009dcSAndroid Build Coastguard Worker veor q0, q0, q14 @ ^= IV 1273*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q10}, [r0]! 1274*8fb009dcSAndroid Build Coastguard Worker veor q1, q1, q8 1275*8fb009dcSAndroid Build Coastguard Worker veor q6, q6, q9 1276*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q15}, [r0]! 1277*8fb009dcSAndroid Build Coastguard Worker veor q4, q4, q10 1278*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q0,q1}, [r1]! @ write output 1279*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q6}, [r1]! 1280*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q4}, [r1]! 1281*8fb009dcSAndroid Build Coastguard Worker b .Lcbc_dec_done 1282*8fb009dcSAndroid Build Coastguard Worker.align 4 1283*8fb009dcSAndroid Build Coastguard Worker.Lcbc_dec_three: 1284*8fb009dcSAndroid Build Coastguard Worker sub r0, r0, #0x30 1285*8fb009dcSAndroid Build Coastguard Worker bl _bsaes_decrypt8 1286*8fb009dcSAndroid Build Coastguard Worker vldmia r9, {q14} @ reload IV 1287*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q8,q9}, [r0]! @ reload input 1288*8fb009dcSAndroid Build Coastguard Worker veor q0, q0, q14 @ ^= IV 1289*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q15}, [r0]! 1290*8fb009dcSAndroid Build Coastguard Worker veor q1, q1, q8 1291*8fb009dcSAndroid Build Coastguard Worker veor q6, q6, q9 1292*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q0,q1}, [r1]! @ write output 1293*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q6}, [r1]! 1294*8fb009dcSAndroid Build Coastguard Worker b .Lcbc_dec_done 1295*8fb009dcSAndroid Build Coastguard Worker.align 4 1296*8fb009dcSAndroid Build Coastguard Worker.Lcbc_dec_two: 1297*8fb009dcSAndroid Build Coastguard Worker sub r0, r0, #0x20 1298*8fb009dcSAndroid Build Coastguard Worker bl _bsaes_decrypt8 1299*8fb009dcSAndroid Build Coastguard Worker vldmia r9, {q14} @ reload IV 1300*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q8}, [r0]! @ reload input 1301*8fb009dcSAndroid Build Coastguard Worker veor q0, q0, q14 @ ^= IV 1302*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q15}, [r0]! @ reload input 1303*8fb009dcSAndroid Build Coastguard Worker veor q1, q1, q8 1304*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q0,q1}, [r1]! @ write output 1305*8fb009dcSAndroid Build Coastguard Worker b .Lcbc_dec_done 1306*8fb009dcSAndroid Build Coastguard Worker.align 4 1307*8fb009dcSAndroid Build Coastguard Worker.Lcbc_dec_one: 1308*8fb009dcSAndroid Build Coastguard Worker sub r0, r0, #0x10 1309*8fb009dcSAndroid Build Coastguard Worker bl _bsaes_decrypt8 1310*8fb009dcSAndroid Build Coastguard Worker vldmia r9, {q14} @ reload IV 1311*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q15}, [r0]! @ reload input 1312*8fb009dcSAndroid Build Coastguard Worker veor q0, q0, q14 @ ^= IV 1313*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q0}, [r1]! @ write output 1314*8fb009dcSAndroid Build Coastguard Worker 1315*8fb009dcSAndroid Build Coastguard Worker.Lcbc_dec_done: 1316*8fb009dcSAndroid Build Coastguard Worker#ifndef BSAES_ASM_EXTENDED_KEY 1317*8fb009dcSAndroid Build Coastguard Worker vmov.i32 q0, #0 1318*8fb009dcSAndroid Build Coastguard Worker vmov.i32 q1, #0 1319*8fb009dcSAndroid Build Coastguard Worker.Lcbc_dec_bzero:@ wipe key schedule [if any] 1320*8fb009dcSAndroid Build Coastguard Worker vstmia sp!, {q0,q1} 1321*8fb009dcSAndroid Build Coastguard Worker cmp sp, r9 1322*8fb009dcSAndroid Build Coastguard Worker bne .Lcbc_dec_bzero 1323*8fb009dcSAndroid Build Coastguard Worker#endif 1324*8fb009dcSAndroid Build Coastguard Worker 1325*8fb009dcSAndroid Build Coastguard Worker mov sp, r9 1326*8fb009dcSAndroid Build Coastguard Worker add sp, #0x10 @ add sp,r9,#0x10 is no good for thumb 1327*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q15}, [r8] @ return IV 1328*8fb009dcSAndroid Build Coastguard Worker VFP_ABI_POP 1329*8fb009dcSAndroid Build Coastguard Worker ldmia sp!, {r4,r5,r6,r7,r8,r9,r10, pc} 1330*8fb009dcSAndroid Build Coastguard Worker.size bsaes_cbc_encrypt,.-bsaes_cbc_encrypt 1331*8fb009dcSAndroid Build Coastguard Worker.globl bsaes_ctr32_encrypt_blocks 1332*8fb009dcSAndroid Build Coastguard Worker.hidden bsaes_ctr32_encrypt_blocks 1333*8fb009dcSAndroid Build Coastguard Worker.type bsaes_ctr32_encrypt_blocks,%function 1334*8fb009dcSAndroid Build Coastguard Worker.align 5 1335*8fb009dcSAndroid Build Coastguard Workerbsaes_ctr32_encrypt_blocks: 1336*8fb009dcSAndroid Build Coastguard Worker @ In OpenSSL, short inputs fall back to aes_nohw_* here. We patch this 1337*8fb009dcSAndroid Build Coastguard Worker @ out to retain a constant-time implementation. 1338*8fb009dcSAndroid Build Coastguard Worker mov ip, sp 1339*8fb009dcSAndroid Build Coastguard Worker stmdb sp!, {r4,r5,r6,r7,r8,r9,r10, lr} 1340*8fb009dcSAndroid Build Coastguard Worker VFP_ABI_PUSH 1341*8fb009dcSAndroid Build Coastguard Worker ldr r8, [ip] @ ctr is 1st arg on the stack 1342*8fb009dcSAndroid Build Coastguard Worker sub sp, sp, #0x10 @ scratch space to carry over the ctr 1343*8fb009dcSAndroid Build Coastguard Worker mov r9, sp @ save sp 1344*8fb009dcSAndroid Build Coastguard Worker 1345*8fb009dcSAndroid Build Coastguard Worker ldr r10, [r3, #240] @ get # of rounds 1346*8fb009dcSAndroid Build Coastguard Worker#ifndef BSAES_ASM_EXTENDED_KEY 1347*8fb009dcSAndroid Build Coastguard Worker @ allocate the key schedule on the stack 1348*8fb009dcSAndroid Build Coastguard Worker sub r12, sp, r10, lsl#7 @ 128 bytes per inner round key 1349*8fb009dcSAndroid Build Coastguard Worker add r12, #96 @ size of bit-sliced key schedule 1350*8fb009dcSAndroid Build Coastguard Worker 1351*8fb009dcSAndroid Build Coastguard Worker @ populate the key schedule 1352*8fb009dcSAndroid Build Coastguard Worker mov r4, r3 @ pass key 1353*8fb009dcSAndroid Build Coastguard Worker mov r5, r10 @ pass # of rounds 1354*8fb009dcSAndroid Build Coastguard Worker mov sp, r12 @ sp is sp 1355*8fb009dcSAndroid Build Coastguard Worker bl _bsaes_key_convert 1356*8fb009dcSAndroid Build Coastguard Worker veor q7,q7,q15 @ fix up last round key 1357*8fb009dcSAndroid Build Coastguard Worker vstmia r12, {q7} @ save last round key 1358*8fb009dcSAndroid Build Coastguard Worker 1359*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q0}, [r8] @ load counter 1360*8fb009dcSAndroid Build Coastguard Worker#ifdef __APPLE__ 1361*8fb009dcSAndroid Build Coastguard Worker mov r8, #:lower16:(.LREVM0SR-.LM0) 1362*8fb009dcSAndroid Build Coastguard Worker add r8, r6, r8 1363*8fb009dcSAndroid Build Coastguard Worker#else 1364*8fb009dcSAndroid Build Coastguard Worker add r8, r6, #.LREVM0SR-.LM0 @ borrow r8 1365*8fb009dcSAndroid Build Coastguard Worker#endif 1366*8fb009dcSAndroid Build Coastguard Worker vldmia sp, {q4} @ load round0 key 1367*8fb009dcSAndroid Build Coastguard Worker#else 1368*8fb009dcSAndroid Build Coastguard Worker ldr r12, [r3, #244] 1369*8fb009dcSAndroid Build Coastguard Worker eors r12, #1 1370*8fb009dcSAndroid Build Coastguard Worker beq 0f 1371*8fb009dcSAndroid Build Coastguard Worker 1372*8fb009dcSAndroid Build Coastguard Worker @ populate the key schedule 1373*8fb009dcSAndroid Build Coastguard Worker str r12, [r3, #244] 1374*8fb009dcSAndroid Build Coastguard Worker mov r4, r3 @ pass key 1375*8fb009dcSAndroid Build Coastguard Worker mov r5, r10 @ pass # of rounds 1376*8fb009dcSAndroid Build Coastguard Worker add r12, r3, #248 @ pass key schedule 1377*8fb009dcSAndroid Build Coastguard Worker bl _bsaes_key_convert 1378*8fb009dcSAndroid Build Coastguard Worker veor q7,q7,q15 @ fix up last round key 1379*8fb009dcSAndroid Build Coastguard Worker vstmia r12, {q7} @ save last round key 1380*8fb009dcSAndroid Build Coastguard Worker 1381*8fb009dcSAndroid Build Coastguard Worker.align 2 1382*8fb009dcSAndroid Build Coastguard Worker add r12, r3, #248 1383*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q0}, [r8] @ load counter 1384*8fb009dcSAndroid Build Coastguard Worker adrl r8, .LREVM0SR @ borrow r8 1385*8fb009dcSAndroid Build Coastguard Worker vldmia r12, {q4} @ load round0 key 1386*8fb009dcSAndroid Build Coastguard Worker sub sp, #0x10 @ place for adjusted round0 key 1387*8fb009dcSAndroid Build Coastguard Worker#endif 1388*8fb009dcSAndroid Build Coastguard Worker 1389*8fb009dcSAndroid Build Coastguard Worker vmov.i32 q8,#1 @ compose 1<<96 1390*8fb009dcSAndroid Build Coastguard Worker veor q9,q9,q9 1391*8fb009dcSAndroid Build Coastguard Worker vrev32.8 q0,q0 1392*8fb009dcSAndroid Build Coastguard Worker vext.8 q8,q9,q8,#4 1393*8fb009dcSAndroid Build Coastguard Worker vrev32.8 q4,q4 1394*8fb009dcSAndroid Build Coastguard Worker vadd.u32 q9,q8,q8 @ compose 2<<96 1395*8fb009dcSAndroid Build Coastguard Worker vstmia sp, {q4} @ save adjusted round0 key 1396*8fb009dcSAndroid Build Coastguard Worker b .Lctr_enc_loop 1397*8fb009dcSAndroid Build Coastguard Worker 1398*8fb009dcSAndroid Build Coastguard Worker.align 4 1399*8fb009dcSAndroid Build Coastguard Worker.Lctr_enc_loop: 1400*8fb009dcSAndroid Build Coastguard Worker vadd.u32 q10, q8, q9 @ compose 3<<96 1401*8fb009dcSAndroid Build Coastguard Worker vadd.u32 q1, q0, q8 @ +1 1402*8fb009dcSAndroid Build Coastguard Worker vadd.u32 q2, q0, q9 @ +2 1403*8fb009dcSAndroid Build Coastguard Worker vadd.u32 q3, q0, q10 @ +3 1404*8fb009dcSAndroid Build Coastguard Worker vadd.u32 q4, q1, q10 1405*8fb009dcSAndroid Build Coastguard Worker vadd.u32 q5, q2, q10 1406*8fb009dcSAndroid Build Coastguard Worker vadd.u32 q6, q3, q10 1407*8fb009dcSAndroid Build Coastguard Worker vadd.u32 q7, q4, q10 1408*8fb009dcSAndroid Build Coastguard Worker vadd.u32 q10, q5, q10 @ next counter 1409*8fb009dcSAndroid Build Coastguard Worker 1410*8fb009dcSAndroid Build Coastguard Worker @ Borrow prologue from _bsaes_encrypt8 to use the opportunity 1411*8fb009dcSAndroid Build Coastguard Worker @ to flip byte order in 32-bit counter 1412*8fb009dcSAndroid Build Coastguard Worker 1413*8fb009dcSAndroid Build Coastguard Worker vldmia sp, {q9} @ load round0 key 1414*8fb009dcSAndroid Build Coastguard Worker#ifndef BSAES_ASM_EXTENDED_KEY 1415*8fb009dcSAndroid Build Coastguard Worker add r4, sp, #0x10 @ pass next round key 1416*8fb009dcSAndroid Build Coastguard Worker#else 1417*8fb009dcSAndroid Build Coastguard Worker add r4, r3, #264 1418*8fb009dcSAndroid Build Coastguard Worker#endif 1419*8fb009dcSAndroid Build Coastguard Worker vldmia r8, {q8} @ .LREVM0SR 1420*8fb009dcSAndroid Build Coastguard Worker mov r5, r10 @ pass rounds 1421*8fb009dcSAndroid Build Coastguard Worker vstmia r9, {q10} @ save next counter 1422*8fb009dcSAndroid Build Coastguard Worker#ifdef __APPLE__ 1423*8fb009dcSAndroid Build Coastguard Worker mov r6, #:lower16:(.LREVM0SR-.LSR) 1424*8fb009dcSAndroid Build Coastguard Worker sub r6, r8, r6 1425*8fb009dcSAndroid Build Coastguard Worker#else 1426*8fb009dcSAndroid Build Coastguard Worker sub r6, r8, #.LREVM0SR-.LSR @ pass constants 1427*8fb009dcSAndroid Build Coastguard Worker#endif 1428*8fb009dcSAndroid Build Coastguard Worker 1429*8fb009dcSAndroid Build Coastguard Worker bl _bsaes_encrypt8_alt 1430*8fb009dcSAndroid Build Coastguard Worker 1431*8fb009dcSAndroid Build Coastguard Worker subs r2, r2, #8 1432*8fb009dcSAndroid Build Coastguard Worker blo .Lctr_enc_loop_done 1433*8fb009dcSAndroid Build Coastguard Worker 1434*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q8,q9}, [r0]! @ load input 1435*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q10,q11}, [r0]! 1436*8fb009dcSAndroid Build Coastguard Worker veor q0, q8 1437*8fb009dcSAndroid Build Coastguard Worker veor q1, q9 1438*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q12,q13}, [r0]! 1439*8fb009dcSAndroid Build Coastguard Worker veor q4, q10 1440*8fb009dcSAndroid Build Coastguard Worker veor q6, q11 1441*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q14,q15}, [r0]! 1442*8fb009dcSAndroid Build Coastguard Worker veor q3, q12 1443*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q0,q1}, [r1]! @ write output 1444*8fb009dcSAndroid Build Coastguard Worker veor q7, q13 1445*8fb009dcSAndroid Build Coastguard Worker veor q2, q14 1446*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q4}, [r1]! 1447*8fb009dcSAndroid Build Coastguard Worker veor q5, q15 1448*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q6}, [r1]! 1449*8fb009dcSAndroid Build Coastguard Worker vmov.i32 q8, #1 @ compose 1<<96 1450*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q3}, [r1]! 1451*8fb009dcSAndroid Build Coastguard Worker veor q9, q9, q9 1452*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q7}, [r1]! 1453*8fb009dcSAndroid Build Coastguard Worker vext.8 q8, q9, q8, #4 1454*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q2}, [r1]! 1455*8fb009dcSAndroid Build Coastguard Worker vadd.u32 q9,q8,q8 @ compose 2<<96 1456*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q5}, [r1]! 1457*8fb009dcSAndroid Build Coastguard Worker vldmia r9, {q0} @ load counter 1458*8fb009dcSAndroid Build Coastguard Worker 1459*8fb009dcSAndroid Build Coastguard Worker bne .Lctr_enc_loop 1460*8fb009dcSAndroid Build Coastguard Worker b .Lctr_enc_done 1461*8fb009dcSAndroid Build Coastguard Worker 1462*8fb009dcSAndroid Build Coastguard Worker.align 4 1463*8fb009dcSAndroid Build Coastguard Worker.Lctr_enc_loop_done: 1464*8fb009dcSAndroid Build Coastguard Worker add r2, r2, #8 1465*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q8}, [r0]! @ load input 1466*8fb009dcSAndroid Build Coastguard Worker veor q0, q8 1467*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q0}, [r1]! @ write output 1468*8fb009dcSAndroid Build Coastguard Worker cmp r2, #2 1469*8fb009dcSAndroid Build Coastguard Worker blo .Lctr_enc_done 1470*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q9}, [r0]! 1471*8fb009dcSAndroid Build Coastguard Worker veor q1, q9 1472*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q1}, [r1]! 1473*8fb009dcSAndroid Build Coastguard Worker beq .Lctr_enc_done 1474*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q10}, [r0]! 1475*8fb009dcSAndroid Build Coastguard Worker veor q4, q10 1476*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q4}, [r1]! 1477*8fb009dcSAndroid Build Coastguard Worker cmp r2, #4 1478*8fb009dcSAndroid Build Coastguard Worker blo .Lctr_enc_done 1479*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q11}, [r0]! 1480*8fb009dcSAndroid Build Coastguard Worker veor q6, q11 1481*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q6}, [r1]! 1482*8fb009dcSAndroid Build Coastguard Worker beq .Lctr_enc_done 1483*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q12}, [r0]! 1484*8fb009dcSAndroid Build Coastguard Worker veor q3, q12 1485*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q3}, [r1]! 1486*8fb009dcSAndroid Build Coastguard Worker cmp r2, #6 1487*8fb009dcSAndroid Build Coastguard Worker blo .Lctr_enc_done 1488*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q13}, [r0]! 1489*8fb009dcSAndroid Build Coastguard Worker veor q7, q13 1490*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q7}, [r1]! 1491*8fb009dcSAndroid Build Coastguard Worker beq .Lctr_enc_done 1492*8fb009dcSAndroid Build Coastguard Worker vld1.8 {q14}, [r0] 1493*8fb009dcSAndroid Build Coastguard Worker veor q2, q14 1494*8fb009dcSAndroid Build Coastguard Worker vst1.8 {q2}, [r1]! 1495*8fb009dcSAndroid Build Coastguard Worker 1496*8fb009dcSAndroid Build Coastguard Worker.Lctr_enc_done: 1497*8fb009dcSAndroid Build Coastguard Worker vmov.i32 q0, #0 1498*8fb009dcSAndroid Build Coastguard Worker vmov.i32 q1, #0 1499*8fb009dcSAndroid Build Coastguard Worker#ifndef BSAES_ASM_EXTENDED_KEY 1500*8fb009dcSAndroid Build Coastguard Worker.Lctr_enc_bzero:@ wipe key schedule [if any] 1501*8fb009dcSAndroid Build Coastguard Worker vstmia sp!, {q0,q1} 1502*8fb009dcSAndroid Build Coastguard Worker cmp sp, r9 1503*8fb009dcSAndroid Build Coastguard Worker bne .Lctr_enc_bzero 1504*8fb009dcSAndroid Build Coastguard Worker#else 1505*8fb009dcSAndroid Build Coastguard Worker vstmia sp, {q0,q1} 1506*8fb009dcSAndroid Build Coastguard Worker#endif 1507*8fb009dcSAndroid Build Coastguard Worker 1508*8fb009dcSAndroid Build Coastguard Worker mov sp, r9 1509*8fb009dcSAndroid Build Coastguard Worker add sp, #0x10 @ add sp,r9,#0x10 is no good for thumb 1510*8fb009dcSAndroid Build Coastguard Worker VFP_ABI_POP 1511*8fb009dcSAndroid Build Coastguard Worker ldmia sp!, {r4,r5,r6,r7,r8,r9,r10, pc} @ return 1512*8fb009dcSAndroid Build Coastguard Worker 1513*8fb009dcSAndroid Build Coastguard Worker @ OpenSSL contains aes_nohw_* fallback code here. We patch this 1514*8fb009dcSAndroid Build Coastguard Worker @ out to retain a constant-time implementation. 1515*8fb009dcSAndroid Build Coastguard Worker.size bsaes_ctr32_encrypt_blocks,.-bsaes_ctr32_encrypt_blocks 1516*8fb009dcSAndroid Build Coastguard Worker#endif 1517*8fb009dcSAndroid Build Coastguard Worker#endif // !OPENSSL_NO_ASM && defined(OPENSSL_ARM) && defined(__ELF__) 1518