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