• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2022 Huawei Technologies Co., Ltd.
3  * Licensed under the Mulan PSL v2.
4  * You can use this software according to the terms and conditions of the Mulan PSL v2.
5  * You may obtain a copy of Mulan PSL v2 at:
6  *     http://license.coscl.org.cn/MulanPSL2
7  * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
8  * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
9  * PURPOSE.
10  * See the Mulan PSL v2 for more details.
11  */
12 #ifndef TEE_SS_AGENT_API_H_
13 #define TEE_SS_AGENT_API_H_
14 
15 #include "tee_defines.h"
16 #include "tee_trusted_storage_api.h"
17 #include "ta_framework.h"
18 #include "tee_internal_task_pub.h"
19 #include "tee_fs.h"
20 #include <huk_service_msg.h>
21 
22 #define CALL_SS_AGENT_HELLO 0x01
23 
24 /* add for rootkey derive */
25 #define AES_CMAC_DERV_MAX_DATA_IN_SIZE 0x400UL
26 
27 #define HASH_LEN              32
28 #define DIR_LEN               64
29 #define ENUM_FLAG_NOT_ACTIVED 0
30 #define ENUM_FLAG_ACTIVED     1
31 
32 #define MAX_SPLIT_NUM         4
33 #define DOUBLE(x)             ((x) * 2)
34 #define FILL_NUM              4
35 
36 struct saved_attr_info_t {
37     TEE_ObjectInfo object_info;
38     uint32_t attr_count;
39     uint32_t attr_size; /* sizeof(attr) */
40     uint32_t opt_attr_count;
41     uint32_t opt_attr_size;
42 };
43 
44 struct __TEE_ObjectEnumHandle {
45     uintptr_t enum_handle;
46 };
47 
48 struct obj_enum_handle_t {
49     uint32_t active_status;
50     uint8_t *obj_enum_buf;
51     uint32_t obj_enum_buf_len;
52     uint32_t offset;
53 };
54 
55 enum ssa_gent_commands {
56     /* all the cmd from TA must be larger than SS_AGENT_FIRST_CMD */
57     SS_AGENT_FIRST_CMD = 0x100,
58     SS_AGENT_CREATE_OBJECT           = 0x121,
59     SS_AGENT_OPEN_OBJECT             = 0x122,
60     SS_AGENT_OPEN_SHARED_OBJECT      = 0x123,
61     SS_AGENT_GET_OBJECT_ATTRIBUTES   = 0x124,
62     SS_AGENT_WRITE_OBJECT            = 0x125,
63     SS_AGENT_READ_OBJECT             = 0x126,
64     SS_AGENT_SEEK_OBJECT             = 0x127,
65     SS_AGENT_TRUNCATE_OBJECT         = 0x128,
66     SS_AGENT_RENAME_OBJECT           = 0x129,
67     SS_AGENT_SYNC_OBJECT             = 0x12a,
68     SS_AGENT_GET_OBJECT_INFO         = 0x12b,
69     SS_AGENT_CLOSE_OBJECT            = 0x12c,
70     SS_AGENT_CLOSE_AND_DELETE_OBJECT = 0x12d,
71     SS_AGENT_FILE_ABORT              = 0x12e,
72     FS_CREATE_OBJECT               = 0x130,
73     FS_CLOSE_OBJECT                = 0x131,
74     FS_OPEN_OBJECT                 = 0x132,
75     FS_SYNC_OBJECT                 = 0x133,
76     FS_READ_OBJECT                 = 0x134,
77     FS_WRITE_OBJECT                = 0x135,
78     FS_SEEK_OBJECT                 = 0x136,
79     FS_REMOVE_OBJECT               = 0x137,
80     FS_TRUNCATE_OBJECT             = 0x138,
81     FS_RENAME_OBJECT               = 0x139,
82     FS_COPY_OBJECT                 = 0x13a,
83     FS_INFO_OBJECT                 = 0x13b,
84     FS_ACCESS_OBJECT               = 0x13c,
85     SS_AGENT_EXT_CREATE_OBJECT     = 0x13d,
86     SS_AGENT_EXT_OPEN_OBJECT       = 0x13e,
87     SS_AGENT_EXT_DELETE_ALL_OBJECT = 0x13f,
88     FS_DISK_USAGE_OBJECT           = 0x140,
89     SS_AGENT_GET_ENUM_FILE_SIZE    = 0x141,
90     SS_AGENT_START_ENUMERATOR      = 0x142,
91     SS_AGENT_LOAD_MANAGE_INFO = 0x300,
92 };
93 
94 struct buffer_t {
95     uint64_t buffer; /* pointer */
96     uint32_t len;
97 };
98 
99 /* =========================================== */
100 struct open_obj_msg_t {
101     uint32_t storage_id;
102     uint64_t object_id; /* pointer */
103     uint32_t obj_id_len;
104     uint32_t flags;
105     uint64_t attr_head; /* pointer */
106     uint32_t attr_head_size;
107     TEE_UUID target_uuid;
108 };
109 
110 struct open_obj_rsp_t {
111     uint32_t err;
112     uint32_t obj_index;
113     uint32_t new_size;
114     uint32_t new_seek_pos;
115 };
116 /* =========================================== */
117 struct open_shared_obj_msg_t {
118     TEE_UUID source_entity_id;
119     uint32_t storage_id;
120     uint64_t object_id; /* pointer */
121     uint32_t obj_id_len;
122 };
123 
124 struct open_shared_obj_rsp_t {
125     uint32_t obj_index;
126     uint32_t attribute_size;
127     uint32_t new_size;
128     uint32_t new_seek_pos;
129 };
130 
131 /* =========================================== */
132 struct get_obj_attrs_msg_t {
133     uint32_t obj_index;
134     uint64_t buffer; /* pointer */
135     uint32_t size;
136 };
137 
138 struct get_obj_attrs_rsp_t {
139     uint32_t size;
140 };
141 
142 /* =========================================== */
143 struct create_obj_msg_t {
144     uint32_t storage_id;
145     uint64_t object_id; /* pointer */
146     uint32_t obj_id_len;
147     uint64_t attributes; /* pointer */
148     uint32_t attributes_len;
149     uint32_t flags;
150     uint64_t initial_data; /* pointer */
151     uint32_t data_len;
152     uint32_t cmd_id;
153     TEE_UUID target_uuid;
154     uint16_t reserved;
155 };
156 
157 struct create_obj_rsp_t {
158     uint32_t obj_index;
159     uint32_t new_seek_pos;
160     uint32_t new_size;
161 };
162 
163 /* =========================================== */
164 struct write_obj_msg_t {
165     uint32_t obj_index;
166     uint64_t buffer; /* poiner */
167     uint32_t len;
168     uint16_t reserved;
169     uint32_t new_seek_pos;
170     uint32_t new_size;
171 };
172 
173 struct write_obj_rsp_t {
174     uint32_t new_seek_pos;
175     uint32_t new_size;
176 };
177 
178 /* =========================================== */
179 struct read_obj_msg_t {
180     uint32_t obj_index;
181     uint64_t buffer; /* pointer */
182     uint32_t len;
183 };
184 
185 struct read_obj_rsp_t {
186     uint32_t count;
187     uint32_t new_seek_pos;
188     uint32_t new_size;
189     uint16_t reserved;
190 };
191 
192 /* =========================================== */
193 struct seek_obj_msg_t {
194     uint32_t obj_index;
195     int32_t offset;
196     uint32_t whence;
197 };
198 
199 struct seek_obj_rsp_t {
200     uint32_t new_seek_pos;
201     uint32_t new_size;
202 };
203 /* =========================================== */
204 struct truncate_obj_msg_t {
205     uint32_t obj_index;
206     int32_t size;
207 };
208 
209 struct truncate_obj_rsp_t {
210     uint32_t new_size;
211     uint32_t new_seek_pos;
212 };
213 
214 /* =========================================== */
215 struct rename_obj_msg_t {
216     uint32_t obj_index;
217     uint64_t new_object_id; /* pointer */
218     uint32_t obj_id_len;
219 };
220 
221 struct rename_obj_rsp_t {
222     uint32_t dummy;
223 };
224 
225 /* =========================================== */
226 struct sync_obj_msg_t {
227     uint32_t obj_index;
228 };
229 
230 struct sync_obj_rsp_t {
231     uint32_t dummy;
232 };
233 /* =========================================== */
234 struct get_info_obj_msg_t {
235     uint32_t obj_index;
236 };
237 
238 struct get_info_obj_rsp_t {
239     uint32_t pos;
240     uint32_t len;
241 };
242 /* =========================================== */
243 struct close_obj_msg_t {
244     uint32_t obj_index;
245 };
246 
247 struct close_obj_rsp_t {
248     uint32_t dummy;
249 };
250 /* =========================================== */
251 struct close_delete_obj_msg_t {
252     uint32_t obj_index;
253 };
254 
255 struct close_delete_obj_rsp_t {
256     uint32_t dummy;
257 };
258 /* =========================================== */
259 /* #keyserivce start */
260 #define SIZE_MAX_EXINFO 64
261 struct derive_plat_key_msg_t {
262     uint32_t key_type;                /* in */
263     uint32_t key_size; /* in */         /* bytes */
264     uint8_t exinfo[SIZE_MAX_EXINFO]; /* in */
265     uint32_t exinfo_size; /* in */     /* bytes */
266     uint32_t csc_type;               /* in */
267     TEE_UUID csc_uuid;               /* in */
268     uint32_t attri_buff_size; /* in */   /* bytes */
269     uint64_t attri_buff; /* out */      /* pointer */
270 };
271 
272 struct fs_buffer_t {
273     uint64_t buffer; /* pointer */
274     uint32_t len;
275     uint32_t flag;
276 };
277 
278 struct fs_read_t {
279     uint64_t buffer; /* pointer */
280     uint32_t count;
281     int32_t fd;
282 };
283 
284 struct fs_write_t {
285     uint64_t buffer; /* pointer */
286     uint32_t count;
287     int32_t fd;
288 };
289 
290 struct fs_seek_t {
291     int32_t fd;
292     int32_t offset;
293     uint32_t whence;
294 };
295 
296 struct fs_remove_t {
297     uint64_t buffer; /* pointer */
298     uint32_t len;
299 };
300 
301 struct fs_truncate_t {
302     uint64_t buffer; /* pointer */
303     uint32_t name_len;
304     uint32_t len;
305 };
306 
307 struct fs_rename_t {
308     uint64_t old_buf; /* pointer */
309     uint32_t old_name_len;
310     uint64_t new_buf; /* pointer */
311     uint32_t new_name_len;
312 };
313 
314 struct fs_copy_t {
315     uint64_t from_buf; /* pointer */
316     uint32_t from_path_len;
317     uint64_t to_buf; /* pointer */
318     uint32_t to_path_len;
319 };
320 
321 struct fs_info_t {
322     int32_t fd;
323 };
324 
325 struct fs_access_t {
326     uint64_t buf; /* pointer */
327     uint32_t path_len;
328     int mode;
329     char all_path;
330 };
331 
332 struct delete_obj_t {
333     TEE_UUID target_uuid;
334 };
335 
336 struct update_manage_info_t {
337     TEE_UUID uuid;
338     uint32_t manager;
339 };
340 
341 /* =========================================== */
342 /* #keyserivce end */
343 union ssa_agent_msg {
344     struct buffer_t buffer;
345     struct reg_ta_info reg;
346     struct reg_agent_buf reg_agent;
347     struct create_obj_msg_t create_obj;
348     struct open_obj_msg_t open_obj;
349     struct open_shared_obj_msg_t open_shared_obj;
350     struct get_obj_attrs_msg_t get_obj_attrs;
351     struct write_obj_msg_t write_obj;
352     struct read_obj_msg_t read_obj;
353     struct seek_obj_msg_t seek_obj;
354     struct truncate_obj_msg_t truncate_obj;
355     struct rename_obj_msg_t rename_obj;
356     struct sync_obj_msg_t sync_obj;
357     struct get_info_obj_msg_t get_info_obj;
358     struct close_obj_msg_t close_obj;
359     struct close_delete_obj_msg_t close_and_delete_obj;
360     /* #keyserivce start */
361     struct derive_plat_key_msg_t key_obj;
362     /* #keyserivce end */
363     /* fsxxx add */
364     struct fs_buffer_t fs_buffer;
365     int32_t fd;
366     struct fs_read_t fs_read;
367     struct fs_write_t fs_write;
368     struct fs_seek_t fs_seek;
369     struct fs_remove_t fs_remove;
370     struct fs_truncate_t fs_truncate;
371     struct fs_rename_t fs_rename;
372     struct fs_copy_t fs_copy;
373     struct fs_info_t fs_info;
374     struct fs_access_t fs_access;
375     struct delete_obj_t delete_obj;
376     struct update_manage_info_t update_manage_info;
377     struct huk_srv_msg huk_msg;
378     TEE_Result ret;
379 };
380 
381 struct fs_create_rsp_t {
382     int32_t fd;
383 };
384 
385 struct fs_open_rsp_t {
386     int32_t fd;
387 };
388 
389 struct fs_close_rsp_t {
390     int32_t rc;
391 };
392 
393 struct fs_read_rsp_t {
394     uint32_t count;
395     int32_t error;
396 };
397 
398 struct fs_write_rsp_t {
399     uint32_t count;
400 };
401 
402 struct fs_seek_rsp_t {
403     int32_t rc;
404 };
405 
406 struct fs_remove_rsp_t {
407     int32_t rc;
408 };
409 
410 struct fs_sync_rsp_t {
411     int32_t rc;
412 };
413 
414 struct fs_truncate_rsp_t {
415     int32_t rc;
416 };
417 
418 struct fs_rename_rsp_t {
419     int32_t rc;
420 };
421 
422 struct fs_copy_rsp_t {
423     int32_t rc;
424 };
425 
426 struct fs_info_rsp_t {
427     int32_t rc;
428     uint32_t pos;
429     uint32_t len;
430 };
431 
432 struct fs_access_rsp_t {
433     int32_t rc;
434 };
435 
436 struct fs_diskusage_rsp_t {
437     int32_t rc;
438     uint32_t secure_remain;
439     uint32_t data_secure_remain;
440 };
441 
442 struct ssa_agent_rsp {
443     TEE_Result ret;
444     union {
445         struct create_obj_rsp_t create_obj;
446         struct open_obj_rsp_t open_obj;
447         struct open_shared_obj_rsp_t open_shared_obj;
448         struct get_obj_attrs_rsp_t get_obj_attrs;
449         struct write_obj_rsp_t write_obj;
450         struct read_obj_rsp_t read_obj;
451         struct seek_obj_rsp_t seek_obj;
452         struct truncate_obj_rsp_t truncate_obj;
453         struct rename_obj_rsp_t rename_obj;
454         struct sync_obj_rsp_t sync_obj;
455         struct get_info_obj_rsp_t get_info_obj;
456         struct close_obj_rsp_t close_obj;
457         struct close_delete_obj_rsp_t close_and_delete_obj;
458         /* #keyserivce start */
459         struct derive_plat_key_msg_t key_obj;
460         /* #keyserivce end */
461         struct fs_create_rsp_t fs_create_rsp;
462         struct fs_open_rsp_t fs_open_rsp;
463         struct fs_close_rsp_t fs_close_rsp;
464         struct fs_read_rsp_t fs_read_rsp;
465         struct fs_write_rsp_t fs_write_rsp;
466         struct fs_seek_rsp_t fs_seek_rsp;
467         struct fs_remove_rsp_t fs_remove_rsp;
468         struct fs_sync_rsp_t fs_sync_rsp;
469         struct fs_truncate_rsp_t fs_truncate_rsp;
470         struct fs_rename_rsp_t fs_rename_rsp;
471         struct fs_copy_rsp_t fs_copy_rsp;
472         struct fs_info_rsp_t fs_info_rsp;
473         struct fs_access_rsp_t fs_access_rsp;
474         struct fs_diskusage_rsp_t fs_diskusage_rsp;
475     };
476 };
477 
478 struct object_enum_info {
479     uint32_t storage_id;
480     uint8_t object_id[HASH_NAME_BUFF_LEN];
481     uint32_t object_id_len;
482     TEE_ObjectInfo obj_info;
483 };
484 
485 #define SS_AGENT_MSG_QUEUE_SIZE 64
486 
487 struct ss_msg_t {
488     uint32_t msg_id;
489     uint32_t sender;
490     union ssa_agent_msg msg;
491 };
492 
493 struct ss_msg_queue_t {
494     uint32_t in;
495     uint32_t out;
496     struct ss_msg_t msg[SS_AGENT_MSG_QUEUE_SIZE];
497 };
498 
499 extern struct ss_msg_queue_t g_ssa_msg_queue;
500 
501 TEE_Result ss_agent_create_object(struct create_obj_msg_t *params, TEE_ObjectHandle *object);
502 
503 TEE_Result ss_agent_open_object(struct create_obj_msg_t *params, TEE_ObjectHandle *object);
504 
505 TEE_Result ss_agent_read_object_data(TEE_ObjectHandle object, void *buffer, uint32_t size, uint32_t *count);
506 
507 TEE_Result ss_agent_write_object_data(TEE_ObjectHandle object, const void *buffer, uint32_t size);
508 
509 TEE_Result ss_agent_seek_object_data(TEE_ObjectHandle object, int32_t offset, TEE_Whence whence);
510 
511 TEE_Result ss_agent_rename_object(TEE_ObjectHandle object, const void *new_object_id, uint32_t new_object_id_len);
512 
513 TEE_Result ss_agent_truncate_object_data(TEE_ObjectHandle object, int32_t size);
514 
515 TEE_Result ss_agent_get_object_info(TEE_ObjectHandle object, uint32_t *pos, uint32_t *len);
516 
517 void ss_agent_close_object(TEE_ObjectHandle object);
518 
519 TEE_Result ss_agent_sync_object(TEE_ObjectHandle object);
520 
521 TEE_Result ss_agent_close_and_delete_object(TEE_ObjectHandle object);
522 TEE_Result allocate_enum_handle(TEE_ObjectEnumHandle *obj_enumerator);
523 void free_enum_handle(TEE_ObjectEnumHandle obj_enumerator);
524 void reset_enum_handle(TEE_ObjectEnumHandle obj_enumerator);
525 TEE_Result ta_start_enumerator(TEE_ObjectEnumHandle obj_enumerator);
526 TEE_Result ta_get_next(TEE_ObjectEnumHandle obj_enumerator, TEE_ObjectInfo *object_info,
527                        uint8_t *object_id, size_t *object_id_len);
528 
529 void ss_agent_proc_cmd(uint32_t snd_cmd, const union ssa_agent_msg *snd_msg, uint32_t ack_cmd,
530                        struct ssa_agent_rsp *rsp_msg);
531 TEE_Result get_device_id_prop(uint8_t *dst, uint32_t len);
532 TEE_Result ssagent_delete_all(TEE_UUID target);
533 uint32_t get_object_key_size(TEE_ObjectHandle attributes);
534 uint32_t get_attr_buf_size(TEE_ObjectHandle object);
535 TEE_Result copy_attribute(uint8_t **p, const TEE_Attribute *attr);
536 TEE_Result restore_attrs(TEE_ObjectHandle object, const uint8_t *buff, uint32_t buff_size,
537     uint32_t attr_size, uint32_t attr_count);
538 #endif /* TEE_SS_AGENT_API_H_ */
539