1419b0af8Sopenharmony_ci/*
2419b0af8Sopenharmony_ci * teek_ns_client.h
3419b0af8Sopenharmony_ci *
4419b0af8Sopenharmony_ci * define structures and IOCTLs.
5419b0af8Sopenharmony_ci *
6419b0af8Sopenharmony_ci * Copyright (C) 2022 Huawei Technologies Co., Ltd.
7419b0af8Sopenharmony_ci *
8419b0af8Sopenharmony_ci * This software is licensed under the terms of the GNU General Public
9419b0af8Sopenharmony_ci * License version 2, as published by the Free Software Foundation, and
10419b0af8Sopenharmony_ci * may be copied, distributed, and modified under those terms.
11419b0af8Sopenharmony_ci *
12419b0af8Sopenharmony_ci * This program is distributed in the hope that it will be useful,
13419b0af8Sopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
14419b0af8Sopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15419b0af8Sopenharmony_ci * GNU General Public License for more details.
16419b0af8Sopenharmony_ci */
17419b0af8Sopenharmony_ci#ifndef TEEK_NS_CLIENT_H
18419b0af8Sopenharmony_ci#define TEEK_NS_CLIENT_H
19419b0af8Sopenharmony_ci
20419b0af8Sopenharmony_ci#include <linux/mutex.h>
21419b0af8Sopenharmony_ci#include <linux/list.h>
22419b0af8Sopenharmony_ci#include <linux/slab.h>
23419b0af8Sopenharmony_ci#include <linux/completion.h>
24419b0af8Sopenharmony_ci#include "tc_ns_client.h"
25419b0af8Sopenharmony_ci#include "tc_ns_log.h"
26419b0af8Sopenharmony_ci
27419b0af8Sopenharmony_ci#define TC_NS_CLIENT_IOC_MAGIC  't'
28419b0af8Sopenharmony_ci#define TC_NS_CLIENT_DEV		"tc_ns_client"
29419b0af8Sopenharmony_ci#define TC_PRIV_DEV				"tc_private"
30419b0af8Sopenharmony_ci#define TC_NS_CLIENT_DEV_NAME   "/dev/tc_ns_client"
31419b0af8Sopenharmony_ci
32419b0af8Sopenharmony_ci#define EXCEPTION_MEM_SIZE (8*1024) /* mem for exception handling */
33419b0af8Sopenharmony_ci#ifdef CONFIG_THIRDPARTY_COMPATIBLE
34419b0af8Sopenharmony_ci#define TSP_REQUEST		0x32000008
35419b0af8Sopenharmony_ci#define TSP_RESPONSE	   0xBE000005
36419b0af8Sopenharmony_ci#else
37419b0af8Sopenharmony_ci#define TSP_REQUEST		 0xB2000008
38419b0af8Sopenharmony_ci#define TSP_RESPONSE	 0xB2000009
39419b0af8Sopenharmony_ci#endif
40419b0af8Sopenharmony_ci#define TSP_REE_SIQ		 0xB200000A
41419b0af8Sopenharmony_ci#define TSP_CRASH		 0xB200000B
42419b0af8Sopenharmony_ci#define TSP_REBOOT		 0xB200000E
43419b0af8Sopenharmony_ci#define TSP_CPU_ON		 0xB200000F
44419b0af8Sopenharmony_ci#define TSP_REBOOT_DONE	 0xB2000010
45419b0af8Sopenharmony_ci#define TSP_PREEMPTED	 0xB2000005
46419b0af8Sopenharmony_ci#define TC_CALL_GLOBAL	 0x01
47419b0af8Sopenharmony_ci#define TC_CALL_SYNC	 0x02
48419b0af8Sopenharmony_ci#define TC_CALL_LOGIN			 0x04
49419b0af8Sopenharmony_ci#define TEE_REQ_FROM_USER_MODE   0U
50419b0af8Sopenharmony_ci#define TEE_REQ_FROM_KERNEL_MODE 1U
51419b0af8Sopenharmony_ci#define TEE_PARAM_NUM			 4
52419b0af8Sopenharmony_ci#define VMALLOC_TYPE			 0
53419b0af8Sopenharmony_ci#define RESERVED_TYPE			 1
54419b0af8Sopenharmony_ci
55419b0af8Sopenharmony_ci/* Max sizes for login info buffer comming from teecd */
56419b0af8Sopenharmony_ci#define MAX_PACKAGE_NAME_LEN 	 255
57419b0af8Sopenharmony_ci/*
58419b0af8Sopenharmony_ci * The apk certificate format is as follows:
59419b0af8Sopenharmony_ci * modulus_size(4 bytes) + modulus buffer(512 bytes)
60419b0af8Sopenharmony_ci * + exponent size(4 bytes) + exponent buffer(1 bytes)
61419b0af8Sopenharmony_ci */
62419b0af8Sopenharmony_ci#define MAX_PUBKEY_LEN 1024
63419b0af8Sopenharmony_ci
64419b0af8Sopenharmony_cistruct tc_ns_dev_list {
65419b0af8Sopenharmony_ci	struct mutex dev_lock; /* for dev_file_list */
66419b0af8Sopenharmony_ci	struct list_head dev_file_list;
67419b0af8Sopenharmony_ci};
68419b0af8Sopenharmony_ci
69419b0af8Sopenharmony_cistruct tc_uuid {
70419b0af8Sopenharmony_ci	uint32_t time_low;
71419b0af8Sopenharmony_ci	uint16_t time_mid;
72419b0af8Sopenharmony_ci	uint16_t timehi_and_version;
73419b0af8Sopenharmony_ci	uint8_t clockseq_and_node[8]; /* clock len is 8 */
74419b0af8Sopenharmony_ci};
75419b0af8Sopenharmony_ci
76419b0af8Sopenharmony_ci#define INVALID_MAP_ADDR ((void*)-1)
77419b0af8Sopenharmony_cistruct tc_ns_shared_mem {
78419b0af8Sopenharmony_ci	void *kernel_addr;
79419b0af8Sopenharmony_ci	void *user_addr;
80419b0af8Sopenharmony_ci	void *user_addr_ca; /* for ca alloc share mem */
81419b0af8Sopenharmony_ci	unsigned int len;
82419b0af8Sopenharmony_ci	int mem_type;
83419b0af8Sopenharmony_ci	struct list_head head;
84419b0af8Sopenharmony_ci	atomic_t usage;
85419b0af8Sopenharmony_ci	atomic_t offset;
86419b0af8Sopenharmony_ci};
87419b0af8Sopenharmony_ci
88419b0af8Sopenharmony_cistruct tc_ns_service {
89419b0af8Sopenharmony_ci	unsigned char uuid[UUID_LEN];
90419b0af8Sopenharmony_ci	struct mutex session_lock; /* for session_list */
91419b0af8Sopenharmony_ci	struct list_head session_list;
92419b0af8Sopenharmony_ci	struct list_head head;
93419b0af8Sopenharmony_ci	struct mutex operation_lock; /* for session's open/close */
94419b0af8Sopenharmony_ci	atomic_t usage;
95419b0af8Sopenharmony_ci};
96419b0af8Sopenharmony_ci
97419b0af8Sopenharmony_ci#define SERVICES_MAX_COUNT 32 /* service limit can opened on 1 fd */
98419b0af8Sopenharmony_cistruct tc_ns_dev_file {
99419b0af8Sopenharmony_ci	unsigned int dev_file_id;
100419b0af8Sopenharmony_ci	struct mutex service_lock; /* for service_ref[], services[] */
101419b0af8Sopenharmony_ci	uint8_t service_ref[SERVICES_MAX_COUNT]; /* a judge if set services[i]=NULL */
102419b0af8Sopenharmony_ci	struct tc_ns_service *services[SERVICES_MAX_COUNT];
103419b0af8Sopenharmony_ci	struct mutex shared_mem_lock; /* for shared_mem_list */
104419b0af8Sopenharmony_ci	struct list_head shared_mem_list;
105419b0af8Sopenharmony_ci	struct list_head head;
106419b0af8Sopenharmony_ci	/* Device is linked to call from kernel */
107419b0af8Sopenharmony_ci	uint8_t kernel_api;
108419b0af8Sopenharmony_ci	/* client login info provided by teecd, can be either package name and public
109419b0af8Sopenharmony_ci	 * key or uid(for non android services/daemons)
110419b0af8Sopenharmony_ci	 * login information can only be set once, dont' allow subsequent calls
111419b0af8Sopenharmony_ci	 */
112419b0af8Sopenharmony_ci	bool login_setup;
113419b0af8Sopenharmony_ci	struct mutex login_setup_lock; /* for login_setup */
114419b0af8Sopenharmony_ci#ifdef CONFIG_AUTH_HASH
115419b0af8Sopenharmony_ci	bool cainfo_hash_setup;
116419b0af8Sopenharmony_ci	struct mutex cainfo_hash_setup_lock;
117419b0af8Sopenharmony_ci#endif
118419b0af8Sopenharmony_ci	uint32_t pkg_name_len;
119419b0af8Sopenharmony_ci	uint8_t pkg_name[MAX_PACKAGE_NAME_LEN];
120419b0af8Sopenharmony_ci	uint32_t pub_key_len;
121419b0af8Sopenharmony_ci	uint8_t pub_key[MAX_PUBKEY_LEN];
122419b0af8Sopenharmony_ci	int load_app_flag;
123419b0af8Sopenharmony_ci	struct completion close_comp; /* for kthread close unclosed session */
124419b0af8Sopenharmony_ci};
125419b0af8Sopenharmony_ci
126419b0af8Sopenharmony_ciunion tc_ns_parameter {
127419b0af8Sopenharmony_ci	struct {
128419b0af8Sopenharmony_ci		unsigned int buffer;
129419b0af8Sopenharmony_ci		unsigned int size;
130419b0af8Sopenharmony_ci	} memref;
131419b0af8Sopenharmony_ci	struct {
132419b0af8Sopenharmony_ci		unsigned int a;
133419b0af8Sopenharmony_ci		unsigned int b;
134419b0af8Sopenharmony_ci	} value;
135419b0af8Sopenharmony_ci};
136419b0af8Sopenharmony_ci
137419b0af8Sopenharmony_cistruct tc_ns_login {
138419b0af8Sopenharmony_ci	unsigned int method;
139419b0af8Sopenharmony_ci	unsigned int mdata;
140419b0af8Sopenharmony_ci};
141419b0af8Sopenharmony_ci
142419b0af8Sopenharmony_cistruct tc_ns_operation {
143419b0af8Sopenharmony_ci	unsigned int paramtypes;
144419b0af8Sopenharmony_ci	union tc_ns_parameter params[TEE_PARAM_NUM];
145419b0af8Sopenharmony_ci	unsigned int buffer_h_addr[TEE_PARAM_NUM];
146419b0af8Sopenharmony_ci	struct tc_ns_shared_mem *sharemem[TEE_PARAM_NUM];
147419b0af8Sopenharmony_ci	void *mb_buffer[TEE_PARAM_NUM];
148419b0af8Sopenharmony_ci};
149419b0af8Sopenharmony_ci
150419b0af8Sopenharmony_cistruct tc_ns_temp_buf {
151419b0af8Sopenharmony_ci	void *temp_buffer;
152419b0af8Sopenharmony_ci	unsigned int size;
153419b0af8Sopenharmony_ci};
154419b0af8Sopenharmony_ci
155419b0af8Sopenharmony_cienum smc_cmd_type {
156419b0af8Sopenharmony_ci	CMD_TYPE_GLOBAL,
157419b0af8Sopenharmony_ci	CMD_TYPE_TA,
158419b0af8Sopenharmony_ci	CMD_TYPE_TA_AGENT,
159419b0af8Sopenharmony_ci	CMD_TYPE_TA2TA_AGENT, /* compatible with TA2TA2TA->AGENT etc. */
160419b0af8Sopenharmony_ci	CMD_TYPE_BUILDIN_AGENT,
161419b0af8Sopenharmony_ci};
162419b0af8Sopenharmony_ci
163419b0af8Sopenharmony_cistruct tc_ns_smc_cmd {
164419b0af8Sopenharmony_ci	uint8_t	  uuid[sizeof(struct tc_uuid)];
165419b0af8Sopenharmony_ci	unsigned int cmd_type;
166419b0af8Sopenharmony_ci	unsigned int cmd_id;
167419b0af8Sopenharmony_ci	unsigned int dev_file_id;
168419b0af8Sopenharmony_ci	unsigned int context_id;
169419b0af8Sopenharmony_ci	unsigned int agent_id;
170419b0af8Sopenharmony_ci	unsigned int operation_phys;
171419b0af8Sopenharmony_ci	unsigned int operation_h_phys;
172419b0af8Sopenharmony_ci	unsigned int login_method;
173419b0af8Sopenharmony_ci	unsigned int login_data_phy;
174419b0af8Sopenharmony_ci	unsigned int login_data_h_addr;
175419b0af8Sopenharmony_ci	unsigned int login_data_len;
176419b0af8Sopenharmony_ci	unsigned int err_origin;
177419b0af8Sopenharmony_ci	int		  ret_val;
178419b0af8Sopenharmony_ci	unsigned int event_nr;
179419b0af8Sopenharmony_ci	unsigned int uid;
180419b0af8Sopenharmony_ci	unsigned int ca_pid; /* pid */
181419b0af8Sopenharmony_ci	unsigned int pid;	 /* tgid */
182419b0af8Sopenharmony_ci	unsigned int eventindex;	/* tee audit event index for upload */
183419b0af8Sopenharmony_ci	bool started;
184419b0af8Sopenharmony_ci} __attribute__((__packed__));
185419b0af8Sopenharmony_ci
186419b0af8Sopenharmony_ci/*
187419b0af8Sopenharmony_ci * @brief
188419b0af8Sopenharmony_ci */
189419b0af8Sopenharmony_cistruct tc_wait_data {
190419b0af8Sopenharmony_ci	wait_queue_head_t send_cmd_wq;
191419b0af8Sopenharmony_ci	int send_wait_flag;
192419b0af8Sopenharmony_ci};
193419b0af8Sopenharmony_ci
194419b0af8Sopenharmony_ci#define NUM_OF_SO 1
195419b0af8Sopenharmony_ci#ifdef CONFIG_CMS_CAHASH_AUTH
196419b0af8Sopenharmony_ci#define KIND_OF_SO 1 /* the number of libteecxxx.so library on MDC\DC\TI */
197419b0af8Sopenharmony_ci#else
198419b0af8Sopenharmony_ci#define KIND_OF_SO 2 /* the number of libteecxxx.so library on OH\HO */
199419b0af8Sopenharmony_ci#endif
200419b0af8Sopenharmony_cistruct tc_ns_session {
201419b0af8Sopenharmony_ci	unsigned int session_id;
202419b0af8Sopenharmony_ci	struct list_head head;
203419b0af8Sopenharmony_ci	struct tc_wait_data wait_data;
204419b0af8Sopenharmony_ci	struct mutex ta_session_lock; /* for open/close/invoke on 1 session */
205419b0af8Sopenharmony_ci	struct tc_ns_dev_file *owner;
206419b0af8Sopenharmony_ci	uint8_t auth_hash_buf[MAX_SHA_256_SZ * NUM_OF_SO + MAX_SHA_256_SZ];
207419b0af8Sopenharmony_ci	atomic_t usage;
208419b0af8Sopenharmony_ci};
209419b0af8Sopenharmony_ci
210419b0af8Sopenharmony_cistruct mb_cmd_pack {
211419b0af8Sopenharmony_ci	struct tc_ns_operation operation;
212419b0af8Sopenharmony_ci	unsigned char login_data[MAX_SHA_256_SZ * NUM_OF_SO + MAX_SHA_256_SZ];
213419b0af8Sopenharmony_ci};
214419b0af8Sopenharmony_ci
215419b0af8Sopenharmony_cistruct load_img_params {
216419b0af8Sopenharmony_ci	struct tc_ns_dev_file *dev_file;
217419b0af8Sopenharmony_ci	const char *file_buffer;
218419b0af8Sopenharmony_ci	unsigned int file_size;
219419b0af8Sopenharmony_ci	struct mb_cmd_pack *mb_pack;
220419b0af8Sopenharmony_ci	char *mb_load_mem;
221419b0af8Sopenharmony_ci	struct tc_uuid *uuid_return;
222419b0af8Sopenharmony_ci	unsigned int mb_load_size;
223419b0af8Sopenharmony_ci};
224419b0af8Sopenharmony_ci
225419b0af8Sopenharmony_cistruct tc_call_params {
226419b0af8Sopenharmony_ci	struct tc_ns_dev_file *dev;
227419b0af8Sopenharmony_ci	struct tc_ns_client_context *context;
228419b0af8Sopenharmony_ci	struct tc_ns_session *sess;
229419b0af8Sopenharmony_ci	uint8_t flags;
230419b0af8Sopenharmony_ci};
231419b0af8Sopenharmony_ci
232419b0af8Sopenharmony_cistruct tc_op_params {
233419b0af8Sopenharmony_ci	struct mb_cmd_pack *mb_pack;
234419b0af8Sopenharmony_ci	struct tc_ns_smc_cmd *smc_cmd;
235419b0af8Sopenharmony_ci	struct tc_ns_temp_buf local_tmpbuf[TEE_PARAM_NUM];
236419b0af8Sopenharmony_ci	uint32_t trans_paramtype[TEE_PARAM_NUM];
237419b0af8Sopenharmony_ci	bool op_inited;
238419b0af8Sopenharmony_ci};
239419b0af8Sopenharmony_ci
240419b0af8Sopenharmony_ci#endif
241