The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/crypto/openssl/arm/bsaes-armv7.S

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

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

Cache object: 74bff798713766cb2900ba220c814b62


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.