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