xref: /linux/lib/crypto/arm64/sm3-ce-core.S (revision 370c3883195566ee3e7d79e0146c3d735a406573)
19f69f52bSEric Biggers/* SPDX-License-Identifier: GPL-2.0-only */
29f69f52bSEric Biggers/*
39f69f52bSEric Biggers * sm3-ce-core.S - SM3 secure hash using ARMv8.2 Crypto Extensions
49f69f52bSEric Biggers *
59f69f52bSEric Biggers * Copyright (C) 2018 Linaro Ltd <ard.biesheuvel@linaro.org>
69f69f52bSEric Biggers */
79f69f52bSEric Biggers
89f69f52bSEric Biggers#include <linux/linkage.h>
99f69f52bSEric Biggers#include <asm/assembler.h>
109f69f52bSEric Biggers
119f69f52bSEric Biggers	.irp		b, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
129f69f52bSEric Biggers	.set		.Lv\b\().4s, \b
139f69f52bSEric Biggers	.endr
149f69f52bSEric Biggers
159f69f52bSEric Biggers	.macro		sm3partw1, rd, rn, rm
169f69f52bSEric Biggers	.inst		0xce60c000 | .L\rd | (.L\rn << 5) | (.L\rm << 16)
179f69f52bSEric Biggers	.endm
189f69f52bSEric Biggers
199f69f52bSEric Biggers	.macro		sm3partw2, rd, rn, rm
209f69f52bSEric Biggers	.inst		0xce60c400 | .L\rd | (.L\rn << 5) | (.L\rm << 16)
219f69f52bSEric Biggers	.endm
229f69f52bSEric Biggers
239f69f52bSEric Biggers	.macro		sm3ss1, rd, rn, rm, ra
249f69f52bSEric Biggers	.inst		0xce400000 | .L\rd | (.L\rn << 5) | (.L\ra << 10) | (.L\rm << 16)
259f69f52bSEric Biggers	.endm
269f69f52bSEric Biggers
279f69f52bSEric Biggers	.macro		sm3tt1a, rd, rn, rm, imm2
289f69f52bSEric Biggers	.inst		0xce408000 | .L\rd | (.L\rn << 5) | ((\imm2) << 12) | (.L\rm << 16)
299f69f52bSEric Biggers	.endm
309f69f52bSEric Biggers
319f69f52bSEric Biggers	.macro		sm3tt1b, rd, rn, rm, imm2
329f69f52bSEric Biggers	.inst		0xce408400 | .L\rd | (.L\rn << 5) | ((\imm2) << 12) | (.L\rm << 16)
339f69f52bSEric Biggers	.endm
349f69f52bSEric Biggers
359f69f52bSEric Biggers	.macro		sm3tt2a, rd, rn, rm, imm2
369f69f52bSEric Biggers	.inst		0xce408800 | .L\rd | (.L\rn << 5) | ((\imm2) << 12) | (.L\rm << 16)
379f69f52bSEric Biggers	.endm
389f69f52bSEric Biggers
399f69f52bSEric Biggers	.macro		sm3tt2b, rd, rn, rm, imm2
409f69f52bSEric Biggers	.inst		0xce408c00 | .L\rd | (.L\rn << 5) | ((\imm2) << 12) | (.L\rm << 16)
419f69f52bSEric Biggers	.endm
429f69f52bSEric Biggers
439f69f52bSEric Biggers	.macro		round, ab, s0, t0, t1, i
449f69f52bSEric Biggers	sm3ss1		v5.4s, v8.4s, \t0\().4s, v9.4s
459f69f52bSEric Biggers	shl		\t1\().4s, \t0\().4s, #1
469f69f52bSEric Biggers	sri		\t1\().4s, \t0\().4s, #31
479f69f52bSEric Biggers	sm3tt1\ab	v8.4s, v5.4s, v10.4s, \i
489f69f52bSEric Biggers	sm3tt2\ab	v9.4s, v5.4s, \s0\().4s, \i
499f69f52bSEric Biggers	.endm
509f69f52bSEric Biggers
519f69f52bSEric Biggers	.macro		qround, ab, s0, s1, s2, s3, s4
529f69f52bSEric Biggers	.ifnb		\s4
539f69f52bSEric Biggers	ext		\s4\().16b, \s1\().16b, \s2\().16b, #12
549f69f52bSEric Biggers	ext		v6.16b, \s0\().16b, \s1\().16b, #12
559f69f52bSEric Biggers	ext		v7.16b, \s2\().16b, \s3\().16b, #8
569f69f52bSEric Biggers	sm3partw1	\s4\().4s, \s0\().4s, \s3\().4s
579f69f52bSEric Biggers	.endif
589f69f52bSEric Biggers
599f69f52bSEric Biggers	eor		v10.16b, \s0\().16b, \s1\().16b
609f69f52bSEric Biggers
619f69f52bSEric Biggers	round		\ab, \s0, v11, v12, 0
629f69f52bSEric Biggers	round		\ab, \s0, v12, v11, 1
639f69f52bSEric Biggers	round		\ab, \s0, v11, v12, 2
649f69f52bSEric Biggers	round		\ab, \s0, v12, v11, 3
659f69f52bSEric Biggers
669f69f52bSEric Biggers	.ifnb		\s4
679f69f52bSEric Biggers	sm3partw2	\s4\().4s, v7.4s, v6.4s
689f69f52bSEric Biggers	.endif
699f69f52bSEric Biggers	.endm
709f69f52bSEric Biggers
719f69f52bSEric Biggers	/*
729f69f52bSEric Biggers	 * void sm3_ce_transform(struct sm3_block_state *state,
739f69f52bSEric Biggers	 *			 const u8 *data, size_t nblocks)
749f69f52bSEric Biggers	 */
759f69f52bSEric Biggers	.text
769f69f52bSEric BiggersSYM_FUNC_START(sm3_ce_transform)
779f69f52bSEric Biggers	/* load state */
789f69f52bSEric Biggers	ld1		{v8.4s-v9.4s}, [x0]
799f69f52bSEric Biggers	rev64		v8.4s, v8.4s
809f69f52bSEric Biggers	rev64		v9.4s, v9.4s
819f69f52bSEric Biggers	ext		v8.16b, v8.16b, v8.16b, #8
829f69f52bSEric Biggers	ext		v9.16b, v9.16b, v9.16b, #8
839f69f52bSEric Biggers
849f69f52bSEric Biggers	adr_l		x8, .Lt
859f69f52bSEric Biggers	ldp		s13, s14, [x8]
869f69f52bSEric Biggers
879f69f52bSEric Biggers	/* load input */
889f69f52bSEric Biggers0:	ld1		{v0.16b-v3.16b}, [x1], #64
899f69f52bSEric Biggers	sub		x2, x2, #1
909f69f52bSEric Biggers
919f69f52bSEric Biggers	mov		v15.16b, v8.16b
929f69f52bSEric Biggers	mov		v16.16b, v9.16b
939f69f52bSEric Biggers
94*12b11e47SEric Biggers	rev32		v0.16b, v0.16b
95*12b11e47SEric Biggers	rev32		v1.16b, v1.16b
96*12b11e47SEric Biggers	rev32		v2.16b, v2.16b
97*12b11e47SEric Biggers	rev32		v3.16b, v3.16b
989f69f52bSEric Biggers
999f69f52bSEric Biggers	ext		v11.16b, v13.16b, v13.16b, #4
1009f69f52bSEric Biggers
1019f69f52bSEric Biggers	qround		a, v0, v1, v2, v3, v4
1029f69f52bSEric Biggers	qround		a, v1, v2, v3, v4, v0
1039f69f52bSEric Biggers	qround		a, v2, v3, v4, v0, v1
1049f69f52bSEric Biggers	qround		a, v3, v4, v0, v1, v2
1059f69f52bSEric Biggers
1069f69f52bSEric Biggers	ext		v11.16b, v14.16b, v14.16b, #4
1079f69f52bSEric Biggers
1089f69f52bSEric Biggers	qround		b, v4, v0, v1, v2, v3
1099f69f52bSEric Biggers	qround		b, v0, v1, v2, v3, v4
1109f69f52bSEric Biggers	qround		b, v1, v2, v3, v4, v0
1119f69f52bSEric Biggers	qround		b, v2, v3, v4, v0, v1
1129f69f52bSEric Biggers	qround		b, v3, v4, v0, v1, v2
1139f69f52bSEric Biggers	qround		b, v4, v0, v1, v2, v3
1149f69f52bSEric Biggers	qround		b, v0, v1, v2, v3, v4
1159f69f52bSEric Biggers	qround		b, v1, v2, v3, v4, v0
1169f69f52bSEric Biggers	qround		b, v2, v3, v4, v0, v1
1179f69f52bSEric Biggers	qround		b, v3, v4
1189f69f52bSEric Biggers	qround		b, v4, v0
1199f69f52bSEric Biggers	qround		b, v0, v1
1209f69f52bSEric Biggers
1219f69f52bSEric Biggers	eor		v8.16b, v8.16b, v15.16b
1229f69f52bSEric Biggers	eor		v9.16b, v9.16b, v16.16b
1239f69f52bSEric Biggers
1249f69f52bSEric Biggers	/* handled all input blocks? */
1259f69f52bSEric Biggers	cbnz		x2, 0b
1269f69f52bSEric Biggers
1279f69f52bSEric Biggers	/* save state */
1289f69f52bSEric Biggers	rev64		v8.4s, v8.4s
1299f69f52bSEric Biggers	rev64		v9.4s, v9.4s
1309f69f52bSEric Biggers	ext		v8.16b, v8.16b, v8.16b, #8
1319f69f52bSEric Biggers	ext		v9.16b, v9.16b, v9.16b, #8
1329f69f52bSEric Biggers	st1		{v8.4s-v9.4s}, [x0]
1339f69f52bSEric Biggers	ret
1349f69f52bSEric BiggersSYM_FUNC_END(sm3_ce_transform)
1359f69f52bSEric Biggers
1369f69f52bSEric Biggers	.section	".rodata", "a"
1379f69f52bSEric Biggers	.align		3
1389f69f52bSEric Biggers.Lt:	.word		0x79cc4519, 0x9d8a7a87
139