xref: /rk3399_ARM-atf/include/drivers/nxp/crypto/caam/hash.h (revision 1f6cf1e4477f1a0132e7361f17de8b2492608673)
1050a99a6SPankaj Gupta /*
2050a99a6SPankaj Gupta  * Copyright 2017-2021 NXP
3050a99a6SPankaj Gupta  *
4050a99a6SPankaj Gupta  * SPDX-License-Identifier: BSD-3-Clause
5050a99a6SPankaj Gupta  *
6050a99a6SPankaj Gupta  */
7050a99a6SPankaj Gupta 
8050a99a6SPankaj Gupta #ifndef __HASH_H__
9050a99a6SPankaj Gupta #define __HASH_H__
10050a99a6SPankaj Gupta 
11050a99a6SPankaj Gupta #include <stdbool.h>
12*e9529e46SRaghu Krishnamurthy #include <common/sha_common_macros.h>
13050a99a6SPankaj Gupta 
14050a99a6SPankaj Gupta /* List of hash algorithms */
15050a99a6SPankaj Gupta enum hash_algo {
16050a99a6SPankaj Gupta 	SHA1 = 0,
17050a99a6SPankaj Gupta 	SHA256
18050a99a6SPankaj Gupta };
19050a99a6SPankaj Gupta 
20050a99a6SPankaj Gupta /*
21050a99a6SPankaj Gupta  * number of words in the digest - Digest is kept internally
22050a99a6SPankaj Gupta  * as 8 32-bit words
23050a99a6SPankaj Gupta  */
24050a99a6SPankaj Gupta #define _SHA256_DIGEST_LENGTH 8
25050a99a6SPankaj Gupta 
26050a99a6SPankaj Gupta /*
27050a99a6SPankaj Gupta  * block length - A block, treated as a sequence of
28050a99a6SPankaj Gupta  * 32-bit words
29050a99a6SPankaj Gupta  */
30050a99a6SPankaj Gupta #define SHA256_BLOCK_LENGTH 16
31050a99a6SPankaj Gupta 
32050a99a6SPankaj Gupta /* number of bytes in the block */
33050a99a6SPankaj Gupta #define SHA256_DATA_SIZE 64
34050a99a6SPankaj Gupta 
35050a99a6SPankaj Gupta #define MAX_SG		12
36050a99a6SPankaj Gupta 
37050a99a6SPankaj Gupta struct sg_entry {
38050a99a6SPankaj Gupta #if defined(NXP_SEC_LE)
39050a99a6SPankaj Gupta 	uint32_t addr_lo;	/* Memory Address - lo */
40050a99a6SPankaj Gupta 	uint32_t addr_hi;	/* Memory Address of start of buffer - hi */
41050a99a6SPankaj Gupta #else
42050a99a6SPankaj Gupta 	uint32_t addr_hi;	/* Memory Address of start of buffer - hi */
43050a99a6SPankaj Gupta 	uint32_t addr_lo;	/* Memory Address - lo */
44050a99a6SPankaj Gupta #endif
45050a99a6SPankaj Gupta 
46050a99a6SPankaj Gupta 	uint32_t len_flag;	/* Length of the data in the frame */
47050a99a6SPankaj Gupta #define SG_ENTRY_LENGTH_MASK	0x3FFFFFFF
48050a99a6SPankaj Gupta #define SG_ENTRY_EXTENSION_BIT	0x80000000
49050a99a6SPankaj Gupta #define SG_ENTRY_FINAL_BIT	0x40000000
50050a99a6SPankaj Gupta 	uint32_t bpid_offset;
51050a99a6SPankaj Gupta #define SG_ENTRY_BPID_MASK	0x00FF0000
52050a99a6SPankaj Gupta #define SG_ENTRY_BPID_SHIFT	16
53050a99a6SPankaj Gupta #define SG_ENTRY_OFFSET_MASK	0x00001FFF
54050a99a6SPankaj Gupta #define SG_ENTRY_OFFSET_SHIFT	0
55050a99a6SPankaj Gupta };
56050a99a6SPankaj Gupta 
57050a99a6SPankaj Gupta /*
58050a99a6SPankaj Gupta  * SHA256-256 context
59050a99a6SPankaj Gupta  * contain the following fields
60050a99a6SPankaj Gupta  * State
61050a99a6SPankaj Gupta  * count low
62050a99a6SPankaj Gupta  * count high
63050a99a6SPankaj Gupta  * block data buffer
64050a99a6SPankaj Gupta  * index to the buffer
65050a99a6SPankaj Gupta  */
66050a99a6SPankaj Gupta struct hash_ctx {
67050a99a6SPankaj Gupta 	struct sg_entry sg_tbl[MAX_SG];
68050a99a6SPankaj Gupta 	uint32_t hash_desc[64];
69050a99a6SPankaj Gupta 	uint8_t hash[SHA256_DIGEST_SIZE];
70050a99a6SPankaj Gupta 	uint32_t sg_num;
71050a99a6SPankaj Gupta 	uint32_t len;
72050a99a6SPankaj Gupta 	uint8_t *data;
73050a99a6SPankaj Gupta 	enum hash_algo algo;
74050a99a6SPankaj Gupta 	bool active;
75050a99a6SPankaj Gupta };
76050a99a6SPankaj Gupta 
77050a99a6SPankaj Gupta int hash_init(enum hash_algo algo, void **ctx);
78050a99a6SPankaj Gupta int hash_update(enum hash_algo algo, void *context, void *data_ptr,
79050a99a6SPankaj Gupta 		unsigned int data_len);
80050a99a6SPankaj Gupta int hash_final(enum hash_algo algo, void *context, void *hash_ptr,
81050a99a6SPankaj Gupta 	       unsigned int hash_len);
82050a99a6SPankaj Gupta 
83050a99a6SPankaj Gupta #endif
84