1/* SPDX-License-Identifier: GPL-2.0-only */ 2/* 3 * sha1-ce-core.S - SHA-1 secure hash using ARMv8 Crypto Extensions 4 * 5 * Copyright (C) 2015 Linaro Ltd. 6 * Author: Ard Biesheuvel <ard.biesheuvel@linaro.org> 7 */ 8 9#include <linux/linkage.h> 10#include <asm/assembler.h> 11 12 .text 13 .arch armv8-a 14 .fpu crypto-neon-fp-armv8 15 16 k0 .req q0 17 k1 .req q1 18 k2 .req q2 19 k3 .req q3 20 21 ta0 .req q4 22 ta1 .req q5 23 tb0 .req q5 24 tb1 .req q4 25 26 dga .req q6 27 dgb .req q7 28 dgbs .req s28 29 30 dg0 .req q12 31 dg1a0 .req q13 32 dg1a1 .req q14 33 dg1b0 .req q14 34 dg1b1 .req q13 35 36 .macro add_only, op, ev, rc, s0, dg1 37 .ifnb \s0 38 vadd.u32 tb\ev, q\s0, \rc 39 .endif 40 sha1h.32 dg1b\ev, dg0 41 .ifb \dg1 42 sha1\op\().32 dg0, dg1a\ev, ta\ev 43 .else 44 sha1\op\().32 dg0, \dg1, ta\ev 45 .endif 46 .endm 47 48 .macro add_update, op, ev, rc, s0, s1, s2, s3, dg1 49 sha1su0.32 q\s0, q\s1, q\s2 50 add_only \op, \ev, \rc, \s1, \dg1 51 sha1su1.32 q\s0, q\s3 52 .endm 53 54 .align 6 55.Lsha1_rcon: 56 .word 0x5a827999, 0x5a827999, 0x5a827999, 0x5a827999 57 .word 0x6ed9eba1, 0x6ed9eba1, 0x6ed9eba1, 0x6ed9eba1 58 .word 0x8f1bbcdc, 0x8f1bbcdc, 0x8f1bbcdc, 0x8f1bbcdc 59 .word 0xca62c1d6, 0xca62c1d6, 0xca62c1d6, 0xca62c1d6 60 61 /* 62 * void sha1_ce_transform(struct sha1_state *sst, u8 const *src, 63 * int blocks); 64 */ 65ENTRY(sha1_ce_transform) 66 /* load round constants */ 67 adr ip, .Lsha1_rcon 68 vld1.32 {k0-k1}, [ip, :128]! 69 vld1.32 {k2-k3}, [ip, :128] 70 71 /* load state */ 72 vld1.32 {dga}, [r0] 73 vldr dgbs, [r0, #16] 74 75 /* load input */ 760: vld1.32 {q8-q9}, [r1]! 77 vld1.32 {q10-q11}, [r1]! 78 subs r2, r2, #1 79 80#ifndef CONFIG_CPU_BIG_ENDIAN 81 vrev32.8 q8, q8 82 vrev32.8 q9, q9 83 vrev32.8 q10, q10 84 vrev32.8 q11, q11 85#endif 86 87 vadd.u32 ta0, q8, k0 88 vmov dg0, dga 89 90 add_update c, 0, k0, 8, 9, 10, 11, dgb 91 add_update c, 1, k0, 9, 10, 11, 8 92 add_update c, 0, k0, 10, 11, 8, 9 93 add_update c, 1, k0, 11, 8, 9, 10 94 add_update c, 0, k1, 8, 9, 10, 11 95 96 add_update p, 1, k1, 9, 10, 11, 8 97 add_update p, 0, k1, 10, 11, 8, 9 98 add_update p, 1, k1, 11, 8, 9, 10 99 add_update p, 0, k1, 8, 9, 10, 11 100 add_update p, 1, k2, 9, 10, 11, 8 101 102 add_update m, 0, k2, 10, 11, 8, 9 103 add_update m, 1, k2, 11, 8, 9, 10 104 add_update m, 0, k2, 8, 9, 10, 11 105 add_update m, 1, k2, 9, 10, 11, 8 106 add_update m, 0, k3, 10, 11, 8, 9 107 108 add_update p, 1, k3, 11, 8, 9, 10 109 add_only p, 0, k3, 9 110 add_only p, 1, k3, 10 111 add_only p, 0, k3, 11 112 add_only p, 1 113 114 /* update state */ 115 vadd.u32 dga, dga, dg0 116 vadd.u32 dgb, dgb, dg1a0 117 bne 0b 118 119 /* store new state */ 120 vst1.32 {dga}, [r0] 121 vstr dgbs, [r0, #16] 122 bx lr 123ENDPROC(sha1_ce_transform) 124