TF-M 软件框架
TF-M是基于PSA架构开发的安全固件,本文基于v1.5v版本。下图是官方的图,详细的TF-M功能。
简要的框图如下:
其核心就是PSA架构,SPM管理分区线程、IPC等机制。分区通过分区线程的形式运行,并提供一种或多种服务。NSPE运行着RTOS,在RTOS上运行着task,task需要用到安全相关服务时,可以调用PSA client APIs请求安全服务,通过IPC机制由SPM通知并调度对应分区线程运行,执行此次的服务请求。然后返回结果给client。
partition
在上面的框图里,crypto、Initial Attestation、Internal Trusted Storage、Protected Storage等就是TF-M里实现的partition。其给client提供具体的RoT服务。比如crypto partition提供hash、加解密、生成随机数等服务。
每个partition都以thread为载体进行管理与调度,SPM管理和调度其thread,保存和切换其上下文。
/* Partition runtime type */
struct partition_t {
const struct partition_load_info_t *p_ldinf; /*通过配置文件加载的partition信息*/
void *p_boundaries;
void *p_interrupts;
void *p_metadata;
union {
struct thread_t thrd; /* IPC model */
uint32_t state; /* SFN model */
};
struct sync_obj_t waitobj;
struct context_ctrl_t ctx_ctrl; /*上下文管理*/
union {
struct bi_list_node_t msg_list; /* IPC model */
struct tfm_msg_body_t *p_msg; /* SFN model */
};
uint32_t signals_allowed;
uint32_t signals_waiting; /*等待的信号*/
uint32_t signals_asserted; /*已发送的信号*/
struct partition_t *next;
};
Secure Service
安全服务(Secure services,又名Service)是SPE中提供安全功能的组件,而Client是服务的用户。当服务访问它所依赖的服务时,它就扮演了客户端的角色。服务被分组到安全分区中。
每个安全分区提供一个或多个安全服务。是具体的安全功能,比如crypto分区里的各种安全服务。在TF-M里,crypto分区只提供一个服务,而具体的服务是通过psa_call调用crypto服务传入的sfn_id决定的。
client调用PSA接口请求的服务就是RoT Service提供的。
每个服务公开其服务ID (SID)和客户端访问使用的句柄Handle。客户端通过SID或Handle通过PSA客户端API访问服务。当需要操作客户端数据或响应客户端时,分区使用PSA Secure Partition API。
/* RoT Service data */
struct service_t {
const struct service_load_info_t *p_ldinf; /* Service load info */
struct partition_t *partition; /* Owner of the service */
struct bi_list_node_t handle_list; /* Service handle list */
struct service_t *next; /* For list operation */
};
Secure Partition Manager(SPM)
SPM是对安全分区的管理,其提供IPC通信机制使partition能与client通信。其管理分区线程的调度,保存线程上下文,按优先级排序调度等。其还实现 PSA client API和PSA partition API。后面写文章详细介绍。