2017-01-11 16:41:53 +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 .
* 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 .
* /
# include < l i n u x / l i n k a g e . h >
2017-07-24 11:28:19 +01:00
# include < a s m / c a c h e . h >
2017-01-11 16:41:53 +00:00
.text
.align 5
rk . r e q r0
rounds . r e q r1
in . r e q r2
out . r e q r3
2017-01-13 08:33:26 +00:00
ttab . r e q i p
2017-01-11 16:41:53 +00:00
t0 . r e q l r
t1 . r e q r2
t2 . r e q r3
.macro _ _ select, o u t , i n , i d x
.if __LINUX_ARM_ARCH__ < 7
and \ o u t , \ i n , #0xff < < ( 8 * \ i d x )
.else
ubfx \ o u t , \ i n , #( 8 * \ i d x ) , #8
.endif
.endm
2017-07-24 11:28:19 +01:00
.macro _ _ load, o u t , i n , i d x , s z , o p
2017-01-11 16:41:53 +00:00
.if __LINUX_ARM_ARCH__ < 7 & & \ idx > 0
2017-07-24 11:28:19 +01:00
ldr\ o p \ o u t , [ t t a b , \ i n , l s r #( 8 * \ i d x ) - \ s z ]
2017-01-11 16:41:53 +00:00
.else
2017-07-24 11:28:19 +01:00
ldr\ o p \ o u t , [ t t a b , \ i n , l s l #\ s z ]
2017-01-11 16:41:53 +00:00
.endif
.endm
2017-07-24 11:28:19 +01:00
.macro _ _ hround, o u t 0 , o u t 1 , i n 0 , i n 1 , i n 2 , i n 3 , t 3 , t 4 , e n c , s z , o p
2017-01-11 16:41:53 +00:00
_ _ select \ o u t 0 , \ i n 0 , 0
_ _ select t 0 , \ i n 1 , 1
2017-07-24 11:28:19 +01:00
_ _ load \ o u t 0 , \ o u t 0 , 0 , \ s z , \ o p
_ _ load t 0 , t 0 , 1 , \ s z , \ o p
2017-01-11 16:41:53 +00:00
.if \ enc
_ _ select \ o u t 1 , \ i n 1 , 0
_ _ select t 1 , \ i n 2 , 1
.else
_ _ select \ o u t 1 , \ i n 3 , 0
_ _ select t 1 , \ i n 0 , 1
.endif
2017-07-24 11:28:19 +01:00
_ _ load \ o u t 1 , \ o u t 1 , 0 , \ s z , \ o p
2017-01-11 16:41:53 +00:00
_ _ select t 2 , \ i n 2 , 2
2017-07-24 11:28:19 +01:00
_ _ load t 1 , t 1 , 1 , \ s z , \ o p
_ _ load t 2 , t 2 , 2 , \ s z , \ o p
2017-01-11 16:41:53 +00:00
eor \ o u t 0 , \ o u t 0 , t 0 , r o r #24
_ _ select t 0 , \ i n 3 , 3
.if \ enc
_ _ select \ t 3 , \ i n 3 , 2
_ _ select \ t 4 , \ i n 0 , 3
.else
_ _ select \ t 3 , \ i n 1 , 2
_ _ select \ t 4 , \ i n 2 , 3
.endif
2017-07-24 11:28:19 +01:00
_ _ load \ t 3 , \ t 3 , 2 , \ s z , \ o p
_ _ load t 0 , t 0 , 3 , \ s z , \ o p
_ _ load \ t 4 , \ t 4 , 3 , \ s z , \ o p
2017-01-11 16:41:53 +00:00
eor \ o u t 1 , \ o u t 1 , t 1 , r o r #24
eor \ o u t 0 , \ o u t 0 , t 2 , r o r #16
ldm r k ! , { t 1 , t 2 }
eor \ o u t 1 , \ o u t 1 , \ t 3 , r o r #16
eor \ o u t 0 , \ o u t 0 , t 0 , r o r #8
eor \ o u t 1 , \ o u t 1 , \ t 4 , r o r #8
eor \ o u t 0 , \ o u t 0 , t 1
eor \ o u t 1 , \ o u t 1 , t 2
.endm
2017-07-24 11:28:19 +01:00
.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 , s z =2 , o p
_ _ 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 , \ s z , \ o p
_ _ 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 , \ s z , \ o p
2017-01-11 16:41:53 +00:00
.endm
2017-07-24 11:28:19 +01:00
.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 , s z =2 , o p
_ _ 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 , \ s z , \ o p
_ _ 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 , \ s z , \ o p
2017-01-11 16:41:53 +00:00
.endm
.macro _ _ rev, o u t , i n
.if __LINUX_ARM_ARCH__ < 6
lsl t 0 , \ i n , #24
and t 1 , \ i n , #0xff00
and t 2 , \ i n , #0xff0000
orr \ o u t , t 0 , \ i n , l s r #24
orr \ o u t , \ o u t , t 1 , l s l #8
orr \ o u t , \ o u t , t 2 , l s r #8
.else
rev \ o u t , \ i n
.endif
.endm
.macro _ _ adrl, o u t , s y m , c
.if __LINUX_ARM_ARCH__ < 7
ldr\ c \ o u t , = \ s y m
.else
movw\ c \ o u t , #: l o w e r 16 : \ s y m
movt\ c \ o u t , #: u p p e r 16 : \ s y m
.endif
.endm
2017-07-24 11:28:19 +01:00
.macro do_ c r y p t , r o u n d , t t a b , l t a b , b s z
2017-01-11 16:41:53 +00:00
push { r3 - r11 , l r }
ldr r4 , [ i n ]
ldr r5 , [ i n , #4 ]
ldr r6 , [ i n , #8 ]
ldr r7 , [ i n , #12 ]
ldm r k ! , { r8 - r11 }
# ifdef C O N F I G _ C P U _ B I G _ E N D I A N
_ _ rev r4 , r4
_ _ rev r5 , r5
_ _ rev r6 , r6
_ _ rev r7 , r7
# endif
eor r4 , r4 , r8
eor r5 , r5 , r9
eor r6 , r6 , r10
eor r7 , r7 , r11
2017-01-13 08:33:26 +00:00
_ _ adrl t t a b , \ t t a b
2017-01-11 16:41:53 +00:00
tst r o u n d s , #2
bne 1 f
0 : \ round r8 , r9 , r10 , r11 , r4 , r5 , r6 , r7
\ round r4 , r5 , r6 , r7 , r8 , r9 , r10 , r11
1 : subs r o u n d s , r o u n d s , #4
\ round r8 , r9 , r10 , r11 , r4 , r5 , r6 , r7
2017-07-24 11:28:19 +01:00
bls 2 f
2017-01-11 16:41:53 +00:00
\ round r4 , r5 , r6 , r7 , r8 , r9 , r10 , r11
2017-07-24 11:28:19 +01:00
b 0 b
2 : _ _ adrl t t a b , \ l t a b
\ round r4 , r5 , r6 , r7 , r8 , r9 , r10 , r11 , \ b s z , b
2017-01-11 16:41:53 +00:00
# ifdef C O N F I G _ C P U _ B I G _ E N D I A N
_ _ rev r4 , r4
_ _ rev r5 , r5
_ _ rev r6 , r6
_ _ rev r7 , r7
# endif
ldr o u t , [ s p ]
str r4 , [ o u t ]
str r5 , [ o u t , #4 ]
str r6 , [ o u t , #8 ]
str r7 , [ o u t , #12 ]
pop { r3 - r11 , p c }
.align 3
.ltorg
.endm
2018-02-12 22:52:37 +09:00
ENTRY( _ _ a e s _ a r m _ 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 t _ t a b + 1 , 2
ENDPROC( _ _ a e s _ a r m _ e n c r y p t )
.align 5
ENTRY( _ _ a e s _ a r m _ 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 , _ _ a e s _ a r m _ i n v e r s e _ s b o x , 0
ENDPROC( _ _ a e s _ a r m _ d e c r y p t )
.section " .rodata " , " a"
2017-07-24 11:28:19 +01:00
.align L1_CACHE_SHIFT
.type _ _ aes_ a r m _ i n v e r s e _ s b o x , % o b j e c t
__aes_arm_inverse_sbox :
.byte 0 x5 2 , 0 x09 , 0 x6 a , 0 x d5 , 0 x30 , 0 x36 , 0 x a5 , 0 x38
.byte 0 xbf, 0 x40 , 0 x a3 , 0 x9 e , 0 x81 , 0 x f3 , 0 x d7 , 0 x f b
.byte 0 x7 c , 0 x e 3 , 0 x39 , 0 x82 , 0 x9 b , 0 x2 f , 0 x f f , 0 x87
.byte 0 x3 4 , 0 x8 e , 0 x43 , 0 x44 , 0 x c4 , 0 x d e , 0 x e 9 , 0 x c b
.byte 0 x5 4 , 0 x7 b , 0 x94 , 0 x32 , 0 x a6 , 0 x c2 , 0 x23 , 0 x3 d
.byte 0 xee, 0 x4 c , 0 x95 , 0 x0 b , 0 x42 , 0 x f a , 0 x c3 , 0 x4 e
.byte 0 x0 8 , 0 x2 e , 0 x a1 , 0 x66 , 0 x28 , 0 x d9 , 0 x24 , 0 x b2
.byte 0 x7 6 , 0 x5 b , 0 x a2 , 0 x49 , 0 x6 d , 0 x8 b , 0 x d1 , 0 x25
.byte 0 x7 2 , 0 x f8 , 0 x f6 , 0 x64 , 0 x86 , 0 x68 , 0 x98 , 0 x16
.byte 0 xd4 , 0 x a4 , 0 x5 c , 0 x c c , 0 x5 d , 0 x65 , 0 x b6 , 0 x92
.byte 0 x6 c , 0 x70 , 0 x48 , 0 x50 , 0 x f d , 0 x e d , 0 x b9 , 0 x d a
.byte 0 x5 e , 0 x15 , 0 x46 , 0 x57 , 0 x a7 , 0 x8 d , 0 x9 d , 0 x84
.byte 0 x9 0 , 0 x d8 , 0 x a b , 0 x00 , 0 x8 c , 0 x b c , 0 x d3 , 0 x0 a
.byte 0 xf7 , 0 x e 4 , 0 x58 , 0 x05 , 0 x b8 , 0 x b3 , 0 x45 , 0 x06
.byte 0 xd0 , 0 x2 c , 0 x1 e , 0 x8 f , 0 x c a , 0 x3 f , 0 x0 f , 0 x02
.byte 0 xc1 , 0 x a f , 0 x b d , 0 x03 , 0 x01 , 0 x13 , 0 x8 a , 0 x6 b
.byte 0 x3 a , 0 x91 , 0 x11 , 0 x41 , 0 x4 f , 0 x67 , 0 x d c , 0 x e a
.byte 0 x9 7 , 0 x f2 , 0 x c f , 0 x c e , 0 x f0 , 0 x b4 , 0 x e 6 , 0 x73
.byte 0 x9 6 , 0 x a c , 0 x74 , 0 x22 , 0 x e 7 , 0 x a d , 0 x35 , 0 x85
.byte 0 xe2 , 0 x f9 , 0 x37 , 0 x e 8 , 0 x1 c , 0 x75 , 0 x d f , 0 x6 e
.byte 0 x4 7 , 0 x f1 , 0 x1 a , 0 x71 , 0 x1 d , 0 x29 , 0 x c5 , 0 x89
.byte 0 x6 f , 0 x b7 , 0 x62 , 0 x0 e , 0 x a a , 0 x18 , 0 x b e , 0 x1 b
.byte 0 xfc, 0 x56 , 0 x3 e , 0 x4 b , 0 x c6 , 0 x d2 , 0 x79 , 0 x20
.byte 0 x9 a , 0 x d b , 0 x c0 , 0 x f e , 0 x78 , 0 x c d , 0 x5 a , 0 x f4
.byte 0 x1 f , 0 x d d , 0 x a8 , 0 x33 , 0 x88 , 0 x07 , 0 x c7 , 0 x31
.byte 0 xb1 , 0 x12 , 0 x10 , 0 x59 , 0 x27 , 0 x80 , 0 x e c , 0 x5 f
.byte 0 x6 0 , 0 x51 , 0 x7 f , 0 x a9 , 0 x19 , 0 x b5 , 0 x4 a , 0 x0 d
.byte 0 x2 d , 0 x e 5 , 0 x7 a , 0 x9 f , 0 x93 , 0 x c9 , 0 x9 c , 0 x e f
.byte 0 xa0 , 0 x e 0 , 0 x3 b , 0 x4 d , 0 x a e , 0 x2 a , 0 x f5 , 0 x b0
.byte 0 xc8 , 0 x e b , 0 x b b , 0 x3 c , 0 x83 , 0 x53 , 0 x99 , 0 x61
.byte 0 x1 7 , 0 x2 b , 0 x04 , 0 x7 e , 0 x b a , 0 x77 , 0 x d6 , 0 x26
.byte 0 xe1 , 0 x69 , 0 x14 , 0 x63 , 0 x55 , 0 x21 , 0 x0 c , 0 x7 d
.size _ _ aes_ a r m _ i n v e r s e _ s b o x , . - _ _ a e s _ a r m _ i n v e r s e _ s b o x