xref: /optee_os/core/drivers/crypto/versal/include/ipi.h (revision b065b2da79bdc065cfb2ee65750aa342419d9599)
1 /* SPDX-License-Identifier: BSD-2-Clause */
2 /*
3  * Copyright (C) Foundries Ltd. 2022
4  * Author: Jorge Ramirez <jorge@foundries.io>
5  */
6 
7 #ifndef IPI_H
8 #define IPI_H
9 
10 #include <drivers/versal_pmc.h>
11 
12 struct versal_rsa_input_param {
13 	uint64_t key_addr;
14 	uint64_t data_addr;
15 	uint32_t key_len;
16 };
17 
18 #if defined(PLATFORM_FLAVOR_net)
19 enum versal_rsa_opmode {
20 	VERSAL_RSA_OPMODE_EXPQ = 0,
21 	VERSAL_RSA_OPMODE_CRT,
22 	VERSAL_RSA_OPMODE_EXPORT,
23 };
24 
25 struct versal_rsa_key_param {
26 	uint64_t exp_addr;
27 	uint64_t mod_addr;
28 	uint64_t p_addr;
29 	uint64_t q_addr;
30 	uint64_t dp_addr;
31 	uint64_t dq_addr;
32 	uint64_t qinv_addr;
33 	uint64_t tot_addr;
34 	uint64_t rn_addr;
35 	uint64_t rrn_addr;
36 	uint32_t p_size;
37 	uint32_t q_size;
38 	uint32_t pubexp;
39 	uint32_t is_prime_avail;
40 	uint32_t is_privexp_avail;
41 	uint32_t is_tot_avail;
42 	uint32_t is_pubexp_avail;
43 	enum versal_rsa_opmode opmode;
44 };
45 #endif
46 
47 struct versal_rsa_sign_param {
48 	uint64_t sign_addr;
49 	uint64_t hash_addr;
50 	uint32_t hash_len;
51 };
52 
53 struct versal_ecc_sign_param {
54 	uint64_t hash_addr;
55 	uint64_t priv_key_addr;
56 	uint64_t epriv_key_addr;
57 	uint32_t curve;
58 	uint32_t hash_len;
59 };
60 
61 struct versal_ecc_verify_param {
62 	uint64_t hash_addr;
63 	uint64_t pub_key_addr;
64 	uint64_t signature_addr;
65 	uint32_t curve;
66 	uint32_t hash_len;
67 };
68 
69 enum versal_aes_operation { VERSAL_AES_ENCRYPT, VERSAL_AES_DECRYPT };
70 
71 struct versal_aes_init {
72 	uint64_t iv_addr;
73 	uint32_t operation;
74 	uint32_t key_src;
75 	uint32_t key_len;
76 };
77 
78 struct versal_aes_input_param {
79 	uint64_t input_addr;
80 	uint32_t input_len;
81 	uint32_t is_last;
82 };
83 
84 enum versal_crypto_api {
85 	VERSAL_FEATURES = 0U,
86 	VERSAL_RSA_SIGN_VERIFY,
87 	VERSAL_RSA_PUBLIC_ENCRYPT,
88 	VERSAL_RSA_PRIVATE_DECRYPT,
89 	VERSAL_SHA3_UPDATE,
90 	VERSAL_ELLIPTIC_GENERATE_PUBLIC_KEY,
91 	VERSAL_ELLIPTIC_GENERATE_SIGN,
92 	VERSAL_ELLIPTIC_VALIDATE_PUBLIC_KEY,
93 	VERSAL_ELLIPTIC_VERIFY_SIGN,
94 	VERSAL_AES_INIT,
95 	VERSAL_AES_OP_INIT,
96 	VERSAL_AES_UPDATE_AAD,
97 	VERSAL_AES_ENCRYPT_UPDATE,
98 	VERSAL_AES_ENCRYPT_FINAL,
99 	VERSAL_AES_DECRYPT_UPDATE,
100 	VERSAL_AES_DECRYPT_FINAL,
101 	VERSAL_AES_KEY_ZERO,
102 	VERSAL_AES_WRITE_KEY,
103 	VERSAL_AES_LOCK_USER_KEY,
104 	VERSAL_AES_KEK_DECRYPT,
105 	VERSAL_AES_SET_DPA_CM,
106 	VERSAL_KAT,
107 	VERSAL_TRNG_GENERATE,
108 	VERSAL_AES_PERFORM_OPERATION,
109 	VERSAL_CRYPTO_API_MAX
110 };
111 
112 enum versal_crypto_kat {
113 	VERSAL_AES_DECRYPT_KAT = 0U,
114 	VERSAL_AES_DECRYPT_CM_KAT,
115 	VERSAL_RSA_PUB_ENC_KAT,
116 	VERSAL_ELLIPTIC_SIGN_VERIFY_KAT,
117 	VERSAL_SHA3_KAT,
118 	VERSAL_AES_ENCRYPT_KAT,
119 	VERSAL_RSA_PRIVATE_DEC_KAT,
120 	VERSAL_ELLIPTIC_SIGN_GEN_KAT,
121 	VERSAL_TRNG_KAT,
122 	VERSAL_UPDATE_KAT_STATUS,
123 };
124 
125 #define VERSAL_MAX_IPI_REGS 6
126 
127 struct versal_cmd_args {
128 	uint32_t data[VERSAL_MAX_IPI_REGS];
129 	size_t dlen;
130 	struct versal_ipi_buf ibuf[VERSAL_MAX_IPI_BUF];
131 };
132 
133 TEE_Result versal_crypto_request(enum versal_crypto_api id,
134 				 struct versal_cmd_args *arg, uint32_t *err);
135 #endif
136 
137