cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

sm3-ce-core.S (3276B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 * sm3-ce-core.S - SM3 secure hash using ARMv8.2 Crypto Extensions
      4 *
      5 * Copyright (C) 2018 Linaro Ltd <ard.biesheuvel@linaro.org>
      6 */
      7
      8#include <linux/linkage.h>
      9#include <asm/assembler.h>
     10
     11	.irp		b, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
     12	.set		.Lv\b\().4s, \b
     13	.endr
     14
     15	.macro		sm3partw1, rd, rn, rm
     16	.inst		0xce60c000 | .L\rd | (.L\rn << 5) | (.L\rm << 16)
     17	.endm
     18
     19	.macro		sm3partw2, rd, rn, rm
     20	.inst		0xce60c400 | .L\rd | (.L\rn << 5) | (.L\rm << 16)
     21	.endm
     22
     23	.macro		sm3ss1, rd, rn, rm, ra
     24	.inst		0xce400000 | .L\rd | (.L\rn << 5) | (.L\ra << 10) | (.L\rm << 16)
     25	.endm
     26
     27	.macro		sm3tt1a, rd, rn, rm, imm2
     28	.inst		0xce408000 | .L\rd | (.L\rn << 5) | ((\imm2) << 12) | (.L\rm << 16)
     29	.endm
     30
     31	.macro		sm3tt1b, rd, rn, rm, imm2
     32	.inst		0xce408400 | .L\rd | (.L\rn << 5) | ((\imm2) << 12) | (.L\rm << 16)
     33	.endm
     34
     35	.macro		sm3tt2a, rd, rn, rm, imm2
     36	.inst		0xce408800 | .L\rd | (.L\rn << 5) | ((\imm2) << 12) | (.L\rm << 16)
     37	.endm
     38
     39	.macro		sm3tt2b, rd, rn, rm, imm2
     40	.inst		0xce408c00 | .L\rd | (.L\rn << 5) | ((\imm2) << 12) | (.L\rm << 16)
     41	.endm
     42
     43	.macro		round, ab, s0, t0, t1, i
     44	sm3ss1		v5.4s, v8.4s, \t0\().4s, v9.4s
     45	shl		\t1\().4s, \t0\().4s, #1
     46	sri		\t1\().4s, \t0\().4s, #31
     47	sm3tt1\ab	v8.4s, v5.4s, v10.4s, \i
     48	sm3tt2\ab	v9.4s, v5.4s, \s0\().4s, \i
     49	.endm
     50
     51	.macro		qround, ab, s0, s1, s2, s3, s4
     52	.ifnb		\s4
     53	ext		\s4\().16b, \s1\().16b, \s2\().16b, #12
     54	ext		v6.16b, \s0\().16b, \s1\().16b, #12
     55	ext		v7.16b, \s2\().16b, \s3\().16b, #8
     56	sm3partw1	\s4\().4s, \s0\().4s, \s3\().4s
     57	.endif
     58
     59	eor		v10.16b, \s0\().16b, \s1\().16b
     60
     61	round		\ab, \s0, v11, v12, 0
     62	round		\ab, \s0, v12, v11, 1
     63	round		\ab, \s0, v11, v12, 2
     64	round		\ab, \s0, v12, v11, 3
     65
     66	.ifnb		\s4
     67	sm3partw2	\s4\().4s, v7.4s, v6.4s
     68	.endif
     69	.endm
     70
     71	/*
     72	 * void sm3_ce_transform(struct sm3_state *sst, u8 const *src,
     73	 *                       int blocks)
     74	 */
     75	.text
     76SYM_FUNC_START(sm3_ce_transform)
     77	/* load state */
     78	ld1		{v8.4s-v9.4s}, [x0]
     79	rev64		v8.4s, v8.4s
     80	rev64		v9.4s, v9.4s
     81	ext		v8.16b, v8.16b, v8.16b, #8
     82	ext		v9.16b, v9.16b, v9.16b, #8
     83
     84	adr_l		x8, .Lt
     85	ldp		s13, s14, [x8]
     86
     87	/* load input */
     880:	ld1		{v0.16b-v3.16b}, [x1], #64
     89	sub		w2, w2, #1
     90
     91	mov		v15.16b, v8.16b
     92	mov		v16.16b, v9.16b
     93
     94CPU_LE(	rev32		v0.16b, v0.16b		)
     95CPU_LE(	rev32		v1.16b, v1.16b		)
     96CPU_LE(	rev32		v2.16b, v2.16b		)
     97CPU_LE(	rev32		v3.16b, v3.16b		)
     98
     99	ext		v11.16b, v13.16b, v13.16b, #4
    100
    101	qround		a, v0, v1, v2, v3, v4
    102	qround		a, v1, v2, v3, v4, v0
    103	qround		a, v2, v3, v4, v0, v1
    104	qround		a, v3, v4, v0, v1, v2
    105
    106	ext		v11.16b, v14.16b, v14.16b, #4
    107
    108	qround		b, v4, v0, v1, v2, v3
    109	qround		b, v0, v1, v2, v3, v4
    110	qround		b, v1, v2, v3, v4, v0
    111	qround		b, v2, v3, v4, v0, v1
    112	qround		b, v3, v4, v0, v1, v2
    113	qround		b, v4, v0, v1, v2, v3
    114	qround		b, v0, v1, v2, v3, v4
    115	qround		b, v1, v2, v3, v4, v0
    116	qround		b, v2, v3, v4, v0, v1
    117	qround		b, v3, v4
    118	qround		b, v4, v0
    119	qround		b, v0, v1
    120
    121	eor		v8.16b, v8.16b, v15.16b
    122	eor		v9.16b, v9.16b, v16.16b
    123
    124	/* handled all input blocks? */
    125	cbnz		w2, 0b
    126
    127	/* save state */
    128	rev64		v8.4s, v8.4s
    129	rev64		v9.4s, v9.4s
    130	ext		v8.16b, v8.16b, v8.16b, #8
    131	ext		v9.16b, v9.16b, v9.16b, #8
    132	st1		{v8.4s-v9.4s}, [x0]
    133	ret
    134SYM_FUNC_END(sm3_ce_transform)
    135
    136	.section	".rodata", "a"
    137	.align		3
    138.Lt:	.word		0x79cc4519, 0x9d8a7a87