2019-06-04 11:11:33 +03:00
/* SPDX-License-Identifier: GPL-2.0-only */
2015-03-10 11:47:45 +03:00
/ *
* sha1 - c e - c o r e . S - S H A - 1 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:45 +03:00
.fpu crypto- n e o n - f p - a r m v8
k0 . r e q q0
k1 . r e q q1
k2 . r e q q2
k3 . r e q q3
ta0 . r e q q4
ta1 . r e q q5
tb0 . r e q q5
tb1 . r e q q4
dga . r e q q6
dgb . r e q q7
dgbs . r e q s28
dg0 . r e q q12
dg1 a0 . r e q q13
dg1 a1 . r e q q14
dg1 b0 . r e q q14
dg1 b1 . r e q q13
.macro add_ o n l y , o p , e v , r c , s0 , d g 1
.ifnb \ s0
vadd. u 3 2 t b \ e v , q \ s0 , \ r c
.endif
sha1 h . 3 2 d g 1 b \ e v , d g 0
.ifb \ dg1
sha1 \ o p \ ( ) . 3 2 d g 0 , d g 1 a \ e v , t a \ e v
.else
sha1 \ o p \ ( ) . 3 2 d g 0 , \ d g 1 , t a \ e v
.endif
.endm
.macro add_ u p d a t e , o p , e v , r c , s0 , s1 , s2 , s3 , d g 1
sha1 s u 0 . 3 2 q \ s0 , q \ s1 , q \ s2
add_ o n l y \ o p , \ e v , \ r c , \ s1 , \ d g 1
sha1 s u 1 . 3 2 q \ s0 , q \ s3
.endm
.align 6
.Lsha1_rcon :
.word 0 x5 a82 7 9 9 9 , 0 x5 a82 7 9 9 9 , 0 x5 a82 7 9 9 9 , 0 x5 a82 7 9 9 9
.word 0 x6 e d9 e b a1 , 0 x6 e d9 e b a1 , 0 x6 e d9 e b a1 , 0 x6 e d9 e b a1
.word 0 x8 f1 b b c d c , 0 x8 f1 b b c d c , 0 x8 f1 b b c d c , 0 x8 f1 b b c d c
.word 0 xca6 2 c1 d6 , 0 x c a62 c1 d6 , 0 x c a62 c1 d6 , 0 x c a62 c1 d6
/ *
2015-04-09 13:55:41 +03:00
* void s h a1 _ c e _ t r a n s f o r m ( s t r u c t s h a1 _ 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:45 +03:00
* /
ENTRY( s h a1 _ c e _ t r a n s f o r m )
/* load round constants */
adr i p , . L s h a1 _ r c o n
vld1 . 3 2 { k 0 - k 1 } , [ i p , : 1 2 8 ] !
vld1 . 3 2 { k 2 - k 3 } , [ i p , : 1 2 8 ]
/* load state */
2015-04-09 13:55:41 +03:00
vld1 . 3 2 { d g a } , [ r0 ]
vldr d g b s , [ r0 , #16 ]
2015-03-10 11:47:45 +03:00
/* load input */
0 : vld1 . 3 2 { q8 - q9 } , [ r1 ] !
vld1 . 3 2 { q10 - q11 } , [ r1 ] !
2015-04-09 13:55:41 +03:00
subs r2 , r2 , #1
2015-03-10 11:47:45 +03:00
# ifndef C O N F I G _ C P U _ B I G _ E N D I A N
vrev3 2 . 8 q8 , q8
vrev3 2 . 8 q9 , q9
vrev3 2 . 8 q10 , q10
vrev3 2 . 8 q11 , q11
# endif
vadd. u 3 2 t a0 , q8 , k 0
vmov d g 0 , d g a
add_ u p d a t e c , 0 , k 0 , 8 , 9 , 1 0 , 1 1 , d g b
add_ u p d a t e c , 1 , k 0 , 9 , 1 0 , 1 1 , 8
add_ u p d a t e c , 0 , k 0 , 1 0 , 1 1 , 8 , 9
add_ u p d a t e c , 1 , k 0 , 1 1 , 8 , 9 , 1 0
add_ u p d a t e c , 0 , k 1 , 8 , 9 , 1 0 , 1 1
add_ u p d a t e p , 1 , k 1 , 9 , 1 0 , 1 1 , 8
add_ u p d a t e p , 0 , k 1 , 1 0 , 1 1 , 8 , 9
add_ u p d a t e p , 1 , k 1 , 1 1 , 8 , 9 , 1 0
add_ u p d a t e p , 0 , k 1 , 8 , 9 , 1 0 , 1 1
add_ u p d a t e p , 1 , k 2 , 9 , 1 0 , 1 1 , 8
add_ u p d a t e m , 0 , k 2 , 1 0 , 1 1 , 8 , 9
add_ u p d a t e m , 1 , k 2 , 1 1 , 8 , 9 , 1 0
add_ u p d a t e m , 0 , k 2 , 8 , 9 , 1 0 , 1 1
add_ u p d a t e m , 1 , k 2 , 9 , 1 0 , 1 1 , 8
add_ u p d a t e m , 0 , k 3 , 1 0 , 1 1 , 8 , 9
add_ u p d a t e p , 1 , k 3 , 1 1 , 8 , 9 , 1 0
add_ o n l y p , 0 , k 3 , 9
add_ o n l y p , 1 , k 3 , 1 0
add_ o n l y p , 0 , k 3 , 1 1
add_ o n l y p , 1
/* 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 a0
bne 0 b
/* store new state */
2015-04-09 13:55:41 +03:00
vst1 . 3 2 { d g a } , [ r0 ]
vstr d g b s , [ r0 , #16 ]
2015-03-10 11:47:45 +03:00
bx l r
ENDPROC( s h a1 _ c e _ t r a n s f o r m )