xref: /rk3399_rockchip-uboot/include/crypto.h (revision c14e46abc4fe0414cea6b176d8cf7282ea8e179a)
1cc6ac5d6SJoseph Chen /* SPDX-License-Identifier:     GPL-2.0+ */
2cc6ac5d6SJoseph Chen /*
3cc6ac5d6SJoseph Chen  * (C) Copyright 2019 Rockchip Electronics Co., Ltd
4cc6ac5d6SJoseph Chen  */
5cc6ac5d6SJoseph Chen 
6cc6ac5d6SJoseph Chen #ifndef _CORE_CRYPTO_H_
7cc6ac5d6SJoseph Chen #define _CORE_CRYPTO_H_
8cc6ac5d6SJoseph Chen 
91d2a3f6cSJoseph Chen #include <common.h>
101d2a3f6cSJoseph Chen #include <dm.h>
11*c14e46abSJoseph Chen #include <image.h>
121d2a3f6cSJoseph Chen #include <u-boot/sha1.h>
131d2a3f6cSJoseph Chen 
14cc6ac5d6SJoseph Chen /* Algorithms/capability of crypto, works together with crypto_algo_nbits() */
15cc6ac5d6SJoseph Chen #define CRYPTO_MD5		BIT(0)
16cc6ac5d6SJoseph Chen #define CRYPTO_SHA1		BIT(1)
17cc6ac5d6SJoseph Chen #define CRYPTO_SHA256		BIT(2)
18e7846385SLin Jinhan #define CRYPTO_SHA512		BIT(3)
19e7846385SLin Jinhan 
20e7846385SLin Jinhan #define CRYPTO_RSA512		BIT(10)
21e7846385SLin Jinhan #define CRYPTO_RSA1024		BIT(11)
22e7846385SLin Jinhan #define CRYPTO_RSA2048		BIT(12)
23e7846385SLin Jinhan #define CRYPTO_RSA3072		BIT(13)
24e7846385SLin Jinhan #define CRYPTO_RSA4096		BIT(14)
25cc6ac5d6SJoseph Chen 
26434d6fd3SLin Jinhan #define CRYPTO_TRNG		BIT(15)
27434d6fd3SLin Jinhan 
28cc6ac5d6SJoseph Chen #define BYTE2WORD(bytes)	((bytes) / 4)
29cc6ac5d6SJoseph Chen #define BITS2BYTE(nbits)	((nbits) / 8)
30cc6ac5d6SJoseph Chen #define BITS2WORD(nbits)	((nbits) / 32)
31cc6ac5d6SJoseph Chen 
32cc6ac5d6SJoseph Chen typedef struct {
33cc6ac5d6SJoseph Chen 	u32 algo;	/* Algorithm: CRYPTO_MD5/CRYPTO_SHA1/CRYPTO_RSA2048... */
34cc6ac5d6SJoseph Chen 	u32 length;	/* Data total length */
35cc6ac5d6SJoseph Chen 
36cc6ac5d6SJoseph Chen } sha_context;
37cc6ac5d6SJoseph Chen 
38cc6ac5d6SJoseph Chen typedef struct {
39cc6ac5d6SJoseph Chen 	u32 algo;	/* Algorithm: CRYPTO_MD5/CRYPTO_SHA1/CRYPTO_RSA2048... */
40cc6ac5d6SJoseph Chen 	u32 *n;		/* Public key factor N */
41cc6ac5d6SJoseph Chen 	u32 *e;		/* Public key factor E */
42cc6ac5d6SJoseph Chen 	u32 *c;		/* Optional, a accelerate factor for some crypto */
43cc6ac5d6SJoseph Chen } rsa_key;
44cc6ac5d6SJoseph Chen 
45cc6ac5d6SJoseph Chen struct dm_crypto_ops {
46cc6ac5d6SJoseph Chen 	/* Hardware algorithm capability */
47cc6ac5d6SJoseph Chen 	u32 (*capability)(struct udevice *dev);
48cc6ac5d6SJoseph Chen 
49cc6ac5d6SJoseph Chen 	/* SHA init/update/final */
50cc6ac5d6SJoseph Chen 	int (*sha_init)(struct udevice *dev, sha_context *ctx);
51cc6ac5d6SJoseph Chen 	int (*sha_update)(struct udevice *dev, u32 *input, u32 len);
52cc6ac5d6SJoseph Chen 	int (*sha_final)(struct udevice *dev, sha_context *ctx, u8 *output);
53cc6ac5d6SJoseph Chen 
54cc6ac5d6SJoseph Chen 	/* RSA verify */
55cc6ac5d6SJoseph Chen 	int (*rsa_verify)(struct udevice *dev, rsa_key *ctx,
56cc6ac5d6SJoseph Chen 			  u8 *sign, u8 *output);
57434d6fd3SLin Jinhan 
58434d6fd3SLin Jinhan 	/* TRNG get */
59434d6fd3SLin Jinhan 	int (*get_trng)(struct udevice *dev, u8 *output, u32 len);
60cc6ac5d6SJoseph Chen };
61cc6ac5d6SJoseph Chen 
62cc6ac5d6SJoseph Chen /**
63cc6ac5d6SJoseph Chen  * crypto_algo_nbits() - Get algorithm bits accroding to algorithm
64cc6ac5d6SJoseph Chen  * @capability: expected algorithm capability, eg. CRYPTO_MD5/RSA2048...
65cc6ac5d6SJoseph Chen  *
66cc6ac5d6SJoseph Chen  * @return algorithm bits
67cc6ac5d6SJoseph Chen  */
68cc6ac5d6SJoseph Chen u32 crypto_algo_nbits(u32 algo);
69cc6ac5d6SJoseph Chen 
70cc6ac5d6SJoseph Chen /**
71cc6ac5d6SJoseph Chen  * crypto_get_device() - Get crypto device by capability
72cc6ac5d6SJoseph Chen  * @capability: expected algorithm capability, eg. CRYPTO_MD5/RSA2048...
73cc6ac5d6SJoseph Chen  *
74cc6ac5d6SJoseph Chen  * @return dev on success, otherwise NULL
75cc6ac5d6SJoseph Chen  */
76cc6ac5d6SJoseph Chen struct udevice *crypto_get_device(u32 capability);
77cc6ac5d6SJoseph Chen 
78cc6ac5d6SJoseph Chen /**
79cc6ac5d6SJoseph Chen  * crypto_sha_init() - Crypto sha init
80cc6ac5d6SJoseph Chen  *
81cc6ac5d6SJoseph Chen  * @dev: crypto device
82cc6ac5d6SJoseph Chen  * @ctx: sha context
83cc6ac5d6SJoseph Chen  *
84cc6ac5d6SJoseph Chen  * @return 0 on success, otherwise failed
85cc6ac5d6SJoseph Chen  */
86cc6ac5d6SJoseph Chen int crypto_sha_init(struct udevice *dev, sha_context *ctx);
87cc6ac5d6SJoseph Chen 
88cc6ac5d6SJoseph Chen /**
89cc6ac5d6SJoseph Chen  * crypto_sha_update() - Crypto sha update
90cc6ac5d6SJoseph Chen  *
91cc6ac5d6SJoseph Chen  * @dev: crypto device
92cc6ac5d6SJoseph Chen  * @input: input data buffer
93cc6ac5d6SJoseph Chen  * @len: input data length
94cc6ac5d6SJoseph Chen  *
95cc6ac5d6SJoseph Chen  * @return 0 on success, otherwise failed
96cc6ac5d6SJoseph Chen  */
97cc6ac5d6SJoseph Chen int crypto_sha_update(struct udevice *dev, u32 *input, u32 len);
98cc6ac5d6SJoseph Chen 
99cc6ac5d6SJoseph Chen /**
100cc6ac5d6SJoseph Chen  * crypto_sha_final() - Crypto sha finish and get result
101cc6ac5d6SJoseph Chen  *
102cc6ac5d6SJoseph Chen  * @dev: crypto device
103cc6ac5d6SJoseph Chen  * @ctx: sha context
104cc6ac5d6SJoseph Chen  * @output: output hash data
105cc6ac5d6SJoseph Chen  *
106cc6ac5d6SJoseph Chen  * @return 0 on success, otherwise failed
107cc6ac5d6SJoseph Chen  */
108cc6ac5d6SJoseph Chen int crypto_sha_final(struct udevice *dev, sha_context *ctx, u8 *output);
109cc6ac5d6SJoseph Chen 
110cc6ac5d6SJoseph Chen /**
111cc6ac5d6SJoseph Chen  * crypto_sha_csum() - Crypto sha hash for one data block only
112cc6ac5d6SJoseph Chen  *
113cc6ac5d6SJoseph Chen  * @dev: crypto device
114cc6ac5d6SJoseph Chen  * @ctx: sha context
115cc6ac5d6SJoseph Chen  * @input: input data buffer
116cc6ac5d6SJoseph Chen  * @input_len: input data length
117cc6ac5d6SJoseph Chen  * @output: output hash data
118cc6ac5d6SJoseph Chen  *
119cc6ac5d6SJoseph Chen  * @return 0 on success, otherwise failed
120cc6ac5d6SJoseph Chen  */
121cc6ac5d6SJoseph Chen int crypto_sha_csum(struct udevice *dev, sha_context *ctx,
122cc6ac5d6SJoseph Chen 		    char *input, u32 input_len, u8 *output);
123cc6ac5d6SJoseph Chen 
124cc6ac5d6SJoseph Chen /**
125*c14e46abSJoseph Chen  * crypto_sha_regions_csum() - Crypto sha hash for multi data blocks
126*c14e46abSJoseph Chen  *
127*c14e46abSJoseph Chen  * @dev: crypto device
128*c14e46abSJoseph Chen  * @ctx: sha context
129*c14e46abSJoseph Chen  * @region: regions buffer
130*c14e46abSJoseph Chen  * @region_count: regions count
131*c14e46abSJoseph Chen  * @output: output hash data
132*c14e46abSJoseph Chen  *
133*c14e46abSJoseph Chen  * @return 0 on success, otherwise failed
134*c14e46abSJoseph Chen  */
135*c14e46abSJoseph Chen int crypto_sha_regions_csum(struct udevice *dev, sha_context *ctx,
136*c14e46abSJoseph Chen 			    const struct image_region region[],
137*c14e46abSJoseph Chen 			    int region_count, u8 *output);
138*c14e46abSJoseph Chen 
139*c14e46abSJoseph Chen /**
140cc6ac5d6SJoseph Chen  * crypto_rsa_verify() - Crypto rsa verify
141cc6ac5d6SJoseph Chen  *
142cc6ac5d6SJoseph Chen  * @dev: crypto device
143cc6ac5d6SJoseph Chen  * @ctx: rsa key context
144cc6ac5d6SJoseph Chen  * @sign: signature
145cc6ac5d6SJoseph Chen  * @output: output hash data buffer
146cc6ac5d6SJoseph Chen  *
147cc6ac5d6SJoseph Chen  * @return 0 on success, otherwise failed
148cc6ac5d6SJoseph Chen  */
149cc6ac5d6SJoseph Chen int crypto_rsa_verify(struct udevice *dev, rsa_key *ctx, u8 *sign, u8 *output);
150cc6ac5d6SJoseph Chen 
151434d6fd3SLin Jinhan /**
152434d6fd3SLin Jinhan  * crypto_get_trng() - Crypto get trng
153434d6fd3SLin Jinhan  *
154434d6fd3SLin Jinhan  * @dev: crypto device
155434d6fd3SLin Jinhan  * @output: output trng data
156434d6fd3SLin Jinhan  * @len: trng len to get
157434d6fd3SLin Jinhan  *
158434d6fd3SLin Jinhan  * @return 0 on success, otherwise failed
159434d6fd3SLin Jinhan  */
160434d6fd3SLin Jinhan int crypto_get_trng(struct udevice *dev, u8 *output, u32 len);
161434d6fd3SLin Jinhan 
162cc6ac5d6SJoseph Chen #endif
163