162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * sha1-ce-core.S - SHA-1 secure hash using ARMv8 Crypto Extensions 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2015 Linaro Ltd. 662306a36Sopenharmony_ci * Author: Ard Biesheuvel <ard.biesheuvel@linaro.org> 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/linkage.h> 1062306a36Sopenharmony_ci#include <asm/assembler.h> 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci .text 1362306a36Sopenharmony_ci .arch armv8-a 1462306a36Sopenharmony_ci .fpu crypto-neon-fp-armv8 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci k0 .req q0 1762306a36Sopenharmony_ci k1 .req q1 1862306a36Sopenharmony_ci k2 .req q2 1962306a36Sopenharmony_ci k3 .req q3 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci ta0 .req q4 2262306a36Sopenharmony_ci ta1 .req q5 2362306a36Sopenharmony_ci tb0 .req q5 2462306a36Sopenharmony_ci tb1 .req q4 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci dga .req q6 2762306a36Sopenharmony_ci dgb .req q7 2862306a36Sopenharmony_ci dgbs .req s28 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci dg0 .req q12 3162306a36Sopenharmony_ci dg1a0 .req q13 3262306a36Sopenharmony_ci dg1a1 .req q14 3362306a36Sopenharmony_ci dg1b0 .req q14 3462306a36Sopenharmony_ci dg1b1 .req q13 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci .macro add_only, op, ev, rc, s0, dg1 3762306a36Sopenharmony_ci .ifnb \s0 3862306a36Sopenharmony_ci vadd.u32 tb\ev, q\s0, \rc 3962306a36Sopenharmony_ci .endif 4062306a36Sopenharmony_ci sha1h.32 dg1b\ev, dg0 4162306a36Sopenharmony_ci .ifb \dg1 4262306a36Sopenharmony_ci sha1\op\().32 dg0, dg1a\ev, ta\ev 4362306a36Sopenharmony_ci .else 4462306a36Sopenharmony_ci sha1\op\().32 dg0, \dg1, ta\ev 4562306a36Sopenharmony_ci .endif 4662306a36Sopenharmony_ci .endm 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci .macro add_update, op, ev, rc, s0, s1, s2, s3, dg1 4962306a36Sopenharmony_ci sha1su0.32 q\s0, q\s1, q\s2 5062306a36Sopenharmony_ci add_only \op, \ev, \rc, \s1, \dg1 5162306a36Sopenharmony_ci sha1su1.32 q\s0, q\s3 5262306a36Sopenharmony_ci .endm 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci .align 6 5562306a36Sopenharmony_ci.Lsha1_rcon: 5662306a36Sopenharmony_ci .word 0x5a827999, 0x5a827999, 0x5a827999, 0x5a827999 5762306a36Sopenharmony_ci .word 0x6ed9eba1, 0x6ed9eba1, 0x6ed9eba1, 0x6ed9eba1 5862306a36Sopenharmony_ci .word 0x8f1bbcdc, 0x8f1bbcdc, 0x8f1bbcdc, 0x8f1bbcdc 5962306a36Sopenharmony_ci .word 0xca62c1d6, 0xca62c1d6, 0xca62c1d6, 0xca62c1d6 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci /* 6262306a36Sopenharmony_ci * void sha1_ce_transform(struct sha1_state *sst, u8 const *src, 6362306a36Sopenharmony_ci * int blocks); 6462306a36Sopenharmony_ci */ 6562306a36Sopenharmony_ciENTRY(sha1_ce_transform) 6662306a36Sopenharmony_ci /* load round constants */ 6762306a36Sopenharmony_ci adr ip, .Lsha1_rcon 6862306a36Sopenharmony_ci vld1.32 {k0-k1}, [ip, :128]! 6962306a36Sopenharmony_ci vld1.32 {k2-k3}, [ip, :128] 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci /* load state */ 7262306a36Sopenharmony_ci vld1.32 {dga}, [r0] 7362306a36Sopenharmony_ci vldr dgbs, [r0, #16] 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci /* load input */ 7662306a36Sopenharmony_ci0: vld1.32 {q8-q9}, [r1]! 7762306a36Sopenharmony_ci vld1.32 {q10-q11}, [r1]! 7862306a36Sopenharmony_ci subs r2, r2, #1 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci#ifndef CONFIG_CPU_BIG_ENDIAN 8162306a36Sopenharmony_ci vrev32.8 q8, q8 8262306a36Sopenharmony_ci vrev32.8 q9, q9 8362306a36Sopenharmony_ci vrev32.8 q10, q10 8462306a36Sopenharmony_ci vrev32.8 q11, q11 8562306a36Sopenharmony_ci#endif 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci vadd.u32 ta0, q8, k0 8862306a36Sopenharmony_ci vmov dg0, dga 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci add_update c, 0, k0, 8, 9, 10, 11, dgb 9162306a36Sopenharmony_ci add_update c, 1, k0, 9, 10, 11, 8 9262306a36Sopenharmony_ci add_update c, 0, k0, 10, 11, 8, 9 9362306a36Sopenharmony_ci add_update c, 1, k0, 11, 8, 9, 10 9462306a36Sopenharmony_ci add_update c, 0, k1, 8, 9, 10, 11 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci add_update p, 1, k1, 9, 10, 11, 8 9762306a36Sopenharmony_ci add_update p, 0, k1, 10, 11, 8, 9 9862306a36Sopenharmony_ci add_update p, 1, k1, 11, 8, 9, 10 9962306a36Sopenharmony_ci add_update p, 0, k1, 8, 9, 10, 11 10062306a36Sopenharmony_ci add_update p, 1, k2, 9, 10, 11, 8 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci add_update m, 0, k2, 10, 11, 8, 9 10362306a36Sopenharmony_ci add_update m, 1, k2, 11, 8, 9, 10 10462306a36Sopenharmony_ci add_update m, 0, k2, 8, 9, 10, 11 10562306a36Sopenharmony_ci add_update m, 1, k2, 9, 10, 11, 8 10662306a36Sopenharmony_ci add_update m, 0, k3, 10, 11, 8, 9 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci add_update p, 1, k3, 11, 8, 9, 10 10962306a36Sopenharmony_ci add_only p, 0, k3, 9 11062306a36Sopenharmony_ci add_only p, 1, k3, 10 11162306a36Sopenharmony_ci add_only p, 0, k3, 11 11262306a36Sopenharmony_ci add_only p, 1 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci /* update state */ 11562306a36Sopenharmony_ci vadd.u32 dga, dga, dg0 11662306a36Sopenharmony_ci vadd.u32 dgb, dgb, dg1a0 11762306a36Sopenharmony_ci bne 0b 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci /* store new state */ 12062306a36Sopenharmony_ci vst1.32 {dga}, [r0] 12162306a36Sopenharmony_ci vstr dgbs, [r0, #16] 12262306a36Sopenharmony_ci bx lr 12362306a36Sopenharmony_ciENDPROC(sha1_ce_transform) 124