/* SPDX-License-Identifier: GPL-2.0-only */
/*
* sm3-ce-core.S - SM3 secure hash using ARMv8.2 Crypto Extensions
*
* Copyright (C) 2018 Linaro Ltd <ard.biesheuvel@linaro.org>
*/
#include <linux/linkage.h>
#include <linux/cfi_types.h>
#include <asm/assembler.h>
.irp b, 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12
.set .Lv\b\().4 s, \b
.endr
.macro sm3partw1, rd, rn, rm
.inst 0 xce60c000 | .L\rd | (.L\rn << 5 ) | (.L\rm << 16 )
.endm
.macro sm3partw2, rd, rn, rm
.inst 0 xce60c400 | .L\rd | (.L\rn << 5 ) | (.L\rm << 16 )
.endm
.macro sm3ss1, rd, rn, rm, ra
.inst 0 xce400000 | .L\rd | (.L\rn << 5 ) | (.L\ra << 10 ) | (.L\rm << 16 )
.endm
.macro sm3tt1a, rd, rn, rm, imm2
.inst 0 xce408000 | .L\rd | (.L\rn << 5 ) | ((\imm2) << 12 ) | (.L\rm << 16 )
.endm
.macro sm3tt1b, rd, rn, rm, imm2
.inst 0 xce408400 | .L\rd | (.L\rn << 5 ) | ((\imm2) << 12 ) | (.L\rm << 16 )
.endm
.macro sm3tt2a, rd, rn, rm, imm2
.inst 0 xce408800 | .L\rd | (.L\rn << 5 ) | ((\imm2) << 12 ) | (.L\rm << 16 )
.endm
.macro sm3tt2b, rd, rn, rm, imm2
.inst 0 xce408c00 | .L\rd | (.L\rn << 5 ) | ((\imm2) << 12 ) | (.L\rm << 16 )
.endm
.macro round, ab, s0, t0, t1, i
sm3ss1 v5.4 s, v8.4 s, \t0\().4 s, v9.4 s
shl \t1\().4 s, \t0\().4 s, #1
sri \t1\().4 s, \t0\().4 s, #31
sm3tt1\ab v8.4 s, v5.4 s, v10.4 s, \i
sm3tt2\ab v9.4 s, v5.4 s, \s0\().4 s, \i
.endm
.macro qround, ab, s0, s1, s2, s3, s4
.ifnb \s4
ext \s4\().16 b, \s1\().16 b, \s2\().16 b, #12
ext v6.16 b, \s0\().16 b, \s1\().16 b, #12
ext v7.16 b, \s2\().16 b, \s3\().16 b, #8
sm3partw1 \s4\().4 s, \s0\().4 s, \s3\().4 s
.endif
eor v10.16 b, \s0\().16 b, \s1\().16 b
round \ab, \s0, v11, v12, 0
round \ab, \s0, v12, v11, 1
round \ab, \s0, v11, v12, 2
round \ab, \s0, v12, v11, 3
.ifnb \s4
sm3partw2 \s4\().4 s, v7.4 s, v6.4 s
.endif
.endm
/*
* void sm3_ce_transform(struct sm3_state *sst, u8 const *src,
* int blocks)
*/
.text
SYM_TYPED_FUNC_START(sm3_ce_transform)
/* load state */
ld1 {v8.4 s-v9.4 s}, [x0]
rev64 v8.4 s, v8.4 s
rev64 v9.4 s, v9.4 s
ext v8.16 b, v8.16 b, v8.16 b, #8
ext v9.16 b, v9.16 b, v9.16 b, #8
adr_l x8, .Lt
ldp s13, s14, [x8]
/* load input */
0 : ld1 {v0.16 b-v3.16 b}, [x1], #64
sub w2, w2, #1
mov v15.16 b, v8.16 b
mov v16.16 b, v9.16 b
CPU_LE( rev32 v0.16 b, v0.16 b )
CPU_LE( rev32 v1.16 b, v1.16 b )
CPU_LE( rev32 v2.16 b, v2.16 b )
CPU_LE( rev32 v3.16 b, v3.16 b )
ext v11.16 b, v13.16 b, v13.16 b, #4
qround a, v0, v1, v2, v3, v4
qround a, v1, v2, v3, v4, v0
qround a, v2, v3, v4, v0, v1
qround a, v3, v4, v0, v1, v2
ext v11.16 b, v14.16 b, v14.16 b, #4
qround b, v4, v0, v1, v2, v3
qround b, v0, v1, v2, v3, v4
qround b, v1, v2, v3, v4, v0
qround b, v2, v3, v4, v0, v1
qround b, v3, v4, v0, v1, v2
qround b, v4, v0, v1, v2, v3
qround b, v0, v1, v2, v3, v4
qround b, v1, v2, v3, v4, v0
qround b, v2, v3, v4, v0, v1
qround b, v3, v4
qround b, v4, v0
qround b, v0, v1
eor v8.16 b, v8.16 b, v15.16 b
eor v9.16 b, v9.16 b, v16.16 b
/* handled all input blocks? */
cbnz w2, 0 b
/* save state */
rev64 v8.4 s, v8.4 s
rev64 v9.4 s, v9.4 s
ext v8.16 b, v8.16 b, v8.16 b, #8
ext v9.16 b, v9.16 b, v9.16 b, #8
st1 {v8.4 s-v9.4 s}, [x0]
ret
SYM_FUNC_END(sm3_ce_transform)
.section ".rodata" , "a"
.align 3
.Lt: .word 0 x79cc4519, 0 x9d8a7a87
Messung V0.5 in Prozent C=90 H=92 G=90
¤ Dauer der Verarbeitung: 0.9 Sekunden
(vorverarbeitet am 2026-06-07)
¤
*© Formatika GbR, Deutschland