2019-06-04 10:11:33 +02:00
/* SPDX-License-Identifier: GPL-2.0-only */
2017-01-11 16:41:54 +00:00
/ *
* Bit s l i c e d A E S u s i n g N E O N i n s t r u c t i o n s
*
* Copyright ( C ) 2 0 1 7 L i n a r o L t d .
* Author : Ard B i e s h e u v e l < a r d . b i e s h e u v e l @linaro.org>
* /
/ *
* The a l g o r i t h m i m p l e m e n t e d h e r e i s d e s c r i b e d i n d e t a i l b y t h e p a p e r
* ' Faster a n d T i m i n g - A t t a c k R e s i s t a n t A E S - G C M ' b y E m i l i a K a e s p e r a n d
* Peter S c h w a b e ( h t t p s : / / e p r i n t . i a c r . o r g / 2 0 0 9 / 1 2 9 . p d f )
*
* This i m p l e m e n t a t i o n i s b a s e d p r i m a r i l y o n t h e O p e n S S L i m p l e m e n t a t i o n
* for 3 2 - b i t A R M w r i t t e n b y A n d y P o l y a k o v < a p p r o @openssl.org>
* /
# include < l i n u x / l i n k a g e . h >
# include < a s m / a s s e m b l e r . h >
.text
.fpu neon
rounds . r e q i p
bskey . r e q r4
q0 l . r e q d0
q0 h . r e q d1
q1 l . r e q d2
q1 h . r e q d3
q2 l . r e q d4
q2 h . r e q d5
q3 l . r e q d6
q3 h . r e q d7
q4 l . r e q d8
q4 h . r e q d9
q5 l . r e q d10
q5 h . r e q d11
q6 l . r e q d12
q6 h . r e q d13
q7 l . r e q d14
q7 h . r e q d15
q8 l . r e q d16
q8 h . r e q d17
q9 l . r e q d18
q9 h . r e q d19
q1 0 l . r e q d20
q1 0 h . r e q d21
q1 1 l . r e q d22
q1 1 h . r e q d23
q1 2 l . r e q d24
q1 2 h . r e q d25
q1 3 l . r e q d26
q1 3 h . r e q d27
q1 4 l . r e q d28
q1 4 h . r e q d29
q1 5 l . r e q d30
q1 5 h . r e q d31
.macro _ _ tbl, o u t , t b l , i n , t m p
.ifc \ out, \ t b l
.ifb \ tmp
.error __tbl needs t e m p r e g i s t e r i f o u t = = t b l
.endif
vmov \ t m p , \ o u t
.endif
vtbl. 8 \ o u t \ ( ) l , { \ t b l } , \ i n \ ( ) l
.ifc \ out, \ t b l
vtbl. 8 \ o u t \ ( ) h , { \ t m p } , \ i n \ ( ) h
.else
vtbl. 8 \ o u t \ ( ) h , { \ t b l } , \ i n \ ( ) h
.endif
.endm
.macro _ _ ldr, o u t , s y m
vldr \ o u t \ ( ) l , \ s y m
vldr \ o u t \ ( ) h , \ s y m + 8
.endm
.macro in_ b s _ c h , b0 , b1 , b2 , b3 , b4 , b5 , b6 , b7
veor \ b2 , \ b2 , \ b1
veor \ b5 , \ b5 , \ b6
veor \ b3 , \ b3 , \ b0
veor \ b6 , \ b6 , \ b2
veor \ b5 , \ b5 , \ b0
veor \ b6 , \ b6 , \ b3
veor \ b3 , \ b3 , \ b7
veor \ b7 , \ b7 , \ b5
veor \ b3 , \ b3 , \ b4
veor \ b4 , \ b4 , \ b5
veor \ b2 , \ b2 , \ b7
veor \ b3 , \ b3 , \ b1
veor \ b1 , \ b1 , \ b5
.endm
.macro out_ b s _ c h , b0 , b1 , b2 , b3 , b4 , b5 , b6 , b7
veor \ b0 , \ b0 , \ b6
veor \ b1 , \ b1 , \ b4
veor \ b4 , \ b4 , \ b6
veor \ b2 , \ b2 , \ b0
veor \ b6 , \ b6 , \ b1
veor \ b1 , \ b1 , \ b5
veor \ b5 , \ b5 , \ b3
veor \ b3 , \ b3 , \ b7
veor \ b7 , \ b7 , \ b5
veor \ b2 , \ b2 , \ b5
veor \ b4 , \ b4 , \ b7
.endm
.macro inv_ i n _ b s _ c h , b6 , b1 , b2 , b4 , b7 , b0 , b3 , b5
veor \ b1 , \ b1 , \ b7
veor \ b4 , \ b4 , \ b7
veor \ b7 , \ b7 , \ b5
veor \ b1 , \ b1 , \ b3
veor \ b2 , \ b2 , \ b5
veor \ b3 , \ b3 , \ b7
veor \ b6 , \ b6 , \ b1
veor \ b2 , \ b2 , \ b0
veor \ b5 , \ b5 , \ b3
veor \ b4 , \ b4 , \ b6
veor \ b0 , \ b0 , \ b6
veor \ b1 , \ b1 , \ b4
.endm
.macro inv_ o u t _ b s _ c h , b6 , b5 , b0 , b3 , b7 , b1 , b4 , b2
veor \ b1 , \ b1 , \ b5
veor \ b2 , \ b2 , \ b7
veor \ b3 , \ b3 , \ b1
veor \ b4 , \ b4 , \ b5
veor \ b7 , \ b7 , \ b5
veor \ b3 , \ b3 , \ b4
veor \ b5 , \ b5 , \ b0
veor \ b3 , \ b3 , \ b7
veor \ b6 , \ b6 , \ b2
veor \ b2 , \ b2 , \ b1
veor \ b6 , \ b6 , \ b3
veor \ b3 , \ b3 , \ b0
veor \ b5 , \ b5 , \ b6
.endm
.macro mul_ g f4 , x0 , x1 , y 0 , y 1 , t 0 , t 1
veor \ t 0 , \ y 0 , \ y 1
vand \ t 0 , \ t 0 , \ x0
veor \ x0 , \ x0 , \ x1
vand \ t 1 , \ x1 , \ y 0
vand \ x0 , \ x0 , \ y 1
veor \ x1 , \ t 1 , \ t 0
veor \ x0 , \ x0 , \ t 1
.endm
.macro mul_ g f4 _ n _ g f4 , x0 , x1 , y 0 , y 1 , t 0 , x2 , x3 , y 2 , y 3 , t 1
veor \ t 0 , \ y 0 , \ y 1
veor \ t 1 , \ y 2 , \ y 3
vand \ t 0 , \ t 0 , \ x0
vand \ t 1 , \ t 1 , \ x2
veor \ x0 , \ x0 , \ x1
veor \ x2 , \ x2 , \ x3
vand \ x1 , \ x1 , \ y 0
vand \ x3 , \ x3 , \ y 2
vand \ x0 , \ x0 , \ y 1
vand \ x2 , \ x2 , \ y 3
veor \ x1 , \ x1 , \ x0
veor \ x2 , \ x2 , \ x3
veor \ x0 , \ x0 , \ t 0
veor \ x3 , \ x3 , \ t 1
.endm
.macro mul_ g f16 _ 2 , x0 , x1 , x2 , x3 , x4 , x5 , x6 , x7 , \
y0 , y 1 , y 2 , y 3 , t 0 , t 1 , t 2 , t 3
veor \ t 0 , \ x0 , \ x2
veor \ t 1 , \ x1 , \ x3
mul_ g f4 \ x0 , \ x1 , \ y 0 , \ y 1 , \ t 2 , \ t 3
veor \ y 0 , \ y 0 , \ y 2
veor \ y 1 , \ y 1 , \ y 3
mul_ g f4 _ n _ g f4 \ t 0 , \ t 1 , \ y 0 , \ y 1 , \ t 3 , \ x2 , \ x3 , \ y 2 , \ y 3 , \ t 2
veor \ x0 , \ x0 , \ t 0
veor \ x2 , \ x2 , \ t 0
veor \ x1 , \ x1 , \ t 1
veor \ x3 , \ x3 , \ t 1
veor \ t 0 , \ x4 , \ x6
veor \ t 1 , \ x5 , \ x7
mul_ g f4 _ n _ g f4 \ t 0 , \ t 1 , \ y 0 , \ y 1 , \ t 3 , \ x6 , \ x7 , \ y 2 , \ y 3 , \ t 2
veor \ y 0 , \ y 0 , \ y 2
veor \ y 1 , \ y 1 , \ y 3
mul_ g f4 \ x4 , \ x5 , \ y 0 , \ y 1 , \ t 2 , \ t 3
veor \ x4 , \ x4 , \ t 0
veor \ x6 , \ x6 , \ t 0
veor \ x5 , \ x5 , \ t 1
veor \ x7 , \ x7 , \ t 1
.endm
.macro inv_ g f25 6 , x0 , x1 , x2 , x3 , x4 , x5 , x6 , x7 , \
t0 , t 1 , t 2 , t 3 , s0 , s1 , s2 , s3
veor \ t 3 , \ x4 , \ x6
veor \ t 0 , \ x5 , \ x7
veor \ t 1 , \ x1 , \ x3
veor \ s1 , \ x7 , \ x6
veor \ s0 , \ x0 , \ x2
veor \ s3 , \ t 3 , \ t 0
vorr \ t 2 , \ t 0 , \ t 1
vand \ s2 , \ t 3 , \ s0
vorr \ t 3 , \ t 3 , \ s0
veor \ s0 , \ s0 , \ t 1
vand \ t 0 , \ t 0 , \ t 1
veor \ t 1 , \ x3 , \ x2
vand \ s3 , \ s3 , \ s0
vand \ s1 , \ s1 , \ t 1
veor \ t 1 , \ x4 , \ x5
veor \ s0 , \ x1 , \ x0
veor \ t 3 , \ t 3 , \ s1
veor \ t 2 , \ t 2 , \ s1
vand \ s1 , \ t 1 , \ s0
vorr \ t 1 , \ t 1 , \ s0
veor \ t 3 , \ t 3 , \ s3
veor \ t 0 , \ t 0 , \ s1
veor \ t 2 , \ t 2 , \ s2
veor \ t 1 , \ t 1 , \ s3
veor \ t 0 , \ t 0 , \ s2
vand \ s0 , \ x7 , \ x3
veor \ t 1 , \ t 1 , \ s2
vand \ s1 , \ x6 , \ x2
vand \ s2 , \ x5 , \ x1
vorr \ s3 , \ x4 , \ x0
veor \ t 3 , \ t 3 , \ s0
veor \ t 1 , \ t 1 , \ s2
veor \ s0 , \ t 0 , \ s3
veor \ t 2 , \ t 2 , \ s1
vand \ s2 , \ t 3 , \ t 1
veor \ s1 , \ t 2 , \ s2
veor \ s3 , \ s0 , \ s2
vbsl \ s1 , \ t 1 , \ s0
vmvn \ t 0 , \ s0
vbsl \ s0 , \ s1 , \ s3
vbsl \ t 0 , \ s1 , \ s3
vbsl \ s3 , \ t 3 , \ t 2
veor \ t 3 , \ t 3 , \ t 2
vand \ s2 , \ s0 , \ s3
veor \ t 1 , \ t 1 , \ t 0
veor \ s2 , \ s2 , \ t 3
mul_ g f16 _ 2 \ x0 , \ x1 , \ x2 , \ x3 , \ x4 , \ x5 , \ x6 , \ x7 , \
\ s3 , \ s2 , \ s1 , \ t 1 , \ s0 , \ t 0 , \ t 2 , \ t 3
.endm
.macro sbox, b0 , b1 , b2 , b3 , b4 , b5 , b6 , b7 , \
t0 , t 1 , t 2 , t 3 , s0 , s1 , s2 , s3
in_ b s _ c h \ b0 , \ b1 , \ b2 , \ b3 , \ b4 , \ b5 , \ b6 , \ b7
inv_ g f25 6 \ b6 , \ b5 , \ b0 , \ b3 , \ b7 , \ b1 , \ b4 , \ b2 , \
\ t0 , \ t 1 , \ t 2 , \ t 3 , \ s0 , \ s1 , \ s2 , \ s3
out_ b s _ c h \ b7 , \ b1 , \ b4 , \ b2 , \ b6 , \ b5 , \ b0 , \ b3
.endm
.macro inv_ s b o x , b0 , b1 , b2 , b3 , b4 , b5 , b6 , b7 , \
t0 , t 1 , t 2 , t 3 , s0 , s1 , s2 , s3
inv_ i n _ b s _ c h \ b0 , \ b1 , \ b2 , \ b3 , \ b4 , \ b5 , \ b6 , \ b7
inv_ g f25 6 \ b5 , \ b1 , \ b2 , \ b6 , \ b3 , \ b7 , \ b0 , \ b4 , \
\ t0 , \ t 1 , \ t 2 , \ t 3 , \ s0 , \ s1 , \ s2 , \ s3
inv_ o u t _ b s _ c h \ b3 , \ b7 , \ b0 , \ b4 , \ b5 , \ b1 , \ b2 , \ b6
.endm
.macro shift_ r o w s , x0 , x1 , x2 , x3 , x4 , x5 , x6 , x7 , \
t0 , t 1 , t 2 , t 3 , m a s k
vld1 . 8 { \ t 0 - \ t 1 } , [ b s k e y , : 2 5 6 ] !
veor \ t 0 , \ t 0 , \ x0
vld1 . 8 { \ t 2 - \ t 3 } , [ b s k e y , : 2 5 6 ] !
veor \ t 1 , \ t 1 , \ x1
_ _ tbl \ x0 , \ t 0 , \ m a s k
veor \ t 2 , \ t 2 , \ x2
_ _ tbl \ x1 , \ t 1 , \ m a s k
vld1 . 8 { \ t 0 - \ t 1 } , [ b s k e y , : 2 5 6 ] !
veor \ t 3 , \ t 3 , \ x3
_ _ tbl \ x2 , \ t 2 , \ m a s k
_ _ tbl \ x3 , \ t 3 , \ m a s k
vld1 . 8 { \ t 2 - \ t 3 } , [ b s k e y , : 2 5 6 ] !
veor \ t 0 , \ t 0 , \ x4
veor \ t 1 , \ t 1 , \ x5
_ _ tbl \ x4 , \ t 0 , \ m a s k
veor \ t 2 , \ t 2 , \ x6
_ _ tbl \ x5 , \ t 1 , \ m a s k
veor \ t 3 , \ t 3 , \ x7
_ _ tbl \ x6 , \ t 2 , \ m a s k
_ _ tbl \ x7 , \ t 3 , \ m a s k
.endm
.macro inv_ s h i f t _ r o w s , x0 , x1 , x2 , x3 , x4 , x5 , x6 , x7 , \
t0 , t 1 , t 2 , t 3 , m a s k
_ _ tbl \ x0 , \ x0 , \ m a s k , \ t 0
_ _ tbl \ x1 , \ x1 , \ m a s k , \ t 1
_ _ tbl \ x2 , \ x2 , \ m a s k , \ t 2
_ _ tbl \ x3 , \ x3 , \ m a s k , \ t 3
_ _ tbl \ x4 , \ x4 , \ m a s k , \ t 0
_ _ tbl \ x5 , \ x5 , \ m a s k , \ t 1
_ _ tbl \ x6 , \ x6 , \ m a s k , \ t 2
_ _ tbl \ x7 , \ x7 , \ m a s k , \ t 3
.endm
.macro mix_ c o l s , x0 , x1 , x2 , x3 , x4 , x5 , x6 , x7 , \
t0 , t 1 , t 2 , t 3 , t 4 , t 5 , t 6 , t 7 , i n v
vext. 8 \ t 0 , \ x0 , \ x0 , #12
vext. 8 \ t 1 , \ x1 , \ x1 , #12
veor \ x0 , \ x0 , \ t 0
vext. 8 \ t 2 , \ x2 , \ x2 , #12
veor \ x1 , \ x1 , \ t 1
vext. 8 \ t 3 , \ x3 , \ x3 , #12
veor \ x2 , \ x2 , \ t 2
vext. 8 \ t 4 , \ x4 , \ x4 , #12
veor \ x3 , \ x3 , \ t 3
vext. 8 \ t 5 , \ x5 , \ x5 , #12
veor \ x4 , \ x4 , \ t 4
vext. 8 \ t 6 , \ x6 , \ x6 , #12
veor \ x5 , \ x5 , \ t 5
vext. 8 \ t 7 , \ x7 , \ x7 , #12
veor \ x6 , \ x6 , \ t 6
veor \ t 1 , \ t 1 , \ x0
veor. 8 \ x7 , \ x7 , \ t 7
vext. 8 \ x0 , \ x0 , \ x0 , #8
veor \ t 2 , \ t 2 , \ x1
veor \ t 0 , \ t 0 , \ x7
veor \ t 1 , \ t 1 , \ x7
vext. 8 \ x1 , \ x1 , \ x1 , #8
veor \ t 5 , \ t 5 , \ x4
veor \ x0 , \ x0 , \ t 0
veor \ t 6 , \ t 6 , \ x5
veor \ x1 , \ x1 , \ t 1
vext. 8 \ t 0 , \ x4 , \ x4 , #8
veor \ t 4 , \ t 4 , \ x3
vext. 8 \ t 1 , \ x5 , \ x5 , #8
veor \ t 7 , \ t 7 , \ x6
vext. 8 \ x4 , \ x3 , \ x3 , #8
veor \ t 3 , \ t 3 , \ x2
vext. 8 \ x5 , \ x7 , \ x7 , #8
veor \ t 4 , \ t 4 , \ x7
vext. 8 \ x3 , \ x6 , \ x6 , #8
veor \ t 3 , \ t 3 , \ x7
vext. 8 \ x6 , \ x2 , \ x2 , #8
veor \ x7 , \ t 1 , \ t 5
.ifb \ inv
veor \ x2 , \ t 0 , \ t 4
veor \ x4 , \ x4 , \ t 3
veor \ x5 , \ x5 , \ t 7
veor \ x3 , \ x3 , \ t 6
veor \ x6 , \ x6 , \ t 2
.else
veor \ t 3 , \ t 3 , \ x4
veor \ x5 , \ x5 , \ t 7
veor \ x2 , \ x3 , \ t 6
veor \ x3 , \ t 0 , \ t 4
veor \ x4 , \ x6 , \ t 2
vmov \ x6 , \ t 3
.endif
.endm
.macro inv_ m i x _ c o l s , x0 , x1 , x2 , x3 , x4 , x5 , x6 , x7 , \
t0 , t 1 , t 2 , t 3 , t 4 , t 5 , t 6 , t 7
vld1 . 8 { \ t 0 - \ t 1 } , [ b s k e y , : 2 5 6 ] !
veor \ x0 , \ x0 , \ t 0
vld1 . 8 { \ t 2 - \ t 3 } , [ b s k e y , : 2 5 6 ] !
veor \ x1 , \ x1 , \ t 1
vld1 . 8 { \ t 4 - \ t 5 } , [ b s k e y , : 2 5 6 ] !
veor \ x2 , \ x2 , \ t 2
vld1 . 8 { \ t 6 - \ t 7 } , [ b s k e y , : 2 5 6 ]
sub b s k e y , b s k e y , #224
veor \ x3 , \ x3 , \ t 3
veor \ x4 , \ x4 , \ t 4
veor \ x5 , \ x5 , \ t 5
veor \ x6 , \ x6 , \ t 6
veor \ x7 , \ x7 , \ t 7
vext. 8 \ t 0 , \ x0 , \ x0 , #8
vext. 8 \ t 6 , \ x6 , \ x6 , #8
vext. 8 \ t 7 , \ x7 , \ x7 , #8
veor \ t 0 , \ t 0 , \ x0
vext. 8 \ t 1 , \ x1 , \ x1 , #8
veor \ t 6 , \ t 6 , \ x6
vext. 8 \ t 2 , \ x2 , \ x2 , #8
veor \ t 7 , \ t 7 , \ x7
vext. 8 \ t 3 , \ x3 , \ x3 , #8
veor \ t 1 , \ t 1 , \ x1
vext. 8 \ t 4 , \ x4 , \ x4 , #8
veor \ t 2 , \ t 2 , \ x2
vext. 8 \ t 5 , \ x5 , \ x5 , #8
veor \ t 3 , \ t 3 , \ x3
veor \ t 4 , \ t 4 , \ x4
veor \ t 5 , \ t 5 , \ x5
veor \ x0 , \ x0 , \ t 6
veor \ x1 , \ x1 , \ t 6
veor \ x2 , \ x2 , \ t 0
veor \ x4 , \ x4 , \ t 2
veor \ x3 , \ x3 , \ t 1
veor \ x1 , \ x1 , \ t 7
veor \ x2 , \ x2 , \ t 7
veor \ x4 , \ x4 , \ t 6
veor \ x5 , \ x5 , \ t 3
veor \ x3 , \ x3 , \ t 6
veor \ x6 , \ x6 , \ t 4
veor \ x4 , \ x4 , \ t 7
veor \ x5 , \ x5 , \ t 7
veor \ x7 , \ x7 , \ t 5
mix_ c o l s \ x0 , \ x1 , \ x2 , \ x3 , \ x4 , \ x5 , \ x6 , \ x7 , \
\ t0 , \ t 1 , \ t 2 , \ t 3 , \ t 4 , \ t 5 , \ t 6 , \ t 7 , 1
.endm
.macro swapmove_ 2 x , a0 , b0 , a1 , b1 , n , m a s k , t 0 , t 1
vshr. u 6 4 \ t 0 , \ b0 , #\ n
vshr. u 6 4 \ t 1 , \ b1 , #\ n
veor \ t 0 , \ t 0 , \ a0
veor \ t 1 , \ t 1 , \ a1
vand \ t 0 , \ t 0 , \ m a s k
vand \ t 1 , \ t 1 , \ m a s k
veor \ a0 , \ a0 , \ t 0
vshl. s64 \ t 0 , \ t 0 , #\ n
veor \ a1 , \ a1 , \ t 1
vshl. s64 \ t 1 , \ t 1 , #\ n
veor \ b0 , \ b0 , \ t 0
veor \ b1 , \ b1 , \ t 1
.endm
.macro bitslice, x7 , x6 , x5 , x4 , x3 , x2 , x1 , x0 , t 0 , t 1 , t 2 , t 3
vmov. i 8 \ t 0 , #0x55
vmov. i 8 \ t 1 , #0x33
swapmove_ 2 x \ x0 , \ x1 , \ x2 , \ x3 , 1 , \ t 0 , \ t 2 , \ t 3
swapmove_ 2 x \ x4 , \ x5 , \ x6 , \ x7 , 1 , \ t 0 , \ t 2 , \ t 3
vmov. i 8 \ t 0 , #0x0f
swapmove_ 2 x \ x0 , \ x2 , \ x1 , \ x3 , 2 , \ t 1 , \ t 2 , \ t 3
swapmove_ 2 x \ x4 , \ x6 , \ x5 , \ x7 , 2 , \ t 1 , \ t 2 , \ t 3
swapmove_ 2 x \ x0 , \ x4 , \ x1 , \ x5 , 4 , \ t 0 , \ t 2 , \ t 3
swapmove_ 2 x \ x2 , \ x6 , \ x3 , \ x7 , 4 , \ t 0 , \ t 2 , \ t 3
.endm
.align 4
M0 : .quad 0x02060a0e 0 3 0 7 0 b0 f , 0 x00 0 4 0 8 0 c01 0 5 0 9 0 d
/ *
* void a e s b s _ c o n v e r t _ k e y ( u 8 o u t [ ] , u 3 2 c o n s t r k [ ] , i n t r o u n d s )
* /
ENTRY( a e s b s _ c o n v e r t _ k e y )
vld1 . 3 2 { q7 } , [ r1 ] ! / / l o a d r o u n d 0 k e y
vld1 . 3 2 { q15 } , [ r1 ] ! / / l o a d r o u n d 1 k e y
vmov. i 8 q8 , #0x01 / / b i t m a s k s
vmov. i 8 q9 , #0x02
vmov. i 8 q10 , #0x04
vmov. i 8 q11 , #0x08
vmov. i 8 q12 , #0x10
vmov. i 8 q13 , #0x20
_ _ ldr q14 , M 0
sub r2 , r2 , #1
vst1 . 8 { q7 } , [ r0 , : 1 2 8 ] ! / / s a v e r o u n d 0 k e y
.Lkey_loop :
_ _ tbl q7 , q15 , q14
vmov. i 8 q6 , #0x40
vmov. i 8 q15 , #0x80
vtst. 8 q0 , q7 , q8
vtst. 8 q1 , q7 , q9
vtst. 8 q2 , q7 , q10
vtst. 8 q3 , q7 , q11
vtst. 8 q4 , q7 , q12
vtst. 8 q5 , q7 , q13
vtst. 8 q6 , q7 , q6
vtst. 8 q7 , q7 , q15
vld1 . 3 2 { q15 } , [ r1 ] ! / / l o a d n e x t r o u n d k e y
vmvn q0 , q0
vmvn q1 , q1
vmvn q5 , q5
vmvn q6 , q6
subs r2 , r2 , #1
vst1 . 8 { q0 - q1 } , [ r0 , : 2 5 6 ] !
vst1 . 8 { q2 - q3 } , [ r0 , : 2 5 6 ] !
vst1 . 8 { q4 - q5 } , [ r0 , : 2 5 6 ] !
vst1 . 8 { q6 - q7 } , [ r0 , : 2 5 6 ] !
bne . L k e y _ l o o p
vmov. i 8 q7 , #0x63 / / c o m p o s e . L 6 3
veor q15 , q15 , q7
vst1 . 8 { q15 } , [ r0 , : 1 2 8 ]
bx l r
ENDPROC( a e s b s _ c o n v e r t _ k e y )
.align 4
M0SR : .quad 0x0a0e0206 0 f0 3 0 7 0 b , 0 x00 0 4 0 8 0 c05 0 9 0 d01
aesbs_encrypt8 :
vld1 . 8 { q9 } , [ b s k e y , : 1 2 8 ] ! / / r o u n d 0 k e y
_ _ ldr q8 , M 0 S R
veor q10 , q0 , q9 / / x o r w i t h r o u n d0 k e y
veor q11 , q1 , q9
_ _ tbl q0 , q10 , q8
veor q12 , q2 , q9
_ _ tbl q1 , q11 , q8
veor q13 , q3 , q9
_ _ tbl q2 , q12 , q8
veor q14 , q4 , q9
_ _ tbl q3 , q13 , q8
veor q15 , q5 , q9
_ _ tbl q4 , q14 , q8
veor q10 , q6 , q9
_ _ tbl q5 , q15 , q8
veor q11 , q7 , q9
_ _ tbl q6 , q10 , q8
_ _ tbl q7 , q11 , q8
bitslice q0 , q1 , q2 , q3 , q4 , q5 , q6 , q7 , q8 , q9 , q10 , q11
sub r o u n d s , r o u n d s , #1
b . L e n c _ s b o x
.align 5
SR : .quad 0x05040706 0 0 0 3 0 2 0 1 , 0 x0 f0 e 0 d0 c0 a09 0 8 0 b
SRM0 : .quad 0x0304090e 0 0 0 5 0 a0 f , 0 x01 0 6 0 b0 c02 0 7 0 8 0 d
.Lenc_last :
_ _ ldr q12 , S R M 0
.Lenc_loop :
shift_ r o w s q0 , q1 , q2 , q3 , q4 , q5 , q6 , q7 , q8 , q9 , q10 , q11 , q12
.Lenc_sbox :
sbox q0 , q1 , q2 , q3 , q4 , q5 , q6 , q7 , q8 , q9 , q10 , q11 , q12 , \
q1 3 , q14 , q15
subs r o u n d s , r o u n d s , #1
bcc . L e n c _ d o n e
mix_ c o l s q0 , q1 , q4 , q6 , q3 , q7 , q2 , q5 , q8 , q9 , q10 , q11 , q12 , \
q1 3 , q14 , q15
beq . L e n c _ l a s t
_ _ ldr q12 , S R
b . L e n c _ l o o p
.Lenc_done :
vld1 . 8 { q12 } , [ b s k e y , : 1 2 8 ] / / l a s t r o u n d k e y
bitslice q0 , q1 , q4 , q6 , q3 , q7 , q2 , q5 , q8 , q9 , q10 , q11
veor q0 , q0 , q12
veor q1 , q1 , q12
veor q4 , q4 , q12
veor q6 , q6 , q12
veor q3 , q3 , q12
veor q7 , q7 , q12
veor q2 , q2 , q12
veor q5 , q5 , q12
bx l r
ENDPROC( a e s b s _ e n c r y p t 8 )
.align 4
M0ISR : .quad 0x0a0e0206 0 7 0 b0 f03 , 0 x00 0 4 0 8 0 c0 d01 0 5 0 9
aesbs_decrypt8 :
add b s k e y , b s k e y , r o u n d s , l s l #7
sub b s k e y , b s k e y , #112
vld1 . 8 { q9 } , [ b s k e y , : 1 2 8 ] / / r o u n d 0 k e y
sub b s k e y , b s k e y , #128
_ _ ldr q8 , M 0 I S R
veor q10 , q0 , q9 / / x o r w i t h r o u n d0 k e y
veor q11 , q1 , q9
_ _ tbl q0 , q10 , q8
veor q12 , q2 , q9
_ _ tbl q1 , q11 , q8
veor q13 , q3 , q9
_ _ tbl q2 , q12 , q8
veor q14 , q4 , q9
_ _ tbl q3 , q13 , q8
veor q15 , q5 , q9
_ _ tbl q4 , q14 , q8
veor q10 , q6 , q9
_ _ tbl q5 , q15 , q8
veor q11 , q7 , q9
_ _ tbl q6 , q10 , q8
_ _ tbl q7 , q11 , q8
bitslice q0 , q1 , q2 , q3 , q4 , q5 , q6 , q7 , q8 , q9 , q10 , q11
sub r o u n d s , r o u n d s , #1
b . L d e c _ s b o x
.align 5
ISR : .quad 0x05040706 0 2 0 1 0 0 0 3 , 0 x0 f0 e 0 d0 c08 0 b0 a09
ISRM0 : .quad 0x01040b0e 0 2 0 5 0 8 0 f, 0 x03 0 6 0 9 0 c00 0 7 0 a0 d
.Ldec_last :
_ _ ldr q12 , I S R M 0
.Ldec_loop :
inv_ s h i f t _ r o w s q0 , q1 , q2 , q3 , q4 , q5 , q6 , q7 , q8 , q9 , q10 , q11 , q12
.Ldec_sbox :
inv_ s b o x q0 , q1 , q2 , q3 , q4 , q5 , q6 , q7 , q8 , q9 , q10 , q11 , q12 , \
q1 3 , q14 , q15
subs r o u n d s , r o u n d s , #1
bcc . L d e c _ d o n e
inv_ m i x _ c o l s q0 , q1 , q6 , q4 , q2 , q7 , q3 , q5 , q8 , q9 , q10 , q11 , q12 , \
q1 3 , q14 , q15
beq . L d e c _ l a s t
_ _ ldr q12 , I S R
b . L d e c _ l o o p
.Ldec_done :
add b s k e y , b s k e y , #112
vld1 . 8 { q12 } , [ b s k e y , : 1 2 8 ] / / l a s t r o u n d k e y
bitslice q0 , q1 , q6 , q4 , q2 , q7 , q3 , q5 , q8 , q9 , q10 , q11
veor q0 , q0 , q12
veor q1 , q1 , q12
veor q6 , q6 , q12
veor q4 , q4 , q12
veor q2 , q2 , q12
veor q7 , q7 , q12
veor q3 , q3 , q12
veor q5 , q5 , q12
bx l r
ENDPROC( a e s b s _ d e c r y p t 8 )
/ *
* aesbs_ e c b _ e n c r y p t ( u 8 o u t [ ] , u 8 c o n s t i n [ ] , u 8 c o n s t r k [ ] , i n t r o u n d s ,
* int b l o c k s )
* aesbs_ e c b _ d e c r y p t ( u 8 o u t [ ] , u 8 c o n s t i n [ ] , u 8 c o n s t r k [ ] , i n t r o u n d s ,
* int b l o c k s )
* /
.macro _ _ ecb_ c r y p t , d o 8 , o 0 , o 1 , o 2 , o 3 , o 4 , o 5 , o 6 , o 7
push { r4 - r6 , l r }
ldr r5 , [ s p , #16 ] / / n u m b e r o f b l o c k s
2020-09-16 15:36:40 +03:00
99 : adr i p , 0 f
2017-01-11 16:41:54 +00:00
and l r , r5 , #7
cmp r5 , #8
sub i p , i p , l r , l s l #2
2020-09-16 15:36:40 +03:00
movlt p c , i p / / c o m p u t e d g o t o i f b l o c k s < 8
2017-01-11 16:41:54 +00:00
vld1 . 8 { q0 } , [ r1 ] !
vld1 . 8 { q1 } , [ r1 ] !
vld1 . 8 { q2 } , [ r1 ] !
vld1 . 8 { q3 } , [ r1 ] !
vld1 . 8 { q4 } , [ r1 ] !
vld1 . 8 { q5 } , [ r1 ] !
vld1 . 8 { q6 } , [ r1 ] !
vld1 . 8 { q7 } , [ r1 ] !
0 : mov b s k e y , r2
mov r o u n d s , r3
bl \ d o 8
2020-09-16 15:36:40 +03:00
adr i p , 1 f
2017-01-11 16:41:54 +00:00
and l r , r5 , #7
cmp r5 , #8
sub i p , i p , l r , l s l #2
2020-09-16 15:36:40 +03:00
movlt p c , i p / / c o m p u t e d g o t o i f b l o c k s < 8
2017-01-11 16:41:54 +00:00
vst1 . 8 { \ o 0 } , [ r0 ] !
vst1 . 8 { \ o 1 } , [ r0 ] !
vst1 . 8 { \ o 2 } , [ r0 ] !
vst1 . 8 { \ o 3 } , [ r0 ] !
vst1 . 8 { \ o 4 } , [ r0 ] !
vst1 . 8 { \ o 5 } , [ r0 ] !
vst1 . 8 { \ o 6 } , [ r0 ] !
vst1 . 8 { \ o 7 } , [ r0 ] !
1 : subs r5 , r5 , #8
bgt 9 9 b
pop { r4 - r6 , p c }
.endm
.align 4
ENTRY( a e s b s _ e c b _ e n c r y p t )
_ _ ecb_ c r y p t a e s b s _ e n c r y p t 8 , q0 , q1 , q4 , q6 , q3 , q7 , q2 , q5
ENDPROC( a e s b s _ e c b _ e n c r y p t )
.align 4
ENTRY( a e s b s _ e c b _ d e c r y p t )
_ _ ecb_ c r y p t a e s b s _ d e c r y p t 8 , q0 , q1 , q6 , q4 , q2 , q7 , q3 , q5
ENDPROC( a e s b s _ e c b _ d e c r y p t )
/ *
* aesbs_ c b c _ d e c r y p t ( u 8 o u t [ ] , u 8 c o n s t i n [ ] , u 8 c o n s t r k [ ] ,
* int r o u n d s , i n t b l o c k s , u 8 i v [ ] )
* /
.align 4
ENTRY( a e s b s _ c b c _ d e c r y p t )
mov i p , s p
push { r4 - r6 , l r }
ldm i p , { r5 - r6 } / / l o a d a r g s 4 - 5
2020-09-16 15:36:40 +03:00
99 : adr i p , 0 f
2017-01-11 16:41:54 +00:00
and l r , r5 , #7
cmp r5 , #8
sub i p , i p , l r , l s l #2
mov l r , r1
2020-09-16 15:36:40 +03:00
movlt p c , i p / / c o m p u t e d g o t o i f b l o c k s < 8
2017-01-11 16:41:54 +00:00
vld1 . 8 { q0 } , [ l r ] !
vld1 . 8 { q1 } , [ l r ] !
vld1 . 8 { q2 } , [ l r ] !
vld1 . 8 { q3 } , [ l r ] !
vld1 . 8 { q4 } , [ l r ] !
vld1 . 8 { q5 } , [ l r ] !
vld1 . 8 { q6 } , [ l r ] !
vld1 . 8 { q7 } , [ l r ]
0 : mov b s k e y , r2
mov r o u n d s , r3
bl a e s b s _ d e c r y p t 8
vld1 . 8 { q8 } , [ r6 ]
vmov q9 , q8
vmov q10 , q8
vmov q11 , q8
vmov q12 , q8
vmov q13 , q8
vmov q14 , q8
vmov q15 , q8
2020-09-16 15:36:40 +03:00
adr i p , 1 f
2017-01-11 16:41:54 +00:00
and l r , r5 , #7
cmp r5 , #8
sub i p , i p , l r , l s l #2
2020-09-16 15:36:40 +03:00
movlt p c , i p / / c o m p u t e d g o t o i f b l o c k s < 8
2017-01-11 16:41:54 +00:00
vld1 . 8 { q9 } , [ r1 ] !
vld1 . 8 { q10 } , [ r1 ] !
vld1 . 8 { q11 } , [ r1 ] !
vld1 . 8 { q12 } , [ r1 ] !
vld1 . 8 { q13 } , [ r1 ] !
vld1 . 8 { q14 } , [ r1 ] !
vld1 . 8 { q15 } , [ r1 ] !
W( n o p )
2020-09-16 15:36:40 +03:00
1 : adr i p , 2 f
2017-01-11 16:41:54 +00:00
sub i p , i p , l r , l s l #3
2020-09-16 15:36:40 +03:00
movlt p c , i p / / c o m p u t e d g o t o i f b l o c k s < 8
2017-01-11 16:41:54 +00:00
veor q0 , q0 , q8
vst1 . 8 { q0 } , [ r0 ] !
veor q1 , q1 , q9
vst1 . 8 { q1 } , [ r0 ] !
veor q6 , q6 , q10
vst1 . 8 { q6 } , [ r0 ] !
veor q4 , q4 , q11
vst1 . 8 { q4 } , [ r0 ] !
veor q2 , q2 , q12
vst1 . 8 { q2 } , [ r0 ] !
veor q7 , q7 , q13
vst1 . 8 { q7 } , [ r0 ] !
veor q3 , q3 , q14
vst1 . 8 { q3 } , [ r0 ] !
veor q5 , q5 , q15
vld1 . 8 { q8 } , [ r1 ] ! / / l o a d n e x t r o u n d ' s i v
2 : vst1 . 8 { q5 } , [ r0 ] !
subs r5 , r5 , #8
vst1 . 8 { q8 } , [ r6 ] / / s t o r e n e x t r o u n d ' s i v
bgt 9 9 b
pop { r4 - r6 , p c }
ENDPROC( a e s b s _ c b c _ d e c r y p t )
.macro next_ c t r , q
2022-01-27 12:35:43 +01:00
vmov \ q \ ( ) h , r9 , r10
2017-01-11 16:41:54 +00:00
adds r10 , r10 , #1
adcs r9 , r9 , #0
2022-01-27 12:35:43 +01:00
vmov \ q \ ( ) l , r7 , r8
2017-01-11 16:41:54 +00:00
adcs r8 , r8 , #0
adc r7 , r7 , #0
vrev3 2 . 8 \ q , \ q
.endm
/ *
* aesbs_ c t r _ e n c r y p t ( u 8 o u t [ ] , u 8 c o n s t i n [ ] , u 8 c o n s t r k [ ] ,
2022-01-27 12:35:43 +01:00
* int r o u n d s , i n t b y t e s , u 8 c t r [ ] )
2017-01-11 16:41:54 +00:00
* /
ENTRY( a e s b s _ c t r _ e n c r y p t )
mov i p , s p
push { r4 - r10 , l r }
2022-01-27 12:35:43 +01:00
ldm i p , { r5 , r6 } / / l o a d a r g s 4 - 5
2017-01-11 16:41:54 +00:00
vld1 . 8 { q0 } , [ r6 ] / / l o a d c o u n t e r
vrev3 2 . 8 q1 , q0
vmov r9 , r10 , d3
vmov r7 , r8 , d2
adds r10 , r10 , #1
adcs r9 , r9 , #0
adcs r8 , r8 , #0
adc r7 , r7 , #0
99 : vmov q1 , q0
2022-01-27 12:35:43 +01:00
sub l r , r5 , #1
2017-01-11 16:41:54 +00:00
vmov q2 , q0
2022-01-27 12:35:43 +01:00
adr i p , 0 f
2017-01-11 16:41:54 +00:00
vmov q3 , q0
2022-01-27 12:35:43 +01:00
and l r , l r , #112
2017-01-11 16:41:54 +00:00
vmov q4 , q0
2022-01-27 12:35:43 +01:00
cmp r5 , #112
2017-01-11 16:41:54 +00:00
vmov q5 , q0
2022-01-27 12:35:43 +01:00
sub i p , i p , l r , l s l #1
2017-01-11 16:41:54 +00:00
vmov q6 , q0
2022-01-27 12:35:43 +01:00
add i p , i p , l r , l s r #2
2017-01-11 16:41:54 +00:00
vmov q7 , q0
2022-01-27 12:35:43 +01:00
movle p c , i p / / c o m p u t e d g o t o i f b y t e s < 1 1 2
2017-01-11 16:41:54 +00:00
next_ c t r q1
next_ c t r q2
next_ c t r q3
next_ c t r q4
next_ c t r q5
next_ c t r q6
next_ c t r q7
0 : mov b s k e y , r2
mov r o u n d s , r3
bl a e s b s _ e n c r y p t 8
2020-09-16 15:36:40 +03:00
adr i p , 1 f
2022-01-27 12:35:43 +01:00
sub l r , r5 , #1
cmp r5 , #128
bic l r , l r , #15
ands r4 , r5 , #15 / / p r e s e r v e s C f l a g
teqcs r5 , r5 / / s e t Z f l a g i f n o t l a s t i t e r a t i o n
sub i p , i p , l r , l s r #2
rsb r4 , r4 , #16
movcc p c , i p / / c o m p u t e d g o t o i f b y t e s < 1 2 8
2017-01-11 16:41:54 +00:00
vld1 . 8 { q8 } , [ r1 ] !
vld1 . 8 { q9 } , [ r1 ] !
vld1 . 8 { q10 } , [ r1 ] !
vld1 . 8 { q11 } , [ r1 ] !
vld1 . 8 { q12 } , [ r1 ] !
vld1 . 8 { q13 } , [ r1 ] !
vld1 . 8 { q14 } , [ r1 ] !
2022-01-27 12:35:43 +01:00
1 : subne r1 , r1 , r4
2017-01-11 16:41:54 +00:00
vld1 . 8 { q15 } , [ r1 ] !
2022-01-27 12:35:43 +01:00
add i p , i p , #2 f - 1 b
2017-01-11 16:41:54 +00:00
veor q0 , q0 , q8
veor q1 , q1 , q9
veor q4 , q4 , q10
veor q6 , q6 , q11
veor q3 , q3 , q12
veor q7 , q7 , q13
veor q2 , q2 , q14
2022-01-27 12:35:43 +01:00
bne 3 f
veor q5 , q5 , q15
movcc p c , i p / / c o m p u t e d g o t o i f b y t e s < 1 2 8
vst1 . 8 { q0 } , [ r0 ] !
vst1 . 8 { q1 } , [ r0 ] !
vst1 . 8 { q4 } , [ r0 ] !
vst1 . 8 { q6 } , [ r0 ] !
vst1 . 8 { q3 } , [ r0 ] !
vst1 . 8 { q7 } , [ r0 ] !
2017-01-11 16:41:54 +00:00
vst1 . 8 { q2 } , [ r0 ] !
2022-01-27 12:35:43 +01:00
2 : subne r0 , r0 , r4
2017-01-11 16:41:54 +00:00
vst1 . 8 { q5 } , [ r0 ] !
2022-01-27 12:35:43 +01:00
next_ c t r q0
2017-01-11 16:41:54 +00:00
2022-01-27 12:35:43 +01:00
subs r5 , r5 , #128
2017-01-11 16:41:54 +00:00
bgt 9 9 b
2017-02-02 11:38:56 +00:00
vst1 . 8 { q0 } , [ r6 ]
2017-01-11 16:41:54 +00:00
pop { r4 - r10 , p c }
2017-02-02 11:38:56 +00:00
2022-01-27 12:35:43 +01:00
3 : adr l r , . L p e r m u t e _ t a b l e + 1 6
cmp r5 , #16 / / Z f l a g r e m a i n s c l e a r e d
sub l r , l r , r4
vld1 . 8 { q8 - q9 } , [ l r ]
vtbl. 8 d16 , { q5 } , d16
vtbl. 8 d17 , { q5 } , d17
veor q5 , q8 , q15
bcc 4 f / / h a v e t o r e l o a d p r e v i f R 5 < 1 6
vtbx. 8 d10 , { q2 } , d18
vtbx. 8 d11 , { q2 } , d19
mov p c , i p / / b r a n c h b a c k t o V S T s e q u e n c e
4 : sub r0 , r0 , r4
vshr. s8 q9 , q9 , #7 / / c r e a t e m a s k f o r V B I F
vld1 . 8 { q8 } , [ r0 ] / / r e l o a d
vbif q5 , q8 , q9
vst1 . 8 { q5 } , [ r0 ]
pop { r4 - r10 , p c }
2017-01-11 16:41:54 +00:00
ENDPROC( a e s b s _ c t r _ e n c r y p t )
2022-01-27 12:35:43 +01:00
.align 6
.Lpermute_table :
.byte 0 xff, 0 x f f , 0 x f f , 0 x f f , 0 x f f , 0 x f f , 0 x f f , 0 x f f
.byte 0 xff, 0 x f f , 0 x f f , 0 x f f , 0 x f f , 0 x f f , 0 x f f , 0 x f f
.byte 0 x0 0 , 0 x01 , 0 x02 , 0 x03 , 0 x04 , 0 x05 , 0 x06 , 0 x07
.byte 0 x0 8 , 0 x09 , 0 x0 a , 0 x0 b , 0 x0 c , 0 x0 d , 0 x0 e , 0 x0 f
.byte 0 xff, 0 x f f , 0 x f f , 0 x f f , 0 x f f , 0 x f f , 0 x f f , 0 x f f
.byte 0 xff, 0 x f f , 0 x f f , 0 x f f , 0 x f f , 0 x f f , 0 x f f , 0 x f f
2017-01-11 16:41:54 +00:00
.macro next_ t w e a k , o u t , i n , c o n s t , t m p
vshr. s64 \ t m p , \ i n , #63
vand \ t m p , \ t m p , \ c o n s t
vadd. u 6 4 \ o u t , \ i n , \ i n
vext. 8 \ t m p , \ t m p , \ t m p , #8
veor \ o u t , \ o u t , \ t m p
.endm
/ *
* aesbs_ x t s _ e n c r y p t ( u 8 o u t [ ] , u 8 c o n s t i n [ ] , u 8 c o n s t r k [ ] , i n t r o u n d s ,
2019-09-03 09:43:36 -07:00
* int b l o c k s , u 8 i v [ ] , i n t r e o r d e r _ l a s t _ t w e a k )
2017-01-11 16:41:54 +00:00
* aesbs_ x t s _ d e c r y p t ( u 8 o u t [ ] , u 8 c o n s t i n [ ] , u 8 c o n s t r k [ ] , i n t r o u n d s ,
2019-09-03 09:43:36 -07:00
* int b l o c k s , u 8 i v [ ] , i n t r e o r d e r _ l a s t _ t w e a k )
2017-01-11 16:41:54 +00:00
* /
2022-01-27 12:35:43 +01:00
.align 6
2017-01-11 16:41:54 +00:00
__xts_prepare8 :
vld1 . 8 { q14 } , [ r7 ] / / l o a d i v
2019-09-03 09:43:27 -07:00
vmov. i 3 2 d30 , #0x87 / / c o m p o s e t w e a k m a s k v e c t o r
vmovl. u 3 2 q15 , d30
vshr. u 6 4 d30 , d31 , #7
2017-01-11 16:41:54 +00:00
vmov q12 , q14
2020-09-16 15:36:40 +03:00
adr i p , 0 f
2017-01-11 16:41:54 +00:00
and r4 , r6 , #7
cmp r6 , #8
sub i p , i p , r4 , l s l #5
mov r4 , s p
2020-09-16 15:36:40 +03:00
movlt p c , i p / / c o m p u t e d g o t o i f b l o c k s < 8
2017-01-11 16:41:54 +00:00
vld1 . 8 { q0 } , [ r1 ] !
next_ t w e a k q12 , q14 , q15 , q13
veor q0 , q0 , q14
vst1 . 8 { q14 } , [ r4 , : 1 2 8 ] !
vld1 . 8 { q1 } , [ r1 ] !
next_ t w e a k q14 , q12 , q15 , q13
veor q1 , q1 , q12
vst1 . 8 { q12 } , [ r4 , : 1 2 8 ] !
vld1 . 8 { q2 } , [ r1 ] !
next_ t w e a k q12 , q14 , q15 , q13
veor q2 , q2 , q14
vst1 . 8 { q14 } , [ r4 , : 1 2 8 ] !
vld1 . 8 { q3 } , [ r1 ] !
next_ t w e a k q14 , q12 , q15 , q13
veor q3 , q3 , q12
vst1 . 8 { q12 } , [ r4 , : 1 2 8 ] !
vld1 . 8 { q4 } , [ r1 ] !
next_ t w e a k q12 , q14 , q15 , q13
veor q4 , q4 , q14
vst1 . 8 { q14 } , [ r4 , : 1 2 8 ] !
vld1 . 8 { q5 } , [ r1 ] !
next_ t w e a k q14 , q12 , q15 , q13
veor q5 , q5 , q12
vst1 . 8 { q12 } , [ r4 , : 1 2 8 ] !
vld1 . 8 { q6 } , [ r1 ] !
next_ t w e a k q12 , q14 , q15 , q13
veor q6 , q6 , q14
vst1 . 8 { q14 } , [ r4 , : 1 2 8 ] !
vld1 . 8 { q7 } , [ r1 ] !
next_ t w e a k q14 , q12 , q15 , q13
2019-09-03 09:43:36 -07:00
THUMB( i t t l e )
W( c m p l e ) r8 , #0
ble 1 f
0 : veor q7 , q7 , q12
2017-01-11 16:41:54 +00:00
vst1 . 8 { q12 } , [ r4 , : 1 2 8 ]
2019-09-03 09:43:36 -07:00
vst1 . 8 { q14 } , [ r7 ] / / s t o r e n e x t i v
2017-01-11 16:41:54 +00:00
bx l r
2019-09-03 09:43:36 -07:00
1 : vswp q12 , q14
b 0 b
2017-01-11 16:41:54 +00:00
ENDPROC( _ _ x t s _ p r e p a r e 8 )
.macro _ _ xts_ c r y p t , d o 8 , o 0 , o 1 , o 2 , o 3 , o 4 , o 5 , o 6 , o 7
push { r4 - r8 , l r }
mov r5 , s p / / p r e s e r v e s p
ldrd r6 , r7 , [ s p , #24 ] / / g e t b l o c k s a n d i v a r g s
2020-09-16 15:36:41 +03:00
rsb r8 , i p , #1
2017-01-11 16:41:54 +00:00
sub i p , s p , #128 / / m a k e r o o m f o r 8 x t w e a k
bic i p , i p , #0xf / / a l i g n s p t o 1 6 b y t e s
mov s p , i p
99 : bl _ _ x t s _ p r e p a r e 8
mov b s k e y , r2
mov r o u n d s , r3
bl \ d o 8
2020-09-16 15:36:40 +03:00
adr i p , 0 f
2017-01-11 16:41:54 +00:00
and l r , r6 , #7
cmp r6 , #8
sub i p , i p , l r , l s l #2
mov r4 , s p
2020-09-16 15:36:40 +03:00
movlt p c , i p / / c o m p u t e d g o t o i f b l o c k s < 8
2017-01-11 16:41:54 +00:00
vld1 . 8 { q8 } , [ r4 , : 1 2 8 ] !
vld1 . 8 { q9 } , [ r4 , : 1 2 8 ] !
vld1 . 8 { q10 } , [ r4 , : 1 2 8 ] !
vld1 . 8 { q11 } , [ r4 , : 1 2 8 ] !
vld1 . 8 { q12 } , [ r4 , : 1 2 8 ] !
vld1 . 8 { q13 } , [ r4 , : 1 2 8 ] !
vld1 . 8 { q14 } , [ r4 , : 1 2 8 ] !
vld1 . 8 { q15 } , [ r4 , : 1 2 8 ]
2020-09-16 15:36:40 +03:00
0 : adr i p , 1 f
2017-01-11 16:41:54 +00:00
sub i p , i p , l r , l s l #3
2020-09-16 15:36:40 +03:00
movlt p c , i p / / c o m p u t e d g o t o i f b l o c k s < 8
2017-01-11 16:41:54 +00:00
veor \ o 0 , \ o 0 , q8
vst1 . 8 { \ o 0 } , [ r0 ] !
veor \ o 1 , \ o 1 , q9
vst1 . 8 { \ o 1 } , [ r0 ] !
veor \ o 2 , \ o 2 , q10
vst1 . 8 { \ o 2 } , [ r0 ] !
veor \ o 3 , \ o 3 , q11
vst1 . 8 { \ o 3 } , [ r0 ] !
veor \ o 4 , \ o 4 , q12
vst1 . 8 { \ o 4 } , [ r0 ] !
veor \ o 5 , \ o 5 , q13
vst1 . 8 { \ o 5 } , [ r0 ] !
veor \ o 6 , \ o 6 , q14
vst1 . 8 { \ o 6 } , [ r0 ] !
veor \ o 7 , \ o 7 , q15
vst1 . 8 { \ o 7 } , [ r0 ] !
1 : subs r6 , r6 , #8
bgt 9 9 b
mov s p , r5
pop { r4 - r8 , p c }
.endm
ENTRY( a e s b s _ x t s _ e n c r y p t )
2020-09-16 15:36:41 +03:00
mov i p , #0 / / n e v e r r e o r d e r f i n a l t w e a k
2017-01-11 16:41:54 +00:00
_ _ xts_ c r y p t a e s b s _ e n c r y p t 8 , q0 , q1 , q4 , q6 , q3 , q7 , q2 , q5
ENDPROC( a e s b s _ x t s _ e n c r y p t )
ENTRY( a e s b s _ x t s _ d e c r y p t )
2020-09-16 15:36:41 +03:00
ldr i p , [ s p , #8 ] / / r e o r d e r f i n a l t w e a k ?
2017-01-11 16:41:54 +00:00
_ _ xts_ c r y p t a e s b s _ d e c r y p t 8 , q0 , q1 , q6 , q4 , q2 , q7 , q3 , q5
ENDPROC( a e s b s _ x t s _ d e c r y p t )