本文学习tee_supplicant的相关内容。以下是杂记,仅用做学习记录。学习代码均取自github和《手机安全和可信应用开发指南》(帅峰云,黄腾,宋洋)

进程间通信,是系统中进程或线程之间的通信机制,本文介绍OPTEE系统中的IPC机制

OPTEE的IPC机制主要满足OPTEE用户空间运行的线程调用其它线程,静态TA,安全驱动的需求。其核心原理是利用系统调用来访问其他线程或者安全驱动。当线程需要进行IPC时,首先会通过系统调用陷入到OPTEE内核态,然后执行类似CA调用TA的操作,建立会话并通过调用命令的方式让其他的TA来完成相应的操作。

TA调用TA

OPTEE定义了3个i二口,来完成TA和TA之间的调用

TEE_OpenTASession

TEE_Result TEE_OpenTASession(const TEE_UUID *destination,uint32_t cancellationRequestTimeout,uint32_t paramTypes,TEE_Param params[TEE_NUM_PARAMS],TEE_TASessionHandle *session,uint32_t *returnOrigin)
{TEE_Result res;struct utee_params up;uint32_t s;__utee_from_param(&up, paramTypes, params);res = utee_open_ta_session(destination, cancellationRequestTimeout,&up, &s, returnOrigin);__utee_to_param(params, NULL, &up);/** Specification says that *session must hold TEE_HANDLE_NULL is* TEE_SUCCESS isn't returned. Set it here explicitly in case* the syscall fails before out parameters has been updated.*/if (res != TEE_SUCCESS)s = TEE_HANDLE_NULL;*session = (TEE_TASessionHandle)(uintptr_t)s;return res;
}/* utee_open_ta_session 会陷入内核然后调用syscall_open_ta_session */
/* Called when a TA calls an OpenSession on another TA */
TEE_Result syscall_open_ta_session(const TEE_UUID *dest,unsigned long cancel_req_to,struct utee_params *usr_param, uint32_t *ta_sess,uint32_t *ret_orig)
{TEE_Result res;uint32_t ret_o = TEE_ORIGIN_TEE;struct tee_ta_session *s = NULL;struct tee_ta_session *sess;struct mobj *mobj_param = NULL;TEE_UUID *uuid = malloc(sizeof(TEE_UUID));struct tee_ta_param *param = malloc(sizeof(struct tee_ta_param));TEE_Identity *clnt_id = malloc(sizeof(TEE_Identity));void *tmp_buf_va[TEE_NUM_PARAMS];struct user_ta_ctx *utc;if (uuid == NULL || param == NULL || clnt_id == NULL) {res = TEE_ERROR_OUT_OF_MEMORY;goto out_free_only;}memset(param, 0, sizeof(struct tee_ta_param));res = tee_ta_get_current_session(&sess); //这里的session是在open一个ta的时候创建的,一个ta对应一个session。这里获取的是本ta的session。if (res != TEE_SUCCESS)goto out_free_only;utc = to_user_ta_ctx(sess->ctx);res = tee_svc_copy_from_user(uuid, dest, sizeof(TEE_UUID));if (res != TEE_SUCCESS)goto function_exit;clnt_id->login = TEE_LOGIN_TRUSTED_APP;memcpy(&clnt_id->uuid, &sess->ctx->uuid, sizeof(TEE_UUID));res = tee_svc_copy_param(sess, NULL, usr_param, param, tmp_buf_va,&mobj_param);if (res != TEE_SUCCESS)goto function_exit;/** Find session of a multi session TA or a static TA* In such a case, there is no need to ask the supplicant for the TA* code*/res = tee_ta_open_session(&ret_o, &s, &utc->open_sessions, uuid,clnt_id, cancel_req_to, param); //调用内核的opensession函数打开对端ta的sessionif (res != TEE_SUCCESS)goto function_exit;res = tee_svc_update_out_param(sess, s, param, tmp_buf_va, usr_param);function_exit:mobj_free(mobj_param);if (res == TEE_SUCCESS)tee_svc_copy_kaddr_to_uref(ta_sess, s);tee_svc_copy_to_user(ret_orig, &ret_o, sizeof(ret_o));out_free_only:free(param);free(uuid);free(clnt_id);return res;
}

TEE_InvokeTACommand

调用TEE_InvokeTACommand时带入命令ID就能调用TA中的具体命令,其过程与CA的命令调用操作几乎一致

TEE_CloseTASession

TEE_CloseTASession接口用于断开TA与其他TA之间的连接,其过程与CA的关闭会话操作几乎一致

TA调用系统服务和安全驱动

OPTEE中的TA调用系统服务和安全驱动和REE侧的userspace调用kernel space是类似的,都是通过触发软件中断然后陷入内核态,调用对应的系统服务来完成的,前文提到的open ta session,invoke ta command, close ta session其实也都是系统服务中的一项,下面罗列出OPTEE对外提供的系统服务函数

/** This array is ordered according to the SYSCALL ids TEE_SCN_xxx*/
static const struct syscall_entry tee_svc_syscall_table[] = {SYSCALL_ENTRY(syscall_sys_return),SYSCALL_ENTRY(syscall_log),SYSCALL_ENTRY(syscall_panic),SYSCALL_ENTRY(syscall_get_property),SYSCALL_ENTRY(syscall_get_property_name_to_index),SYSCALL_ENTRY(syscall_open_ta_session),SYSCALL_ENTRY(syscall_close_ta_session),SYSCALL_ENTRY(syscall_invoke_ta_command),SYSCALL_ENTRY(syscall_check_access_rights),SYSCALL_ENTRY(syscall_get_cancellation_flag),SYSCALL_ENTRY(syscall_unmask_cancellation),SYSCALL_ENTRY(syscall_mask_cancellation),SYSCALL_ENTRY(syscall_wait),SYSCALL_ENTRY(syscall_get_time),SYSCALL_ENTRY(syscall_set_ta_time),SYSCALL_ENTRY(syscall_cryp_state_alloc),SYSCALL_ENTRY(syscall_cryp_state_copy),SYSCALL_ENTRY(syscall_cryp_state_free),SYSCALL_ENTRY(syscall_hash_init),SYSCALL_ENTRY(syscall_hash_update),SYSCALL_ENTRY(syscall_hash_final),SYSCALL_ENTRY(syscall_cipher_init),SYSCALL_ENTRY(syscall_cipher_update),SYSCALL_ENTRY(syscall_cipher_final),SYSCALL_ENTRY(syscall_cryp_obj_get_info),SYSCALL_ENTRY(syscall_cryp_obj_restrict_usage),SYSCALL_ENTRY(syscall_cryp_obj_get_attr),SYSCALL_ENTRY(syscall_cryp_obj_alloc),SYSCALL_ENTRY(syscall_cryp_obj_close),SYSCALL_ENTRY(syscall_cryp_obj_reset),SYSCALL_ENTRY(syscall_cryp_obj_populate),SYSCALL_ENTRY(syscall_cryp_obj_copy),SYSCALL_ENTRY(syscall_cryp_derive_key),SYSCALL_ENTRY(syscall_cryp_random_number_generate),SYSCALL_ENTRY(syscall_authenc_init),SYSCALL_ENTRY(syscall_authenc_update_aad),SYSCALL_ENTRY(syscall_authenc_update_payload),SYSCALL_ENTRY(syscall_authenc_enc_final),SYSCALL_ENTRY(syscall_authenc_dec_final),SYSCALL_ENTRY(syscall_asymm_operate),SYSCALL_ENTRY(syscall_asymm_verify),SYSCALL_ENTRY(syscall_storage_obj_open),SYSCALL_ENTRY(syscall_storage_obj_create),SYSCALL_ENTRY(syscall_storage_obj_del),SYSCALL_ENTRY(syscall_storage_obj_rename),SYSCALL_ENTRY(syscall_storage_alloc_enum),SYSCALL_ENTRY(syscall_storage_free_enum),SYSCALL_ENTRY(syscall_storage_reset_enum),SYSCALL_ENTRY(syscall_storage_start_enum),SYSCALL_ENTRY(syscall_storage_next_enum),SYSCALL_ENTRY(syscall_storage_obj_read),SYSCALL_ENTRY(syscall_storage_obj_write),SYSCALL_ENTRY(syscall_storage_obj_trunc),SYSCALL_ENTRY(syscall_storage_obj_seek),SYSCALL_ENTRY(syscall_obj_generate_key),SYSCALL_ENTRY(syscall_se_service_open),SYSCALL_ENTRY(syscall_se_service_close),SYSCALL_ENTRY(syscall_se_service_get_readers),SYSCALL_ENTRY(syscall_se_reader_get_prop),SYSCALL_ENTRY(syscall_se_reader_get_name),SYSCALL_ENTRY(syscall_se_reader_open_session),SYSCALL_ENTRY(syscall_se_reader_close_sessions),SYSCALL_ENTRY(syscall_se_session_is_closed),SYSCALL_ENTRY(syscall_se_session_get_atr),SYSCALL_ENTRY(syscall_se_session_open_channel),SYSCALL_ENTRY(syscall_se_session_close),SYSCALL_ENTRY(syscall_se_channel_select_next),SYSCALL_ENTRY(syscall_se_channel_get_select_resp),SYSCALL_ENTRY(syscall_se_channel_transmit),SYSCALL_ENTRY(syscall_se_channel_close),SYSCALL_ENTRY(syscall_cache_operation),
};

以上函数在OPTEE userspace中对应型如utee_xxxx类的接口,例如syscall_open_ta_session对应utee_open_ta_session,只要调用utee_open_ta_session函数就会调用到内核准备的syscall_open_ta_session系统服务

OPTEE学习笔记 - IPC相关推荐

  1. OPTEE学习笔记 - AArch64 RPC(一)

    前文OPTEE学习笔记 - REE与TEE通信记录了AArch32的RPC调用流程,这边总结一下OPTEE AArch64的RPC调用流程,基于optee 3.11版本以及TF-A 2.4 REE侧E ...

  2. OPTEE学习笔记 - AArch64 RPC(二)

    在前面的文章OPTEE学习笔记 - AArch64 RPC(一)中我们分析了fast call的AArch64 RPC.本文基于前文,分析一下std call的实现. 正常执行流程 我们以optee_ ...

  3. python学习笔记-ipc机制 (进程间通信)及其代码实现

    IPC(Inter-Process Communication,进程间通信).进程间通信是指两个进程的数据之间产生交互 IPC的概念 空会话的概念 空会话是在没有信任的情况下与服务器建立的会话,对于一 ...

  4. Android开发艺术探索学习笔记 第二章IPC

    最近将之前工作做本地的学习笔记上传一下 这里是Android艺术开发探索的前三章内容 文章目录 1. android的多进程模式 2. IPC基础概念介绍 2.1 Serializable 2.2Pa ...

  5. 几种常见的IPC(进程间通信)学习笔记

    几种常见的IPC(进程间通信)学习笔记 我们知道进程是资源分配的最小单位,而线程是资源调度的最小单位.我们涉及比较多的通常是多线程开发,因为现在的程序要处理复杂的任务,往往需要多线程,确保主线程不会因 ...

  6. OP-TEE内核学习笔记(一)(安全存储)—— 安全存储 GP API

    存储文件基础操作 一. 安全存储GP API 1.1 `TEE_CreatePersistentObject` 1.2 `TEE_CloseAndDeletePersistentObject` 1.3 ...

  7. 【内网学习笔记】19、IPC 与计划任务

    0.前言 在多层代理的环境中,由于网络限制,通常采用命令行的方式连接主机,这里学习下 IPC 建立会话与配置计划任务的相关点. 1.IPC IPC (Internet Process Connecti ...

  8. [mmu/cache]-ARM MMU的学习笔记-一篇就够了

    ★★★ 个人博客导读首页-点击此处 ★★★ . 说明: 在默认情况下,本文讲述的都是ARMV8-aarch64架构,linux kernel 64位 . 相关文章 1.ARM cache的学习笔记-一 ...

  9. [mmu/cache]-ARM cache的学习笔记-一篇就够了

    ★★★ 个人博客导读首页-点击此处 ★★★ . 说明: 在默认情况下,本文讲述的都是ARMV8-aarch64架构,linux kernel 64位 . 相关文章 1.ARM MMU的学习笔记-一篇就 ...

  10. Kubernetes学习笔记(一)

    2019独角兽企业重金招聘Python工程师标准>>> Kubernetes学习笔记(一) 博客分类: Kubernetes 导语 2015年4月,传闻已久的Borg论文伴随Kube ...

最新文章

  1. 创建topic验证kafka集群
  2. C# 代理做为函数参数的时候
  3. 如何对付“新垃圾邮件”?
  4. [armv9]-ARM最新架构为memcpy/memset底层的实现提供新的指令
  5. HADOOP2.5.0_64安装日志
  6. mysql 多级分类_数据库多级分类相关行排列在一起的查询
  7. pl sql 工具insert into 中文 后, select为乱码
  8. SpringBoot实现定时器定时处理任务
  9. jsf 单元测试_构建和测试JSF.next
  10. hbuilder边框代码是什么_看懂HTML代码,摸清国外买家喜欢搜什么关键词
  11. 网站后台输入密码错误
  12. BZOJ.4337.[BJOI2015]树的同构(树哈希)
  13. php 卷积神经网络,PyTorch上实现卷积神经网络CNN的方法
  14. 我同学的易宝支付面试经历
  15. linux的acid属性,Linux_Linux下主要浏览器Acid3大测试(组图),最近浏览器大战愈演愈烈,而 - phpStudy...
  16. 推荐几款大家常使用的 SSH 客户端工具
  17. 手机指纹识别测试软件,指纹测算-指纹照相机 扫描识别指纹评分
  18. win10/ubuntu18.04 双系统开机黑屏,无法通过grub 选择系统,直接进入Ubuntu系统
  19. web前端开发薪资,JavaScript的字面量与变量
  20. 代码传奇 | 身价10亿程序员的传奇一生

热门文章

  1. 3D数学基础:向量运算
  2. 2021年广东专精特新中小企业补助及小巨人企业补贴
  3. Echarts数据可视化
  4. 对接饿了么 获取授权
  5. 运动目标检测 光流法
  6. win7局域网共享设置_win7系统打印机共享设置(详细图文步骤)
  7. ElmentUI数据表格 序号
  8. netron工具简单使用
  9. w7怎么修改服务器dns,win7系统在哪修改dns?win7系统修改dns的详细步骤
  10. 手算平方根的JavaScript实现,并推广至任意次方根