2018-01-09 21:23:02 +03:00
/* SPDX-License-Identifier: GPL-2.0 */
/ *
* sha5 1 2 - c e - c o r e . S - c o r e S H A - 3 8 4 / S H A - 5 1 2 t r a n s f o r m u s i n g v8 C r y p t o E x t e n s i o n s
*
* Copyright ( C ) 2 0 1 8 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 .
* /
# 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 >
2018-01-19 15:04:40 +03:00
.irp b,0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,1 0 ,1 1 ,1 2 ,1 3 ,1 4 ,1 5 ,1 6 ,1 7 ,1 8 ,1 9
2018-01-09 21:23:02 +03:00
.set .Lq \ b, \ b
.set .Lv \ b\ ( ) . 2 d , \ b
.endr
.macro sha5 1 2 h , r d , r n , r m
.inst 0xce608000 | .L \ rd | ( . L \ r n < < 5 ) | ( . L \ r m < < 1 6 )
.endm
.macro sha5 1 2 h2 , r d , r n , r m
.inst 0xce608400 | .L \ rd | ( . L \ r n < < 5 ) | ( . L \ r m < < 1 6 )
.endm
.macro sha5 1 2 s u 0 , r d , r n
.inst 0xcec08000 | .L \ rd | ( . L \ r n < < 5 )
.endm
.macro sha5 1 2 s u 1 , r d , r n , r m
.inst 0xce608800 | .L \ rd | ( . L \ r n < < 5 ) | ( . L \ r m < < 1 6 )
.endm
/ *
* The S H A - 5 1 2 r o u n d c o n s t a n t s
* /
2018-01-19 15:04:40 +03:00
.section " .rodata " , " a"
2018-01-09 21:23:02 +03:00
.align 4
.Lsha512_rcon :
.quad 0 x4 2 8 a2 f98 d72 8 a e 2 2 , 0 x71 3 7 4 4 9 1 2 3 e f65 c d
.quad 0 xb5 c0 f b c f e c4 d3 b2 f , 0 x e 9 b5 d b a58 1 8 9 d b b c
.quad 0 x3 9 5 6 c25 b f34 8 b53 8 , 0 x59 f11 1 f1 b60 5 d01 9
.quad 0 x9 2 3 f82 a4 a f19 4 f9 b , 0 x a b1 c5 e d5 d a6 d81 1 8
.quad 0 xd8 0 7 a a98 a30 3 0 2 4 2 , 0 x12 8 3 5 b01 4 5 7 0 6 f b e
.quad 0 x2 4 3 1 8 5 b e 4 e e 4 b28 c , 0 x55 0 c7 d c3 d5 f f b4 e 2
.quad 0 x7 2 b e 5 d74 f27 b89 6 f , 0 x80 d e b1 f e 3 b16 9 6 b1
.quad 0 x9 b d c06 a72 5 c71 2 3 5 , 0 x c19 b f17 4 c f69 2 6 9 4
.quad 0 xe4 9 b69 c19 e f14 a d2 , 0 x e f b e 4 7 8 6 3 8 4 f25 e 3
.quad 0 x0 f c19 d c68 b8 c d5 b5 , 0 x24 0 c a1 c c77 a c9 c65
.quad 0 x2 d e 9 2 c6 f59 2 b02 7 5 , 0 x4 a74 8 4 a a6 e a6 e 4 8 3
.quad 0 x5 c b0 a9 d c b d41 f b d4 , 0 x76 f98 8 d a83 1 1 5 3 b5
.quad 0 x9 8 3 e 5 1 5 2 e e 6 6 d f a b , 0 x a83 1 c66 d2 d b43 2 1 0
.quad 0 xb0 0 3 2 7 c89 8 f b21 3 f , 0 x b f59 7 f c7 b e e f0 e e 4
.quad 0 xc6 e 0 0 b f33 d a88 f c2 , 0 x d5 a79 1 4 7 9 3 0 a a72 5
.quad 0 x0 6 c a63 5 1 e 0 0 3 8 2 6 f , 0 x14 2 9 2 9 6 7 0 a0 e 6 e 7 0
.quad 0 x2 7 b70 a85 4 6 d22 f f c , 0 x2 e 1 b21 3 8 5 c26 c92 6
.quad 0 x4 d2 c6 d f c5 a c42 a e d , 0 x53 3 8 0 d13 9 d95 b3 d f
.quad 0 x6 5 0 a73 5 4 8 b a f63 d e , 0 x76 6 a0 a b b3 c77 b2 a8
.quad 0 x8 1 c2 c92 e 4 7 e d a e e 6 , 0 x92 7 2 2 c85 1 4 8 2 3 5 3 b
.quad 0 xa2 b f e 8 a14 c f10 3 6 4 , 0 x a81 a66 4 b b c42 3 0 0 1
.quad 0 xc2 4 b8 b70 d0 f89 7 9 1 , 0 x c76 c51 a30 6 5 4 b e 3 0
.quad 0 xd1 9 2 e 8 1 9 d6 e f52 1 8 , 0 x d69 9 0 6 2 4 5 5 6 5 a91 0
.quad 0 xf4 0 e 3 5 8 5 5 7 7 1 2 0 2 a , 0 x10 6 a a07 0 3 2 b b d1 b8
.quad 0 x1 9 a4 c11 6 b8 d2 d0 c8 , 0 x1 e 3 7 6 c08 5 1 4 1 a b53
.quad 0 x2 7 4 8 7 7 4 c d f8 e e b99 , 0 x34 b0 b c b5 e 1 9 b48 a8
.quad 0 x3 9 1 c0 c b3 c5 c95 a63 , 0 x4 e d8 a a4 a e 3 4 1 8 a c b
.quad 0 x5 b9 c c a4 f77 6 3 e 3 7 3 , 0 x68 2 e 6 f f3 d6 b2 b8 a3
.quad 0 x7 4 8 f82 e e 5 d e f b2 f c , 0 x78 a56 3 6 f43 1 7 2 f60
.quad 0 x8 4 c87 8 1 4 a1 f0 a b72 , 0 x8 c c70 2 0 8 1 a64 3 9 e c
.quad 0 x9 0 b e f f f a23 6 3 1 e 2 8 , 0 x a45 0 6 c e b d e 8 2 b d e 9
.quad 0 xbef9 a3 f7 b2 c67 9 1 5 , 0 x c67 1 7 8 f2 e 3 7 2 5 3 2 b
.quad 0 xca2 7 3 e c e e a26 6 1 9 c , 0 x d18 6 b8 c72 1 c0 c20 7
.quad 0 xeada7 d d6 c d e 0 e b1 e , 0 x f57 d4 f7 f e e 6 e d17 8
.quad 0 x0 6 f06 7 a a72 1 7 6 f b a , 0 x0 a63 7 d c5 a2 c89 8 a6
.quad 0 x1 1 3 f98 0 4 b e f90 d a e , 0 x1 b71 0 b35 1 3 1 c47 1 b
.quad 0 x2 8 d b77 f52 3 0 4 7 d84 , 0 x32 c a a b7 b40 c72 4 9 3
.quad 0 x3 c9 e b e 0 a15 c9 b e b c , 0 x43 1 d67 c49 c10 0 d4 c
.quad 0 x4 c c5 d4 b e c b3 e 4 2 b6 , 0 x59 7 f29 9 c f c65 7 e 2 a
.quad 0 x5 f c b6 f a b3 a d6 f a e c , 0 x6 c44 1 9 8 c4 a47 5 8 1 7
.macro dround, i 0 , i 1 , i 2 , i 3 , i 4 , r c0 , r c1 , i n 0 , i n 1 , i n 2 , i n 3 , i n 4
.ifnb \ rc1
2018-01-19 15:04:40 +03:00
ld1 { v \ r c1 \ ( ) . 2 d } , [ x4 ] , #16
2018-01-09 21:23:02 +03:00
.endif
2018-01-19 15:04:40 +03:00
add v5 . 2 d , v \ r c0 \ ( ) . 2 d , v \ i n 0 \ ( ) . 2 d
2018-01-09 21:23:02 +03:00
ext v6 . 1 6 b , v \ i 2 \ ( ) . 1 6 b , v \ i 3 \ ( ) . 1 6 b , #8
2018-01-19 15:04:40 +03:00
ext v5 . 1 6 b , v5 . 1 6 b , v5 . 1 6 b , #8
2018-01-09 21:23:02 +03:00
ext v7 . 1 6 b , v \ i 1 \ ( ) . 1 6 b , v \ i 2 \ ( ) . 1 6 b , #8
2018-01-19 15:04:40 +03:00
add v \ i 3 \ ( ) . 2 d , v \ i 3 \ ( ) . 2 d , v5 . 2 d
2018-01-09 21:23:02 +03:00
.ifnb \ in1
2018-01-19 15:04:40 +03:00
ext v5 . 1 6 b , v \ i n 3 \ ( ) . 1 6 b , v \ i n 4 \ ( ) . 1 6 b , #8
2018-01-09 21:23:02 +03:00
sha5 1 2 s u 0 v \ i n 0 \ ( ) . 2 d , v \ i n 1 \ ( ) . 2 d
.endif
sha5 1 2 h q \ i 3 , q6 , v7 . 2 d
.ifnb \ in1
2018-01-19 15:04:40 +03:00
sha5 1 2 s u 1 v \ i n 0 \ ( ) . 2 d , v \ i n 2 \ ( ) . 2 d , v5 . 2 d
2018-01-09 21:23:02 +03:00
.endif
add v \ i 4 \ ( ) . 2 d , v \ i 1 \ ( ) . 2 d , v \ i 3 \ ( ) . 2 d
sha5 1 2 h2 q \ i 3 , q \ i 1 , v \ i 0 \ ( ) . 2 d
.endm
/ *
* void s h a51 2 _ c e _ t r a n s f o r m ( s t r u c t s h a51 2 _ 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 )
* /
2018-01-19 15:04:40 +03:00
.text
2019-12-13 18:49:10 +03:00
SYM_ F U N C _ S T A R T ( s h a51 2 _ c e _ t r a n s f o r m )
2018-04-30 19:18:30 +03:00
frame_ p u s h 3
mov x19 , x0
mov x20 , x1
mov x21 , x2
2018-01-09 21:23:02 +03:00
/* load state */
2018-04-30 19:18:30 +03:00
0 : ld1 { v8 . 2 d - v11 . 2 d } , [ x19 ]
2018-01-19 15:04:40 +03:00
/* load first 4 round constants */
adr_ l x3 , . L s h a51 2 _ r c o n
ld1 { v20 . 2 d - v23 . 2 d } , [ x3 ] , #64
2018-01-09 21:23:02 +03:00
/* load input */
2018-04-30 19:18:30 +03:00
1 : ld1 { v12 . 2 d - v15 . 2 d } , [ x20 ] , #64
ld1 { v16 . 2 d - v19 . 2 d } , [ x20 ] , #64
sub w21 , w21 , #1
2018-01-09 21:23:02 +03:00
CPU_ L E ( r e v64 v12 . 1 6 b , v12 . 1 6 b )
CPU_ L E ( r e v64 v13 . 1 6 b , v13 . 1 6 b )
CPU_ L E ( r e v64 v14 . 1 6 b , v14 . 1 6 b )
CPU_ L E ( r e v64 v15 . 1 6 b , v15 . 1 6 b )
CPU_ L E ( r e v64 v16 . 1 6 b , v16 . 1 6 b )
CPU_ L E ( r e v64 v17 . 1 6 b , v17 . 1 6 b )
CPU_ L E ( r e v64 v18 . 1 6 b , v18 . 1 6 b )
CPU_ L E ( r e v64 v19 . 1 6 b , v19 . 1 6 b )
2018-01-19 15:04:40 +03:00
mov x4 , x3 / / r c p o i n t e r
2018-01-09 21:23:02 +03:00
2018-01-19 15:04:40 +03:00
mov v0 . 1 6 b , v8 . 1 6 b
mov v1 . 1 6 b , v9 . 1 6 b
mov v2 . 1 6 b , v10 . 1 6 b
mov v3 . 1 6 b , v11 . 1 6 b
2018-01-09 21:23:02 +03:00
/ / v0 a b c d - - e f g h a b
/ / v1 c d - - e f g h a b c d
/ / v2 e f g h a b c d - - e f
/ / v3 g h a b c d - - e f g h
/ / v4 - - e f g h a b c d - -
2018-01-19 15:04:40 +03:00
dround 0 , 1 , 2 , 3 , 4 , 2 0 , 2 4 , 1 2 , 1 3 , 1 9 , 1 6 , 1 7
dround 3 , 0 , 4 , 2 , 1 , 2 1 , 2 5 , 1 3 , 1 4 , 1 2 , 1 7 , 1 8
dround 2 , 3 , 1 , 4 , 0 , 2 2 , 2 6 , 1 4 , 1 5 , 1 3 , 1 8 , 1 9
dround 4 , 2 , 0 , 1 , 3 , 2 3 , 2 7 , 1 5 , 1 6 , 1 4 , 1 9 , 1 2
dround 1 , 4 , 3 , 0 , 2 , 2 4 , 2 8 , 1 6 , 1 7 , 1 5 , 1 2 , 1 3
dround 0 , 1 , 2 , 3 , 4 , 2 5 , 2 9 , 1 7 , 1 8 , 1 6 , 1 3 , 1 4
dround 3 , 0 , 4 , 2 , 1 , 2 6 , 3 0 , 1 8 , 1 9 , 1 7 , 1 4 , 1 5
dround 2 , 3 , 1 , 4 , 0 , 2 7 , 3 1 , 1 9 , 1 2 , 1 8 , 1 5 , 1 6
dround 4 , 2 , 0 , 1 , 3 , 2 8 , 2 4 , 1 2 , 1 3 , 1 9 , 1 6 , 1 7
dround 1 , 4 , 3 , 0 , 2 , 2 9 , 2 5 , 1 3 , 1 4 , 1 2 , 1 7 , 1 8
dround 0 , 1 , 2 , 3 , 4 , 3 0 , 2 6 , 1 4 , 1 5 , 1 3 , 1 8 , 1 9
dround 3 , 0 , 4 , 2 , 1 , 3 1 , 2 7 , 1 5 , 1 6 , 1 4 , 1 9 , 1 2
dround 2 , 3 , 1 , 4 , 0 , 2 4 , 2 8 , 1 6 , 1 7 , 1 5 , 1 2 , 1 3
dround 4 , 2 , 0 , 1 , 3 , 2 5 , 2 9 , 1 7 , 1 8 , 1 6 , 1 3 , 1 4
dround 1 , 4 , 3 , 0 , 2 , 2 6 , 3 0 , 1 8 , 1 9 , 1 7 , 1 4 , 1 5
dround 0 , 1 , 2 , 3 , 4 , 2 7 , 3 1 , 1 9 , 1 2 , 1 8 , 1 5 , 1 6
dround 3 , 0 , 4 , 2 , 1 , 2 8 , 2 4 , 1 2 , 1 3 , 1 9 , 1 6 , 1 7
dround 2 , 3 , 1 , 4 , 0 , 2 9 , 2 5 , 1 3 , 1 4 , 1 2 , 1 7 , 1 8
dround 4 , 2 , 0 , 1 , 3 , 3 0 , 2 6 , 1 4 , 1 5 , 1 3 , 1 8 , 1 9
dround 1 , 4 , 3 , 0 , 2 , 3 1 , 2 7 , 1 5 , 1 6 , 1 4 , 1 9 , 1 2
dround 0 , 1 , 2 , 3 , 4 , 2 4 , 2 8 , 1 6 , 1 7 , 1 5 , 1 2 , 1 3
dround 3 , 0 , 4 , 2 , 1 , 2 5 , 2 9 , 1 7 , 1 8 , 1 6 , 1 3 , 1 4
dround 2 , 3 , 1 , 4 , 0 , 2 6 , 3 0 , 1 8 , 1 9 , 1 7 , 1 4 , 1 5
dround 4 , 2 , 0 , 1 , 3 , 2 7 , 3 1 , 1 9 , 1 2 , 1 8 , 1 5 , 1 6
dround 1 , 4 , 3 , 0 , 2 , 2 8 , 2 4 , 1 2 , 1 3 , 1 9 , 1 6 , 1 7
dround 0 , 1 , 2 , 3 , 4 , 2 9 , 2 5 , 1 3 , 1 4 , 1 2 , 1 7 , 1 8
dround 3 , 0 , 4 , 2 , 1 , 3 0 , 2 6 , 1 4 , 1 5 , 1 3 , 1 8 , 1 9
dround 2 , 3 , 1 , 4 , 0 , 3 1 , 2 7 , 1 5 , 1 6 , 1 4 , 1 9 , 1 2
dround 4 , 2 , 0 , 1 , 3 , 2 4 , 2 8 , 1 6 , 1 7 , 1 5 , 1 2 , 1 3
dround 1 , 4 , 3 , 0 , 2 , 2 5 , 2 9 , 1 7 , 1 8 , 1 6 , 1 3 , 1 4
dround 0 , 1 , 2 , 3 , 4 , 2 6 , 3 0 , 1 8 , 1 9 , 1 7 , 1 4 , 1 5
dround 3 , 0 , 4 , 2 , 1 , 2 7 , 3 1 , 1 9 , 1 2 , 1 8 , 1 5 , 1 6
dround 2 , 3 , 1 , 4 , 0 , 2 8 , 2 4 , 1 2
dround 4 , 2 , 0 , 1 , 3 , 2 9 , 2 5 , 1 3
dround 1 , 4 , 3 , 0 , 2 , 3 0 , 2 6 , 1 4
dround 0 , 1 , 2 , 3 , 4 , 3 1 , 2 7 , 1 5
dround 3 , 0 , 4 , 2 , 1 , 2 4 , , 1 6
dround 2 , 3 , 1 , 4 , 0 , 2 5 , , 1 7
dround 4 , 2 , 0 , 1 , 3 , 2 6 , , 1 8
dround 1 , 4 , 3 , 0 , 2 , 2 7 , , 1 9
2018-01-09 21:23:02 +03:00
/* update state */
2018-01-19 15:04:40 +03:00
add v8 . 2 d , v8 . 2 d , v0 . 2 d
add v9 . 2 d , v9 . 2 d , v1 . 2 d
add v10 . 2 d , v10 . 2 d , v2 . 2 d
add v11 . 2 d , v11 . 2 d , v3 . 2 d
2018-01-09 21:23:02 +03:00
/* handled all input blocks? */
2018-04-30 19:18:30 +03:00
cbz w21 , 3 f
if_ w i l l _ c o n d _ y i e l d _ n e o n
st1 { v8 . 2 d - v11 . 2 d } , [ x19 ]
do_ c o n d _ y i e l d _ n e o n
b 0 b
endif_ y i e l d _ n e o n
b 1 b
2018-01-09 21:23:02 +03:00
/* store new state */
2018-04-30 19:18:30 +03:00
3 : st1 { v8 . 2 d - v11 . 2 d } , [ x19 ]
frame_ p o p
2018-01-09 21:23:02 +03:00
ret
2019-12-13 18:49:10 +03:00
SYM_ F U N C _ E N D ( s h a51 2 _ c e _ t r a n s f o r m )