2019-06-04 10:11:33 +02:00
/* SPDX-License-Identifier: GPL-2.0-only */
2014-02-10 11:26:29 +01:00
/ *
2024-01-18 18:06:33 +01:00
* aes- c e - c c m - c o r e . S - A E S - C C M t r a n s f o r m f o r A R M v8 w i t h C r y p t o E x t e n s i o n s
2014-02-10 11:26:29 +01:00
*
2024-01-18 18:06:33 +01:00
* Copyright ( C ) 2 0 1 3 - 2 0 1 7 L i n a r o L t d .
* Copyright ( C ) 2 0 2 4 G o o g l e L L C
*
* Author : Ard B i e s h e u v e l < a r d b @kernel.org>
2014-02-10 11:26:29 +01:00
* /
# include < l i n u x / l i n k a g e . h >
2016-10-11 19:15:17 +01:00
# include < a s m / a s s e m b l e r . h >
2014-02-10 11:26:29 +01:00
.text
.arch armv8 - a + c r y p t o
2024-01-18 18:06:35 +01:00
.macro load_ r o u n d _ k e y s , r k , n r , t m p
sub w \ t m p , \ n r , #10
add \ t m p , \ r k , w \ t m p , s x t w #4
ld1 { v10 . 4 s - v13 . 4 s } , [ \ r k ]
ld1 { v14 . 4 s - v17 . 4 s } , [ \ t m p ] , #64
ld1 { v18 . 4 s - v21 . 4 s } , [ \ t m p ] , #64
ld1 { v3 . 4 s - v5 . 4 s } , [ \ t m p ]
.endm
.macro dround, v a , v b , v k
aese \ v a \ ( ) . 1 6 b , \ v k \ ( ) . 1 6 b
aesmc \ v a \ ( ) . 1 6 b , \ v a \ ( ) . 1 6 b
aese \ v b \ ( ) . 1 6 b , \ v k \ ( ) . 1 6 b
aesmc \ v b \ ( ) . 1 6 b , \ v b \ ( ) . 1 6 b
.endm
.macro aes_ e n c r y p t , v a , v b , n r
tbz \ n r , #2 , . L \ @
dround \ v a , \ v b , v10
dround \ v a , \ v b , v11
tbz \ n r , #1 , . L \ @
dround \ v a , \ v b , v12
dround \ v a , \ v b , v13
.L \ @: .irp v, v14, v15, v16, v17, v18, v19, v20, v21, v3
dround \ v a , \ v b , \ v
.endr
aese \ v a \ ( ) . 1 6 b , v4 . 1 6 b
aese \ v b \ ( ) . 1 6 b , v4 . 1 6 b
.endm
2014-02-10 11:26:29 +01:00
.macro aes_ c c m _ d o _ c r y p t ,e n c
2024-01-18 18:06:35 +01:00
load_ r o u n d _ k e y s x3 , w4 , x10
2018-07-29 16:52:30 +02:00
ld1 { v0 . 1 6 b } , [ x5 ] / * l o a d m a c * /
2024-01-18 18:06:37 +01:00
cbz x2 , c e _ a e s _ c c m _ f i n a l
ldr x8 , [ x6 , #8 ] / * l o a d l o w e r c t r * /
2018-07-29 16:52:30 +02:00
CPU_ L E ( r e v x8 , x8 ) / * k e e p s w a b b e d c t r i n r e g * /
2014-02-10 11:26:29 +01:00
0 : /* outer loop */
2018-07-29 16:52:30 +02:00
ld1 { v1 . 8 b } , [ x6 ] / * l o a d u p p e r c t r * /
prfm p l d l 1 s t r m , [ x1 ]
add x8 , x8 , #1
rev x9 , x8
2014-02-10 11:26:29 +01:00
ins v1 . d [ 1 ] , x9 / * n o c a r r y i n l o w e r c t r * /
2024-01-18 18:06:35 +01:00
aes_ e n c r y p t v0 , v1 , w4
2018-07-29 16:52:30 +02:00
subs w2 , w2 , #16
2024-01-18 18:06:36 +01:00
bmi c e _ a e s _ c c m _ c r y p t _ t a i l
2018-07-29 16:52:30 +02:00
ld1 { v2 . 1 6 b } , [ x1 ] , #16 / * l o a d n e x t i n p u t b l o c k * /
2014-02-10 11:26:29 +01:00
.if \ enc = = 1
eor v2 . 1 6 b , v2 . 1 6 b , v5 . 1 6 b / * f i n a l r o u n d e n c + m a c * /
2024-01-18 18:06:33 +01:00
eor v6 . 1 6 b , v1 . 1 6 b , v2 . 1 6 b / * x o r w i t h c r y p t e d c t r * /
2014-02-10 11:26:29 +01:00
.else
eor v2 . 1 6 b , v2 . 1 6 b , v1 . 1 6 b / * x o r w i t h c r y p t e d c t r * /
2024-01-18 18:06:33 +01:00
eor v6 . 1 6 b , v2 . 1 6 b , v5 . 1 6 b / * f i n a l r o u n d e n c * /
2014-02-10 11:26:29 +01:00
.endif
eor v0 . 1 6 b , v0 . 1 6 b , v2 . 1 6 b / * x o r m a c w i t h p t ^ r k [ l a s t ] * /
2024-01-18 18:06:33 +01:00
st1 { v6 . 1 6 b } , [ x0 ] , #16 / * w r i t e o u t p u t b l o c k * /
2018-07-29 16:52:30 +02:00
bne 0 b
CPU_ L E ( r e v x8 , x8 )
str x8 , [ x6 , #8 ] / * s t o r e l s b e n d o f c t r ( B E ) * /
2024-01-18 18:06:37 +01:00
cbnz x7 , c e _ a e s _ c c m _ f i n a l
st1 { v0 . 1 6 b } , [ x5 ] / * s t o r e m a c * /
ret
2024-01-18 18:06:36 +01:00
.endm
2018-07-29 16:52:30 +02:00
2024-01-18 18:06:36 +01:00
SYM_ F U N C _ S T A R T _ L O C A L ( c e _ a e s _ c c m _ c r y p t _ t a i l )
eor v0 . 1 6 b , v0 . 1 6 b , v5 . 1 6 b / * f i n a l r o u n d m a c * /
2014-02-10 11:26:29 +01:00
eor v1 . 1 6 b , v1 . 1 6 b , v5 . 1 6 b / * f i n a l r o u n d e n c * /
2024-01-18 18:06:33 +01:00
add x1 , x1 , w2 , s x t w / * r e w i n d t h e i n p u t p o i n t e r ( w2 < 0 ) * /
add x0 , x0 , w2 , s x t w / * r e w i n d t h e o u t p u t p o i n t e r * /
adr_ l x8 , . L p e r m u t e / * l o a d p e r m u t e v e c t o r s * /
add x9 , x8 , w2 , s x t w
sub x8 , x8 , w2 , s x t w
ld1 { v7 . 1 6 b - v8 . 1 6 b } , [ x9 ]
ld1 { v9 . 1 6 b } , [ x8 ]
ld1 { v2 . 1 6 b } , [ x1 ] / * l o a d a f u l l b l o c k o f i n p u t * /
tbl v1 . 1 6 b , { v1 . 1 6 b } , v7 . 1 6 b / * m o v e k e y s t r e a m t o e n d o f r e g i s t e r * /
2024-01-18 18:06:36 +01:00
eor v7 . 1 6 b , v2 . 1 6 b , v1 . 1 6 b / * e n c r y p t p a r t i a l i n p u t b l o c k * /
bif v2 . 1 6 b , v7 . 1 6 b , v22 . 1 6 b / * s e l e c t p l a i n t e x t * /
tbx v7 . 1 6 b , { v6 . 1 6 b } , v8 . 1 6 b / * i n s e r t o u t p u t f r o m p r e v i o u s i t e r a t i o n * /
tbl v2 . 1 6 b , { v2 . 1 6 b } , v9 . 1 6 b / * c o p y p l a i n t e x t t o s t a r t o f v2 * /
eor v0 . 1 6 b , v0 . 1 6 b , v2 . 1 6 b / * f o l d p l a i n t e x t i n t o m a c * /
2024-01-18 18:06:33 +01:00
2024-01-18 18:06:36 +01:00
st1 { v7 . 1 6 b } , [ x0 ] / * s t o r e o u t p u t b l o c k * /
2024-01-18 18:06:37 +01:00
cbz x7 , 0 f
SYM_ I N N E R _ L A B E L ( c e _ a e s _ c c m _ f i n a l , S Y M _ L _ L O C A L )
ld1 { v1 . 1 6 b } , [ x7 ] / * l o a d 1 s t c t r i v * /
aes_ e n c r y p t v0 , v1 , w4
/* final round key cancels out */
eor v0 . 1 6 b , v0 . 1 6 b , v1 . 1 6 b / * e n - / d e c r y p t t h e m a c * /
0 : st1 { v0 . 1 6 b } , [ x5 ] / * s t o r e r e s u l t * /
2024-01-18 18:06:33 +01:00
ret
2024-01-18 18:06:36 +01:00
SYM_ F U N C _ E N D ( c e _ a e s _ c c m _ c r y p t _ t a i l )
2014-02-10 11:26:29 +01:00
/ *
* void c e _ a e s _ c c m _ e n c r y p t ( u 8 o u t [ ] , u 8 c o n s t i n [ ] , u 3 2 c b y t e s ,
* u8 c o n s t r k [ ] , u 3 2 r o u n d s , u 8 m a c [ ] ,
2024-01-18 18:06:37 +01:00
* u8 c t r [ ] , u 8 c o n s t f i n a l _ i v [ ] ) ;
2014-02-10 11:26:29 +01:00
* void c e _ a e s _ c c m _ d e c r y p t ( u 8 o u t [ ] , u 8 c o n s t i n [ ] , u 3 2 c b y t e s ,
* u8 c o n s t r k [ ] , u 3 2 r o u n d s , u 8 m a c [ ] ,
2024-01-18 18:06:37 +01:00
* u8 c t r [ ] , u 8 c o n s t f i n a l _ i v [ ] ) ;
2014-02-10 11:26:29 +01:00
* /
2019-12-13 15:49:10 +00:00
SYM_ F U N C _ S T A R T ( c e _ a e s _ c c m _ e n c r y p t )
2024-01-18 18:06:36 +01:00
movi v22 . 1 6 b , #255
2014-02-10 11:26:29 +01:00
aes_ c c m _ d o _ c r y p t 1
2019-12-13 15:49:10 +00:00
SYM_ F U N C _ E N D ( c e _ a e s _ c c m _ e n c r y p t )
2014-02-10 11:26:29 +01:00
2019-12-13 15:49:10 +00:00
SYM_ F U N C _ S T A R T ( c e _ a e s _ c c m _ d e c r y p t )
2024-01-18 18:06:36 +01:00
movi v22 . 1 6 b , #0
2014-02-10 11:26:29 +01:00
aes_ c c m _ d o _ c r y p t 0
2019-12-13 15:49:10 +00:00
SYM_ F U N C _ E N D ( c e _ a e s _ c c m _ d e c r y p t )
2024-01-18 18:06:33 +01:00
.section " .rodata " , " a"
.align 6
.fill 1 5 , 1 , 0 xff
.Lpermute :
.byte 0 x0 , 0 x1 , 0 x2 , 0 x3 , 0 x4 , 0 x5 , 0 x6 , 0 x7
.byte 0 x8 , 0 x9 , 0 x a , 0 x b , 0 x c , 0 x d , 0 x e , 0 x f
.fill 1 5 , 1 , 0 xff