• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * teek_ns_client.h
3  *
4  * define structures and IOCTLs.
5  *
6  * Copyright (C) 2022 Huawei Technologies Co., Ltd.
7  *
8  * This software is licensed under the terms of the GNU General Public
9  * License version 2, as published by the Free Software Foundation, and
10  * may be copied, distributed, and modified under those terms.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  */
17 #ifndef TEEK_NS_CLIENT_H
18 #define TEEK_NS_CLIENT_H
19 
20 #include <linux/mutex.h>
21 #include <linux/list.h>
22 #include <linux/slab.h>
23 #include <linux/completion.h>
24 #include "tc_ns_client.h"
25 #include "tc_ns_log.h"
26 
27 #define TC_NS_CLIENT_IOC_MAGIC  't'
28 #define TC_NS_CLIENT_DEV		"tc_ns_client"
29 #define TC_PRIV_DEV				"tc_private"
30 #define TC_NS_CLIENT_DEV_NAME   "/dev/tc_ns_client"
31 
32 #define EXCEPTION_MEM_SIZE (8*1024) /* mem for exception handling */
33 #ifdef CONFIG_THIRDPARTY_COMPATIBLE
34 #define TSP_REQUEST		0x32000008
35 #define TSP_RESPONSE	   0xBE000005
36 #else
37 #define TSP_REQUEST		 0xB2000008
38 #define TSP_RESPONSE	 0xB2000009
39 #endif
40 #define TSP_REE_SIQ		 0xB200000A
41 #define TSP_CRASH		 0xB200000B
42 #define TSP_REBOOT		 0xB200000E
43 #define TSP_CPU_ON		 0xB200000F
44 #define TSP_REBOOT_DONE	 0xB2000010
45 #define TSP_PREEMPTED	 0xB2000005
46 #define TC_CALL_GLOBAL	 0x01
47 #define TC_CALL_SYNC	 0x02
48 #define TC_CALL_LOGIN			 0x04
49 #define TEE_REQ_FROM_USER_MODE   0U
50 #define TEE_REQ_FROM_KERNEL_MODE 1U
51 #define TEE_PARAM_NUM			 4
52 #define VMALLOC_TYPE			 0
53 #define RESERVED_TYPE			 1
54 
55 /* Max sizes for login info buffer comming from teecd */
56 #define MAX_PACKAGE_NAME_LEN 	 255
57 /*
58  * The apk certificate format is as follows:
59  * modulus_size(4 bytes) + modulus buffer(512 bytes)
60  * + exponent size(4 bytes) + exponent buffer(1 bytes)
61  */
62 #define MAX_PUBKEY_LEN 1024
63 
64 struct tc_ns_dev_list {
65 	struct mutex dev_lock; /* for dev_file_list */
66 	struct list_head dev_file_list;
67 };
68 
69 struct tc_uuid {
70 	uint32_t time_low;
71 	uint16_t time_mid;
72 	uint16_t timehi_and_version;
73 	uint8_t clockseq_and_node[8]; /* clock len is 8 */
74 };
75 
76 #define INVALID_MAP_ADDR ((void*)-1)
77 struct tc_ns_shared_mem {
78 	void *kernel_addr;
79 	void *user_addr;
80 	void *user_addr_ca; /* for ca alloc share mem */
81 	unsigned int len;
82 	int mem_type;
83 	struct list_head head;
84 	atomic_t usage;
85 	atomic_t offset;
86 };
87 
88 struct tc_ns_service {
89 	unsigned char uuid[UUID_LEN];
90 	struct mutex session_lock; /* for session_list */
91 	struct list_head session_list;
92 	struct list_head head;
93 	struct mutex operation_lock; /* for session's open/close */
94 	atomic_t usage;
95 };
96 
97 #define SERVICES_MAX_COUNT 32 /* service limit can opened on 1 fd */
98 struct tc_ns_dev_file {
99 	unsigned int dev_file_id;
100 	struct mutex service_lock; /* for service_ref[], services[] */
101 	uint8_t service_ref[SERVICES_MAX_COUNT]; /* a judge if set services[i]=NULL */
102 	struct tc_ns_service *services[SERVICES_MAX_COUNT];
103 	struct mutex shared_mem_lock; /* for shared_mem_list */
104 	struct list_head shared_mem_list;
105 	struct list_head head;
106 	/* Device is linked to call from kernel */
107 	uint8_t kernel_api;
108 	/* client login info provided by teecd, can be either package name and public
109 	 * key or uid(for non android services/daemons)
110 	 * login information can only be set once, dont' allow subsequent calls
111 	 */
112 	bool login_setup;
113 	struct mutex login_setup_lock; /* for login_setup */
114 #ifdef CONFIG_AUTH_HASH
115 	bool cainfo_hash_setup;
116 	struct mutex cainfo_hash_setup_lock;
117 #endif
118 	uint32_t pkg_name_len;
119 	uint8_t pkg_name[MAX_PACKAGE_NAME_LEN];
120 	uint32_t pub_key_len;
121 	uint8_t pub_key[MAX_PUBKEY_LEN];
122 	int load_app_flag;
123 	struct completion close_comp; /* for kthread close unclosed session */
124 };
125 
126 union tc_ns_parameter {
127 	struct {
128 		unsigned int buffer;
129 		unsigned int size;
130 	} memref;
131 	struct {
132 		unsigned int a;
133 		unsigned int b;
134 	} value;
135 };
136 
137 struct tc_ns_login {
138 	unsigned int method;
139 	unsigned int mdata;
140 };
141 
142 struct tc_ns_operation {
143 	unsigned int paramtypes;
144 	union tc_ns_parameter params[TEE_PARAM_NUM];
145 	unsigned int buffer_h_addr[TEE_PARAM_NUM];
146 	struct tc_ns_shared_mem *sharemem[TEE_PARAM_NUM];
147 	void *mb_buffer[TEE_PARAM_NUM];
148 };
149 
150 struct tc_ns_temp_buf {
151 	void *temp_buffer;
152 	unsigned int size;
153 };
154 
155 enum smc_cmd_type {
156 	CMD_TYPE_GLOBAL,
157 	CMD_TYPE_TA,
158 	CMD_TYPE_TA_AGENT,
159 	CMD_TYPE_TA2TA_AGENT, /* compatible with TA2TA2TA->AGENT etc. */
160 	CMD_TYPE_BUILDIN_AGENT,
161 };
162 
163 struct tc_ns_smc_cmd {
164 	uint8_t	  uuid[sizeof(struct tc_uuid)];
165 	unsigned int cmd_type;
166 	unsigned int cmd_id;
167 	unsigned int dev_file_id;
168 	unsigned int context_id;
169 	unsigned int agent_id;
170 	unsigned int operation_phys;
171 	unsigned int operation_h_phys;
172 	unsigned int login_method;
173 	unsigned int login_data_phy;
174 	unsigned int login_data_h_addr;
175 	unsigned int login_data_len;
176 	unsigned int err_origin;
177 	int		  ret_val;
178 	unsigned int event_nr;
179 	unsigned int uid;
180 	unsigned int ca_pid; /* pid */
181 	unsigned int pid;	 /* tgid */
182 	unsigned int eventindex;	/* tee audit event index for upload */
183 	bool started;
184 } __attribute__((__packed__));
185 
186 /*
187  * @brief
188  */
189 struct tc_wait_data {
190 	wait_queue_head_t send_cmd_wq;
191 	int send_wait_flag;
192 };
193 
194 #define NUM_OF_SO 1
195 #ifdef CONFIG_CMS_CAHASH_AUTH
196 #define KIND_OF_SO 1 /* the number of libteecxxx.so library on MDC\DC\TI */
197 #else
198 #define KIND_OF_SO 2 /* the number of libteecxxx.so library on OH\HO */
199 #endif
200 struct tc_ns_session {
201 	unsigned int session_id;
202 	struct list_head head;
203 	struct tc_wait_data wait_data;
204 	struct mutex ta_session_lock; /* for open/close/invoke on 1 session */
205 	struct tc_ns_dev_file *owner;
206 	uint8_t auth_hash_buf[MAX_SHA_256_SZ * NUM_OF_SO + MAX_SHA_256_SZ];
207 	atomic_t usage;
208 };
209 
210 struct mb_cmd_pack {
211 	struct tc_ns_operation operation;
212 	unsigned char login_data[MAX_SHA_256_SZ * NUM_OF_SO + MAX_SHA_256_SZ];
213 };
214 
215 struct load_img_params {
216 	struct tc_ns_dev_file *dev_file;
217 	const char *file_buffer;
218 	unsigned int file_size;
219 	struct mb_cmd_pack *mb_pack;
220 	char *mb_load_mem;
221 	struct tc_uuid *uuid_return;
222 	unsigned int mb_load_size;
223 };
224 
225 struct tc_call_params {
226 	struct tc_ns_dev_file *dev;
227 	struct tc_ns_client_context *context;
228 	struct tc_ns_session *sess;
229 	uint8_t flags;
230 };
231 
232 struct tc_op_params {
233 	struct mb_cmd_pack *mb_pack;
234 	struct tc_ns_smc_cmd *smc_cmd;
235 	struct tc_ns_temp_buf local_tmpbuf[TEE_PARAM_NUM];
236 	uint32_t trans_paramtype[TEE_PARAM_NUM];
237 	bool op_inited;
238 };
239 
240 #endif
241