1*b6a44cc5Sleisen /* SPDX-License-Identifier: BSD-2-Clause */ 2*b6a44cc5Sleisen /* Copyright (c) 2022-2024 HiSilicon Limited. */ 3*b6a44cc5Sleisen #ifndef __SEC_HASH_H__ 4*b6a44cc5Sleisen #define __SEC_HASH_H__ 5*b6a44cc5Sleisen 6*b6a44cc5Sleisen #include <stdint.h> 7*b6a44cc5Sleisen #include <tee_api_types.h> 8*b6a44cc5Sleisen 9*b6a44cc5Sleisen #define WORD_ALIGNMENT_MASK 0x3 10*b6a44cc5Sleisen #define HASH_MODE_OFFSET 28 11*b6a44cc5Sleisen #define WCRYPTO_DIGEST_HMAC 3 12*b6a44cc5Sleisen #define WCRYPTO_DIGEST_NORMAL 5 13*b6a44cc5Sleisen #define MAX_AUTH_LENGTH 16776704 14*b6a44cc5Sleisen #define HASH_MAC_LEN128 16 15*b6a44cc5Sleisen #define HASH_MAC_LEN160 20 16*b6a44cc5Sleisen #define HASH_MAC_LEN224 28 17*b6a44cc5Sleisen #define HASH_MAC_LEN256 32 18*b6a44cc5Sleisen #define HASH_MAC_LEN384 48 19*b6a44cc5Sleisen #define HASH_MAC_LEN512 64 20*b6a44cc5Sleisen #define SEC_DIGEST_MAX_KEY_SIZE 128 21*b6a44cc5Sleisen #define SEC_DIGEST_MAX_MAC_SIZE 64 22*b6a44cc5Sleisen #define SEC_DIGEST_MAX_IV_SIZE 64 23*b6a44cc5Sleisen #define SMALL_BUF_SIZE 0x1000 24*b6a44cc5Sleisen 25*b6a44cc5Sleisen struct hashctx { 26*b6a44cc5Sleisen uint8_t key[SEC_DIGEST_MAX_KEY_SIZE]; 27*b6a44cc5Sleisen uint8_t iv[SEC_DIGEST_MAX_IV_SIZE]; 28*b6a44cc5Sleisen uint8_t out[SEC_DIGEST_MAX_MAC_SIZE]; 29*b6a44cc5Sleisen bool has_next; 30*b6a44cc5Sleisen uint8_t mode; 31*b6a44cc5Sleisen uint32_t algo; 32*b6a44cc5Sleisen uint32_t scene; 33*b6a44cc5Sleisen struct hisi_qp *qp; 34*b6a44cc5Sleisen uint8_t *in; 35*b6a44cc5Sleisen uint64_t in_dma; 36*b6a44cc5Sleisen size_t buf_len; 37*b6a44cc5Sleisen size_t in_len; 38*b6a44cc5Sleisen uint64_t out_dma; 39*b6a44cc5Sleisen size_t mac_len; 40*b6a44cc5Sleisen uint64_t key_dma; 41*b6a44cc5Sleisen size_t key_len; 42*b6a44cc5Sleisen uint64_t iv_dma; 43*b6a44cc5Sleisen size_t iv_len; 44*b6a44cc5Sleisen uint64_t long_data_len; 45*b6a44cc5Sleisen }; 46*b6a44cc5Sleisen 47*b6a44cc5Sleisen /* 48*b6a44cc5Sleisen * Format the hash context to keep the reference to the 49*b6a44cc5Sleisen * operation driver 50*b6a44cc5Sleisen */ 51*b6a44cc5Sleisen struct crypto_hash { 52*b6a44cc5Sleisen struct crypto_hash_ctx hash_ctx; /* Crypto Hash API context */ 53*b6a44cc5Sleisen struct hashctx *ctx; /* Hash Context */ 54*b6a44cc5Sleisen }; 55*b6a44cc5Sleisen 56*b6a44cc5Sleisen /* 57*b6a44cc5Sleisen * Format the hmac context to keep the reference to the 58*b6a44cc5Sleisen * operation driver 59*b6a44cc5Sleisen */ 60*b6a44cc5Sleisen struct crypto_hmac { 61*b6a44cc5Sleisen struct crypto_mac_ctx hmac_op; /* Crypto Hash API context */ 62*b6a44cc5Sleisen struct hashctx *ctx; /* Hash Context */ 63*b6a44cc5Sleisen }; 64*b6a44cc5Sleisen 65*b6a44cc5Sleisen enum A_ALG { 66*b6a44cc5Sleisen A_ALG_SHA1 = 0x0, 67*b6a44cc5Sleisen A_ALG_SHA256 = 0x1, 68*b6a44cc5Sleisen A_ALG_MD5 = 0x2, 69*b6a44cc5Sleisen A_ALG_SHA224 = 0x3, 70*b6a44cc5Sleisen A_ALG_SHA384 = 0x4, 71*b6a44cc5Sleisen A_ALG_SHA512 = 0x5, 72*b6a44cc5Sleisen A_ALG_SHA512_224 = 0x6, 73*b6a44cc5Sleisen A_ALG_SHA512_256 = 0x7, 74*b6a44cc5Sleisen A_ALG_HMAC_SHA1 = 0x10, 75*b6a44cc5Sleisen A_ALG_HMAC_SHA256 = 0x11, 76*b6a44cc5Sleisen A_ALG_HMAC_MD5 = 0x12, 77*b6a44cc5Sleisen A_ALG_HMAC_SHA224 = 0x13, 78*b6a44cc5Sleisen A_ALG_HMAC_SHA384 = 0x14, 79*b6a44cc5Sleisen A_ALG_HMAC_SHA512 = 0x15, 80*b6a44cc5Sleisen A_ALG_HMAC_SHA512_224 = 0x16, 81*b6a44cc5Sleisen A_ALG_HMAC_SHA512_256 = 0x17, 82*b6a44cc5Sleisen A_ALG_AES_XCBC_MAC_96 = 0x20, 83*b6a44cc5Sleisen A_ALG_AES_XCBC_PRF_128 = 0x20, 84*b6a44cc5Sleisen A_ALG_AES_CMAC = 0x21, 85*b6a44cc5Sleisen A_ALG_AES_GMAC = 0x22, 86*b6a44cc5Sleisen A_ALG_SM3 = 0x25, 87*b6a44cc5Sleisen A_ALG_HMAC_SM3 = 0x26, 88*b6a44cc5Sleisen A_ALG_MAX 89*b6a44cc5Sleisen }; 90*b6a44cc5Sleisen 91*b6a44cc5Sleisen enum { 92*b6a44cc5Sleisen AI_GEN_INNER = 0x0, 93*b6a44cc5Sleisen AI_GEN_IVIN_ADDR = 0x1, 94*b6a44cc5Sleisen AI_GEN_CAL_IV_ADDR = 0x2, 95*b6a44cc5Sleisen AI_GEN_TRNG = 0x3, 96*b6a44cc5Sleisen }; 97*b6a44cc5Sleisen 98*b6a44cc5Sleisen enum { 99*b6a44cc5Sleisen AUTHPAD_PAD, 100*b6a44cc5Sleisen AUTHPAD_NOPAD, 101*b6a44cc5Sleisen }; 102*b6a44cc5Sleisen 103*b6a44cc5Sleisen TEE_Result hisi_sec_hash_ctx_init(struct hashctx *hash_ctx, uint32_t algo); 104*b6a44cc5Sleisen TEE_Result hisi_sec_digest_ctx_init(struct hashctx *hash_ctx, 105*b6a44cc5Sleisen const uint8_t *key, size_t len); 106*b6a44cc5Sleisen TEE_Result hisi_sec_digest_do_update(struct hashctx *hashctx, 107*b6a44cc5Sleisen const uint8_t *data, size_t len); 108*b6a44cc5Sleisen TEE_Result hisi_sec_digest_do_final(struct hashctx *hashctx, uint8_t *digest, 109*b6a44cc5Sleisen size_t len); 110*b6a44cc5Sleisen void hisi_sec_digest_ctx_free(struct hashctx *hash_ctx); 111*b6a44cc5Sleisen void hisi_sec_digest_copy_state(struct hashctx *out_hash_ctx, 112*b6a44cc5Sleisen struct hashctx *in_hash_ctx); 113*b6a44cc5Sleisen 114*b6a44cc5Sleisen #endif 115