Path: blob/main/sys/crypto/openssl/arm/bsaes-armv7.S
39482 views
/* Do not modify. This file is auto-generated from bsaes-armv7.pl. */1@ Copyright 2012-2023 The OpenSSL Project Authors. All Rights Reserved.2@3@ Licensed under the Apache License 2.0 (the "License"). You may not use4@ this file except in compliance with the License. You can obtain a copy5@ in the file LICENSE in the source distribution or at6@ https://www.openssl.org/source/license.html789@ ====================================================================10@ Written by Andy Polyakov <appro@openssl.org> for the OpenSSL11@ project. The module is, however, dual licensed under OpenSSL and12@ CRYPTOGAMS licenses depending on where you obtain it. For further13@ details see http://www.openssl.org/~appro/cryptogams/.14@15@ Specific modes and adaptation for Linux kernel by Ard Biesheuvel16@ of Linaro.17@ ====================================================================1819@ Bit-sliced AES for ARM NEON20@21@ February 2012.22@23@ This implementation is direct adaptation of bsaes-x86_64 module for24@ ARM NEON. Except that this module is endian-neutral [in sense that25@ it can be compiled for either endianness] by courtesy of vld1.8's26@ neutrality. Initial version doesn't implement interface to OpenSSL,27@ only low-level primitives and unsupported entry points, just enough28@ to collect performance results, which for Cortex-A8 core are:29@30@ encrypt 19.5 cycles per byte processed with 128-bit key31@ decrypt 22.1 cycles per byte processed with 128-bit key32@ key conv. 440 cycles per 128-bit key/0.18 of 8x block33@34@ Snapdragon S4 encrypts byte in 17.6 cycles and decrypts in 19.7,35@ which is [much] worse than anticipated (for further details see36@ http://www.openssl.org/~appro/Snapdragon-S4.html).37@38@ Cortex-A15 manages in 14.2/16.1 cycles [when integer-only code39@ manages in 20.0 cycles].40@41@ When comparing to x86_64 results keep in mind that NEON unit is42@ [mostly] single-issue and thus can't [fully] benefit from43@ instruction-level parallelism. And when comparing to aes-armv444@ results keep in mind key schedule conversion overhead (see45@ bsaes-x86_64.pl for further details)...46@47@ <appro@openssl.org>4849@ April-August 201350@ Add CBC, CTR and XTS subroutines and adapt for kernel use; courtesy of Ard.5152@ $output is the last argument if it looks like a file (it has an extension)53@ $flavour is the first argument if it doesn't look like a file54#ifndef __KERNEL__55# include "arm_arch.h"5657# define VFP_ABI_PUSH vstmdb sp!,{d8-d15}58# define VFP_ABI_POP vldmia sp!,{d8-d15}59# define VFP_ABI_FRAME 0x4060#else61# define VFP_ABI_PUSH62# define VFP_ABI_POP63# define VFP_ABI_FRAME 064# define BSAES_ASM_EXTENDED_KEY65# define XTS_CHAIN_TWEAK66# define __ARM_ARCH__ __LINUX_ARM_ARCH__67# define __ARM_MAX_ARCH__ 768#endif6970#ifdef __thumb__71# define adrl adr72#endif7374#if __ARM_MAX_ARCH__>=775.arch armv7-a76.fpu neon7778.syntax unified @ ARMv7-capable assembler is expected to handle this79#if defined(__thumb2__) && !defined(__APPLE__)80.thumb81#else82.code 3283# undef __thumb2__84#endif8586.text8788.type _bsaes_decrypt8,%function89.align 490_bsaes_decrypt8:91adr r6,.92vldmia r4!, {q9} @ round 0 key93#if defined(__thumb2__) || defined(__APPLE__)94adr r6,.LM0ISR95#else96add r6,r6,#.LM0ISR-_bsaes_decrypt897#endif9899vldmia r6!, {q8} @ .LM0ISR100veor q10, q0, q9 @ xor with round0 key101veor q11, q1, q9102vtbl.8 d0, {q10}, d16103vtbl.8 d1, {q10}, d17104veor q12, q2, q9105vtbl.8 d2, {q11}, d16106vtbl.8 d3, {q11}, d17107veor q13, q3, q9108vtbl.8 d4, {q12}, d16109vtbl.8 d5, {q12}, d17110veor q14, q4, q9111vtbl.8 d6, {q13}, d16112vtbl.8 d7, {q13}, d17113veor q15, q5, q9114vtbl.8 d8, {q14}, d16115vtbl.8 d9, {q14}, d17116veor q10, q6, q9117vtbl.8 d10, {q15}, d16118vtbl.8 d11, {q15}, d17119veor q11, q7, q9120vtbl.8 d12, {q10}, d16121vtbl.8 d13, {q10}, d17122vtbl.8 d14, {q11}, d16123vtbl.8 d15, {q11}, d17124vmov.i8 q8,#0x55 @ compose .LBS0125vmov.i8 q9,#0x33 @ compose .LBS1126vshr.u64 q10, q6, #1127vshr.u64 q11, q4, #1128veor q10, q10, q7129veor q11, q11, q5130vand q10, q10, q8131vand q11, q11, q8132veor q7, q7, q10133vshl.u64 q10, q10, #1134veor q5, q5, q11135vshl.u64 q11, q11, #1136veor q6, q6, q10137veor q4, q4, q11138vshr.u64 q10, q2, #1139vshr.u64 q11, q0, #1140veor q10, q10, q3141veor q11, q11, q1142vand q10, q10, q8143vand q11, q11, q8144veor q3, q3, q10145vshl.u64 q10, q10, #1146veor q1, q1, q11147vshl.u64 q11, q11, #1148veor q2, q2, q10149veor q0, q0, q11150vmov.i8 q8,#0x0f @ compose .LBS2151vshr.u64 q10, q5, #2152vshr.u64 q11, q4, #2153veor q10, q10, q7154veor q11, q11, q6155vand q10, q10, q9156vand q11, q11, q9157veor q7, q7, q10158vshl.u64 q10, q10, #2159veor q6, q6, q11160vshl.u64 q11, q11, #2161veor q5, q5, q10162veor q4, q4, q11163vshr.u64 q10, q1, #2164vshr.u64 q11, q0, #2165veor q10, q10, q3166veor q11, q11, q2167vand q10, q10, q9168vand q11, q11, q9169veor q3, q3, q10170vshl.u64 q10, q10, #2171veor q2, q2, q11172vshl.u64 q11, q11, #2173veor q1, q1, q10174veor q0, q0, q11175vshr.u64 q10, q3, #4176vshr.u64 q11, q2, #4177veor q10, q10, q7178veor q11, q11, q6179vand q10, q10, q8180vand q11, q11, q8181veor q7, q7, q10182vshl.u64 q10, q10, #4183veor q6, q6, q11184vshl.u64 q11, q11, #4185veor q3, q3, q10186veor q2, q2, q11187vshr.u64 q10, q1, #4188vshr.u64 q11, q0, #4189veor q10, q10, q5190veor q11, q11, q4191vand q10, q10, q8192vand q11, q11, q8193veor q5, q5, q10194vshl.u64 q10, q10, #4195veor q4, q4, q11196vshl.u64 q11, q11, #4197veor q1, q1, q10198veor q0, q0, q11199sub r5,r5,#1200b .Ldec_sbox201.align 4202.Ldec_loop:203vldmia r4!, {q8,q9,q10,q11}204veor q8, q8, q0205veor q9, q9, q1206vtbl.8 d0, {q8}, d24207vtbl.8 d1, {q8}, d25208vldmia r4!, {q8}209veor q10, q10, q2210vtbl.8 d2, {q9}, d24211vtbl.8 d3, {q9}, d25212vldmia r4!, {q9}213veor q11, q11, q3214vtbl.8 d4, {q10}, d24215vtbl.8 d5, {q10}, d25216vldmia r4!, {q10}217vtbl.8 d6, {q11}, d24218vtbl.8 d7, {q11}, d25219vldmia r4!, {q11}220veor q8, q8, q4221veor q9, q9, q5222vtbl.8 d8, {q8}, d24223vtbl.8 d9, {q8}, d25224veor q10, q10, q6225vtbl.8 d10, {q9}, d24226vtbl.8 d11, {q9}, d25227veor q11, q11, q7228vtbl.8 d12, {q10}, d24229vtbl.8 d13, {q10}, d25230vtbl.8 d14, {q11}, d24231vtbl.8 d15, {q11}, d25232.Ldec_sbox:233veor q1, q1, q4234veor q3, q3, q4235236veor q4, q4, q7237veor q1, q1, q6238veor q2, q2, q7239veor q6, q6, q4240241veor q0, q0, q1242veor q2, q2, q5243veor q7, q7, q6244veor q3, q3, q0245veor q5, q5, q0246veor q1, q1, q3247veor q11, q3, q0248veor q10, q7, q4249veor q9, q1, q6250veor q13, q4, q0251vmov q8, q10252veor q12, q5, q2253254vorr q10, q10, q9255veor q15, q11, q8256vand q14, q11, q12257vorr q11, q11, q12258veor q12, q12, q9259vand q8, q8, q9260veor q9, q6, q2261vand q15, q15, q12262vand q13, q13, q9263veor q9, q3, q7264veor q12, q1, q5265veor q11, q11, q13266veor q10, q10, q13267vand q13, q9, q12268vorr q9, q9, q12269veor q11, q11, q15270veor q8, q8, q13271veor q10, q10, q14272veor q9, q9, q15273veor q8, q8, q14274vand q12, q4, q6275veor q9, q9, q14276vand q13, q0, q2277vand q14, q7, q1278vorr q15, q3, q5279veor q11, q11, q12280veor q9, q9, q14281veor q8, q8, q15282veor q10, q10, q13283284@ Inv_GF16 0, 1, 2, 3, s0, s1, s2, s3285286@ new smaller inversion287288vand q14, q11, q9289vmov q12, q8290291veor q13, q10, q14292veor q15, q8, q14293veor q14, q8, q14 @ q14=q15294295vbsl q13, q9, q8296vbsl q15, q11, q10297veor q11, q11, q10298299vbsl q12, q13, q14300vbsl q8, q14, q13301302vand q14, q12, q15303veor q9, q9, q8304305veor q14, q14, q11306veor q12, q5, q2307veor q8, q1, q6308veor q10, q15, q14309vand q10, q10, q5310veor q5, q5, q1311vand q11, q1, q15312vand q5, q5, q14313veor q1, q11, q10314veor q5, q5, q11315veor q15, q15, q13316veor q14, q14, q9317veor q11, q15, q14318veor q10, q13, q9319vand q11, q11, q12320vand q10, q10, q2321veor q12, q12, q8322veor q2, q2, q6323vand q8, q8, q15324vand q6, q6, q13325vand q12, q12, q14326vand q2, q2, q9327veor q8, q8, q12328veor q2, q2, q6329veor q12, q12, q11330veor q6, q6, q10331veor q5, q5, q12332veor q2, q2, q12333veor q1, q1, q8334veor q6, q6, q8335336veor q12, q3, q0337veor q8, q7, q4338veor q11, q15, q14339veor q10, q13, q9340vand q11, q11, q12341vand q10, q10, q0342veor q12, q12, q8343veor q0, q0, q4344vand q8, q8, q15345vand q4, q4, q13346vand q12, q12, q14347vand q0, q0, q9348veor q8, q8, q12349veor q0, q0, q4350veor q12, q12, q11351veor q4, q4, q10352veor q15, q15, q13353veor q14, q14, q9354veor q10, q15, q14355vand q10, q10, q3356veor q3, q3, q7357vand q11, q7, q15358vand q3, q3, q14359veor q7, q11, q10360veor q3, q3, q11361veor q3, q3, q12362veor q0, q0, q12363veor q7, q7, q8364veor q4, q4, q8365veor q1, q1, q7366veor q6, q6, q5367368veor q4, q4, q1369veor q2, q2, q7370veor q5, q5, q7371veor q4, q4, q2372veor q7, q7, q0373veor q4, q4, q5374veor q3, q3, q6375veor q6, q6, q1376veor q3, q3, q4377378veor q4, q4, q0379veor q7, q7, q3380subs r5,r5,#1381bcc .Ldec_done382@ multiplication by 0x05-0x00-0x04-0x00383vext.8 q8, q0, q0, #8384vext.8 q14, q3, q3, #8385vext.8 q15, q5, q5, #8386veor q8, q8, q0387vext.8 q9, q1, q1, #8388veor q14, q14, q3389vext.8 q10, q6, q6, #8390veor q15, q15, q5391vext.8 q11, q4, q4, #8392veor q9, q9, q1393vext.8 q12, q2, q2, #8394veor q10, q10, q6395vext.8 q13, q7, q7, #8396veor q11, q11, q4397veor q12, q12, q2398veor q13, q13, q7399400veor q0, q0, q14401veor q1, q1, q14402veor q6, q6, q8403veor q2, q2, q10404veor q4, q4, q9405veor q1, q1, q15406veor q6, q6, q15407veor q2, q2, q14408veor q7, q7, q11409veor q4, q4, q14410veor q3, q3, q12411veor q2, q2, q15412veor q7, q7, q15413veor q5, q5, q13414vext.8 q8, q0, q0, #12 @ x0 <<< 32415vext.8 q9, q1, q1, #12416veor q0, q0, q8 @ x0 ^ (x0 <<< 32)417vext.8 q10, q6, q6, #12418veor q1, q1, q9419vext.8 q11, q4, q4, #12420veor q6, q6, q10421vext.8 q12, q2, q2, #12422veor q4, q4, q11423vext.8 q13, q7, q7, #12424veor q2, q2, q12425vext.8 q14, q3, q3, #12426veor q7, q7, q13427vext.8 q15, q5, q5, #12428veor q3, q3, q14429430veor q9, q9, q0431veor q5, q5, q15432vext.8 q0, q0, q0, #8 @ (x0 ^ (x0 <<< 32)) <<< 64)433veor q10, q10, q1434veor q8, q8, q5435veor q9, q9, q5436vext.8 q1, q1, q1, #8437veor q13, q13, q2438veor q0, q0, q8439veor q14, q14, q7440veor q1, q1, q9441vext.8 q8, q2, q2, #8442veor q12, q12, q4443vext.8 q9, q7, q7, #8444veor q15, q15, q3445vext.8 q2, q4, q4, #8446veor q11, q11, q6447vext.8 q7, q5, q5, #8448veor q12, q12, q5449vext.8 q4, q3, q3, #8450veor q11, q11, q5451vext.8 q3, q6, q6, #8452veor q5, q9, q13453veor q11, q11, q2454veor q7, q7, q15455veor q6, q4, q14456veor q4, q8, q12457veor q2, q3, q10458vmov q3, q11459@ vmov q5, q9460vldmia r6, {q12} @ .LISR461ite eq @ Thumb2 thing, sanity check in ARM462addeq r6,r6,#0x10463bne .Ldec_loop464vldmia r6, {q12} @ .LISRM0465b .Ldec_loop466.align 4467.Ldec_done:468vmov.i8 q8,#0x55 @ compose .LBS0469vmov.i8 q9,#0x33 @ compose .LBS1470vshr.u64 q10, q3, #1471vshr.u64 q11, q2, #1472veor q10, q10, q5473veor q11, q11, q7474vand q10, q10, q8475vand q11, q11, q8476veor q5, q5, q10477vshl.u64 q10, q10, #1478veor q7, q7, q11479vshl.u64 q11, q11, #1480veor q3, q3, q10481veor q2, q2, q11482vshr.u64 q10, q6, #1483vshr.u64 q11, q0, #1484veor q10, q10, q4485veor q11, q11, q1486vand q10, q10, q8487vand q11, q11, q8488veor q4, q4, q10489vshl.u64 q10, q10, #1490veor q1, q1, q11491vshl.u64 q11, q11, #1492veor q6, q6, q10493veor q0, q0, q11494vmov.i8 q8,#0x0f @ compose .LBS2495vshr.u64 q10, q7, #2496vshr.u64 q11, q2, #2497veor q10, q10, q5498veor q11, q11, q3499vand q10, q10, q9500vand q11, q11, q9501veor q5, q5, q10502vshl.u64 q10, q10, #2503veor q3, q3, q11504vshl.u64 q11, q11, #2505veor q7, q7, q10506veor q2, q2, q11507vshr.u64 q10, q1, #2508vshr.u64 q11, q0, #2509veor q10, q10, q4510veor q11, q11, q6511vand q10, q10, q9512vand q11, q11, q9513veor q4, q4, q10514vshl.u64 q10, q10, #2515veor q6, q6, q11516vshl.u64 q11, q11, #2517veor q1, q1, q10518veor q0, q0, q11519vshr.u64 q10, q4, #4520vshr.u64 q11, q6, #4521veor q10, q10, q5522veor q11, q11, q3523vand q10, q10, q8524vand q11, q11, q8525veor q5, q5, q10526vshl.u64 q10, q10, #4527veor q3, q3, q11528vshl.u64 q11, q11, #4529veor q4, q4, q10530veor q6, q6, q11531vshr.u64 q10, q1, #4532vshr.u64 q11, q0, #4533veor q10, q10, q7534veor q11, q11, q2535vand q10, q10, q8536vand q11, q11, q8537veor q7, q7, q10538vshl.u64 q10, q10, #4539veor q2, q2, q11540vshl.u64 q11, q11, #4541veor q1, q1, q10542veor q0, q0, q11543vldmia r4, {q8} @ last round key544veor q6, q6, q8545veor q4, q4, q8546veor q2, q2, q8547veor q7, q7, q8548veor q3, q3, q8549veor q5, q5, q8550veor q0, q0, q8551veor q1, q1, q8552bx lr553.size _bsaes_decrypt8,.-_bsaes_decrypt8554555.type _bsaes_const,%object556.align 6557_bsaes_const:558.LM0ISR:@ InvShiftRows constants559.quad 0x0a0e0206070b0f03, 0x0004080c0d010509560.LISR:561.quad 0x0504070602010003, 0x0f0e0d0c080b0a09562.LISRM0:563.quad 0x01040b0e0205080f, 0x0306090c00070a0d564.LM0SR:@ ShiftRows constants565.quad 0x0a0e02060f03070b, 0x0004080c05090d01566.LSR:567.quad 0x0504070600030201, 0x0f0e0d0c0a09080b568.LSRM0:569.quad 0x0304090e00050a0f, 0x01060b0c0207080d570.LM0:571.quad 0x02060a0e03070b0f, 0x0004080c0105090d572.LREVM0SR:573.quad 0x090d01050c000408, 0x03070b0f060a0e02574.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,0575.align 2576.align 6577.size _bsaes_const,.-_bsaes_const578579.type _bsaes_encrypt8,%function580.align 4581_bsaes_encrypt8:582adr r6,.583vldmia r4!, {q9} @ round 0 key584#if defined(__thumb2__) || defined(__APPLE__)585adr r6,.LM0SR586#else587sub r6,r6,#_bsaes_encrypt8-.LM0SR588#endif589590vldmia r6!, {q8} @ .LM0SR591_bsaes_encrypt8_alt:592veor q10, q0, q9 @ xor with round0 key593veor q11, q1, q9594vtbl.8 d0, {q10}, d16595vtbl.8 d1, {q10}, d17596veor q12, q2, q9597vtbl.8 d2, {q11}, d16598vtbl.8 d3, {q11}, d17599veor q13, q3, q9600vtbl.8 d4, {q12}, d16601vtbl.8 d5, {q12}, d17602veor q14, q4, q9603vtbl.8 d6, {q13}, d16604vtbl.8 d7, {q13}, d17605veor q15, q5, q9606vtbl.8 d8, {q14}, d16607vtbl.8 d9, {q14}, d17608veor q10, q6, q9609vtbl.8 d10, {q15}, d16610vtbl.8 d11, {q15}, d17611veor q11, q7, q9612vtbl.8 d12, {q10}, d16613vtbl.8 d13, {q10}, d17614vtbl.8 d14, {q11}, d16615vtbl.8 d15, {q11}, d17616_bsaes_encrypt8_bitslice:617vmov.i8 q8,#0x55 @ compose .LBS0618vmov.i8 q9,#0x33 @ compose .LBS1619vshr.u64 q10, q6, #1620vshr.u64 q11, q4, #1621veor q10, q10, q7622veor q11, q11, q5623vand q10, q10, q8624vand q11, q11, q8625veor q7, q7, q10626vshl.u64 q10, q10, #1627veor q5, q5, q11628vshl.u64 q11, q11, #1629veor q6, q6, q10630veor q4, q4, q11631vshr.u64 q10, q2, #1632vshr.u64 q11, q0, #1633veor q10, q10, q3634veor q11, q11, q1635vand q10, q10, q8636vand q11, q11, q8637veor q3, q3, q10638vshl.u64 q10, q10, #1639veor q1, q1, q11640vshl.u64 q11, q11, #1641veor q2, q2, q10642veor q0, q0, q11643vmov.i8 q8,#0x0f @ compose .LBS2644vshr.u64 q10, q5, #2645vshr.u64 q11, q4, #2646veor q10, q10, q7647veor q11, q11, q6648vand q10, q10, q9649vand q11, q11, q9650veor q7, q7, q10651vshl.u64 q10, q10, #2652veor q6, q6, q11653vshl.u64 q11, q11, #2654veor q5, q5, q10655veor q4, q4, q11656vshr.u64 q10, q1, #2657vshr.u64 q11, q0, #2658veor q10, q10, q3659veor q11, q11, q2660vand q10, q10, q9661vand q11, q11, q9662veor q3, q3, q10663vshl.u64 q10, q10, #2664veor q2, q2, q11665vshl.u64 q11, q11, #2666veor q1, q1, q10667veor q0, q0, q11668vshr.u64 q10, q3, #4669vshr.u64 q11, q2, #4670veor q10, q10, q7671veor q11, q11, q6672vand q10, q10, q8673vand q11, q11, q8674veor q7, q7, q10675vshl.u64 q10, q10, #4676veor q6, q6, q11677vshl.u64 q11, q11, #4678veor q3, q3, q10679veor q2, q2, q11680vshr.u64 q10, q1, #4681vshr.u64 q11, q0, #4682veor q10, q10, q5683veor q11, q11, q4684vand q10, q10, q8685vand q11, q11, q8686veor q5, q5, q10687vshl.u64 q10, q10, #4688veor q4, q4, q11689vshl.u64 q11, q11, #4690veor q1, q1, q10691veor q0, q0, q11692sub r5,r5,#1693b .Lenc_sbox694.align 4695.Lenc_loop:696vldmia r4!, {q8,q9,q10,q11}697veor q8, q8, q0698veor q9, q9, q1699vtbl.8 d0, {q8}, d24700vtbl.8 d1, {q8}, d25701vldmia r4!, {q8}702veor q10, q10, q2703vtbl.8 d2, {q9}, d24704vtbl.8 d3, {q9}, d25705vldmia r4!, {q9}706veor q11, q11, q3707vtbl.8 d4, {q10}, d24708vtbl.8 d5, {q10}, d25709vldmia r4!, {q10}710vtbl.8 d6, {q11}, d24711vtbl.8 d7, {q11}, d25712vldmia r4!, {q11}713veor q8, q8, q4714veor q9, q9, q5715vtbl.8 d8, {q8}, d24716vtbl.8 d9, {q8}, d25717veor q10, q10, q6718vtbl.8 d10, {q9}, d24719vtbl.8 d11, {q9}, d25720veor q11, q11, q7721vtbl.8 d12, {q10}, d24722vtbl.8 d13, {q10}, d25723vtbl.8 d14, {q11}, d24724vtbl.8 d15, {q11}, d25725.Lenc_sbox:726veor q2, q2, q1727veor q5, q5, q6728veor q3, q3, q0729veor q6, q6, q2730veor q5, q5, q0731732veor q6, q6, q3733veor q3, q3, q7734veor q7, q7, q5735veor q3, q3, q4736veor q4, q4, q5737738veor q2, q2, q7739veor q3, q3, q1740veor q1, q1, q5741veor q11, q7, q4742veor q10, q1, q2743veor q9, q5, q3744veor q13, q2, q4745vmov q8, q10746veor q12, q6, q0747748vorr q10, q10, q9749veor q15, q11, q8750vand q14, q11, q12751vorr q11, q11, q12752veor q12, q12, q9753vand q8, q8, q9754veor q9, q3, q0755vand q15, q15, q12756vand q13, q13, q9757veor q9, q7, q1758veor q12, q5, q6759veor q11, q11, q13760veor q10, q10, q13761vand q13, q9, q12762vorr q9, q9, q12763veor q11, q11, q15764veor q8, q8, q13765veor q10, q10, q14766veor q9, q9, q15767veor q8, q8, q14768vand q12, q2, q3769veor q9, q9, q14770vand q13, q4, q0771vand q14, q1, q5772vorr q15, q7, q6773veor q11, q11, q12774veor q9, q9, q14775veor q8, q8, q15776veor q10, q10, q13777778@ Inv_GF16 0, 1, 2, 3, s0, s1, s2, s3779780@ new smaller inversion781782vand q14, q11, q9783vmov q12, q8784785veor q13, q10, q14786veor q15, q8, q14787veor q14, q8, q14 @ q14=q15788789vbsl q13, q9, q8790vbsl q15, q11, q10791veor q11, q11, q10792793vbsl q12, q13, q14794vbsl q8, q14, q13795796vand q14, q12, q15797veor q9, q9, q8798799veor q14, q14, q11800veor q12, q6, q0801veor q8, q5, q3802veor q10, q15, q14803vand q10, q10, q6804veor q6, q6, q5805vand q11, q5, q15806vand q6, q6, q14807veor q5, q11, q10808veor q6, q6, q11809veor q15, q15, q13810veor q14, q14, q9811veor q11, q15, q14812veor q10, q13, q9813vand q11, q11, q12814vand q10, q10, q0815veor q12, q12, q8816veor q0, q0, q3817vand q8, q8, q15818vand q3, q3, q13819vand q12, q12, q14820vand q0, q0, q9821veor q8, q8, q12822veor q0, q0, q3823veor q12, q12, q11824veor q3, q3, q10825veor q6, q6, q12826veor q0, q0, q12827veor q5, q5, q8828veor q3, q3, q8829830veor q12, q7, q4831veor q8, q1, q2832veor q11, q15, q14833veor q10, q13, q9834vand q11, q11, q12835vand q10, q10, q4836veor q12, q12, q8837veor q4, q4, q2838vand q8, q8, q15839vand q2, q2, q13840vand q12, q12, q14841vand q4, q4, q9842veor q8, q8, q12843veor q4, q4, q2844veor q12, q12, q11845veor q2, q2, q10846veor q15, q15, q13847veor q14, q14, q9848veor q10, q15, q14849vand q10, q10, q7850veor q7, q7, q1851vand q11, q1, q15852vand q7, q7, q14853veor q1, q11, q10854veor q7, q7, q11855veor q7, q7, q12856veor q4, q4, q12857veor q1, q1, q8858veor q2, q2, q8859veor q7, q7, q0860veor q1, q1, q6861veor q6, q6, q0862veor q4, q4, q7863veor q0, q0, q1864865veor q1, q1, q5866veor q5, q5, q2867veor q2, q2, q3868veor q3, q3, q5869veor q4, q4, q5870871veor q6, q6, q3872subs r5,r5,#1873bcc .Lenc_done874vext.8 q8, q0, q0, #12 @ x0 <<< 32875vext.8 q9, q1, q1, #12876veor q0, q0, q8 @ x0 ^ (x0 <<< 32)877vext.8 q10, q4, q4, #12878veor q1, q1, q9879vext.8 q11, q6, q6, #12880veor q4, q4, q10881vext.8 q12, q3, q3, #12882veor q6, q6, q11883vext.8 q13, q7, q7, #12884veor q3, q3, q12885vext.8 q14, q2, q2, #12886veor q7, q7, q13887vext.8 q15, q5, q5, #12888veor q2, q2, q14889890veor q9, q9, q0891veor q5, q5, q15892vext.8 q0, q0, q0, #8 @ (x0 ^ (x0 <<< 32)) <<< 64)893veor q10, q10, q1894veor q8, q8, q5895veor q9, q9, q5896vext.8 q1, q1, q1, #8897veor q13, q13, q3898veor q0, q0, q8899veor q14, q14, q7900veor q1, q1, q9901vext.8 q8, q3, q3, #8902veor q12, q12, q6903vext.8 q9, q7, q7, #8904veor q15, q15, q2905vext.8 q3, q6, q6, #8906veor q11, q11, q4907vext.8 q7, q5, q5, #8908veor q12, q12, q5909vext.8 q6, q2, q2, #8910veor q11, q11, q5911vext.8 q2, q4, q4, #8912veor q5, q9, q13913veor q4, q8, q12914veor q3, q3, q11915veor q7, q7, q15916veor q6, q6, q14917@ vmov q4, q8918veor q2, q2, q10919@ vmov q5, q9920vldmia r6, {q12} @ .LSR921ite eq @ Thumb2 thing, samity check in ARM922addeq r6,r6,#0x10923bne .Lenc_loop924vldmia r6, {q12} @ .LSRM0925b .Lenc_loop926.align 4927.Lenc_done:928vmov.i8 q8,#0x55 @ compose .LBS0929vmov.i8 q9,#0x33 @ compose .LBS1930vshr.u64 q10, q2, #1931vshr.u64 q11, q3, #1932veor q10, q10, q5933veor q11, q11, q7934vand q10, q10, q8935vand q11, q11, q8936veor q5, q5, q10937vshl.u64 q10, q10, #1938veor q7, q7, q11939vshl.u64 q11, q11, #1940veor q2, q2, q10941veor q3, q3, q11942vshr.u64 q10, q4, #1943vshr.u64 q11, q0, #1944veor q10, q10, q6945veor q11, q11, q1946vand q10, q10, q8947vand q11, q11, q8948veor q6, q6, q10949vshl.u64 q10, q10, #1950veor q1, q1, q11951vshl.u64 q11, q11, #1952veor q4, q4, q10953veor q0, q0, q11954vmov.i8 q8,#0x0f @ compose .LBS2955vshr.u64 q10, q7, #2956vshr.u64 q11, q3, #2957veor q10, q10, q5958veor q11, q11, q2959vand q10, q10, q9960vand q11, q11, q9961veor q5, q5, q10962vshl.u64 q10, q10, #2963veor q2, q2, q11964vshl.u64 q11, q11, #2965veor q7, q7, q10966veor q3, q3, q11967vshr.u64 q10, q1, #2968vshr.u64 q11, q0, #2969veor q10, q10, q6970veor q11, q11, q4971vand q10, q10, q9972vand q11, q11, q9973veor q6, q6, q10974vshl.u64 q10, q10, #2975veor q4, q4, q11976vshl.u64 q11, q11, #2977veor q1, q1, q10978veor q0, q0, q11979vshr.u64 q10, q6, #4980vshr.u64 q11, q4, #4981veor q10, q10, q5982veor q11, q11, q2983vand q10, q10, q8984vand q11, q11, q8985veor q5, q5, q10986vshl.u64 q10, q10, #4987veor q2, q2, q11988vshl.u64 q11, q11, #4989veor q6, q6, q10990veor q4, q4, q11991vshr.u64 q10, q1, #4992vshr.u64 q11, q0, #4993veor q10, q10, q7994veor q11, q11, q3995vand q10, q10, q8996vand q11, q11, q8997veor q7, q7, q10998vshl.u64 q10, q10, #4999veor q3, q3, q111000vshl.u64 q11, q11, #41001veor q1, q1, q101002veor q0, q0, q111003vldmia r4, {q8} @ last round key1004veor q4, q4, q81005veor q6, q6, q81006veor q3, q3, q81007veor q7, q7, q81008veor q2, q2, q81009veor q5, q5, q81010veor q0, q0, q81011veor q1, q1, q81012bx lr1013.size _bsaes_encrypt8,.-_bsaes_encrypt81014.type _bsaes_key_convert,%function1015.align 41016_bsaes_key_convert:1017adr r6,.1018vld1.8 {q7}, [r4]! @ load round 0 key1019#if defined(__thumb2__) || defined(__APPLE__)1020adr r6,.LM01021#else1022sub r6,r6,#_bsaes_key_convert-.LM01023#endif1024vld1.8 {q15}, [r4]! @ load round 1 key10251026vmov.i8 q8, #0x01 @ bit masks1027vmov.i8 q9, #0x021028vmov.i8 q10, #0x041029vmov.i8 q11, #0x081030vmov.i8 q12, #0x101031vmov.i8 q13, #0x201032vldmia r6, {q14} @ .LM010331034#ifdef __ARMEL__1035vrev32.8 q7, q71036vrev32.8 q15, q151037#endif1038sub r5,r5,#11039vstmia r12!, {q7} @ save round 0 key1040b .Lkey_loop10411042.align 41043.Lkey_loop:1044vtbl.8 d14,{q15},d281045vtbl.8 d15,{q15},d291046vmov.i8 q6, #0x401047vmov.i8 q15, #0x8010481049vtst.8 q0, q7, q81050vtst.8 q1, q7, q91051vtst.8 q2, q7, q101052vtst.8 q3, q7, q111053vtst.8 q4, q7, q121054vtst.8 q5, q7, q131055vtst.8 q6, q7, q61056vtst.8 q7, q7, q151057vld1.8 {q15}, [r4]! @ load next round key1058vmvn q0, q0 @ "pnot"1059vmvn q1, q11060vmvn q5, q51061vmvn q6, q61062#ifdef __ARMEL__1063vrev32.8 q15, q151064#endif1065subs r5,r5,#11066vstmia r12!,{q0,q1,q2,q3,q4,q5,q6,q7} @ write bit-sliced round key1067bne .Lkey_loop10681069vmov.i8 q7,#0x63 @ compose .L631070@ don't save last round key1071bx lr1072.size _bsaes_key_convert,.-_bsaes_key_convert1073107410751076.globl ossl_bsaes_cbc_encrypt1077.type ossl_bsaes_cbc_encrypt,%function1078.align 51079ossl_bsaes_cbc_encrypt:1080#ifndef __KERNEL__1081cmp r2, #1281082#ifndef __thumb__1083blo AES_cbc_encrypt1084#else1085bhs .Lcbc_do_bsaes1086b AES_cbc_encrypt1087.Lcbc_do_bsaes:1088#endif1089#endif10901091@ it is up to the caller to make sure we are called with enc == 010921093mov ip, sp1094stmdb sp!, {r4,r5,r6,r7,r8,r9,r10, lr}1095VFP_ABI_PUSH1096ldr r8, [ip] @ IV is 1st arg on the stack1097mov r2, r2, lsr#4 @ len in 16 byte blocks1098sub sp, #0x10 @ scratch space to carry over the IV1099mov r9, sp @ save sp11001101ldr r10, [r3, #240] @ get # of rounds1102#ifndef BSAES_ASM_EXTENDED_KEY1103@ allocate the key schedule on the stack1104sub r12, sp, r10, lsl#7 @ 128 bytes per inner round key1105add r12, #96 @ sifze of bit-slices key schedule11061107@ populate the key schedule1108mov r4, r3 @ pass key1109mov r5, r10 @ pass # of rounds1110mov sp, r12 @ sp is sp1111bl _bsaes_key_convert1112vldmia sp, {q6}1113vstmia r12, {q15} @ save last round key1114veor q7, q7, q6 @ fix up round 0 key1115vstmia sp, {q7}1116#else1117ldr r12, [r3, #244]1118eors r12, #11119beq 0f11201121@ populate the key schedule1122str r12, [r3, #244]1123mov r4, r3 @ pass key1124mov r5, r10 @ pass # of rounds1125add r12, r3, #248 @ pass key schedule1126bl _bsaes_key_convert1127add r4, r3, #2481128vldmia r4, {q6}1129vstmia r12, {q15} @ save last round key1130veor q7, q7, q6 @ fix up round 0 key1131vstmia r4, {q7}11321133.align 211340:1135#endif11361137vld1.8 {q15}, [r8] @ load IV1138b .Lcbc_dec_loop11391140.align 41141.Lcbc_dec_loop:1142subs r2, r2, #0x81143bmi .Lcbc_dec_loop_finish11441145vld1.8 {q0,q1}, [r0]! @ load input1146vld1.8 {q2,q3}, [r0]!1147#ifndef BSAES_ASM_EXTENDED_KEY1148mov r4, sp @ pass the key1149#else1150add r4, r3, #2481151#endif1152vld1.8 {q4,q5}, [r0]!1153mov r5, r101154vld1.8 {q6,q7}, [r0]1155sub r0, r0, #0x601156vstmia r9, {q15} @ put aside IV11571158bl _bsaes_decrypt811591160vldmia r9, {q14} @ reload IV1161vld1.8 {q8,q9}, [r0]! @ reload input1162veor q0, q0, q14 @ ^= IV1163vld1.8 {q10,q11}, [r0]!1164veor q1, q1, q81165veor q6, q6, q91166vld1.8 {q12,q13}, [r0]!1167veor q4, q4, q101168veor q2, q2, q111169vld1.8 {q14,q15}, [r0]!1170veor q7, q7, q121171vst1.8 {q0,q1}, [r1]! @ write output1172veor q3, q3, q131173vst1.8 {q6}, [r1]!1174veor q5, q5, q141175vst1.8 {q4}, [r1]!1176vst1.8 {q2}, [r1]!1177vst1.8 {q7}, [r1]!1178vst1.8 {q3}, [r1]!1179vst1.8 {q5}, [r1]!11801181b .Lcbc_dec_loop11821183.Lcbc_dec_loop_finish:1184adds r2, r2, #81185beq .Lcbc_dec_done11861187vld1.8 {q0}, [r0]! @ load input1188cmp r2, #21189blo .Lcbc_dec_one1190vld1.8 {q1}, [r0]!1191#ifndef BSAES_ASM_EXTENDED_KEY1192mov r4, sp @ pass the key1193#else1194add r4, r3, #2481195#endif1196mov r5, r101197vstmia r9, {q15} @ put aside IV1198beq .Lcbc_dec_two1199vld1.8 {q2}, [r0]!1200cmp r2, #41201blo .Lcbc_dec_three1202vld1.8 {q3}, [r0]!1203beq .Lcbc_dec_four1204vld1.8 {q4}, [r0]!1205cmp r2, #61206blo .Lcbc_dec_five1207vld1.8 {q5}, [r0]!1208beq .Lcbc_dec_six1209vld1.8 {q6}, [r0]!1210sub r0, r0, #0x7012111212bl _bsaes_decrypt812131214vldmia r9, {q14} @ reload IV1215vld1.8 {q8,q9}, [r0]! @ reload input1216veor q0, q0, q14 @ ^= IV1217vld1.8 {q10,q11}, [r0]!1218veor q1, q1, q81219veor q6, q6, q91220vld1.8 {q12,q13}, [r0]!1221veor q4, q4, q101222veor q2, q2, q111223vld1.8 {q15}, [r0]!1224veor q7, q7, q121225vst1.8 {q0,q1}, [r1]! @ write output1226veor q3, q3, q131227vst1.8 {q6}, [r1]!1228vst1.8 {q4}, [r1]!1229vst1.8 {q2}, [r1]!1230vst1.8 {q7}, [r1]!1231vst1.8 {q3}, [r1]!1232b .Lcbc_dec_done1233.align 41234.Lcbc_dec_six:1235sub r0, r0, #0x601236bl _bsaes_decrypt81237vldmia r9,{q14} @ reload IV1238vld1.8 {q8,q9}, [r0]! @ reload input1239veor q0, q0, q14 @ ^= IV1240vld1.8 {q10,q11}, [r0]!1241veor q1, q1, q81242veor q6, q6, q91243vld1.8 {q12}, [r0]!1244veor q4, q4, q101245veor q2, q2, q111246vld1.8 {q15}, [r0]!1247veor q7, q7, q121248vst1.8 {q0,q1}, [r1]! @ write output1249vst1.8 {q6}, [r1]!1250vst1.8 {q4}, [r1]!1251vst1.8 {q2}, [r1]!1252vst1.8 {q7}, [r1]!1253b .Lcbc_dec_done1254.align 41255.Lcbc_dec_five:1256sub r0, r0, #0x501257bl _bsaes_decrypt81258vldmia r9, {q14} @ reload IV1259vld1.8 {q8,q9}, [r0]! @ reload input1260veor q0, q0, q14 @ ^= IV1261vld1.8 {q10,q11}, [r0]!1262veor q1, q1, q81263veor q6, q6, q91264vld1.8 {q15}, [r0]!1265veor q4, q4, q101266vst1.8 {q0,q1}, [r1]! @ write output1267veor q2, q2, q111268vst1.8 {q6}, [r1]!1269vst1.8 {q4}, [r1]!1270vst1.8 {q2}, [r1]!1271b .Lcbc_dec_done1272.align 41273.Lcbc_dec_four:1274sub r0, r0, #0x401275bl _bsaes_decrypt81276vldmia r9, {q14} @ reload IV1277vld1.8 {q8,q9}, [r0]! @ reload input1278veor q0, q0, q14 @ ^= IV1279vld1.8 {q10}, [r0]!1280veor q1, q1, q81281veor q6, q6, q91282vld1.8 {q15}, [r0]!1283veor q4, q4, q101284vst1.8 {q0,q1}, [r1]! @ write output1285vst1.8 {q6}, [r1]!1286vst1.8 {q4}, [r1]!1287b .Lcbc_dec_done1288.align 41289.Lcbc_dec_three:1290sub r0, r0, #0x301291bl _bsaes_decrypt81292vldmia r9, {q14} @ reload IV1293vld1.8 {q8,q9}, [r0]! @ reload input1294veor q0, q0, q14 @ ^= IV1295vld1.8 {q15}, [r0]!1296veor q1, q1, q81297veor q6, q6, q91298vst1.8 {q0,q1}, [r1]! @ write output1299vst1.8 {q6}, [r1]!1300b .Lcbc_dec_done1301.align 41302.Lcbc_dec_two:1303sub r0, r0, #0x201304bl _bsaes_decrypt81305vldmia r9, {q14} @ reload IV1306vld1.8 {q8}, [r0]! @ reload input1307veor q0, q0, q14 @ ^= IV1308vld1.8 {q15}, [r0]! @ reload input1309veor q1, q1, q81310vst1.8 {q0,q1}, [r1]! @ write output1311b .Lcbc_dec_done1312.align 41313.Lcbc_dec_one:1314sub r0, r0, #0x101315mov r10, r1 @ save original out pointer1316mov r1, r9 @ use the iv scratch space as out buffer1317mov r2, r31318vmov q4,q15 @ just in case ensure that IV1319vmov q5,q0 @ and input are preserved1320bl AES_decrypt1321vld1.8 {q0}, [r9] @ load result1322veor q0, q0, q4 @ ^= IV1323vmov q15, q5 @ q5 holds input1324vst1.8 {q0}, [r10] @ write output13251326.Lcbc_dec_done:1327#ifndef BSAES_ASM_EXTENDED_KEY1328vmov.i32 q0, #01329vmov.i32 q1, #01330.Lcbc_dec_bzero:@ wipe key schedule [if any]1331vstmia sp!, {q0,q1}1332cmp sp, r91333bne .Lcbc_dec_bzero1334#endif13351336mov sp, r91337add sp, #0x10 @ add sp,r9,#0x10 is no good for thumb1338vst1.8 {q15}, [r8] @ return IV1339VFP_ABI_POP1340ldmia sp!, {r4,r5,r6,r7,r8,r9,r10, pc}1341.size ossl_bsaes_cbc_encrypt,.-ossl_bsaes_cbc_encrypt13421343.globl ossl_bsaes_ctr32_encrypt_blocks1344.type ossl_bsaes_ctr32_encrypt_blocks,%function1345.align 51346ossl_bsaes_ctr32_encrypt_blocks:1347cmp r2, #8 @ use plain AES for1348blo .Lctr_enc_short @ small sizes13491350mov ip, sp1351stmdb sp!, {r4,r5,r6,r7,r8,r9,r10, lr}1352VFP_ABI_PUSH1353ldr r8, [ip] @ ctr is 1st arg on the stack1354sub sp, sp, #0x10 @ scratch space to carry over the ctr1355mov r9, sp @ save sp13561357ldr r10, [r3, #240] @ get # of rounds1358#ifndef BSAES_ASM_EXTENDED_KEY1359@ allocate the key schedule on the stack1360sub r12, sp, r10, lsl#7 @ 128 bytes per inner round key1361add r12, #96 @ size of bit-sliced key schedule13621363@ populate the key schedule1364mov r4, r3 @ pass key1365mov r5, r10 @ pass # of rounds1366mov sp, r12 @ sp is sp1367bl _bsaes_key_convert1368veor q7,q7,q15 @ fix up last round key1369vstmia r12, {q7} @ save last round key13701371vld1.8 {q0}, [r8] @ load counter1372#ifdef __APPLE__1373mov r8, #:lower16:(.LREVM0SR-.LM0)1374add r8, r6, r81375#else1376add r8, r6, #.LREVM0SR-.LM0 @ borrow r81377#endif1378vldmia sp, {q4} @ load round0 key1379#else1380ldr r12, [r3, #244]1381eors r12, #11382beq 0f13831384@ populate the key schedule1385str r12, [r3, #244]1386mov r4, r3 @ pass key1387mov r5, r10 @ pass # of rounds1388add r12, r3, #248 @ pass key schedule1389bl _bsaes_key_convert1390veor q7,q7,q15 @ fix up last round key1391vstmia r12, {q7} @ save last round key13921393.align 213940: add r12, r3, #2481395vld1.8 {q0}, [r8] @ load counter1396add r8, r6, #.LREVM0SR-.LM0 @ borrow r81397vldmia r12, {q4} @ load round0 key1398sub sp, #0x10 @ place for adjusted round0 key1399#endif14001401vmov.i32 q8,#1 @ compose 1<<961402veor q9,q9,q91403vrev32.8 q0,q01404vext.8 q8,q9,q8,#41405vrev32.8 q4,q41406vadd.u32 q9,q8,q8 @ compose 2<<961407vstmia sp, {q4} @ save adjusted round0 key1408b .Lctr_enc_loop14091410.align 41411.Lctr_enc_loop:1412vadd.u32 q10, q8, q9 @ compose 3<<961413vadd.u32 q1, q0, q8 @ +11414vadd.u32 q2, q0, q9 @ +21415vadd.u32 q3, q0, q10 @ +31416vadd.u32 q4, q1, q101417vadd.u32 q5, q2, q101418vadd.u32 q6, q3, q101419vadd.u32 q7, q4, q101420vadd.u32 q10, q5, q10 @ next counter14211422@ Borrow prologue from _bsaes_encrypt8 to use the opportunity1423@ to flip byte order in 32-bit counter14241425vldmia sp, {q9} @ load round0 key1426#ifndef BSAES_ASM_EXTENDED_KEY1427add r4, sp, #0x10 @ pass next round key1428#else1429add r4, r3, #2641430#endif1431vldmia r8, {q8} @ .LREVM0SR1432mov r5, r10 @ pass rounds1433vstmia r9, {q10} @ save next counter1434#ifdef __APPLE__1435mov r6, #:lower16:(.LREVM0SR-.LSR)1436sub r6, r8, r61437#else1438sub r6, r8, #.LREVM0SR-.LSR @ pass constants1439#endif14401441bl _bsaes_encrypt8_alt14421443subs r2, r2, #81444blo .Lctr_enc_loop_done14451446vld1.8 {q8,q9}, [r0]! @ load input1447vld1.8 {q10,q11}, [r0]!1448veor q0, q81449veor q1, q91450vld1.8 {q12,q13}, [r0]!1451veor q4, q101452veor q6, q111453vld1.8 {q14,q15}, [r0]!1454veor q3, q121455vst1.8 {q0,q1}, [r1]! @ write output1456veor q7, q131457veor q2, q141458vst1.8 {q4}, [r1]!1459veor q5, q151460vst1.8 {q6}, [r1]!1461vmov.i32 q8, #1 @ compose 1<<961462vst1.8 {q3}, [r1]!1463veor q9, q9, q91464vst1.8 {q7}, [r1]!1465vext.8 q8, q9, q8, #41466vst1.8 {q2}, [r1]!1467vadd.u32 q9,q8,q8 @ compose 2<<961468vst1.8 {q5}, [r1]!1469vldmia r9, {q0} @ load counter14701471bne .Lctr_enc_loop1472b .Lctr_enc_done14731474.align 41475.Lctr_enc_loop_done:1476add r2, r2, #81477vld1.8 {q8}, [r0]! @ load input1478veor q0, q81479vst1.8 {q0}, [r1]! @ write output1480cmp r2, #21481blo .Lctr_enc_done1482vld1.8 {q9}, [r0]!1483veor q1, q91484vst1.8 {q1}, [r1]!1485beq .Lctr_enc_done1486vld1.8 {q10}, [r0]!1487veor q4, q101488vst1.8 {q4}, [r1]!1489cmp r2, #41490blo .Lctr_enc_done1491vld1.8 {q11}, [r0]!1492veor q6, q111493vst1.8 {q6}, [r1]!1494beq .Lctr_enc_done1495vld1.8 {q12}, [r0]!1496veor q3, q121497vst1.8 {q3}, [r1]!1498cmp r2, #61499blo .Lctr_enc_done1500vld1.8 {q13}, [r0]!1501veor q7, q131502vst1.8 {q7}, [r1]!1503beq .Lctr_enc_done1504vld1.8 {q14}, [r0]1505veor q2, q141506vst1.8 {q2}, [r1]!15071508.Lctr_enc_done:1509vmov.i32 q0, #01510vmov.i32 q1, #01511#ifndef BSAES_ASM_EXTENDED_KEY1512.Lctr_enc_bzero:@ wipe key schedule [if any]1513vstmia sp!, {q0,q1}1514cmp sp, r91515bne .Lctr_enc_bzero1516#else1517vstmia sp, {q0,q1}1518#endif15191520mov sp, r91521add sp, #0x10 @ add sp,r9,#0x10 is no good for thumb1522VFP_ABI_POP1523ldmia sp!, {r4,r5,r6,r7,r8,r9,r10, pc} @ return15241525.align 41526.Lctr_enc_short:1527ldr ip, [sp] @ ctr pointer is passed on stack1528stmdb sp!, {r4,r5,r6,r7,r8, lr}15291530mov r4, r0 @ copy arguments1531mov r5, r11532mov r6, r21533mov r7, r31534ldr r8, [ip, #12] @ load counter .LSW1535vld1.8 {q1}, [ip] @ load whole counter value1536#ifdef __ARMEL__1537rev r8, r81538#endif1539sub sp, sp, #0x101540vst1.8 {q1}, [sp] @ copy counter value1541sub sp, sp, #0x1015421543.Lctr_enc_short_loop:1544add r0, sp, #0x10 @ input counter value1545mov r1, sp @ output on the stack1546mov r2, r7 @ key15471548bl AES_encrypt15491550vld1.8 {q0}, [r4]! @ load input1551vld1.8 {q1}, [sp] @ load encrypted counter1552add r8, r8, #11553#ifdef __ARMEL__1554rev r0, r81555str r0, [sp, #0x1c] @ next counter value1556#else1557str r8, [sp, #0x1c] @ next counter value1558#endif1559veor q0,q0,q11560vst1.8 {q0}, [r5]! @ store output1561subs r6, r6, #11562bne .Lctr_enc_short_loop15631564vmov.i32 q0, #01565vmov.i32 q1, #01566vstmia sp!, {q0,q1}15671568ldmia sp!, {r4,r5,r6,r7,r8, pc}1569.size ossl_bsaes_ctr32_encrypt_blocks,.-ossl_bsaes_ctr32_encrypt_blocks1570.globl ossl_bsaes_xts_encrypt1571.type ossl_bsaes_xts_encrypt,%function1572.align 41573ossl_bsaes_xts_encrypt:1574mov ip, sp1575stmdb sp!, {r4,r5,r6,r7,r8,r9,r10, lr} @ 0x201576VFP_ABI_PUSH1577mov r6, sp @ future r315781579mov r7, r01580mov r8, r11581mov r9, r21582mov r10, r315831584sub r0, sp, #0x10 @ 0x101585bic r0, #0xf @ align at 16 bytes1586mov sp, r015871588#ifdef XTS_CHAIN_TWEAK1589ldr r0, [ip] @ pointer to input tweak1590#else1591@ generate initial tweak1592ldr r0, [ip, #4] @ iv[]1593mov r1, sp1594ldr r2, [ip, #0] @ key21595bl AES_encrypt1596mov r0,sp @ pointer to initial tweak1597#endif15981599ldr r1, [r10, #240] @ get # of rounds1600mov r3, r61601#ifndef BSAES_ASM_EXTENDED_KEY1602@ allocate the key schedule on the stack1603sub r12, sp, r1, lsl#7 @ 128 bytes per inner round key1604@ add r12, #96 @ size of bit-sliced key schedule1605sub r12, #48 @ place for tweak[9]16061607@ populate the key schedule1608mov r4, r10 @ pass key1609mov r5, r1 @ pass # of rounds1610mov sp, r121611add r12, #0x90 @ pass key schedule1612bl _bsaes_key_convert1613veor q7, q7, q15 @ fix up last round key1614vstmia r12, {q7} @ save last round key1615#else1616ldr r12, [r10, #244]1617eors r12, #11618beq 0f16191620str r12, [r10, #244]1621mov r4, r10 @ pass key1622mov r5, r1 @ pass # of rounds1623add r12, r10, #248 @ pass key schedule1624bl _bsaes_key_convert1625veor q7, q7, q15 @ fix up last round key1626vstmia r12, {q7}16271628.align 216290: sub sp, #0x90 @ place for tweak[9]1630#endif16311632vld1.8 {q8}, [r0] @ initial tweak1633adr r2, .Lxts_magic16341635subs r9, #0x801636blo .Lxts_enc_short1637b .Lxts_enc_loop16381639.align 41640.Lxts_enc_loop:1641vldmia r2, {q5} @ load XTS magic1642vshr.s64 q6, q8, #631643mov r0, sp1644vand q6, q6, q51645vadd.u64 q9, q8, q81646vst1.64 {q8}, [r0,:128]!1647vswp d13,d121648vshr.s64 q7, q9, #631649veor q9, q9, q61650vand q7, q7, q51651vadd.u64 q10, q9, q91652vst1.64 {q9}, [r0,:128]!1653vswp d15,d141654vshr.s64 q6, q10, #631655veor q10, q10, q71656vand q6, q6, q51657vld1.8 {q0}, [r7]!1658vadd.u64 q11, q10, q101659vst1.64 {q10}, [r0,:128]!1660vswp d13,d121661vshr.s64 q7, q11, #631662veor q11, q11, q61663vand q7, q7, q51664vld1.8 {q1}, [r7]!1665veor q0, q0, q81666vadd.u64 q12, q11, q111667vst1.64 {q11}, [r0,:128]!1668vswp d15,d141669vshr.s64 q6, q12, #631670veor q12, q12, q71671vand q6, q6, q51672vld1.8 {q2}, [r7]!1673veor q1, q1, q91674vadd.u64 q13, q12, q121675vst1.64 {q12}, [r0,:128]!1676vswp d13,d121677vshr.s64 q7, q13, #631678veor q13, q13, q61679vand q7, q7, q51680vld1.8 {q3}, [r7]!1681veor q2, q2, q101682vadd.u64 q14, q13, q131683vst1.64 {q13}, [r0,:128]!1684vswp d15,d141685vshr.s64 q6, q14, #631686veor q14, q14, q71687vand q6, q6, q51688vld1.8 {q4}, [r7]!1689veor q3, q3, q111690vadd.u64 q15, q14, q141691vst1.64 {q14}, [r0,:128]!1692vswp d13,d121693vshr.s64 q7, q15, #631694veor q15, q15, q61695vand q7, q7, q51696vld1.8 {q5}, [r7]!1697veor q4, q4, q121698vadd.u64 q8, q15, q151699vst1.64 {q15}, [r0,:128]!1700vswp d15,d141701veor q8, q8, q71702vst1.64 {q8}, [r0,:128] @ next round tweak17031704vld1.8 {q6,q7}, [r7]!1705veor q5, q5, q131706#ifndef BSAES_ASM_EXTENDED_KEY1707add r4, sp, #0x90 @ pass key schedule1708#else1709add r4, r10, #248 @ pass key schedule1710#endif1711veor q6, q6, q141712mov r5, r1 @ pass rounds1713veor q7, q7, q151714mov r0, sp17151716bl _bsaes_encrypt817171718vld1.64 {q8,q9}, [r0,:128]!1719vld1.64 {q10,q11}, [r0,:128]!1720veor q0, q0, q81721vld1.64 {q12,q13}, [r0,:128]!1722veor q1, q1, q91723veor q8, q4, q101724vst1.8 {q0,q1}, [r8]!1725veor q9, q6, q111726vld1.64 {q14,q15}, [r0,:128]!1727veor q10, q3, q121728vst1.8 {q8,q9}, [r8]!1729veor q11, q7, q131730veor q12, q2, q141731vst1.8 {q10,q11}, [r8]!1732veor q13, q5, q151733vst1.8 {q12,q13}, [r8]!17341735vld1.64 {q8}, [r0,:128] @ next round tweak17361737subs r9, #0x801738bpl .Lxts_enc_loop17391740.Lxts_enc_short:1741adds r9, #0x701742bmi .Lxts_enc_done17431744vldmia r2, {q5} @ load XTS magic1745vshr.s64 q7, q8, #631746mov r0, sp1747vand q7, q7, q51748vadd.u64 q9, q8, q81749vst1.64 {q8}, [r0,:128]!1750vswp d15,d141751vshr.s64 q6, q9, #631752veor q9, q9, q71753vand q6, q6, q51754vadd.u64 q10, q9, q91755vst1.64 {q9}, [r0,:128]!1756vswp d13,d121757vshr.s64 q7, q10, #631758veor q10, q10, q61759vand q7, q7, q51760vld1.8 {q0}, [r7]!1761subs r9, #0x101762bmi .Lxts_enc_11763vadd.u64 q11, q10, q101764vst1.64 {q10}, [r0,:128]!1765vswp d15,d141766vshr.s64 q6, q11, #631767veor q11, q11, q71768vand q6, q6, q51769vld1.8 {q1}, [r7]!1770subs r9, #0x101771bmi .Lxts_enc_21772veor q0, q0, q81773vadd.u64 q12, q11, q111774vst1.64 {q11}, [r0,:128]!1775vswp d13,d121776vshr.s64 q7, q12, #631777veor q12, q12, q61778vand q7, q7, q51779vld1.8 {q2}, [r7]!1780subs r9, #0x101781bmi .Lxts_enc_31782veor q1, q1, q91783vadd.u64 q13, q12, q121784vst1.64 {q12}, [r0,:128]!1785vswp d15,d141786vshr.s64 q6, q13, #631787veor q13, q13, q71788vand q6, q6, q51789vld1.8 {q3}, [r7]!1790subs r9, #0x101791bmi .Lxts_enc_41792veor q2, q2, q101793vadd.u64 q14, q13, q131794vst1.64 {q13}, [r0,:128]!1795vswp d13,d121796vshr.s64 q7, q14, #631797veor q14, q14, q61798vand q7, q7, q51799vld1.8 {q4}, [r7]!1800subs r9, #0x101801bmi .Lxts_enc_51802veor q3, q3, q111803vadd.u64 q15, q14, q141804vst1.64 {q14}, [r0,:128]!1805vswp d15,d141806vshr.s64 q6, q15, #631807veor q15, q15, q71808vand q6, q6, q51809vld1.8 {q5}, [r7]!1810subs r9, #0x101811bmi .Lxts_enc_61812veor q4, q4, q121813sub r9, #0x101814vst1.64 {q15}, [r0,:128] @ next round tweak18151816vld1.8 {q6}, [r7]!1817veor q5, q5, q131818#ifndef BSAES_ASM_EXTENDED_KEY1819add r4, sp, #0x90 @ pass key schedule1820#else1821add r4, r10, #248 @ pass key schedule1822#endif1823veor q6, q6, q141824mov r5, r1 @ pass rounds1825mov r0, sp18261827bl _bsaes_encrypt818281829vld1.64 {q8,q9}, [r0,:128]!1830vld1.64 {q10,q11}, [r0,:128]!1831veor q0, q0, q81832vld1.64 {q12,q13}, [r0,:128]!1833veor q1, q1, q91834veor q8, q4, q101835vst1.8 {q0,q1}, [r8]!1836veor q9, q6, q111837vld1.64 {q14}, [r0,:128]!1838veor q10, q3, q121839vst1.8 {q8,q9}, [r8]!1840veor q11, q7, q131841veor q12, q2, q141842vst1.8 {q10,q11}, [r8]!1843vst1.8 {q12}, [r8]!18441845vld1.64 {q8}, [r0,:128] @ next round tweak1846b .Lxts_enc_done1847.align 41848.Lxts_enc_6:1849veor q4, q4, q121850#ifndef BSAES_ASM_EXTENDED_KEY1851add r4, sp, #0x90 @ pass key schedule1852#else1853add r4, r10, #248 @ pass key schedule1854#endif1855veor q5, q5, q131856mov r5, r1 @ pass rounds1857mov r0, sp18581859bl _bsaes_encrypt818601861vld1.64 {q8,q9}, [r0,:128]!1862vld1.64 {q10,q11}, [r0,:128]!1863veor q0, q0, q81864vld1.64 {q12,q13}, [r0,:128]!1865veor q1, q1, q91866veor q8, q4, q101867vst1.8 {q0,q1}, [r8]!1868veor q9, q6, q111869veor q10, q3, q121870vst1.8 {q8,q9}, [r8]!1871veor q11, q7, q131872vst1.8 {q10,q11}, [r8]!18731874vld1.64 {q8}, [r0,:128] @ next round tweak1875b .Lxts_enc_done18761877@ put this in range for both ARM and Thumb mode adr instructions1878.align 51879.Lxts_magic:1880.quad 1, 0x8718811882.align 51883.Lxts_enc_5:1884veor q3, q3, q111885#ifndef BSAES_ASM_EXTENDED_KEY1886add r4, sp, #0x90 @ pass key schedule1887#else1888add r4, r10, #248 @ pass key schedule1889#endif1890veor q4, q4, q121891mov r5, r1 @ pass rounds1892mov r0, sp18931894bl _bsaes_encrypt818951896vld1.64 {q8,q9}, [r0,:128]!1897vld1.64 {q10,q11}, [r0,:128]!1898veor q0, q0, q81899vld1.64 {q12}, [r0,:128]!1900veor q1, q1, q91901veor q8, q4, q101902vst1.8 {q0,q1}, [r8]!1903veor q9, q6, q111904veor q10, q3, q121905vst1.8 {q8,q9}, [r8]!1906vst1.8 {q10}, [r8]!19071908vld1.64 {q8}, [r0,:128] @ next round tweak1909b .Lxts_enc_done1910.align 41911.Lxts_enc_4:1912veor q2, q2, q101913#ifndef BSAES_ASM_EXTENDED_KEY1914add r4, sp, #0x90 @ pass key schedule1915#else1916add r4, r10, #248 @ pass key schedule1917#endif1918veor q3, q3, q111919mov r5, r1 @ pass rounds1920mov r0, sp19211922bl _bsaes_encrypt819231924vld1.64 {q8,q9}, [r0,:128]!1925vld1.64 {q10,q11}, [r0,:128]!1926veor q0, q0, q81927veor q1, q1, q91928veor q8, q4, q101929vst1.8 {q0,q1}, [r8]!1930veor q9, q6, q111931vst1.8 {q8,q9}, [r8]!19321933vld1.64 {q8}, [r0,:128] @ next round tweak1934b .Lxts_enc_done1935.align 41936.Lxts_enc_3:1937veor q1, q1, q91938#ifndef BSAES_ASM_EXTENDED_KEY1939add r4, sp, #0x90 @ pass key schedule1940#else1941add r4, r10, #248 @ pass key schedule1942#endif1943veor q2, q2, q101944mov r5, r1 @ pass rounds1945mov r0, sp19461947bl _bsaes_encrypt819481949vld1.64 {q8,q9}, [r0,:128]!1950vld1.64 {q10}, [r0,:128]!1951veor q0, q0, q81952veor q1, q1, q91953veor q8, q4, q101954vst1.8 {q0,q1}, [r8]!1955vst1.8 {q8}, [r8]!19561957vld1.64 {q8}, [r0,:128] @ next round tweak1958b .Lxts_enc_done1959.align 41960.Lxts_enc_2:1961veor q0, q0, q81962#ifndef BSAES_ASM_EXTENDED_KEY1963add r4, sp, #0x90 @ pass key schedule1964#else1965add r4, r10, #248 @ pass key schedule1966#endif1967veor q1, q1, q91968mov r5, r1 @ pass rounds1969mov r0, sp19701971bl _bsaes_encrypt819721973vld1.64 {q8,q9}, [r0,:128]!1974veor q0, q0, q81975veor q1, q1, q91976vst1.8 {q0,q1}, [r8]!19771978vld1.64 {q8}, [r0,:128] @ next round tweak1979b .Lxts_enc_done1980.align 41981.Lxts_enc_1:1982mov r0, sp1983veor q0, q0, q81984mov r1, sp1985vst1.8 {q0}, [sp,:128]1986mov r2, r101987mov r4, r3 @ preserve fp19881989bl AES_encrypt19901991vld1.8 {q0}, [sp,:128]1992veor q0, q0, q81993vst1.8 {q0}, [r8]!1994mov r3, r419951996vmov q8, q9 @ next round tweak19971998.Lxts_enc_done:1999#ifndef XTS_CHAIN_TWEAK2000adds r9, #0x102001beq .Lxts_enc_ret2002sub r6, r8, #0x1020032004.Lxts_enc_steal:2005ldrb r0, [r7], #12006ldrb r1, [r8, #-0x10]2007strb r0, [r8, #-0x10]2008strb r1, [r8], #120092010subs r9, #12011bhi .Lxts_enc_steal20122013vld1.8 {q0}, [r6]2014mov r0, sp2015veor q0, q0, q82016mov r1, sp2017vst1.8 {q0}, [sp,:128]2018mov r2, r102019mov r4, r3 @ preserve fp20202021bl AES_encrypt20222023vld1.8 {q0}, [sp,:128]2024veor q0, q0, q82025vst1.8 {q0}, [r6]2026mov r3, r42027#endif20282029.Lxts_enc_ret:2030bic r0, r3, #0xf2031vmov.i32 q0, #02032vmov.i32 q1, #02033#ifdef XTS_CHAIN_TWEAK2034ldr r1, [r3, #0x20+VFP_ABI_FRAME] @ chain tweak2035#endif2036.Lxts_enc_bzero:@ wipe key schedule [if any]2037vstmia sp!, {q0,q1}2038cmp sp, r02039bne .Lxts_enc_bzero20402041mov sp, r32042#ifdef XTS_CHAIN_TWEAK2043vst1.8 {q8}, [r1]2044#endif2045VFP_ABI_POP2046ldmia sp!, {r4,r5,r6,r7,r8,r9,r10, pc} @ return20472048.size ossl_bsaes_xts_encrypt,.-ossl_bsaes_xts_encrypt20492050.globl ossl_bsaes_xts_decrypt2051.type ossl_bsaes_xts_decrypt,%function2052.align 42053ossl_bsaes_xts_decrypt:2054mov ip, sp2055stmdb sp!, {r4,r5,r6,r7,r8,r9,r10, lr} @ 0x202056VFP_ABI_PUSH2057mov r6, sp @ future r320582059mov r7, r02060mov r8, r12061mov r9, r22062mov r10, r320632064sub r0, sp, #0x10 @ 0x102065bic r0, #0xf @ align at 16 bytes2066mov sp, r020672068#ifdef XTS_CHAIN_TWEAK2069ldr r0, [ip] @ pointer to input tweak2070#else2071@ generate initial tweak2072ldr r0, [ip, #4] @ iv[]2073mov r1, sp2074ldr r2, [ip, #0] @ key22075bl AES_encrypt2076mov r0, sp @ pointer to initial tweak2077#endif20782079ldr r1, [r10, #240] @ get # of rounds2080mov r3, r62081#ifndef BSAES_ASM_EXTENDED_KEY2082@ allocate the key schedule on the stack2083sub r12, sp, r1, lsl#7 @ 128 bytes per inner round key2084@ add r12, #96 @ size of bit-sliced key schedule2085sub r12, #48 @ place for tweak[9]20862087@ populate the key schedule2088mov r4, r10 @ pass key2089mov r5, r1 @ pass # of rounds2090mov sp, r122091add r12, #0x90 @ pass key schedule2092bl _bsaes_key_convert2093add r4, sp, #0x902094vldmia r4, {q6}2095vstmia r12, {q15} @ save last round key2096veor q7, q7, q6 @ fix up round 0 key2097vstmia r4, {q7}2098#else2099ldr r12, [r10, #244]2100eors r12, #12101beq 0f21022103str r12, [r10, #244]2104mov r4, r10 @ pass key2105mov r5, r1 @ pass # of rounds2106add r12, r10, #248 @ pass key schedule2107bl _bsaes_key_convert2108add r4, r10, #2482109vldmia r4, {q6}2110vstmia r12, {q15} @ save last round key2111veor q7, q7, q6 @ fix up round 0 key2112vstmia r4, {q7}21132114.align 221150: sub sp, #0x90 @ place for tweak[9]2116#endif2117vld1.8 {q8}, [r0] @ initial tweak2118adr r2, .Lxts_magic21192120#ifndef XTS_CHAIN_TWEAK2121tst r9, #0xf @ if not multiple of 162122it ne @ Thumb2 thing, sanity check in ARM2123subne r9, #0x10 @ subtract another 16 bytes2124#endif2125subs r9, #0x8021262127blo .Lxts_dec_short2128b .Lxts_dec_loop21292130.align 42131.Lxts_dec_loop:2132vldmia r2, {q5} @ load XTS magic2133vshr.s64 q6, q8, #632134mov r0, sp2135vand q6, q6, q52136vadd.u64 q9, q8, q82137vst1.64 {q8}, [r0,:128]!2138vswp d13,d122139vshr.s64 q7, q9, #632140veor q9, q9, q62141vand q7, q7, q52142vadd.u64 q10, q9, q92143vst1.64 {q9}, [r0,:128]!2144vswp d15,d142145vshr.s64 q6, q10, #632146veor q10, q10, q72147vand q6, q6, q52148vld1.8 {q0}, [r7]!2149vadd.u64 q11, q10, q102150vst1.64 {q10}, [r0,:128]!2151vswp d13,d122152vshr.s64 q7, q11, #632153veor q11, q11, q62154vand q7, q7, q52155vld1.8 {q1}, [r7]!2156veor q0, q0, q82157vadd.u64 q12, q11, q112158vst1.64 {q11}, [r0,:128]!2159vswp d15,d142160vshr.s64 q6, q12, #632161veor q12, q12, q72162vand q6, q6, q52163vld1.8 {q2}, [r7]!2164veor q1, q1, q92165vadd.u64 q13, q12, q122166vst1.64 {q12}, [r0,:128]!2167vswp d13,d122168vshr.s64 q7, q13, #632169veor q13, q13, q62170vand q7, q7, q52171vld1.8 {q3}, [r7]!2172veor q2, q2, q102173vadd.u64 q14, q13, q132174vst1.64 {q13}, [r0,:128]!2175vswp d15,d142176vshr.s64 q6, q14, #632177veor q14, q14, q72178vand q6, q6, q52179vld1.8 {q4}, [r7]!2180veor q3, q3, q112181vadd.u64 q15, q14, q142182vst1.64 {q14}, [r0,:128]!2183vswp d13,d122184vshr.s64 q7, q15, #632185veor q15, q15, q62186vand q7, q7, q52187vld1.8 {q5}, [r7]!2188veor q4, q4, q122189vadd.u64 q8, q15, q152190vst1.64 {q15}, [r0,:128]!2191vswp d15,d142192veor q8, q8, q72193vst1.64 {q8}, [r0,:128] @ next round tweak21942195vld1.8 {q6,q7}, [r7]!2196veor q5, q5, q132197#ifndef BSAES_ASM_EXTENDED_KEY2198add r4, sp, #0x90 @ pass key schedule2199#else2200add r4, r10, #248 @ pass key schedule2201#endif2202veor q6, q6, q142203mov r5, r1 @ pass rounds2204veor q7, q7, q152205mov r0, sp22062207bl _bsaes_decrypt822082209vld1.64 {q8,q9}, [r0,:128]!2210vld1.64 {q10,q11}, [r0,:128]!2211veor q0, q0, q82212vld1.64 {q12,q13}, [r0,:128]!2213veor q1, q1, q92214veor q8, q6, q102215vst1.8 {q0,q1}, [r8]!2216veor q9, q4, q112217vld1.64 {q14,q15}, [r0,:128]!2218veor q10, q2, q122219vst1.8 {q8,q9}, [r8]!2220veor q11, q7, q132221veor q12, q3, q142222vst1.8 {q10,q11}, [r8]!2223veor q13, q5, q152224vst1.8 {q12,q13}, [r8]!22252226vld1.64 {q8}, [r0,:128] @ next round tweak22272228subs r9, #0x802229bpl .Lxts_dec_loop22302231.Lxts_dec_short:2232adds r9, #0x702233bmi .Lxts_dec_done22342235vldmia r2, {q5} @ load XTS magic2236vshr.s64 q7, q8, #632237mov r0, sp2238vand q7, q7, q52239vadd.u64 q9, q8, q82240vst1.64 {q8}, [r0,:128]!2241vswp d15,d142242vshr.s64 q6, q9, #632243veor q9, q9, q72244vand q6, q6, q52245vadd.u64 q10, q9, q92246vst1.64 {q9}, [r0,:128]!2247vswp d13,d122248vshr.s64 q7, q10, #632249veor q10, q10, q62250vand q7, q7, q52251vld1.8 {q0}, [r7]!2252subs r9, #0x102253bmi .Lxts_dec_12254vadd.u64 q11, q10, q102255vst1.64 {q10}, [r0,:128]!2256vswp d15,d142257vshr.s64 q6, q11, #632258veor q11, q11, q72259vand q6, q6, q52260vld1.8 {q1}, [r7]!2261subs r9, #0x102262bmi .Lxts_dec_22263veor q0, q0, q82264vadd.u64 q12, q11, q112265vst1.64 {q11}, [r0,:128]!2266vswp d13,d122267vshr.s64 q7, q12, #632268veor q12, q12, q62269vand q7, q7, q52270vld1.8 {q2}, [r7]!2271subs r9, #0x102272bmi .Lxts_dec_32273veor q1, q1, q92274vadd.u64 q13, q12, q122275vst1.64 {q12}, [r0,:128]!2276vswp d15,d142277vshr.s64 q6, q13, #632278veor q13, q13, q72279vand q6, q6, q52280vld1.8 {q3}, [r7]!2281subs r9, #0x102282bmi .Lxts_dec_42283veor q2, q2, q102284vadd.u64 q14, q13, q132285vst1.64 {q13}, [r0,:128]!2286vswp d13,d122287vshr.s64 q7, q14, #632288veor q14, q14, q62289vand q7, q7, q52290vld1.8 {q4}, [r7]!2291subs r9, #0x102292bmi .Lxts_dec_52293veor q3, q3, q112294vadd.u64 q15, q14, q142295vst1.64 {q14}, [r0,:128]!2296vswp d15,d142297vshr.s64 q6, q15, #632298veor q15, q15, q72299vand q6, q6, q52300vld1.8 {q5}, [r7]!2301subs r9, #0x102302bmi .Lxts_dec_62303veor q4, q4, q122304sub r9, #0x102305vst1.64 {q15}, [r0,:128] @ next round tweak23062307vld1.8 {q6}, [r7]!2308veor q5, q5, q132309#ifndef BSAES_ASM_EXTENDED_KEY2310add r4, sp, #0x90 @ pass key schedule2311#else2312add r4, r10, #248 @ pass key schedule2313#endif2314veor q6, q6, q142315mov r5, r1 @ pass rounds2316mov r0, sp23172318bl _bsaes_decrypt823192320vld1.64 {q8,q9}, [r0,:128]!2321vld1.64 {q10,q11}, [r0,:128]!2322veor q0, q0, q82323vld1.64 {q12,q13}, [r0,:128]!2324veor q1, q1, q92325veor q8, q6, q102326vst1.8 {q0,q1}, [r8]!2327veor q9, q4, q112328vld1.64 {q14}, [r0,:128]!2329veor q10, q2, q122330vst1.8 {q8,q9}, [r8]!2331veor q11, q7, q132332veor q12, q3, q142333vst1.8 {q10,q11}, [r8]!2334vst1.8 {q12}, [r8]!23352336vld1.64 {q8}, [r0,:128] @ next round tweak2337b .Lxts_dec_done2338.align 42339.Lxts_dec_6:2340vst1.64 {q14}, [r0,:128] @ next round tweak23412342veor q4, q4, q122343#ifndef BSAES_ASM_EXTENDED_KEY2344add r4, sp, #0x90 @ pass key schedule2345#else2346add r4, r10, #248 @ pass key schedule2347#endif2348veor q5, q5, q132349mov r5, r1 @ pass rounds2350mov r0, sp23512352bl _bsaes_decrypt823532354vld1.64 {q8,q9}, [r0,:128]!2355vld1.64 {q10,q11}, [r0,:128]!2356veor q0, q0, q82357vld1.64 {q12,q13}, [r0,:128]!2358veor q1, q1, q92359veor q8, q6, q102360vst1.8 {q0,q1}, [r8]!2361veor q9, q4, q112362veor q10, q2, q122363vst1.8 {q8,q9}, [r8]!2364veor q11, q7, q132365vst1.8 {q10,q11}, [r8]!23662367vld1.64 {q8}, [r0,:128] @ next round tweak2368b .Lxts_dec_done2369.align 42370.Lxts_dec_5:2371veor q3, q3, q112372#ifndef BSAES_ASM_EXTENDED_KEY2373add r4, sp, #0x90 @ pass key schedule2374#else2375add r4, r10, #248 @ pass key schedule2376#endif2377veor q4, q4, q122378mov r5, r1 @ pass rounds2379mov r0, sp23802381bl _bsaes_decrypt823822383vld1.64 {q8,q9}, [r0,:128]!2384vld1.64 {q10,q11}, [r0,:128]!2385veor q0, q0, q82386vld1.64 {q12}, [r0,:128]!2387veor q1, q1, q92388veor q8, q6, q102389vst1.8 {q0,q1}, [r8]!2390veor q9, q4, q112391veor q10, q2, q122392vst1.8 {q8,q9}, [r8]!2393vst1.8 {q10}, [r8]!23942395vld1.64 {q8}, [r0,:128] @ next round tweak2396b .Lxts_dec_done2397.align 42398.Lxts_dec_4:2399veor q2, q2, q102400#ifndef BSAES_ASM_EXTENDED_KEY2401add r4, sp, #0x90 @ pass key schedule2402#else2403add r4, r10, #248 @ pass key schedule2404#endif2405veor q3, q3, q112406mov r5, r1 @ pass rounds2407mov r0, sp24082409bl _bsaes_decrypt824102411vld1.64 {q8,q9}, [r0,:128]!2412vld1.64 {q10,q11}, [r0,:128]!2413veor q0, q0, q82414veor q1, q1, q92415veor q8, q6, q102416vst1.8 {q0,q1}, [r8]!2417veor q9, q4, q112418vst1.8 {q8,q9}, [r8]!24192420vld1.64 {q8}, [r0,:128] @ next round tweak2421b .Lxts_dec_done2422.align 42423.Lxts_dec_3:2424veor q1, q1, q92425#ifndef BSAES_ASM_EXTENDED_KEY2426add r4, sp, #0x90 @ pass key schedule2427#else2428add r4, r10, #248 @ pass key schedule2429#endif2430veor q2, q2, q102431mov r5, r1 @ pass rounds2432mov r0, sp24332434bl _bsaes_decrypt824352436vld1.64 {q8,q9}, [r0,:128]!2437vld1.64 {q10}, [r0,:128]!2438veor q0, q0, q82439veor q1, q1, q92440veor q8, q6, q102441vst1.8 {q0,q1}, [r8]!2442vst1.8 {q8}, [r8]!24432444vld1.64 {q8}, [r0,:128] @ next round tweak2445b .Lxts_dec_done2446.align 42447.Lxts_dec_2:2448veor q0, q0, q82449#ifndef BSAES_ASM_EXTENDED_KEY2450add r4, sp, #0x90 @ pass key schedule2451#else2452add r4, r10, #248 @ pass key schedule2453#endif2454veor q1, q1, q92455mov r5, r1 @ pass rounds2456mov r0, sp24572458bl _bsaes_decrypt824592460vld1.64 {q8,q9}, [r0,:128]!2461veor q0, q0, q82462veor q1, q1, q92463vst1.8 {q0,q1}, [r8]!24642465vld1.64 {q8}, [r0,:128] @ next round tweak2466b .Lxts_dec_done2467.align 42468.Lxts_dec_1:2469mov r0, sp2470veor q0, q0, q82471mov r1, sp2472vst1.8 {q0}, [sp,:128]2473mov r5, r2 @ preserve magic2474mov r2, r102475mov r4, r3 @ preserve fp24762477bl AES_decrypt24782479vld1.8 {q0}, [sp,:128]2480veor q0, q0, q82481vst1.8 {q0}, [r8]!2482mov r3, r42483mov r2, r524842485vmov q8, q9 @ next round tweak24862487.Lxts_dec_done:2488#ifndef XTS_CHAIN_TWEAK2489adds r9, #0x102490beq .Lxts_dec_ret24912492@ calculate one round of extra tweak for the stolen ciphertext2493vldmia r2, {q5}2494vshr.s64 q6, q8, #632495vand q6, q6, q52496vadd.u64 q9, q8, q82497vswp d13,d122498veor q9, q9, q624992500@ perform the final decryption with the last tweak value2501vld1.8 {q0}, [r7]!2502mov r0, sp2503veor q0, q0, q92504mov r1, sp2505vst1.8 {q0}, [sp,:128]2506mov r2, r102507mov r4, r3 @ preserve fp25082509bl AES_decrypt25102511vld1.8 {q0}, [sp,:128]2512veor q0, q0, q92513vst1.8 {q0}, [r8]25142515mov r6, r82516.Lxts_dec_steal:2517ldrb r1, [r8]2518ldrb r0, [r7], #12519strb r1, [r8, #0x10]2520strb r0, [r8], #125212522subs r9, #12523bhi .Lxts_dec_steal25242525vld1.8 {q0}, [r6]2526mov r0, sp2527veor q0, q82528mov r1, sp2529vst1.8 {q0}, [sp,:128]2530mov r2, r1025312532bl AES_decrypt25332534vld1.8 {q0}, [sp,:128]2535veor q0, q0, q82536vst1.8 {q0}, [r6]2537mov r3, r42538#endif25392540.Lxts_dec_ret:2541bic r0, r3, #0xf2542vmov.i32 q0, #02543vmov.i32 q1, #02544#ifdef XTS_CHAIN_TWEAK2545ldr r1, [r3, #0x20+VFP_ABI_FRAME] @ chain tweak2546#endif2547.Lxts_dec_bzero:@ wipe key schedule [if any]2548vstmia sp!, {q0,q1}2549cmp sp, r02550bne .Lxts_dec_bzero25512552mov sp, r32553#ifdef XTS_CHAIN_TWEAK2554vst1.8 {q8}, [r1]2555#endif2556VFP_ABI_POP2557ldmia sp!, {r4,r5,r6,r7,r8,r9,r10, pc} @ return25582559.size ossl_bsaes_xts_decrypt,.-ossl_bsaes_xts_decrypt2560#endif256125622563