2014-03-21 10:19:17 +01:00
/ *
* linux/ a r c h / a r m 6 4 / c r y p t o / a e s - m o d e s . S - c h a i n i n g m o d e w r a p p e r s f o r A E S
*
* Copyright ( C ) 2 0 1 3 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 .
* /
/* included by aes-ce.S and aes-neon.S */
.text
.align 4
/ *
* There a r e s e v e r a l w a y s t o i n s t a n t i a t e t h i s c o d e :
* - no i n t e r l e a v e , a l l i n l i n e
* - 2 - way i n t e r l e a v e , 2 x c a l l s o u t o f l i n e ( - D I N T E R L E A V E =2 )
* - 2 - way i n t e r l e a v e , a l l i n l i n e ( - D I N T E R L E A V E =2 - D I N T E R L E A V E _ I N L I N E )
* - 4 - way i n t e r l e a v e , 4 x c a l l s o u t o f l i n e ( - D I N T E R L E A V E =4 )
* - 4 - way i n t e r l e a v e , a l l i n l i n e ( - D I N T E R L E A V E =4 - D I N T E R L E A V E _ I N L I N E )
*
* Macros i m p o r t e d b y t h i s c o d e :
* - enc_ p r e p a r e - s e t u p N E O N r e g i s t e r s f o r e n c r y p t i o n
* - dec_ p r e p a r e - s e t u p N E O N r e g i s t e r s f o r d e c r y p t i o n
* - enc_ s w i t c h _ k e y - c h a n g e t o n e w k e y a f t e r h a v i n g p r e p a r e d f o r e n c r y p t i o n
* - encrypt_ b l o c k - e n c r y p t a s i n g l e b l o c k
* - decrypt b l o c k - d e c r y p t a s i n g l e b l o c k
* - encrypt_ b l o c k 2 x - e n c r y p t 2 b l o c k s i n p a r a l l e l ( i f I N T E R L E A V E = = 2 )
* - decrypt_ b l o c k 2 x - d e c r y p t 2 b l o c k s i n p a r a l l e l ( i f I N T E R L E A V E = = 2 )
* - encrypt_ b l o c k 4 x - e n c r y p t 4 b l o c k s i n p a r a l l e l ( i f I N T E R L E A V E = = 4 )
* - decrypt_ b l o c k 4 x - d e c r y p t 4 b l o c k s i n p a r a l l e l ( i f I N T E R L E A V E = = 4 )
* /
# if d e f i n e d ( I N T E R L E A V E ) & & ! d e f i n e d ( I N T E R L E A V E _ I N L I N E )
# define F R A M E _ P U S H s t p x29 , x30 , [ s p ,#- 16 ] ! ; mov x29, sp
# define F R A M E _ P O P l d p x29 , x30 , [ s p ] ,#16
# if I N T E R L E A V E = = 2
aes_encrypt_block2x :
encrypt_ b l o c k 2 x v0 , v1 , w3 , x2 , x6 , w7
ret
ENDPROC( a e s _ e n c r y p t _ b l o c k 2 x )
aes_decrypt_block2x :
decrypt_ b l o c k 2 x v0 , v1 , w3 , x2 , x6 , w7
ret
ENDPROC( a e s _ d e c r y p t _ b l o c k 2 x )
# elif I N T E R L E A V E = = 4
aes_encrypt_block4x :
encrypt_ b l o c k 4 x v0 , v1 , v2 , v3 , w3 , x2 , x6 , w7
ret
ENDPROC( a e s _ e n c r y p t _ b l o c k 4 x )
aes_decrypt_block4x :
decrypt_ b l o c k 4 x v0 , v1 , v2 , v3 , w3 , x2 , x6 , w7
ret
ENDPROC( a e s _ d e c r y p t _ b l o c k 4 x )
# else
# error I N T E R L E A V E s h o u l d e q u a l 2 o r 4
# endif
.macro do_encrypt_block2x
bl a e s _ e n c r y p t _ b l o c k 2 x
.endm
.macro do_decrypt_block2x
bl a e s _ d e c r y p t _ b l o c k 2 x
.endm
.macro do_encrypt_block4x
bl a e s _ e n c r y p t _ b l o c k 4 x
.endm
.macro do_decrypt_block4x
bl a e s _ d e c r y p t _ b l o c k 4 x
.endm
# else
# define F R A M E _ P U S H
# define F R A M E _ P O P
.macro do_encrypt_block2x
encrypt_ b l o c k 2 x v0 , v1 , w3 , x2 , x6 , w7
.endm
.macro do_decrypt_block2x
decrypt_ b l o c k 2 x v0 , v1 , w3 , x2 , x6 , w7
.endm
.macro do_encrypt_block4x
encrypt_ b l o c k 4 x v0 , v1 , v2 , v3 , w3 , x2 , x6 , w7
.endm
.macro do_decrypt_block4x
decrypt_ b l o c k 4 x v0 , v1 , v2 , v3 , w3 , x2 , x6 , w7
.endm
# endif
/ *
* aes_ 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 , i n t f i r s t )
* aes_ 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 , i n t f i r s t )
* /
AES_ E N T R Y ( a e s _ e c b _ e n c r y p t )
FRAME_ P U S H
cbz w5 , . L e c b e n c l o o p N x
enc_ p r e p a r e w3 , x2 , x5
.LecbencloopNx :
# if I N T E R L E A V E > = 2
subs w4 , w4 , #I N T E R L E A V E
bmi . L e c b e n c1 x
# if I N T E R L E A V E = = 2
ld1 { v0 . 1 6 b - v1 . 1 6 b } , [ x1 ] , #32 / * g e t 2 p t b l o c k s * /
do_ e n c r y p t _ b l o c k 2 x
st1 { v0 . 1 6 b - v1 . 1 6 b } , [ x0 ] , #32
# else
ld1 { v0 . 1 6 b - v3 . 1 6 b } , [ x1 ] , #64 / * g e t 4 p t b l o c k s * /
do_ e n c r y p t _ b l o c k 4 x
st1 { v0 . 1 6 b - v3 . 1 6 b } , [ x0 ] , #64
# endif
b . L e c b e n c l o o p N x
.Lecbenc1x :
adds w4 , w4 , #I N T E R L E A V E
beq . L e c b e n c o u t
# endif
.Lecbencloop :
ld1 { v0 . 1 6 b } , [ x1 ] , #16 / * g e t n e x t p t b l o c k * /
encrypt_ b l o c k v0 , w3 , x2 , x5 , w6
st1 { v0 . 1 6 b } , [ x0 ] , #16
subs w4 , w4 , #1
bne . L e c b e n c l o o p
.Lecbencout :
FRAME_ P O P
ret
AES_ E N D P R O C ( a e s _ e c b _ e n c r y p t )
AES_ E N T R Y ( a e s _ e c b _ d e c r y p t )
FRAME_ P U S H
cbz w5 , . L e c b d e c l o o p N x
dec_ p r e p a r e w3 , x2 , x5
.LecbdecloopNx :
# if I N T E R L E A V E > = 2
subs w4 , w4 , #I N T E R L E A V E
bmi . L e c b d e c1 x
# if I N T E R L E A V E = = 2
ld1 { v0 . 1 6 b - v1 . 1 6 b } , [ x1 ] , #32 / * g e t 2 c t b l o c k s * /
do_ d e c r y p t _ b l o c k 2 x
st1 { v0 . 1 6 b - v1 . 1 6 b } , [ x0 ] , #32
# else
ld1 { v0 . 1 6 b - v3 . 1 6 b } , [ x1 ] , #64 / * g e t 4 c t b l o c k s * /
do_ d e c r y p t _ b l o c k 4 x
st1 { v0 . 1 6 b - v3 . 1 6 b } , [ x0 ] , #64
# endif
b . L e c b d e c l o o p N x
.Lecbdec1x :
adds w4 , w4 , #I N T E R L E A V E
beq . L e c b d e c o u t
# endif
.Lecbdecloop :
ld1 { v0 . 1 6 b } , [ x1 ] , #16 / * g e t n e x t c t b l o c k * /
decrypt_ b l o c k v0 , w3 , x2 , x5 , w6
st1 { v0 . 1 6 b } , [ x0 ] , #16
subs w4 , w4 , #1
bne . L e c b d e c l o o p
.Lecbdecout :
FRAME_ P O P
ret
AES_ E N D P R O C ( a e s _ e c b _ d e c r y p t )
/ *
* aes_ c b c _ 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 [ ] , i n t f i r s t )
* aes_ 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 [ ] , i n t r o u n d s ,
* int b l o c k s , u 8 i v [ ] , i n t f i r s t )
* /
AES_ E N T R Y ( a e s _ c b c _ e n c r y p t )
cbz w6 , . L c b c e n c l o o p
ld1 { v0 . 1 6 b } , [ x5 ] / * g e t i v * /
2017-01-17 13:46:29 +00:00
enc_ p r e p a r e w3 , x2 , x6
2014-03-21 10:19:17 +01:00
.Lcbcencloop :
ld1 { v1 . 1 6 b } , [ x1 ] , #16 / * g e t n e x t p t b l o c k * /
eor v0 . 1 6 b , v0 . 1 6 b , v1 . 1 6 b / * . . a n d x o r w i t h i v * /
2017-01-17 13:46:29 +00:00
encrypt_ b l o c k v0 , w3 , x2 , x6 , w7
2014-03-21 10:19:17 +01:00
st1 { v0 . 1 6 b } , [ x0 ] , #16
subs w4 , w4 , #1
bne . L c b c e n c l o o p
2017-01-17 13:46:29 +00:00
st1 { v0 . 1 6 b } , [ x5 ] / * r e t u r n i v * /
2014-03-21 10:19:17 +01:00
ret
AES_ E N D P R O C ( a e s _ c b c _ e n c r y p t )
AES_ E N T R Y ( a e s _ c b c _ d e c r y p t )
FRAME_ P U S H
cbz w6 , . L c b c d e c l o o p N x
ld1 { v7 . 1 6 b } , [ x5 ] / * g e t i v * /
2017-01-17 13:46:29 +00:00
dec_ p r e p a r e w3 , x2 , x6
2014-03-21 10:19:17 +01:00
.LcbcdecloopNx :
# if I N T E R L E A V E > = 2
subs w4 , w4 , #I N T E R L E A V E
bmi . L c b c d e c1 x
# if I N T E R L E A V E = = 2
ld1 { v0 . 1 6 b - v1 . 1 6 b } , [ x1 ] , #32 / * g e t 2 c t b l o c k s * /
mov v2 . 1 6 b , v0 . 1 6 b
mov v3 . 1 6 b , v1 . 1 6 b
do_ d e c r y p t _ b l o c k 2 x
eor v0 . 1 6 b , v0 . 1 6 b , v7 . 1 6 b
eor v1 . 1 6 b , v1 . 1 6 b , v2 . 1 6 b
mov v7 . 1 6 b , v3 . 1 6 b
st1 { v0 . 1 6 b - v1 . 1 6 b } , [ x0 ] , #32
# else
ld1 { v0 . 1 6 b - v3 . 1 6 b } , [ x1 ] , #64 / * g e t 4 c t b l o c k s * /
mov v4 . 1 6 b , v0 . 1 6 b
mov v5 . 1 6 b , v1 . 1 6 b
mov v6 . 1 6 b , v2 . 1 6 b
do_ d e c r y p t _ b l o c k 4 x
sub x1 , x1 , #16
eor v0 . 1 6 b , v0 . 1 6 b , v7 . 1 6 b
eor v1 . 1 6 b , v1 . 1 6 b , v4 . 1 6 b
ld1 { v7 . 1 6 b } , [ x1 ] , #16 / * r e l o a d 1 c t b l o c k * /
eor v2 . 1 6 b , v2 . 1 6 b , v5 . 1 6 b
eor v3 . 1 6 b , v3 . 1 6 b , v6 . 1 6 b
st1 { v0 . 1 6 b - v3 . 1 6 b } , [ x0 ] , #64
# endif
b . L c b c d e c l o o p N x
.Lcbcdec1x :
adds w4 , w4 , #I N T E R L E A V E
beq . L c b c d e c o u t
# endif
.Lcbcdecloop :
ld1 { v1 . 1 6 b } , [ x1 ] , #16 / * g e t n e x t c t b l o c k * /
mov v0 . 1 6 b , v1 . 1 6 b / * . . . a n d c o p y t o v0 * /
2017-01-17 13:46:29 +00:00
decrypt_ b l o c k v0 , w3 , x2 , x6 , w7
2014-03-21 10:19:17 +01:00
eor v0 . 1 6 b , v0 . 1 6 b , v7 . 1 6 b / * x o r w i t h i v = > p t * /
mov v7 . 1 6 b , v1 . 1 6 b / * c t i s n e x t i v * /
st1 { v0 . 1 6 b } , [ x0 ] , #16
subs w4 , w4 , #1
bne . L c b c d e c l o o p
.Lcbcdecout :
FRAME_ P O P
2017-01-17 13:46:29 +00:00
st1 { v7 . 1 6 b } , [ x5 ] / * r e t u r n i v * /
2014-03-21 10:19:17 +01:00
ret
AES_ E N D P R O C ( a e s _ c b c _ d e c r y p t )
/ *
* aes_ 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 [ ] , i n t r o u n d s ,
* int b l o c k s , u 8 c t r [ ] , i n t f i r s t )
* /
AES_ E N T R Y ( a e s _ c t r _ e n c r y p t )
FRAME_ P U S H
2017-01-17 13:46:29 +00:00
cbz w6 , . L c t r n o t f i r s t / * 1 s t t i m e a r o u n d ? * /
2014-03-21 10:19:17 +01:00
enc_ p r e p a r e w3 , x2 , x6
ld1 { v4 . 1 6 b } , [ x5 ]
2017-01-17 13:46:29 +00:00
.Lctrnotfirst :
umov x8 , v4 . d [ 1 ] / * k e e p s w a b b e d c t r i n r e g * /
rev x8 , x8
2014-03-21 10:19:17 +01:00
# if I N T E R L E A V E > = 2
2017-01-17 13:46:29 +00:00
cmn w8 , w4 / * 3 2 b i t o v e r f l o w ? * /
2014-03-21 10:19:17 +01:00
bcs . L c t r l o o p
.LctrloopNx :
subs w4 , w4 , #I N T E R L E A V E
bmi . L c t r1 x
# if I N T E R L E A V E = = 2
mov v0 . 8 b , v4 . 8 b
mov v1 . 8 b , v4 . 8 b
2017-01-17 13:46:29 +00:00
rev x7 , x8
add x8 , x8 , #1
2014-03-21 10:19:17 +01:00
ins v0 . d [ 1 ] , x7
2017-01-17 13:46:29 +00:00
rev x7 , x8
add x8 , x8 , #1
2014-03-21 10:19:17 +01:00
ins v1 . d [ 1 ] , x7
ld1 { v2 . 1 6 b - v3 . 1 6 b } , [ x1 ] , #32 / * g e t 2 i n p u t b l o c k s * /
do_ e n c r y p t _ b l o c k 2 x
eor v0 . 1 6 b , v0 . 1 6 b , v2 . 1 6 b
eor v1 . 1 6 b , v1 . 1 6 b , v3 . 1 6 b
st1 { v0 . 1 6 b - v1 . 1 6 b } , [ x0 ] , #32
# else
ldr q8 , =0x30000000200000001 / * a d d e n d s 1 ,2 ,3 [ ,0 ] * /
2017-01-17 13:46:29 +00:00
dup v7 . 4 s , w8
2014-03-21 10:19:17 +01:00
mov v0 . 1 6 b , v4 . 1 6 b
add v7 . 4 s , v7 . 4 s , v8 . 4 s
mov v1 . 1 6 b , v4 . 1 6 b
rev3 2 v8 . 1 6 b , v7 . 1 6 b
mov v2 . 1 6 b , v4 . 1 6 b
mov v3 . 1 6 b , v4 . 1 6 b
mov v1 . s [ 3 ] , v8 . s [ 0 ]
mov v2 . s [ 3 ] , v8 . s [ 1 ]
mov v3 . s [ 3 ] , v8 . s [ 2 ]
ld1 { v5 . 1 6 b - v7 . 1 6 b } , [ x1 ] , #48 / * g e t 3 i n p u t b l o c k s * /
do_ e n c r y p t _ b l o c k 4 x
eor v0 . 1 6 b , v5 . 1 6 b , v0 . 1 6 b
ld1 { v5 . 1 6 b } , [ x1 ] , #16 / * g e t 1 i n p u t b l o c k * /
eor v1 . 1 6 b , v6 . 1 6 b , v1 . 1 6 b
eor v2 . 1 6 b , v7 . 1 6 b , v2 . 1 6 b
eor v3 . 1 6 b , v5 . 1 6 b , v3 . 1 6 b
st1 { v0 . 1 6 b - v3 . 1 6 b } , [ x0 ] , #64
2017-01-17 13:46:29 +00:00
add x8 , x8 , #I N T E R L E A V E
2014-03-21 10:19:17 +01:00
# endif
2017-01-17 13:46:29 +00:00
rev x7 , x8
2014-03-21 10:19:17 +01:00
ins v4 . d [ 1 ] , x7
2017-01-17 13:46:29 +00:00
cbz w4 , . L c t r o u t
2014-03-21 10:19:17 +01:00
b . L c t r l o o p N x
.Lctr1x :
adds w4 , w4 , #I N T E R L E A V E
beq . L c t r o u t
# endif
.Lctrloop :
mov v0 . 1 6 b , v4 . 1 6 b
encrypt_ b l o c k v0 , w3 , x2 , x6 , w7
2017-01-17 13:46:29 +00:00
adds x8 , x8 , #1 / * i n c r e m e n t B E c t r * /
rev x7 , x8
ins v4 . d [ 1 ] , x7
bcs . L c t r c a r r y / * o v e r f l o w ? * /
.Lctrcarrydone :
2014-03-21 10:19:17 +01:00
subs w4 , w4 , #1
bmi . L c t r h a l f b l o c k / * b l o c k s < 0 m e a n s 1 / 2 b l o c k * /
ld1 { v3 . 1 6 b } , [ x1 ] , #16
eor v3 . 1 6 b , v0 . 1 6 b , v3 . 1 6 b
st1 { v3 . 1 6 b } , [ x0 ] , #16
2017-01-17 13:46:29 +00:00
bne . L c t r l o o p
.Lctrout :
st1 { v4 . 1 6 b } , [ x5 ] / * r e t u r n n e x t C T R v a l u e * /
FRAME_ P O P
ret
2014-03-21 10:19:17 +01:00
.Lctrhalfblock :
ld1 { v3 . 8 b } , [ x1 ]
eor v3 . 8 b , v0 . 8 b , v3 . 8 b
st1 { v3 . 8 b } , [ x0 ]
FRAME_ P O P
ret
2017-01-17 13:46:29 +00:00
.Lctrcarry :
umov x7 , v4 . d [ 0 ] / * l o a d u p p e r w o r d o f c t r * /
rev x7 , x7 / * . . . t o h a n d l e t h e c a r r y * /
add x7 , x7 , #1
rev x7 , x7
ins v4 . d [ 0 ] , x7
b . L c t r c a r r y d o n e
2014-03-21 10:19:17 +01:00
AES_ E N D P R O C ( a e s _ c t r _ e n c r y p t )
.ltorg
/ *
* aes_ 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 1 [ ] , i n t r o u n d s ,
* int b l o c k s , u 8 c o n s t r k 2 [ ] , u 8 i v [ ] , i n t f i r s t )
* aes_ 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 1 [ ] , i n t r o u n d s ,
* int b l o c k s , u 8 c o n s t r k 2 [ ] , u 8 i v [ ] , i n t f i r s t )
* /
.macro next_ t w e a k , o u t , i n , c o n s t , t m p
sshr \ t m p \ ( ) . 2 d , \ i n \ ( ) . 2 d , #63
and \ t m p \ ( ) . 1 6 b , \ t m p \ ( ) . 1 6 b , \ c o n s t \ ( ) . 1 6 b
add \ o u t \ ( ) . 2 d , \ i n \ ( ) . 2 d , \ i n \ ( ) . 2 d
ext \ t m p \ ( ) . 1 6 b , \ t m p \ ( ) . 1 6 b , \ t m p \ ( ) . 1 6 b , #8
eor \ o u t \ ( ) . 1 6 b , \ o u t \ ( ) . 1 6 b , \ t m p \ ( ) . 1 6 b
.endm
.Lxts_mul_x :
2016-10-11 19:15:19 +01:00
CPU_ L E ( . q u a d 1 , 0 x87 )
CPU_ B E ( . q u a d 0 x87 , 1 )
2014-03-21 10:19:17 +01:00
AES_ E N T R Y ( a e s _ x t s _ e n c r y p t )
FRAME_ P U S H
cbz w7 , . L x t s e n c l o o p N x
ld1 { v4 . 1 6 b } , [ x6 ]
enc_ p r e p a r e w3 , x5 , x6
encrypt_ b l o c k v4 , w3 , x5 , x6 , w7 / * f i r s t t w e a k * /
enc_ s w i t c h _ k e y w3 , x2 , x6
ldr q7 , . L x t s _ m u l _ x
b . L x t s e n c N x
.LxtsencloopNx :
ldr q7 , . L x t s _ m u l _ x
next_ t w e a k v4 , v4 , v7 , v8
.LxtsencNx :
# if I N T E R L E A V E > = 2
subs w4 , w4 , #I N T E R L E A V E
bmi . L x t s e n c1 x
# if I N T E R L E A V E = = 2
ld1 { v0 . 1 6 b - v1 . 1 6 b } , [ x1 ] , #32 / * g e t 2 p t b l o c k s * /
next_ t w e a k v5 , v4 , v7 , v8
eor v0 . 1 6 b , v0 . 1 6 b , v4 . 1 6 b
eor v1 . 1 6 b , v1 . 1 6 b , v5 . 1 6 b
do_ e n c r y p t _ b l o c k 2 x
eor v0 . 1 6 b , v0 . 1 6 b , v4 . 1 6 b
eor v1 . 1 6 b , v1 . 1 6 b , v5 . 1 6 b
st1 { v0 . 1 6 b - v1 . 1 6 b } , [ x0 ] , #32
cbz w4 , . L x t s e n c o u t N x
next_ t w e a k v4 , v5 , v7 , v8
b . L x t s e n c N x
.LxtsencoutNx :
mov v4 . 1 6 b , v5 . 1 6 b
b . L x t s e n c o u t
# else
ld1 { v0 . 1 6 b - v3 . 1 6 b } , [ x1 ] , #64 / * g e t 4 p t b l o c k s * /
next_ t w e a k v5 , v4 , v7 , v8
eor v0 . 1 6 b , v0 . 1 6 b , v4 . 1 6 b
next_ t w e a k v6 , v5 , v7 , v8
eor v1 . 1 6 b , v1 . 1 6 b , v5 . 1 6 b
eor v2 . 1 6 b , v2 . 1 6 b , v6 . 1 6 b
next_ t w e a k v7 , v6 , v7 , v8
eor v3 . 1 6 b , v3 . 1 6 b , v7 . 1 6 b
do_ e n c r y p t _ b l o c k 4 x
eor v3 . 1 6 b , v3 . 1 6 b , v7 . 1 6 b
eor v0 . 1 6 b , v0 . 1 6 b , v4 . 1 6 b
eor v1 . 1 6 b , v1 . 1 6 b , v5 . 1 6 b
eor v2 . 1 6 b , v2 . 1 6 b , v6 . 1 6 b
st1 { v0 . 1 6 b - v3 . 1 6 b } , [ x0 ] , #64
mov v4 . 1 6 b , v7 . 1 6 b
cbz w4 , . L x t s e n c o u t
b . L x t s e n c l o o p N x
# endif
.Lxtsenc1x :
adds w4 , w4 , #I N T E R L E A V E
beq . L x t s e n c o u t
# endif
.Lxtsencloop :
ld1 { v1 . 1 6 b } , [ x1 ] , #16
eor v0 . 1 6 b , v1 . 1 6 b , v4 . 1 6 b
encrypt_ b l o c k v0 , w3 , x2 , x6 , w7
eor v0 . 1 6 b , v0 . 1 6 b , v4 . 1 6 b
st1 { v0 . 1 6 b } , [ x0 ] , #16
subs w4 , w4 , #1
beq . L x t s e n c o u t
next_ t w e a k v4 , v4 , v7 , v8
b . L x t s e n c l o o p
.Lxtsencout :
FRAME_ P O P
ret
AES_ E N D P R O C ( a e s _ x t s _ e n c r y p t )
AES_ E N T R Y ( a e s _ x t s _ d e c r y p t )
FRAME_ P U S H
cbz w7 , . L x t s d e c l o o p N x
ld1 { v4 . 1 6 b } , [ x6 ]
enc_ p r e p a r e w3 , x5 , x6
encrypt_ b l o c k v4 , w3 , x5 , x6 , w7 / * f i r s t t w e a k * /
dec_ p r e p a r e w3 , x2 , x6
ldr q7 , . L x t s _ m u l _ x
b . L x t s d e c N x
.LxtsdecloopNx :
ldr q7 , . L x t s _ m u l _ x
next_ t w e a k v4 , v4 , v7 , v8
.LxtsdecNx :
# if I N T E R L E A V E > = 2
subs w4 , w4 , #I N T E R L E A V E
bmi . L x t s d e c1 x
# if I N T E R L E A V E = = 2
ld1 { v0 . 1 6 b - v1 . 1 6 b } , [ x1 ] , #32 / * g e t 2 c t b l o c k s * /
next_ t w e a k v5 , v4 , v7 , v8
eor v0 . 1 6 b , v0 . 1 6 b , v4 . 1 6 b
eor v1 . 1 6 b , v1 . 1 6 b , v5 . 1 6 b
do_ d e c r y p t _ b l o c k 2 x
eor v0 . 1 6 b , v0 . 1 6 b , v4 . 1 6 b
eor v1 . 1 6 b , v1 . 1 6 b , v5 . 1 6 b
st1 { v0 . 1 6 b - v1 . 1 6 b } , [ x0 ] , #32
cbz w4 , . L x t s d e c o u t N x
next_ t w e a k v4 , v5 , v7 , v8
b . L x t s d e c N x
.LxtsdecoutNx :
mov v4 . 1 6 b , v5 . 1 6 b
b . L x t s d e c o u t
# else
ld1 { v0 . 1 6 b - v3 . 1 6 b } , [ x1 ] , #64 / * g e t 4 c t b l o c k s * /
next_ t w e a k v5 , v4 , v7 , v8
eor v0 . 1 6 b , v0 . 1 6 b , v4 . 1 6 b
next_ t w e a k v6 , v5 , v7 , v8
eor v1 . 1 6 b , v1 . 1 6 b , v5 . 1 6 b
eor v2 . 1 6 b , v2 . 1 6 b , v6 . 1 6 b
next_ t w e a k v7 , v6 , v7 , v8
eor v3 . 1 6 b , v3 . 1 6 b , v7 . 1 6 b
do_ d e c r y p t _ b l o c k 4 x
eor v3 . 1 6 b , v3 . 1 6 b , v7 . 1 6 b
eor v0 . 1 6 b , v0 . 1 6 b , v4 . 1 6 b
eor v1 . 1 6 b , v1 . 1 6 b , v5 . 1 6 b
eor v2 . 1 6 b , v2 . 1 6 b , v6 . 1 6 b
st1 { v0 . 1 6 b - v3 . 1 6 b } , [ x0 ] , #64
mov v4 . 1 6 b , v7 . 1 6 b
cbz w4 , . L x t s d e c o u t
b . L x t s d e c l o o p N x
# endif
.Lxtsdec1x :
adds w4 , w4 , #I N T E R L E A V E
beq . L x t s d e c o u t
# endif
.Lxtsdecloop :
ld1 { v1 . 1 6 b } , [ x1 ] , #16
eor v0 . 1 6 b , v1 . 1 6 b , v4 . 1 6 b
decrypt_ b l o c k v0 , w3 , x2 , x6 , w7
eor v0 . 1 6 b , v0 . 1 6 b , v4 . 1 6 b
st1 { v0 . 1 6 b } , [ x0 ] , #16
subs w4 , w4 , #1
beq . L x t s d e c o u t
next_ t w e a k v4 , v4 , v7 , v8
b . L x t s d e c l o o p
.Lxtsdecout :
FRAME_ P O P
ret
AES_ E N D P R O C ( a e s _ x t s _ d e c r y p t )