2019-06-04 11:11:33 +03:00
/* SPDX-License-Identifier: GPL-2.0-only */
2015-03-10 11:47:46 +03:00
/ *
* sha2 - c e - c o r e . S - S H A - 2 2 4 / 2 5 6 s e c u r e h a s h u s i n g A R M v8 C r y p t o E x t e n s i o n s
*
* Copyright ( C ) 2 0 1 5 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>
* /
# 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
2019-10-11 12:08:00 +03:00
.arch armv8 - a
2015-03-10 11:47:46 +03:00
.fpu crypto- n e o n - f p - a r m v8
k0 . r e q q7
k1 . r e q q8
rk . r e q r3
ta0 . r e q q9
ta1 . r e q q10
tb0 . r e q q10
tb1 . r e q q9
dga . r e q q11
dgb . r e q q12
dg0 . r e q q13
dg1 . r e q q14
dg2 . r e q q15
.macro add_ o n l y , e v , s0
vmov d g 2 , d g 0
.ifnb \ s0
vld1 . 3 2 { k \ e v } , [ r k , : 1 2 8 ] !
.endif
sha2 5 6 h . 3 2 d g 0 , d g 1 , t b \ e v
sha2 5 6 h2 . 3 2 d g 1 , d g 2 , t b \ e v
.ifnb \ s0
vadd. u 3 2 t a \ e v , q \ s0 , k \ e v
.endif
.endm
.macro add_ u p d a t e , e v , s0 , s1 , s2 , s3
sha2 5 6 s u 0 . 3 2 q \ s0 , q \ s1
add_ o n l y \ e v , \ s1
sha2 5 6 s u 1 . 3 2 q \ s0 , q \ s2 , q \ s3
.endm
.align 6
.Lsha256_rcon :
.word 0 x4 2 8 a2 f98 , 0 x71 3 7 4 4 9 1 , 0 x b5 c0 f b c f , 0 x e 9 b5 d b a5
.word 0 x3 9 5 6 c25 b , 0 x59 f11 1 f1 , 0 x92 3 f82 a4 , 0 x a b1 c5 e d5
.word 0 xd8 0 7 a a98 , 0 x12 8 3 5 b01 , 0 x24 3 1 8 5 b e , 0 x55 0 c7 d c3
.word 0 x7 2 b e 5 d74 , 0 x80 d e b1 f e , 0 x9 b d c06 a7 , 0 x c19 b f17 4
.word 0 xe4 9 b69 c1 , 0 x e f b e 4 7 8 6 , 0 x0 f c19 d c6 , 0 x24 0 c a1 c c
.word 0 x2 d e 9 2 c6 f , 0 x4 a74 8 4 a a , 0 x5 c b0 a9 d c , 0 x76 f98 8 d a
.word 0 x9 8 3 e 5 1 5 2 , 0 x a83 1 c66 d , 0 x b00 3 2 7 c8 , 0 x b f59 7 f c7
.word 0 xc6 e 0 0 b f3 , 0 x d5 a79 1 4 7 , 0 x06 c a63 5 1 , 0 x14 2 9 2 9 6 7
.word 0 x2 7 b70 a85 , 0 x2 e 1 b21 3 8 , 0 x4 d2 c6 d f c , 0 x53 3 8 0 d13
.word 0 x6 5 0 a73 5 4 , 0 x76 6 a0 a b b , 0 x81 c2 c92 e , 0 x92 7 2 2 c85
.word 0 xa2 b f e 8 a1 , 0 x a81 a66 4 b , 0 x c24 b8 b70 , 0 x c76 c51 a3
.word 0 xd1 9 2 e 8 1 9 , 0 x d69 9 0 6 2 4 , 0 x f40 e 3 5 8 5 , 0 x10 6 a a07 0
.word 0 x1 9 a4 c11 6 , 0 x1 e 3 7 6 c08 , 0 x27 4 8 7 7 4 c , 0 x34 b0 b c b5
.word 0 x3 9 1 c0 c b3 , 0 x4 e d8 a a4 a , 0 x5 b9 c c a4 f , 0 x68 2 e 6 f f3
.word 0 x7 4 8 f82 e e , 0 x78 a56 3 6 f , 0 x84 c87 8 1 4 , 0 x8 c c70 2 0 8
.word 0 x9 0 b e f f f a , 0 x a45 0 6 c e b , 0 x b e f9 a3 f7 , 0 x c67 1 7 8 f2
/ *
2015-04-09 13:55:43 +03:00
* void s h a2 _ c e _ t r a n s f o r m ( s t r u c t s h a25 6 _ s t a t e * s s t , u 8 c o n s t * s r c ,
int b l o c k s ) ;
2015-03-10 11:47:46 +03:00
* /
ENTRY( s h a2 _ c e _ t r a n s f o r m )
/* load state */
2015-04-09 13:55:43 +03:00
vld1 . 3 2 { d g a - d g b } , [ r0 ]
2015-03-10 11:47:46 +03:00
/* load input */
0 : vld1 . 3 2 { q0 - q1 } , [ r1 ] !
vld1 . 3 2 { q2 - q3 } , [ r1 ] !
2015-04-09 13:55:43 +03:00
subs r2 , r2 , #1
2015-03-10 11:47:46 +03:00
# ifndef C O N F I G _ C P U _ B I G _ E N D I A N
vrev3 2 . 8 q0 , q0
vrev3 2 . 8 q1 , q1
vrev3 2 . 8 q2 , q2
vrev3 2 . 8 q3 , q3
# endif
/* load first round constant */
adr r k , . L s h a25 6 _ r c o n
vld1 . 3 2 { k 0 } , [ r k , : 1 2 8 ] !
vadd. u 3 2 t a0 , q0 , k 0
vmov d g 0 , d g a
vmov d g 1 , d g b
add_ u p d a t e 1 , 0 , 1 , 2 , 3
add_ u p d a t e 0 , 1 , 2 , 3 , 0
add_ u p d a t e 1 , 2 , 3 , 0 , 1
add_ u p d a t e 0 , 3 , 0 , 1 , 2
add_ u p d a t e 1 , 0 , 1 , 2 , 3
add_ u p d a t e 0 , 1 , 2 , 3 , 0
add_ u p d a t e 1 , 2 , 3 , 0 , 1
add_ u p d a t e 0 , 3 , 0 , 1 , 2
add_ u p d a t e 1 , 0 , 1 , 2 , 3
add_ u p d a t e 0 , 1 , 2 , 3 , 0
add_ u p d a t e 1 , 2 , 3 , 0 , 1
add_ u p d a t e 0 , 3 , 0 , 1 , 2
add_ o n l y 1 , 1
add_ o n l y 0 , 2
add_ o n l y 1 , 3
add_ o n l y 0
/* update state */
vadd. u 3 2 d g a , d g a , d g 0
vadd. u 3 2 d g b , d g b , d g 1
bne 0 b
/* store new state */
2015-04-09 13:55:43 +03:00
vst1 . 3 2 { d g a - d g b } , [ r0 ]
2015-03-10 11:47:46 +03:00
bx l r
ENDPROC( s h a2 _ c e _ t r a n s f o r m )