2018-01-19 15:04:38 +03:00
/* SPDX-License-Identifier: GPL-2.0 */
/ *
* sha3 - c e - c o r e . S - c o r e S H A - 3 t r a n s f o r m u s i n g v8 . 2 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 >
.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 ,2 0 ,2 1 ,2 2 ,2 3 ,2 4 ,2 5 ,2 6 ,2 7 ,2 8 ,2 9 ,3 0 ,3 1
.set .Lv \ b\ ( ) . 2 d , \ b
.set .Lv \ b\ ( ) . 1 6 b , \ b
.endr
/ *
* ARMv8 . 2 C r y p t o E x t e n s i o n s i n s t r u c t i o n s
* /
.macro eor3 , r d , r n , r m , r a
.inst 0xce000000 | .L \ rd | ( . L \ r n < < 5 ) | ( . L \ r a < < 1 0 ) | ( . L \ r m < < 1 6 )
.endm
.macro rax1 , r d , r n , r m
.inst 0xce608c00 | .L \ rd | ( . L \ r n < < 5 ) | ( . L \ r m < < 1 6 )
.endm
.macro bcax, r d , r n , r m , r a
.inst 0xce200000 | .L \ rd | ( . L \ r n < < 5 ) | ( . L \ r a < < 1 0 ) | ( . L \ r m < < 1 6 )
.endm
.macro xar, r d , r n , r m , i m m 6
.inst 0xce800000 | .L \ rd | ( . L \ r n < < 5 ) | ( ( \ i m m 6 ) < < 1 0 ) | ( . L \ r m < < 1 6 )
.endm
/ *
2021-02-03 14:36:21 +03:00
* int s h a3 _ c e _ t r a n s f o r m ( u 6 4 * s t , c o n s t u 8 * d a t a , i n t b l o c k s , i n t d g _ s i z e )
2018-01-19 15:04:38 +03:00
* /
.text
2019-12-13 18:49:10 +03:00
SYM_ F U N C _ S T A R T ( s h a3 _ c e _ t r a n s f o r m )
2021-02-03 14:36:21 +03:00
/* load state */
add x8 , x0 , #32
ld1 { v0 . 1 d - v3 . 1 d } , [ x0 ]
2018-01-19 15:04:38 +03:00
ld1 { v4 . 1 d - v7 . 1 d } , [ x8 ] , #32
ld1 { v8 . 1 d - v11 . 1 d } , [ x8 ] , #32
ld1 { v12 . 1 d - v15 . 1 d } , [ x8 ] , #32
ld1 { v16 . 1 d - v19 . 1 d } , [ x8 ] , #32
ld1 { v20 . 1 d - v23 . 1 d } , [ x8 ] , #32
ld1 { v24 . 1 d } , [ x8 ]
2021-02-03 14:36:21 +03:00
0 : sub w2 , w2 , #1
2018-01-19 15:04:38 +03:00
mov w8 , #24
adr_ l x9 , . L s h a3 _ r c o n
/* load input */
2021-02-03 14:36:21 +03:00
ld1 { v25 . 8 b - v28 . 8 b } , [ x1 ] , #32
ld1 { v29 . 8 b - v31 . 8 b } , [ x1 ] , #24
2018-01-19 15:04:38 +03:00
eor v0 . 8 b , v0 . 8 b , v25 . 8 b
eor v1 . 8 b , v1 . 8 b , v26 . 8 b
eor v2 . 8 b , v2 . 8 b , v27 . 8 b
eor v3 . 8 b , v3 . 8 b , v28 . 8 b
eor v4 . 8 b , v4 . 8 b , v29 . 8 b
eor v5 . 8 b , v5 . 8 b , v30 . 8 b
eor v6 . 8 b , v6 . 8 b , v31 . 8 b
2021-02-03 14:36:21 +03:00
tbnz x3 , #6 , 2 f / / S H A 3 - 5 1 2
2018-01-19 15:04:38 +03:00
2021-02-03 14:36:21 +03:00
ld1 { v25 . 8 b - v28 . 8 b } , [ x1 ] , #32
ld1 { v29 . 8 b - v30 . 8 b } , [ x1 ] , #16
2018-01-19 15:04:38 +03:00
eor v7 . 8 b , v7 . 8 b , v25 . 8 b
eor v8 . 8 b , v8 . 8 b , v26 . 8 b
eor v9 . 8 b , v9 . 8 b , v27 . 8 b
eor v10 . 8 b , v10 . 8 b , v28 . 8 b
eor v11 . 8 b , v11 . 8 b , v29 . 8 b
eor v12 . 8 b , v12 . 8 b , v30 . 8 b
2021-02-03 14:36:21 +03:00
tbnz x3 , #4 , 1 f / / S H A 3 - 3 8 4 o r S H A 3 - 2 2 4
2018-01-19 15:04:38 +03:00
/ / SHA3 - 2 5 6
2021-02-03 14:36:21 +03:00
ld1 { v25 . 8 b - v28 . 8 b } , [ x1 ] , #32
2018-01-19 15:04:38 +03:00
eor v13 . 8 b , v13 . 8 b , v25 . 8 b
eor v14 . 8 b , v14 . 8 b , v26 . 8 b
eor v15 . 8 b , v15 . 8 b , v27 . 8 b
eor v16 . 8 b , v16 . 8 b , v28 . 8 b
2021-02-03 14:36:21 +03:00
b 3 f
2018-01-19 15:04:38 +03:00
2021-02-03 14:36:21 +03:00
1 : tbz x3 , #2 , 3 f / / b i t 2 c l e a r e d ? S H A - 3 8 4
2018-01-19 15:04:38 +03:00
/ / SHA3 - 2 2 4
2021-02-03 14:36:21 +03:00
ld1 { v25 . 8 b - v28 . 8 b } , [ x1 ] , #32
ld1 { v29 . 8 b } , [ x1 ] , #8
2018-01-19 15:04:38 +03:00
eor v13 . 8 b , v13 . 8 b , v25 . 8 b
eor v14 . 8 b , v14 . 8 b , v26 . 8 b
eor v15 . 8 b , v15 . 8 b , v27 . 8 b
eor v16 . 8 b , v16 . 8 b , v28 . 8 b
eor v17 . 8 b , v17 . 8 b , v29 . 8 b
2021-02-03 14:36:21 +03:00
b 3 f
2018-01-19 15:04:38 +03:00
/ / SHA3 - 5 1 2
2021-02-03 14:36:21 +03:00
2 : ld1 { v25 . 8 b - v26 . 8 b } , [ x1 ] , #16
2018-01-19 15:04:38 +03:00
eor v7 . 8 b , v7 . 8 b , v25 . 8 b
eor v8 . 8 b , v8 . 8 b , v26 . 8 b
2021-02-03 14:36:21 +03:00
3 : sub w8 , w8 , #1
2018-01-19 15:04:38 +03:00
eor3 v29 . 1 6 b , v4 . 1 6 b , v9 . 1 6 b , v14 . 1 6 b
eor3 v26 . 1 6 b , v1 . 1 6 b , v6 . 1 6 b , v11 . 1 6 b
eor3 v28 . 1 6 b , v3 . 1 6 b , v8 . 1 6 b , v13 . 1 6 b
eor3 v25 . 1 6 b , v0 . 1 6 b , v5 . 1 6 b , v10 . 1 6 b
eor3 v27 . 1 6 b , v2 . 1 6 b , v7 . 1 6 b , v12 . 1 6 b
eor3 v29 . 1 6 b , v29 . 1 6 b , v19 . 1 6 b , v24 . 1 6 b
eor3 v26 . 1 6 b , v26 . 1 6 b , v16 . 1 6 b , v21 . 1 6 b
eor3 v28 . 1 6 b , v28 . 1 6 b , v18 . 1 6 b , v23 . 1 6 b
eor3 v25 . 1 6 b , v25 . 1 6 b , v15 . 1 6 b , v20 . 1 6 b
eor3 v27 . 1 6 b , v27 . 1 6 b , v17 . 1 6 b , v22 . 1 6 b
rax1 v30 . 2 d , v29 . 2 d , v26 . 2 d / / b c [ 0 ]
rax1 v26 . 2 d , v26 . 2 d , v28 . 2 d / / b c [ 2 ]
rax1 v28 . 2 d , v28 . 2 d , v25 . 2 d / / b c [ 4 ]
rax1 v25 . 2 d , v25 . 2 d , v27 . 2 d / / b c [ 1 ]
rax1 v27 . 2 d , v27 . 2 d , v29 . 2 d / / b c [ 3 ]
eor v0 . 1 6 b , v0 . 1 6 b , v30 . 1 6 b
xar v29 . 2 d , v1 . 2 d , v25 . 2 d , ( 6 4 - 1 )
xar v1 . 2 d , v6 . 2 d , v25 . 2 d , ( 6 4 - 4 4 )
xar v6 . 2 d , v9 . 2 d , v28 . 2 d , ( 6 4 - 2 0 )
xar v9 . 2 d , v22 . 2 d , v26 . 2 d , ( 6 4 - 6 1 )
xar v22 . 2 d , v14 . 2 d , v28 . 2 d , ( 6 4 - 3 9 )
xar v14 . 2 d , v20 . 2 d , v30 . 2 d , ( 6 4 - 1 8 )
xar v31 . 2 d , v2 . 2 d , v26 . 2 d , ( 6 4 - 6 2 )
xar v2 . 2 d , v12 . 2 d , v26 . 2 d , ( 6 4 - 4 3 )
xar v12 . 2 d , v13 . 2 d , v27 . 2 d , ( 6 4 - 2 5 )
xar v13 . 2 d , v19 . 2 d , v28 . 2 d , ( 6 4 - 8 )
xar v19 . 2 d , v23 . 2 d , v27 . 2 d , ( 6 4 - 5 6 )
xar v23 . 2 d , v15 . 2 d , v30 . 2 d , ( 6 4 - 4 1 )
xar v15 . 2 d , v4 . 2 d , v28 . 2 d , ( 6 4 - 2 7 )
xar v28 . 2 d , v24 . 2 d , v28 . 2 d , ( 6 4 - 1 4 )
xar v24 . 2 d , v21 . 2 d , v25 . 2 d , ( 6 4 - 2 )
xar v8 . 2 d , v8 . 2 d , v27 . 2 d , ( 6 4 - 5 5 )
xar v4 . 2 d , v16 . 2 d , v25 . 2 d , ( 6 4 - 4 5 )
xar v16 . 2 d , v5 . 2 d , v30 . 2 d , ( 6 4 - 3 6 )
xar v5 . 2 d , v3 . 2 d , v27 . 2 d , ( 6 4 - 2 8 )
xar v27 . 2 d , v18 . 2 d , v27 . 2 d , ( 6 4 - 2 1 )
xar v3 . 2 d , v17 . 2 d , v26 . 2 d , ( 6 4 - 1 5 )
xar v25 . 2 d , v11 . 2 d , v25 . 2 d , ( 6 4 - 1 0 )
xar v26 . 2 d , v7 . 2 d , v26 . 2 d , ( 6 4 - 6 )
xar v30 . 2 d , v10 . 2 d , v30 . 2 d , ( 6 4 - 3 )
bcax v20 . 1 6 b , v31 . 1 6 b , v22 . 1 6 b , v8 . 1 6 b
bcax v21 . 1 6 b , v8 . 1 6 b , v23 . 1 6 b , v22 . 1 6 b
bcax v22 . 1 6 b , v22 . 1 6 b , v24 . 1 6 b , v23 . 1 6 b
bcax v23 . 1 6 b , v23 . 1 6 b , v31 . 1 6 b , v24 . 1 6 b
bcax v24 . 1 6 b , v24 . 1 6 b , v8 . 1 6 b , v31 . 1 6 b
ld1 r { v31 . 2 d } , [ x9 ] , #8
bcax v17 . 1 6 b , v25 . 1 6 b , v19 . 1 6 b , v3 . 1 6 b
bcax v18 . 1 6 b , v3 . 1 6 b , v15 . 1 6 b , v19 . 1 6 b
bcax v19 . 1 6 b , v19 . 1 6 b , v16 . 1 6 b , v15 . 1 6 b
bcax v15 . 1 6 b , v15 . 1 6 b , v25 . 1 6 b , v16 . 1 6 b
bcax v16 . 1 6 b , v16 . 1 6 b , v3 . 1 6 b , v25 . 1 6 b
bcax v10 . 1 6 b , v29 . 1 6 b , v12 . 1 6 b , v26 . 1 6 b
bcax v11 . 1 6 b , v26 . 1 6 b , v13 . 1 6 b , v12 . 1 6 b
bcax v12 . 1 6 b , v12 . 1 6 b , v14 . 1 6 b , v13 . 1 6 b
bcax v13 . 1 6 b , v13 . 1 6 b , v29 . 1 6 b , v14 . 1 6 b
bcax v14 . 1 6 b , v14 . 1 6 b , v26 . 1 6 b , v29 . 1 6 b
bcax v7 . 1 6 b , v30 . 1 6 b , v9 . 1 6 b , v4 . 1 6 b
bcax v8 . 1 6 b , v4 . 1 6 b , v5 . 1 6 b , v9 . 1 6 b
bcax v9 . 1 6 b , v9 . 1 6 b , v6 . 1 6 b , v5 . 1 6 b
bcax v5 . 1 6 b , v5 . 1 6 b , v30 . 1 6 b , v6 . 1 6 b
bcax v6 . 1 6 b , v6 . 1 6 b , v4 . 1 6 b , v30 . 1 6 b
bcax v3 . 1 6 b , v27 . 1 6 b , v0 . 1 6 b , v28 . 1 6 b
bcax v4 . 1 6 b , v28 . 1 6 b , v1 . 1 6 b , v0 . 1 6 b
bcax v0 . 1 6 b , v0 . 1 6 b , v2 . 1 6 b , v1 . 1 6 b
bcax v1 . 1 6 b , v1 . 1 6 b , v27 . 1 6 b , v2 . 1 6 b
bcax v2 . 1 6 b , v2 . 1 6 b , v28 . 1 6 b , v27 . 1 6 b
eor v0 . 1 6 b , v0 . 1 6 b , v31 . 1 6 b
2021-02-03 14:36:21 +03:00
cbnz w8 , 3 b
2021-03-02 12:01:12 +03:00
cond_ y i e l d 4 f , x8 , x9
2021-02-03 14:36:21 +03:00
cbnz w2 , 0 b
2018-01-19 15:04:38 +03:00
/* save state */
2021-03-02 12:01:12 +03:00
4 : st1 { v0 . 1 d - v3 . 1 d } , [ x0 ] , #32
2021-02-03 14:36:21 +03:00
st1 { v4 . 1 d - v7 . 1 d } , [ x0 ] , #32
st1 { v8 . 1 d - v11 . 1 d } , [ x0 ] , #32
st1 { v12 . 1 d - v15 . 1 d } , [ x0 ] , #32
st1 { v16 . 1 d - v19 . 1 d } , [ x0 ] , #32
st1 { v20 . 1 d - v23 . 1 d } , [ x0 ] , #32
st1 { v24 . 1 d } , [ x0 ]
mov w0 , w2
2018-01-19 15:04:38 +03:00
ret
2019-12-13 18:49:10 +03:00
SYM_ F U N C _ E N D ( s h a3 _ c e _ t r a n s f o r m )
2018-01-19 15:04:38 +03:00
.section " .rodata " , " a"
.align 8
.Lsha3_rcon :
.quad 0 x0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 , 0 x00 0 0 0 0 0 0 0 0 0 0 8 0 8 2 , 0 x80 0 0 0 0 0 0 0 0 0 0 8 0 8 a
.quad 0 x8 0 0 0 0 0 0 0 8 0 0 0 8 0 0 0 , 0 x00 0 0 0 0 0 0 0 0 0 0 8 0 8 b , 0 x00 0 0 0 0 0 0 8 0 0 0 0 0 0 1
.quad 0 x8 0 0 0 0 0 0 0 8 0 0 0 8 0 8 1 , 0 x80 0 0 0 0 0 0 0 0 0 0 8 0 0 9 , 0 x00 0 0 0 0 0 0 0 0 0 0 0 0 8 a
.quad 0 x0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 8 , 0 x00 0 0 0 0 0 0 8 0 0 0 8 0 0 9 , 0 x00 0 0 0 0 0 0 8 0 0 0 0 0 0 a
.quad 0 x0 0 0 0 0 0 0 0 8 0 0 0 8 0 8 b , 0 x80 0 0 0 0 0 0 0 0 0 0 0 0 8 b , 0 x80 0 0 0 0 0 0 0 0 0 0 8 0 8 9
.quad 0 x8 0 0 0 0 0 0 0 0 0 0 0 8 0 0 3 , 0 x80 0 0 0 0 0 0 0 0 0 0 8 0 0 2 , 0 x80 0 0 0 0 0 0 0 0 0 0 0 0 8 0
.quad 0 x0 0 0 0 0 0 0 0 0 0 0 0 8 0 0 a , 0 x80 0 0 0 0 0 0 8 0 0 0 0 0 0 a , 0 x80 0 0 0 0 0 0 8 0 0 0 8 0 8 1
.quad 0 x8 0 0 0 0 0 0 0 0 0 0 0 8 0 8 0 , 0 x00 0 0 0 0 0 0 8 0 0 0 0 0 0 1 , 0 x80 0 0 0 0 0 0 8 0 0 0 8 0 0 8