1/* SPDX-License-Identifier: BSD-2-Clause */ 2/* 3 * Copyright 2023 The ChromiumOS Authors 4 * Copyright (c) 2015-2020, Linaro Limited 5 * Copyright (C) 2014 Linaro Ltd <[email protected]> 6 */ 7 8/* Core SHA-224/SHA-256 transform using v8 Crypto Extensions */ 9 10 .arch armv8-a+crypto 11 12 dga .req q20 13 dgav .req v20 14 dgb .req q21 15 dgbv .req v21 16 17 t0 .req v22 18 t1 .req v23 19 20 dg0q .req q24 21 dg0v .req v24 22 dg1q .req q25 23 dg1v .req v25 24 dg2q .req q26 25 dg2v .req v26 26 27 .macro add_only, ev, rc, s0 28 mov dg2v.16b, dg0v.16b 29 .ifeq \ev 30 add t1.4s, v\s0\().4s, \rc\().4s 31 sha256h dg0q, dg1q, t0.4s 32 sha256h2 dg1q, dg2q, t0.4s 33 .else 34 .ifnb \s0 35 add t0.4s, v\s0\().4s, \rc\().4s 36 .endif 37 sha256h dg0q, dg1q, t1.4s 38 sha256h2 dg1q, dg2q, t1.4s 39 .endif 40 .endm 41 42 .macro add_update, ev, rc, s0, s1, s2, s3 43 sha256su0 v\s0\().4s, v\s1\().4s 44 add_only \ev, \rc, \s1 45 sha256su1 v\s0\().4s, v\s2\().4s, v\s3\().4s 46 .endm 47 48 .macro FUNC name colon 49 .section .text.\name , "ax" , %progbits 50 .global \name 51 .type \name , %function 52 .balign 4 53 \name \colon 54 .endm 55 56 .macro END_FUNC name 57 .size \name , .-\name 58 .endm 59 60 .extern vb2_sha256_k /* Defined in 2sha256.c */ 61 62 /* 63 * void sha2_ce_transform(struct sha256_ce_state *sst, u8 const *src, 64 * int blocks) 65 */ 66FUNC sha256_ce_transform , : 67 /* load round constants */ 68 adr x8, vb2_sha256_k 69 ld1 { v0.4s- v3.4s}, [x8], #64 70 ld1 { v4.4s- v7.4s}, [x8], #64 71 ld1 { v8.4s-v11.4s}, [x8], #64 72 ld1 {v12.4s-v15.4s}, [x8] 73 74 /* load state */ 75 mov x9, x0 76 ld1 {dgav.4s}, [x9], #16 77 ld1 {dgbv.4s}, [x9] 78 79 /* load input */ 800: ld1 {v16.16b-v19.16b}, [x1], #64 81 sub w2, w2, #1 82 83 rev32 v16.16b, v16.16b 84 rev32 v17.16b, v17.16b 85 rev32 v18.16b, v18.16b 86 rev32 v19.16b, v19.16b 87 881: add t0.4s, v16.4s, v0.4s 89 mov dg0v.16b, dgav.16b 90 mov dg1v.16b, dgbv.16b 91 92 add_update 0, v1, 16, 17, 18, 19 93 add_update 1, v2, 17, 18, 19, 16 94 add_update 0, v3, 18, 19, 16, 17 95 add_update 1, v4, 19, 16, 17, 18 96 97 add_update 0, v5, 16, 17, 18, 19 98 add_update 1, v6, 17, 18, 19, 16 99 add_update 0, v7, 18, 19, 16, 17 100 add_update 1, v8, 19, 16, 17, 18 101 102 add_update 0, v9, 16, 17, 18, 19 103 add_update 1, v10, 17, 18, 19, 16 104 add_update 0, v11, 18, 19, 16, 17 105 add_update 1, v12, 19, 16, 17, 18 106 107 add_only 0, v13, 17 108 add_only 1, v14, 18 109 add_only 0, v15, 19 110 add_only 1 111 112 /* update state */ 113 add dgav.4s, dgav.4s, dg0v.4s 114 add dgbv.4s, dgbv.4s, dg1v.4s 115 116 /* handled all input blocks? */ 117 cbnz w2, 0b 118 119 /* store new state */ 1203: mov x9, x0 121 st1 {dgav.16b}, [x9], #16 122 st1 {dgbv.16b}, [x9] 123 ret 124END_FUNC sha256_ce_transform 125