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