OP-TEE: Phân tích quy trình gọi từ CA đến TA (Phần 2)
Phân tích chi tiết quy trình gọi từ Client Application đến Trusted Application trong OP-TEE, từ TEE driver đến ATF.
1. Môi trường
- Ubuntu 22.04
- ARM Development Studio (ADS) + OP-TEE FVP
2. Quy trình gọi (Call Flow) phân tích
2.1. Tổng quan
Từ góc độ tổng quan, toàn bộ quy trình gọi từ CA đến TA:
1
CA → OP-TEE Client → TEE Driver → ATF → TEE → TA
Sơ đồ tổng quan quy trình gọi từ CA đến TA
2.2. Quy trình làm việc của CA & TA
Client Application (CA):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 1. Khởi tạo context để tương tác với TEE
res = TEEC_InitializeContext(NULL, &ctx);
// 2. Mở session, TEE sẽ xác thực và tải TA tương ứng
res = TEEC_OpenSession(&ctx, &sess, &uuid,
TEEC_LOGIN_PUBLIC, NULL, NULL, &err_origin);
// 3. Tương tác thông qua invoke command
res = TEEC_InvokeCommand(&sess, TA_HELLO_WORLD_CMD_INC_VALUE, &op,
&err_origin);
// 4. Đóng session
TEEC_CloseSession(&sess);
// 5. Giải phóng context
TEEC_FinalizeContext(&ctx);
Trusted Application (TA):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 1. Entry points khi TA được tải
TA_CreateEntryPoint
TA_OpenSessionEntryPoint
// 2. Xử lý business logic
TEE_Result TA_InvokeCommandEntryPoint(void __maybe_unused *sess_ctx,
uint32_t cmd_id,
uint32_t param_types,
TEE_Param params[4])
{
switch (cmd_id) {
case TA_HELLO_WORLD_CMD_INC_VALUE:
return inc_value(param_types, params);
case TA_HELLO_WORLD_CMD_DEC_VALUE:
return dec_value(param_types, params);
default:
return TEE_ERROR_BAD_PARAMETERS;
}
}
// 3. Cleanup khi đóng session
TA_CloseSessionEntryPoint
TA_DestroyEntryPoint
Mối quan hệ CA-TA:
1
2
3
TEEC_OpenSession → TA_CreateEntryPoint + TA_OpenSessionEntryPoint
TEEC_InvokeCommand → TA_InvokeCommandEntryPoint
TEEC_CloseSession → TA_CloseSessionEntryPoint + TA_DestroyEntryPoint
3. Phân tích mã nguồn
3.1. TEEC_InitializeContext
Mở TEE driver và chuẩn bị giao tiếp:
1
2
3
TEEC_InitializeContext
└── teec_open_dev
└── ioctl(fd, TEE_IOC_VERSION, &vers)
Command được sử dụng: TEE_IOC_VERSION
3.2. TEEC_OpenSession
Quá trình mở session phức tạp nhất, bao gồm việc tải TA:
1
2
TEEC_OpenSession(&ctx, &sess, &uuid, TEEC_LOGIN_PUBLIC, NULL, NULL, &err_origin);
└── ioctl(ctx->fd, TEE_IOC_OPEN_SESSION, &buf_data);
Trong TEE Driver:
1
2
3
4
tee_ioctl_open_session
└── ctx->teedev->desc->ops->open_session(ctx, &arg, params);
└── optee_open_session
└── optee->ops->do_call_with_arg(ctx, shm_arg, offs);
SMC Call đến ATF:
1
2
3
// linux/drivers/tee/optee/smc_abi.c
optee->smc.invoke_fn(param.a0, param.a1, param.a2, param.a3,
param.a4, param.a5, param.a6, param.a7, &res);
Trong ATF:
- SMC #0 interrupt → Exception Level 3
opteed_smc_handler
xử lý request- Lưu non-secure context, phục hồi secure context
- ERET vào OP-TEE
Trong OP-TEE:
1
2
3
4
5
6
7
8
9
10
thread_handle_std_smc
└── thread_alloc_and_run
└── thread_std_smc_entry
└── __tee_entry_std
└── entry_open_session (OPTEE_MSG_CMD_OPEN_SESSION)
└── tee_ta_open_session
└── tee_ta_init_session // Tải TA
└── ts_ctx->ops->enter_open_session
└── user_ta_enter_open_session
└── thread_enter_user_mode // S-EL1 → S-EL0
3.3. TEEC_InvokeCommand
Logic tương tự OpenSession, khác biệt ở command:
1
2
3
4
5
TEEC_InvokeCommand
└── ioctl(TEE_IOC_INVOKE_COMMAND)
└── entry_invoke_command (OPTEE_MSG_CMD_INVOKE_COMMAND)
└── user_ta_enter_invoke_cmd
└── user_ta_enter(UTEE_ENTRY_FUNC_INVOKE_COMMAND)
Cuối cùng gọi đến TA_InvokeCommandEntryPoint
trong TA.
3.4. TEEC_CloseSession
Đóng session và cleanup:
1
2
3
4
5
6
7
void TEEC_CloseSession(TEEC_Session *session)
{
struct tee_ioctl_close_session_arg arg;
arg.session = session->session_id;
ioctl(session->ctx->fd, TEE_IOC_CLOSE_SESSION, &arg);
}
Command: TEE_IOC_CLOSE_SESSION
→ TA_CloseSessionEntryPoint
3.5. TEEC_FinalizeContext
Đóng driver:
1
2
3
4
5
void TEEC_FinalizeContext(TEEC_Context *ctx)
{
if (ctx)
close(ctx->fd);
}
Chúc mừng! Bạn đã hiểu được quy trình hoàn chỉnh từ CA đến TA trong OP-TEE ecosystem. Kiến thức này là nền tảng quan trọng để phát triển và debug các ứng dụng bảo mật trên ARM TrustZone.