开发者学堂课程【阿里云物联网安全:TEE 应用开发入门】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/570/detail/7772
TEE 应用开发入门
内容介绍:
一、 回顾
二、 REE 和 TEE 的交互原理
三、 CA 与 TA 建立联系的四个基本要素
四、 通过GP API 具体函数调用角度介绍 REE 和 TEE 的交互原理
五、参考和引用
一、回顾
处理器分为两个状态,正常态和安全态,正常态对应 REE 侧,安全态对应 TEE侧,两种状态下,按照特权级由低到高的顺序依次有用户模式、内核模式、monitor模式。
二、REE 和 TEE 的交互原理
以 RAMv7架构为例,如图所示,从 CA 调用到 TA 需要五个步骤。首先,CA 调用 GP 标准定义的 Client API 接口从user 模式进入到 REE 侧的 kernel 模式,在 kernel 模式下通过 SMC 指令切换到 monitor 模式,monitor 模式是处理器的最高特权模式,因此,monitor 本身就处在了安全态,此时处理器已处在安全态。
再从 monitor 模式切换到安全模式下的kernel模式,TEE 运行在该模式下会根据 CA 传递过来的 TA UID 加载对应的TA,再切换到安全态下的 user 模式继续运行。
在 TA 侧也有GP 定义的标准接口,称为 Internal API,包含算法、内存、TA 交互调用等通用功能。
TA 会根据 CA 传递过来的秘密 ID 以及共享内存的内容完成相关的任务后重新返回值,再通过 syscall 返回 TEE OS,同样 TEE OS 会通过 SMC call 指令返回 monitor 模式,再用 monitor 切换到正常态下的 kernel 模式,接下来返回到上层的 user 模式,这时 CA 就可以通过返回值和更新后的内存内容来获取 TA 的处理结果。
三、 CA 与 TA 建立联系的四个基本要素
1、UUID:TA 的唯一标识码,CA 需要告诉 TEE 正常的 UUID 才能和 TA 建立联系。
2、Context:建立的基础,用来保存 CA 与 TEE之间的上下文。
3、Session:在 Context 中可添加,用来保存 CA 与特定 TA 的会话。
4、Shared Memory:在 Session 中可添加,连接 CA 和 TA 之间的共享内存,用于两者之间数据交互。
四、通过 GP API 具体函数调用角度介绍 REE 和 TEE 的交互原理
GP API 函数调用顺序:
1、调用 TEEC Initialize Context 创建 CA 与 TEE 之间的上下文。
2、通过 TEEC OpenSession 传入对应的 UIID,创建 CA 与对应 TA 的会话。
3、如果在交互过程中需要用到共享内存,则通过 TEEC AllocateShareMemory 创建 CA 和 TA 之间的内存。
4、通过调用 TEEC InvokeCommand 对应的 Command ID 以及共享内存的起始地址和大小,等 TA 处理完对应秘密ID 的过程后,结果通过该行数直接返回。
接下来的三步是对1-3步的清理流程:
1、释放共享内存
2、关闭 CA/TA 会话
3、清空 Context
注:在开发 CA 过程中,需要保证行数的成对使用,以防止内存泄漏或无法创建新的 CA/TA 会话等。
TA的代码相对更简单些,在 TA 内部,会有 CA 对应侧的行数对应入口,比如 CA 调用完 TEE C OpenSession 后,TEE OS 会进入 TA-OpenSessionEntryPoint 里完成 TA 对应初始化相应内容。
当 CA 侧调用 TEEC-Invoke Command 时,会对 TA 的函数入口 TA-Invoke CommandEntry Point,在该函数里,需要根据 Command ID 来实现对应的处理内容。