xref: /arm-trusted-firmware/include/drivers/nxp/crypto/caam/hash.h (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright 2017-2021 NXP
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  *
6*91f16700Schasinglulu  */
7*91f16700Schasinglulu 
8*91f16700Schasinglulu #ifndef __HASH_H__
9*91f16700Schasinglulu #define __HASH_H__
10*91f16700Schasinglulu 
11*91f16700Schasinglulu #include <stdbool.h>
12*91f16700Schasinglulu 
13*91f16700Schasinglulu /* List of hash algorithms */
14*91f16700Schasinglulu enum hash_algo {
15*91f16700Schasinglulu 	SHA1 = 0,
16*91f16700Schasinglulu 	SHA256
17*91f16700Schasinglulu };
18*91f16700Schasinglulu 
19*91f16700Schasinglulu /* number of bytes in the SHA256-256 digest */
20*91f16700Schasinglulu #define SHA256_DIGEST_SIZE 32
21*91f16700Schasinglulu 
22*91f16700Schasinglulu /*
23*91f16700Schasinglulu  * number of words in the digest - Digest is kept internally
24*91f16700Schasinglulu  * as 8 32-bit words
25*91f16700Schasinglulu  */
26*91f16700Schasinglulu #define _SHA256_DIGEST_LENGTH 8
27*91f16700Schasinglulu 
28*91f16700Schasinglulu /*
29*91f16700Schasinglulu  * block length - A block, treated as a sequence of
30*91f16700Schasinglulu  * 32-bit words
31*91f16700Schasinglulu  */
32*91f16700Schasinglulu #define SHA256_BLOCK_LENGTH 16
33*91f16700Schasinglulu 
34*91f16700Schasinglulu /* number of bytes in the block */
35*91f16700Schasinglulu #define SHA256_DATA_SIZE 64
36*91f16700Schasinglulu 
37*91f16700Schasinglulu #define MAX_SG		12
38*91f16700Schasinglulu 
39*91f16700Schasinglulu struct sg_entry {
40*91f16700Schasinglulu #if defined(NXP_SEC_LE)
41*91f16700Schasinglulu 	uint32_t addr_lo;	/* Memory Address - lo */
42*91f16700Schasinglulu 	uint32_t addr_hi;	/* Memory Address of start of buffer - hi */
43*91f16700Schasinglulu #else
44*91f16700Schasinglulu 	uint32_t addr_hi;	/* Memory Address of start of buffer - hi */
45*91f16700Schasinglulu 	uint32_t addr_lo;	/* Memory Address - lo */
46*91f16700Schasinglulu #endif
47*91f16700Schasinglulu 
48*91f16700Schasinglulu 	uint32_t len_flag;	/* Length of the data in the frame */
49*91f16700Schasinglulu #define SG_ENTRY_LENGTH_MASK	0x3FFFFFFF
50*91f16700Schasinglulu #define SG_ENTRY_EXTENSION_BIT	0x80000000
51*91f16700Schasinglulu #define SG_ENTRY_FINAL_BIT	0x40000000
52*91f16700Schasinglulu 	uint32_t bpid_offset;
53*91f16700Schasinglulu #define SG_ENTRY_BPID_MASK	0x00FF0000
54*91f16700Schasinglulu #define SG_ENTRY_BPID_SHIFT	16
55*91f16700Schasinglulu #define SG_ENTRY_OFFSET_MASK	0x00001FFF
56*91f16700Schasinglulu #define SG_ENTRY_OFFSET_SHIFT	0
57*91f16700Schasinglulu };
58*91f16700Schasinglulu 
59*91f16700Schasinglulu /*
60*91f16700Schasinglulu  * SHA256-256 context
61*91f16700Schasinglulu  * contain the following fields
62*91f16700Schasinglulu  * State
63*91f16700Schasinglulu  * count low
64*91f16700Schasinglulu  * count high
65*91f16700Schasinglulu  * block data buffer
66*91f16700Schasinglulu  * index to the buffer
67*91f16700Schasinglulu  */
68*91f16700Schasinglulu struct hash_ctx {
69*91f16700Schasinglulu 	struct sg_entry sg_tbl[MAX_SG];
70*91f16700Schasinglulu 	uint32_t hash_desc[64];
71*91f16700Schasinglulu 	uint8_t hash[SHA256_DIGEST_SIZE];
72*91f16700Schasinglulu 	uint32_t sg_num;
73*91f16700Schasinglulu 	uint32_t len;
74*91f16700Schasinglulu 	uint8_t *data;
75*91f16700Schasinglulu 	enum hash_algo algo;
76*91f16700Schasinglulu 	bool active;
77*91f16700Schasinglulu };
78*91f16700Schasinglulu 
79*91f16700Schasinglulu int hash_init(enum hash_algo algo, void **ctx);
80*91f16700Schasinglulu int hash_update(enum hash_algo algo, void *context, void *data_ptr,
81*91f16700Schasinglulu 		unsigned int data_len);
82*91f16700Schasinglulu int hash_final(enum hash_algo algo, void *context, void *hash_ptr,
83*91f16700Schasinglulu 	       unsigned int hash_len);
84*91f16700Schasinglulu 
85*91f16700Schasinglulu #endif
86