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>
*
* This p r o g r a m i s f r e e s o f t w a r e ; you can redistribute it and/or modify
* it u n d e r t h e t e r m s o f t h e G N U G e n e r a l P u b l i c L i c e n s e v e r s i o n 2 a s
* published b y t h e F r e e S o f t w a r e F o u n d a t i o n .
* /
/ *
* 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 _ _ adr, r e g , l b l
adr \ r e g , \ l b l
THUMB( o r r \ r e g , \ r e g , #1 )
.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
99 : _ _ adr i p , 0 f
and l r , r5 , #7
cmp r5 , #8
sub i p , i p , l r , l s l #2
bxlt i p / / c o m p u t e d g o t o i f b l o c k s < 8
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
_ _ adr i p , 1 f
and l r , r5 , #7
cmp r5 , #8
sub i p , i p , l r , l s l #2
bxlt i p / / c o m p u t e d g o t o i f b l o c k s < 8
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
99 : _ _ adr i p , 0 f
and l r , r5 , #7
cmp r5 , #8
sub i p , i p , l r , l s l #2
mov l r , r1
bxlt i p / / c o m p u t e d g o t o i f b l o c k s < 8
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
_ _ adr i p , 1 f
and l r , r5 , #7
cmp r5 , #8
sub i p , i p , l r , l s l #2
bxlt i p / / c o m p u t e d g o t o i f b l o c k s < 8
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 )
1 : _ _ adr i p , 2 f
sub i p , i p , l r , l s l #3
bxlt i p / / c o m p u t e d g o t o i f b l o c k s < 8
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
crypto: arm/aes-neonbs - fix issue with v2.22 and older assembler
The GNU assembler for ARM version 2.22 or older fails to infer the
element size from the vmov instructions, and aborts the build in
the following way;
.../aes-neonbs-core.S: Assembler messages:
.../aes-neonbs-core.S:817: Error: bad type for scalar -- `vmov q1h[1],r10'
.../aes-neonbs-core.S:817: Error: bad type for scalar -- `vmov q1h[0],r9'
.../aes-neonbs-core.S:817: Error: bad type for scalar -- `vmov q1l[1],r8'
.../aes-neonbs-core.S:817: Error: bad type for scalar -- `vmov q1l[0],r7'
.../aes-neonbs-core.S:818: Error: bad type for scalar -- `vmov q2h[1],r10'
.../aes-neonbs-core.S:818: Error: bad type for scalar -- `vmov q2h[0],r9'
.../aes-neonbs-core.S:818: Error: bad type for scalar -- `vmov q2l[1],r8'
.../aes-neonbs-core.S:818: Error: bad type for scalar -- `vmov q2l[0],r7'
Fix this by setting the element size explicitly, by replacing vmov with
vmov.32.
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2017-01-19 12:23:32 +00:00
vmov. 3 2 \ q \ ( ) h [ 1 ] , r10
2017-01-11 16:41:54 +00:00
adds r10 , r10 , #1
crypto: arm/aes-neonbs - fix issue with v2.22 and older assembler
The GNU assembler for ARM version 2.22 or older fails to infer the
element size from the vmov instructions, and aborts the build in
the following way;
.../aes-neonbs-core.S: Assembler messages:
.../aes-neonbs-core.S:817: Error: bad type for scalar -- `vmov q1h[1],r10'
.../aes-neonbs-core.S:817: Error: bad type for scalar -- `vmov q1h[0],r9'
.../aes-neonbs-core.S:817: Error: bad type for scalar -- `vmov q1l[1],r8'
.../aes-neonbs-core.S:817: Error: bad type for scalar -- `vmov q1l[0],r7'
.../aes-neonbs-core.S:818: Error: bad type for scalar -- `vmov q2h[1],r10'
.../aes-neonbs-core.S:818: Error: bad type for scalar -- `vmov q2h[0],r9'
.../aes-neonbs-core.S:818: Error: bad type for scalar -- `vmov q2l[1],r8'
.../aes-neonbs-core.S:818: Error: bad type for scalar -- `vmov q2l[0],r7'
Fix this by setting the element size explicitly, by replacing vmov with
vmov.32.
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2017-01-19 12:23:32 +00:00
vmov. 3 2 \ q \ ( ) h [ 0 ] , r9
2017-01-11 16:41:54 +00:00
adcs r9 , r9 , #0
crypto: arm/aes-neonbs - fix issue with v2.22 and older assembler
The GNU assembler for ARM version 2.22 or older fails to infer the
element size from the vmov instructions, and aborts the build in
the following way;
.../aes-neonbs-core.S: Assembler messages:
.../aes-neonbs-core.S:817: Error: bad type for scalar -- `vmov q1h[1],r10'
.../aes-neonbs-core.S:817: Error: bad type for scalar -- `vmov q1h[0],r9'
.../aes-neonbs-core.S:817: Error: bad type for scalar -- `vmov q1l[1],r8'
.../aes-neonbs-core.S:817: Error: bad type for scalar -- `vmov q1l[0],r7'
.../aes-neonbs-core.S:818: Error: bad type for scalar -- `vmov q2h[1],r10'
.../aes-neonbs-core.S:818: Error: bad type for scalar -- `vmov q2h[0],r9'
.../aes-neonbs-core.S:818: Error: bad type for scalar -- `vmov q2l[1],r8'
.../aes-neonbs-core.S:818: Error: bad type for scalar -- `vmov q2l[0],r7'
Fix this by setting the element size explicitly, by replacing vmov with
vmov.32.
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2017-01-19 12:23:32 +00:00
vmov. 3 2 \ q \ ( ) l [ 1 ] , r8
2017-01-11 16:41:54 +00:00
adcs r8 , r8 , #0
crypto: arm/aes-neonbs - fix issue with v2.22 and older assembler
The GNU assembler for ARM version 2.22 or older fails to infer the
element size from the vmov instructions, and aborts the build in
the following way;
.../aes-neonbs-core.S: Assembler messages:
.../aes-neonbs-core.S:817: Error: bad type for scalar -- `vmov q1h[1],r10'
.../aes-neonbs-core.S:817: Error: bad type for scalar -- `vmov q1h[0],r9'
.../aes-neonbs-core.S:817: Error: bad type for scalar -- `vmov q1l[1],r8'
.../aes-neonbs-core.S:817: Error: bad type for scalar -- `vmov q1l[0],r7'
.../aes-neonbs-core.S:818: Error: bad type for scalar -- `vmov q2h[1],r10'
.../aes-neonbs-core.S:818: Error: bad type for scalar -- `vmov q2h[0],r9'
.../aes-neonbs-core.S:818: Error: bad type for scalar -- `vmov q2l[1],r8'
.../aes-neonbs-core.S:818: Error: bad type for scalar -- `vmov q2l[0],r7'
Fix this by setting the element size explicitly, by replacing vmov with
vmov.32.
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2017-01-19 12:23:32 +00:00
vmov. 3 2 \ q \ ( ) l [ 0 ] , r7
2017-01-11 16:41:54 +00:00
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 [ ] ,
* int r o u n d s , i n t b l o c k s , u 8 c t r [ ] , b o o l f i n a l )
* /
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 }
ldm i p , { r5 - r7 } / / l o a d a r g s 4 - 6
add r5 , r5 , r7 / / o n e e x t r a b l o c k i f f i n a l = = 1
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
vmov q2 , q0
vmov q3 , q0
vmov q4 , q0
vmov q5 , q0
vmov q6 , q0
vmov q7 , q0
_ _ adr i p , 0 f
sub l r , r5 , #1
and l r , l r , #7
cmp r5 , #8
sub i p , i p , l r , l s l #5
sub i p , i p , l r , l s l #2
bxlt i p / / c o m p u t e d g o t o i f b l o c k s < 8
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
_ _ adr i p , 1 f
and l r , r5 , #7
cmp r5 , #8
movgt r4 , #0
ldrle r4 , [ s p , #40 ] / / l o a d f i n a l i n t h e l a s t r o u n d
sub i p , i p , l r , l s l #2
bxlt i p / / c o m p u t e d g o t o i f b l o c k s < 8
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 ] !
teq r4 , #0 / / s k i p l a s t b l o c k i f ' f i n a l '
1 : bne 2 f
vld1 . 8 { q15 } , [ r1 ] !
2 : _ _ adr i p , 3 f
cmp r5 , #8
sub i p , i p , l r , l s l #3
bxlt i p / / c o m p u t e d g o t o i f b l o c k s < 8
veor q0 , q0 , q8
vst1 . 8 { q0 } , [ r0 ] !
veor q1 , q1 , q9
vst1 . 8 { q1 } , [ r0 ] !
veor q4 , q4 , q10
vst1 . 8 { q4 } , [ r0 ] !
veor q6 , q6 , q11
vst1 . 8 { q6 } , [ r0 ] !
veor q3 , q3 , q12
vst1 . 8 { q3 } , [ r0 ] !
veor q7 , q7 , q13
vst1 . 8 { q7 } , [ r0 ] !
veor q2 , q2 , q14
vst1 . 8 { q2 } , [ r0 ] !
teq r4 , #0 / / s k i p l a s t b l o c k i f ' f i n a l '
W( b n e ) 4 f
3 : veor q5 , q5 , q15
vst1 . 8 { q5 } , [ r0 ] !
next_ c t r q0
subs r5 , r5 , #8
bgt 9 9 b
vmov q5 , q0
4 : vst1 . 8 { q5 } , [ r6 ]
pop { r4 - r10 , p c }
ENDPROC( a e s b s _ c t r _ e n c r y p t )
.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
.align 4
.Lxts_mul_x :
.quad 1 , 0 x8 7
/ *
* 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 ,
* int b l o c k s , u 8 i v [ ] )
* 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 ,
* int b l o c k s , u 8 i v [ ] )
* /
__xts_prepare8 :
vld1 . 8 { q14 } , [ r7 ] / / l o a d i v
_ _ ldr q15 , . L x t s _ m u l _ x / / l o a d t w e a k m a s k
vmov q12 , q14
_ _ adr i p , 0 f
and r4 , r6 , #7
cmp r6 , #8
sub i p , i p , r4 , l s l #5
mov r4 , s p
bxlt i p / / c o m p u t e d g o t o i f b l o c k s < 8
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
veor q7 , q7 , q12
vst1 . 8 { q12 } , [ r4 , : 1 2 8 ]
0 : vst1 . 8 { q14 } , [ r7 ] / / s t o r e n e x t i v
bx l r
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
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
_ _ adr i p , 0 f
and l r , r6 , #7
cmp r6 , #8
sub i p , i p , l r , l s l #2
mov r4 , s p
bxlt i p / / c o m p u t e d g o t o i f b l o c k s < 8
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 ]
0 : _ _ adr i p , 1 f
sub i p , i p , l r , l s l #3
bxlt i p / / c o m p u t e d g o t o i f b l o c k s < 8
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 )
_ _ 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 )
_ _ 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 )