blob: d724b0b7527808fa4207bb598368fb30c2610deb [file] [log] [blame]
b.liu68a94c92025-05-24 12:53:41 +08001#include <dlfcn.h>
hong.liud2417072025-06-27 07:10:37 -07002#include <stdbool.h>
b.liu68a94c92025-05-24 12:53:41 +08003#include <stdio.h>
hong.liud2417072025-06-27 07:10:37 -07004#include <stdlib.h>
b.liu68a94c92025-05-24 12:53:41 +08005#include <string.h>
6#include <stdint.h>
hong.liud2417072025-06-27 07:10:37 -07007#include "gsw_secrypt_ss_interface.h"
8#include "gsw_hal_errcode.h"
b.liu68a94c92025-05-24 12:53:41 +08009
10#ifndef LOG_ERR_LEVEL
11#define LOG_ERR_LEVEL 3 /* error conditions */
12#endif
13#ifndef LOG_WARN_LEVEL
14#define LOG_WARN_LEVEL 4 /* warning conditions */
15#endif
16#ifndef LOG_INFO_LEVEL
17#define LOG_INFO_LEVEL 6 /* informational */
18#endif
19#ifndef LOG_DEBUG_LEVEL
20#define LOG_DEBUG_LEVEL 7 /* debug-level messages */
21#endif
22#ifndef LOG_VERBOSE_LEVEL
23#define LOG_VERBOSE_LEVEL 8
24#endif
25
l.yang6a42e4d2025-05-28 01:04:20 -070026#define GSW_TEE "[HAL][GSW_TEE]"
27
b.liu68a94c92025-05-24 12:53:41 +080028#define LOGV(fmt, args ...) \
29 do{ \
30 char *file_ptr_1001 = __FILE__; \
31 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
32 char line_1001[10] = {0}; \
33 sprintf(line_1001, "%d", __LINE__); \
34 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
35 if(*ptr_1001 == '/') \
36 break; \
37 ptr_1001--; \
38 } \
l.yang6a42e4d2025-05-28 01:04:20 -070039 mbtk_log(LOG_VERBOSE_LEVEL, "%s#%s: "GSW_TEE"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +080040 } while(0)
41
42#define LOGI(fmt, args...) \
43 do{ \
44 char *file_ptr_1001 = __FILE__; \
45 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
46 char line_1001[10] = {0}; \
47 sprintf(line_1001, "%d", __LINE__); \
48 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
49 if(*ptr_1001 == '/') \
50 break; \
51 ptr_1001--; \
52 } \
l.yang6a42e4d2025-05-28 01:04:20 -070053 mbtk_log(LOG_INFO_LEVEL, "%s#%s: "GSW_TEE"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +080054 } while(0)
55
56#define LOGD(fmt, args...) \
57 do{ \
58 char *file_ptr_1001 = __FILE__; \
59 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
60 char line_1001[10] = {0}; \
61 sprintf(line_1001, "%d", __LINE__); \
62 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
63 if(*ptr_1001 == '/') \
64 break; \
65 ptr_1001--; \
66 } \
l.yang6a42e4d2025-05-28 01:04:20 -070067 mbtk_log(LOG_DEBUG_LEVEL, "%s#%s: "GSW_TEE"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +080068 } while(0)
69
70#define LOGW(fmt, args...) \
71 do{ \
72 char *file_ptr_1001 = __FILE__; \
73 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
74 char line_1001[10] = {0}; \
75 sprintf(line_1001, "%d", __LINE__); \
76 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
77 if(*ptr_1001 == '/') \
78 break; \
79 ptr_1001--; \
80 } \
l.yang6a42e4d2025-05-28 01:04:20 -070081 mbtk_log(LOG_WARN_LEVEL, "%s#%s: "GSW_TEE"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +080082 } while(0)
83
84#define LOGE(fmt, args...) \
85 do{ \
86 char *file_ptr_1001 = __FILE__; \
87 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
88 char line_1001[10] = {0}; \
89 sprintf(line_1001, "%d", __LINE__); \
90 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
91 if(*ptr_1001 == '/') \
92 break; \
93 ptr_1001--; \
94 } \
l.yang6a42e4d2025-05-28 01:04:20 -070095 mbtk_log(LOG_ERR_LEVEL, "%s#%s: "GSW_TEE"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +080096 } while(0)
97
lichengzhangd7aea6c2025-06-05 16:35:54 +080098/**
99 * struct TEEC_Context - Represents a connection between a client application
100 * and a TEE.
101 */
102 typedef struct {
103 /* Implementation defined */
104 struct {
105 int fd;
106 bool reg_mem;
107 bool memref_null;
108 } imp;
109} TEEC_Context;
110
111/**
112 * struct TEEC_Session - Represents a connection between a client application
113 * and a trusted application.
114 */
115 typedef struct {
116 /* Implementation defined */
117 struct {
118 TEEC_Context *ctx;
119 uint32_t session_id;
120 } imp;
121} TEEC_Session;
122
b.liu68a94c92025-05-24 12:53:41 +0800123struct test_ctx {
lichengzhangd7aea6c2025-06-05 16:35:54 +0800124 TEEC_Context ctx;
125 TEEC_Session sess;
b.liu68a94c92025-05-24 12:53:41 +0800126};
127
lichengzhangd7aea6c2025-06-05 16:35:54 +0800128#define TEEC_SUCCESS 0x00000000
129#define TEEC_ERROR_STORAGE_NOT_AVAILABLE 0xF0100003
130#define TEEC_ERROR_GENERIC 0xFFFF0000
131#define TEEC_ERROR_ACCESS_DENIED 0xFFFF0001
132#define TEEC_ERROR_CANCEL 0xFFFF0002
133#define TEEC_ERROR_ACCESS_CONFLICT 0xFFFF0003
134#define TEEC_ERROR_EXCESS_DATA 0xFFFF0004
135#define TEEC_ERROR_BAD_FORMAT 0xFFFF0005
136#define TEEC_ERROR_BAD_PARAMETERS 0xFFFF0006
137#define TEEC_ERROR_BAD_STATE 0xFFFF0007
138#define TEEC_ERROR_ITEM_NOT_FOUND 0xFFFF0008
139#define TEEC_ERROR_NOT_IMPLEMENTED 0xFFFF0009
140#define TEEC_ERROR_NOT_SUPPORTED 0xFFFF000A
141#define TEEC_ERROR_NO_DATA 0xFFFF000B
142#define TEEC_ERROR_OUT_OF_MEMORY 0xFFFF000C
143#define TEEC_ERROR_BUSY 0xFFFF000D
144#define TEEC_ERROR_COMMUNICATION 0xFFFF000E
145#define TEEC_ERROR_SECURITY 0xFFFF000F
146#define TEEC_ERROR_SHORT_BUFFER 0xFFFF0010
147#define TEEC_ERROR_EXTERNAL_CANCEL 0xFFFF0011
148#define TEEC_ERROR_TARGET_DEAD 0xFFFF3024
b.liu68a94c92025-05-24 12:53:41 +0800149
150struct test_ctx ctx;
151
152#define lib_secure_path "/lib/libsecure_storage.so"
153static void *dlHandle_secure;
154
155#define lib_mbtk_path "/lib/libmbtk_lib.so"
156static void *dlHandle_mbtk;
157
lichengzhangd7aea6c2025-06-05 16:35:54 +0800158typedef uint32_t TEEC_Result;
b.liu68a94c92025-05-24 12:53:41 +0800159static void (*mbtk_log)(int level, const char *format, ...);
160static void (*mbtk_log_init)(char *path, char *tag);
161
b.liu68a94c92025-05-24 12:53:41 +0800162int (*prepare_tee_session)(struct test_ctx *ctx);
163void (*terminate_tee_session)(struct test_ctx *ctx);
164TEEC_Result (*read_secure_object)(struct test_ctx *ctx, const char *id,char *data, size_t data_len);
165TEEC_Result (*write_secure_object)(struct test_ctx *ctx, const char *id,char *data, size_t data_len);
166TEEC_Result (*delete_secure_object)(struct test_ctx *ctx, const char *id);
167
b.liu68a94c92025-05-24 12:53:41 +0800168static int tee_api_import(void)
169{
170
171 dlHandle_mbtk = dlopen(lib_mbtk_path, RTLD_NOW);
172 if (dlHandle_mbtk == NULL)
173 {
lichengzhangd7aea6c2025-06-05 16:35:54 +0800174 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800175 }
176
177 dlHandle_secure = dlopen(lib_secure_path, RTLD_NOW);
178 if (dlHandle_secure == NULL)
179 {
lichengzhangd7aea6c2025-06-05 16:35:54 +0800180 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800181 }
182
183 mbtk_log_init = (void (*)(char *path, char *tag))dlsym(dlHandle_mbtk, "mbtk_log_init");
184 if (mbtk_log_init == NULL)
185 {
lichengzhangd7aea6c2025-06-05 16:35:54 +0800186 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800187 }
188
189 mbtk_log = (void (*)(int level, const char *format, ...))dlsym(dlHandle_mbtk, "mbtk_log");
190 if (mbtk_log == NULL)
191 {
lichengzhangd7aea6c2025-06-05 16:35:54 +0800192 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800193 }
194
195 prepare_tee_session = (int (*)(struct test_ctx *ctx))dlsym(dlHandle_secure, "prepare_tee_session");
196 if (prepare_tee_session == NULL)
197 {
198 LOGE("prepare_tee_session dlsym fail\n");
lichengzhangd7aea6c2025-06-05 16:35:54 +0800199 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800200 }
201
202 terminate_tee_session = (void (*)(struct test_ctx *ctx))dlsym(dlHandle_secure, "terminate_tee_session");
203 if (terminate_tee_session == NULL)
204 {
205 LOGE("terminate_tee_session dlsym fail\n");
lichengzhangd7aea6c2025-06-05 16:35:54 +0800206 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800207 }
208
209 read_secure_object = (TEEC_Result (*)(struct test_ctx *ctx, const char *id,char *data, size_t data_len))dlsym(dlHandle_secure, "read_secure_object");
210 if (read_secure_object == NULL)
211 {
212 LOGE("read_secure_object dlsym fail\n");
lichengzhangd7aea6c2025-06-05 16:35:54 +0800213 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800214 }
215
216 write_secure_object = (TEEC_Result (*)(struct test_ctx *ctx, const char *id,char *data, size_t data_len))dlsym(dlHandle_secure, "write_secure_object");
217 if (write_secure_object == NULL)
218 {
219 LOGE("write_secure_object dlsym fail\n");
lichengzhangd7aea6c2025-06-05 16:35:54 +0800220 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800221 }
222
223 delete_secure_object = (TEEC_Result (*)(struct test_ctx *ctx, const char *id))dlsym(dlHandle_secure, "delete_secure_object");
224 if (delete_secure_object == NULL)
225 {
226 LOGE("delete_secure_object dlsym fail\n");
lichengzhangd7aea6c2025-06-05 16:35:54 +0800227 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800228 }
229
230 return GSW_HAL_SUCCESS;
231}
232
233/**
234* @brief init tee sdk
235* @param [in] None
236* @param [out] None
237* @retval GSW_HAL_SUCCESS is success\other is fail
238*/
239int32_t gsw_tee_sdk_init(void)
240{
241 int32_t ret = 0;
242 ret = tee_api_import();
243 if(ret)
244 {
245 LOGE("tee_api_import fail\n");
246 return ret;
247 }
248 ret = prepare_tee_session(&ctx);
249
250 return ret;
251}
252
b.liu68a94c92025-05-24 12:53:41 +0800253/**
254* @brief read sensitive data from tee
255* @param [in] char* in_obj_name :Sensitive data name
256* @param [in] unsigned int* p_out_buf_len:The size of sensitive data output cache
257* @param [out] char* out_buf:Cache of sensitive data output
258* @param [out] unsigned int* p_out_buf_len:Sensitive data length
259* @retval GSW_HAL_SUCCESS is success\other is fail
260*/
261#define basic_buf_len 7000
262int32_t gsw_tee_read_secure_data(const char* in_obj_name, char* out_buf, unsigned int* p_out_buf_len)
263{
lichengzhangd7aea6c2025-06-05 16:35:54 +0800264 if (in_obj_name == NULL || out_buf == NULL)
hong.liud2417072025-06-27 07:10:37 -0700265 {
lichengzhangd7aea6c2025-06-05 16:35:54 +0800266 return GSW_HAL_NORMAL_FAIL;
hong.liud2417072025-06-27 07:10:37 -0700267 }
268
b.liu68a94c92025-05-24 12:53:41 +0800269 int32_t ret = 0;
hong.liud2417072025-06-27 07:10:37 -0700270 char *tmp_buf = (char*)malloc(basic_buf_len);
271 if (NULL == tmp_buf)
272 {
273 LOGE("Failed malloc fail");
274 return GSW_HAL_NO_MEMORY;
275 }
276
277 TEEC_Result res = read_secure_object(&ctx, in_obj_name, tmp_buf, basic_buf_len);
b.liu68a94c92025-05-24 12:53:41 +0800278 if (res != TEEC_SUCCESS)
279 {
280 LOGE("Failed to read an object from the secure storage");
lichengzhangd7aea6c2025-06-05 16:35:54 +0800281 ret = GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800282 }
lichengzhangd7aea6c2025-06-05 16:35:54 +0800283 memcpy(out_buf, tmp_buf, strlen(tmp_buf)+1);
b.liu68a94c92025-05-24 12:53:41 +0800284 *p_out_buf_len = strlen(out_buf);
lichengzhangd7aea6c2025-06-05 16:35:54 +0800285 free(tmp_buf);
b.liu68a94c92025-05-24 12:53:41 +0800286 return ret;
287}
288
b.liu68a94c92025-05-24 12:53:41 +0800289/**
290* @brief write sensitive data to tee
291* @param [in] char* in_obj_name :Sensitive data name
292* @param [in] char* in_buf:A cache for writing sensitive data
293* @param [out] unsigned int in_buf_len:Sensitive data length
294* @retval GSW_HAL_SUCCESS is success\other is fail
295*/
296int32_t gsw_tee_write_secure_data(const char* in_obj_name, char* in_buf, unsigned int in_buf_len)
297{
lichengzhangd7aea6c2025-06-05 16:35:54 +0800298 if (in_obj_name == NULL || in_buf == NULL)
299 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800300 int32_t ret = 0;
hong.liud2417072025-06-27 07:10:37 -0700301
302 TEEC_Result res = write_secure_object(&ctx, in_obj_name,in_buf, in_buf_len);
b.liu68a94c92025-05-24 12:53:41 +0800303 if (res != TEEC_SUCCESS)
304 {
305 LOGE("Failed to write an object from the secure storage");
lichengzhangd7aea6c2025-06-05 16:35:54 +0800306 ret = GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800307 }
308
309 return ret;
310}
311
312
313/**
314* @brief delete sensitive data from tee
315* @param [in] char* in_obj_name :Sensitive data name
316* @retval GSW_HAL_SUCCESS is success\other is fail
317*/
318int32_t gsw_tee_delete_secure_data(const char* in_obj_name)
319{
lichengzhangd7aea6c2025-06-05 16:35:54 +0800320 if (in_obj_name == NULL)
321 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800322 int32_t ret = 0;
hong.liud2417072025-06-27 07:10:37 -0700323
324 TEEC_Result res = delete_secure_object(&ctx, in_obj_name);
b.liu68a94c92025-05-24 12:53:41 +0800325 if (res != TEEC_SUCCESS)
326 {
327 LOGE("Failed to delete the object: 0x%x", res);
lichengzhangd7aea6c2025-06-05 16:35:54 +0800328 ret = GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800329 }
330
b.liu68a94c92025-05-24 12:53:41 +0800331 return ret;
b.liu68a94c92025-05-24 12:53:41 +0800332}
333
334/**
335* @brief check sensitive data from tee
336* @param [in] char* in_obj_name :Sensitive data name
337* @retval GSW_HAL_SUCCESS is exist\ other is not exist or fail
338*/
339int32_t gsw_tee_check_secure_data(const char* in_obj_name)
340{
lichengzhangd7aea6c2025-06-05 16:35:54 +0800341 if (in_obj_name == NULL)
342 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800343 int32_t ret = 1;
b.liu68a94c92025-05-24 12:53:41 +0800344
hong.liud2417072025-06-27 07:10:37 -0700345 char *tmp_buf = (char*)malloc(basic_buf_len);
346 if (NULL == tmp_buf)
347 {
348 LOGE("Failed malloc fail");
349 return GSW_HAL_NO_MEMORY;
350 }
351 TEEC_Result res = read_secure_object(&ctx, in_obj_name, tmp_buf, basic_buf_len);
b.liu68a94c92025-05-24 12:53:41 +0800352 if (res == TEEC_ERROR_ITEM_NOT_FOUND)
353 {
354 LOGE("the obj no found\n");
lichengzhangd7aea6c2025-06-05 16:35:54 +0800355 ret = GSW_HAL_ERROR_TEE_SFS_FILE_NOEXIST;
b.liu68a94c92025-05-24 12:53:41 +0800356 }
357 else if (res == TEEC_SUCCESS)
358 {
359 LOGE("the obj is exist\n");
360 ret = GSW_HAL_SUCCESS;
361 }
362 else
363 {
364 LOGE("Failed to read an object from the secure storage");
lichengzhangd7aea6c2025-06-05 16:35:54 +0800365 ret = GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800366 }
lichengzhangd7aea6c2025-06-05 16:35:54 +0800367 free(tmp_buf);
b.liu68a94c92025-05-24 12:53:41 +0800368 return ret;
369}
370
lichengzhangd7aea6c2025-06-05 16:35:54 +0800371/**
372* @brief deinit tee sdk
373* @param [in] None
374* @param [out] None
375* @retval GSW_HAL_SUCCESS is success\other is fail
376*/
b.liu68a94c92025-05-24 12:53:41 +0800377int32_t gsw_tee_sdk_deinit(void)
378{
379 if (terminate_tee_session) {
380 terminate_tee_session(&ctx); // 终止TEE会话
381 terminate_tee_session = NULL;
382 }
383
384 if (dlHandle_secure) {
385 dlclose(dlHandle_secure); // 卸载安全库
386 dlHandle_secure = NULL;
387 }
388
389 if (dlHandle_mbtk) {
390 dlclose(dlHandle_mbtk); // 卸载日志库
391 dlHandle_mbtk = NULL;
392 }
393
394 return GSW_HAL_SUCCESS;
395}
396
hong.liud2417072025-06-27 07:10:37 -0700397int32_t gsw_secure_init(void)
398{
399 static int s_init_flag = 0;
400 if (0xAA55 == s_init_flag)
401 {
402 return GSW_HAL_SUCCESS;
403 }
404 if (GSW_HAL_SUCCESS == gsw_tee_sdk_init())
405 {
406 s_init_flag = 0xAA55;
407 return GSW_HAL_SUCCESS;
408 }
409 LOGE("secure sdk init fail!!!");
410 return GSW_HAL_NORMAL_FAIL;
411}
412
413int32_t gsw_secure_storage_query(const char *objname, int32_t *exist_state)
414{
415#if 0
416 if (NULL == objname || NULL == exist_state)
417 {
418 LOGE("storage query input param error objname %p, exist_state %p",objname, exist_state);
419 return GSW_HAL_ARG_INVALID;
420 }
421 int32_t ret = gsw_secure_init();
422 if (GSW_HAL_SUCCESS != ret)
423 {
424 return ret;
425 }
426 ret = gsw_tee_check_secure_data(objname);
427 if (GSW_HAL_SUCCESS == ret)
428 {
429 *exist_state = 1; //表明数据存在
430 }
431 else
432 {
433 *exist_state = 0;
434 }
435 return ret;
436#else
437 return GSW_HAL_NO_SUPPROT;
438#endif
439}
440
441int32_t gsw_secure_storage_read(const char *objname, uint8_t *outbuf, uint32_t buflen, uint32_t *outlen)
442{
443#if 0
444 if (NULL == objname || NULL == outbuf || NULL == outlen)
445 {
446 LOGE("storage read input param error objname %p, outbuf %p, outlen %p",objname, outbuf, outlen);
447 return GSW_HAL_ARG_INVALID;
448 }
449 int32_t ret = gsw_secure_init();
450 if (GSW_HAL_SUCCESS != ret)
451 {
452 return ret;
453 }
454 *outlen = buflen;
455 return gsw_tee_read_secure_data(objname, (char*)outbuf, outlen);
456#else
457 return GSW_HAL_NO_SUPPROT;
458#endif
459
460}
461
462int32_t gsw_secure_storage_write(const char *objname, const uint8_t *inbuf, uint32_t inlen)
463{
464#if 0
465 if (NULL == objname || NULL == inbuf || 0 == inlen)
466 {
467 LOGE("storage write input param error objname %p, outbuf %p, inlen %u",objname, inbuf, inlen);
468 return GSW_HAL_ARG_INVALID;
469 }
470 int32_t ret = gsw_secure_init();
471 if (GSW_HAL_SUCCESS != ret)
472 {
473 return ret;
474 }
475 return gsw_tee_write_secure_data(objname, (char*)inbuf, inlen);
476#else
477 return GSW_HAL_NO_SUPPROT;
478#endif
479}
480
481int32_t gsw_secure_storage_delete(const char *objname)
482{
483#if 0
484 if (NULL == objname)
485 {
486 LOGE("storage delete input param error objname %p",objname);
487 return GSW_HAL_ARG_INVALID;
488 }
489 int32_t ret = gsw_secure_init();
490 if (GSW_HAL_SUCCESS != ret)
491 {
492 return ret;
493 }
494 return gsw_tee_delete_secure_data(objname);
495#else
496 return GSW_HAL_NO_SUPPROT;
497#endif
498}