xref: /optee_os/core/drivers/crypto/hisilicon/sec_hash.h (revision b6a44cc5a792f1ca0c8f4fc0a9ae33f1017c1e2f)
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