2017-01-11 16:41:52 +00:00
/ *
* Scalar A E S c o r e t r a n s f o r m
*
* Copyright ( C ) 2 0 1 7 L i n a r o L t d < 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 .
* /
# 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
rk . r e q x0
out . r e q x1
in . r e q x2
rounds . r e q x3
tt . r e q x4
lt . r e q x2
2017-01-28 23:25:37 +00:00
.macro _ _ pair, e n c , r e g 0 , r e g 1 , i n 0 , i n 1 e , i n 1 d , s h i f t
ubfx \ r e g 0 , \ i n 0 , #\ s h i f t , # 8
2017-01-11 16:41:52 +00:00
.if \ enc
2017-01-28 23:25:37 +00:00
ubfx \ r e g 1 , \ i n 1 e , #\ s h i f t , # 8
2017-01-11 16:41:52 +00:00
.else
2017-01-28 23:25:37 +00:00
ubfx \ r e g 1 , \ i n 1 d , #\ s h i f t , # 8
2017-01-11 16:41:52 +00:00
.endif
2017-01-28 23:25:37 +00:00
ldr \ r e g 0 , [ t t , \ r e g 0 , u x t w #2 ]
ldr \ r e g 1 , [ t t , \ r e g 1 , u x t w #2 ]
.endm
2017-01-11 16:41:52 +00:00
2017-01-28 23:25:37 +00:00
.macro _ _ hround, o u t 0 , o u t 1 , i n 0 , i n 1 , i n 2 , i n 3 , t 0 , t 1 , e n c
ldp \ o u t 0 , \ o u t 1 , [ r k ] , #8
2017-01-11 16:41:52 +00:00
2017-01-28 23:25:37 +00:00
_ _ pair \ e n c , w13 , w14 , \ i n 0 , \ i n 1 , \ i n 3 , 0
_ _ pair \ e n c , w15 , w16 , \ i n 1 , \ i n 2 , \ i n 0 , 8
_ _ pair \ e n c , w17 , w18 , \ i n 2 , \ i n 3 , \ i n 1 , 1 6
_ _ pair \ e n c , \ t 0 , \ t 1 , \ i n 3 , \ i n 0 , \ i n 2 , 2 4
2017-01-11 16:41:52 +00:00
eor \ o u t 0 , \ o u t 0 , w13
2017-01-28 23:25:37 +00:00
eor \ o u t 1 , \ o u t 1 , w14
eor \ o u t 0 , \ o u t 0 , w15 , r o r #24
eor \ o u t 1 , \ o u t 1 , w16 , r o r #24
eor \ o u t 0 , \ o u t 0 , w17 , r o r #16
eor \ o u t 1 , \ o u t 1 , w18 , r o r #16
eor \ o u t 0 , \ o u t 0 , \ t 0 , r o r #8
2017-01-11 16:41:52 +00:00
eor \ o u t 1 , \ o u t 1 , \ t 1 , r o r #8
.endm
.macro fround, o u t 0 , o u t 1 , o u t 2 , o u t 3 , i n 0 , i n 1 , i n 2 , i n 3
_ _ hround \ o u t 0 , \ o u t 1 , \ i n 0 , \ i n 1 , \ i n 2 , \ i n 3 , \ o u t 2 , \ o u t 3 , 1
_ _ hround \ o u t 2 , \ o u t 3 , \ i n 2 , \ i n 3 , \ i n 0 , \ i n 1 , \ i n 1 , \ i n 2 , 1
.endm
.macro iround, o u t 0 , o u t 1 , o u t 2 , o u t 3 , i n 0 , i n 1 , i n 2 , i n 3
_ _ hround \ o u t 0 , \ o u t 1 , \ i n 0 , \ i n 3 , \ i n 2 , \ i n 1 , \ o u t 2 , \ o u t 3 , 0
_ _ hround \ o u t 2 , \ o u t 3 , \ i n 2 , \ i n 1 , \ i n 0 , \ i n 3 , \ i n 1 , \ i n 0 , 0
.endm
.macro do_ c r y p t , r o u n d , t t a b , l t a b
ldp w5 , w6 , [ i n ]
ldp w7 , w8 , [ i n , #8 ]
ldp w9 , w10 , [ r k ] , #16
ldp w11 , w12 , [ r k , #- 8 ]
CPU_ B E ( r e v w5 , w5 )
CPU_ B E ( r e v w6 , w6 )
CPU_ B E ( r e v w7 , w7 )
CPU_ B E ( r e v w8 , w8 )
eor w5 , w5 , w9
eor w6 , w6 , w10
eor w7 , w7 , w11
eor w8 , w8 , w12
2017-01-28 23:25:36 +00:00
adr_ l t t , \ t t a b
adr_ l l t , \ l t a b
2017-01-11 16:41:52 +00:00
tbnz r o u n d s , #1 , 1 f
0 : \ round w9 , w10 , w11 , w12 , w5 , w6 , w7 , w8
\ round w5 , w6 , w7 , w8 , w9 , w10 , w11 , w12
1 : subs r o u n d s , r o u n d s , #4
\ round w9 , w10 , w11 , w12 , w5 , w6 , w7 , w8
csel t t , t t , l t , h i
\ round w5 , w6 , w7 , w8 , w9 , w10 , w11 , w12
b. h i 0 b
CPU_ B E ( r e v w5 , w5 )
CPU_ B E ( r e v w6 , w6 )
CPU_ B E ( r e v w7 , w7 )
CPU_ B E ( r e v w8 , w8 )
stp w5 , w6 , [ o u t ]
stp w7 , w8 , [ o u t , #8 ]
ret
.endm
.align 5
ENTRY( _ _ a e s _ a r m 6 4 _ e n c r y p t )
do_ c r y p t f r o u n d , c r y p t o _ f t _ t a b , c r y p t o _ f l _ t a b
ENDPROC( _ _ a e s _ a r m 6 4 _ e n c r y p t )
.align 5
ENTRY( _ _ a e s _ a r m 6 4 _ d e c r y p t )
do_ c r y p t i r o u n d , c r y p t o _ i t _ t a b , c r y p t o _ i l _ t a b
ENDPROC( _ _ a e s _ a r m 6 4 _ d e c r y p t )