【OP-TEE 3.8.0学习】003_Trusted Applications(TAs)

Trusted Applications

实现Trusted Applications(可信任应用程序,简称TA)有两种方法:Pseudo TAs(伪TAs)和user mode TAs(用户模式TAs)。用户模式TA是GlobalPlatform API TEE规范指定的功能齐全的TA,这些TA只是人们在说"TA"时所指的哪些TA,在大多数情况下,这是编写和使用TA的首选类型。

Pseudo Trusted Applications

伪TA不是受信任的应用程序,伪TA不是特定的实体,伪TA是一个接口。它是一个由OP-TEE核心向其他外部世界公开的接口:用于保护客户端受信任的应用程序和不安全的客户端实体。

这些都直接在OP-TEE核心树中实现,比如,core/pta与OP-TEE核心blob一起静态构建。

OP-TEE中包含伪TAs已经隐藏在"GloblaPlatform TA Client" API后面的OP-TEE安全特权级服务。这些伪TAs用于各种目的,例如特定的安全服务或嵌入式测试服务。

伪TAs无法从GlobaPlatform TEE规范指定的GlobaPlatform核心内部API支持中获益。这些API作为一个静态库提供给TA,每个TA将链接到("libutee"),并通过系统调用OP-TEE核心服务。由于OP-TEE内核不与libutee链接,伪TAs只能使用OP-TEE内核内部的API和例程。

因为伪TAs运行在与OP-TEE内核代码本身相同的特权执行级别上,这可能是可取的,也可能不是理想的,这取决于用例。

在大多数情况下,非特权(用户模式)TA是最好的选择,而不是直接将代码添加到OP-TEE内核。但是,如果您决定在OP-TEE内核中处理应用程序,这样是最好的,那么可以将core/pta/stats.c作为一个模板,并将基于该模板的伪TA添加到与sub.mk同一级目录

User Mode Trusted Applications

REE中某些东西想要与特定的应用程序UUID对话时,用户模式TAs由安全世界中OP-TEE内核加载映射到内存中。它们以比OP-TEE内核代码更低的CPU权限级别运行。在这方面,它们与运行在REE中常规应用程序非常相似,只是他们在安全世界中执行。

TA受益于GlobaPlatform规范指定的GlobaPlatform核心内部API。有几种类型的用户模式TA,它们的存储方式不同。

TA locations

Plain TAs(用户模式)可以存储在不同的地方以及从不同的地方加载,OP-TEE目前支持三种方式。

Early TA

所谓early TA实际上与REE FS TA完全相同,但它们不是从普通文件系统加载的,而是链接到TEE内核blob中的一个特色数据段中。因此,它们甚至在tee-supplicant(tee_supplicant为REE侧守护进程,主要作用,用来实现secure world端操作REE侧文件系统,EMMC的rpmb分区,网络socket操作,数据库操作的需求。tee_supplicant与secure world之间的交互模式类似于生产者与消费者的方式进行配合来是实现上述需求)和REE文件系统出现之前就可以使用了。

REE filesystem TA

它们由ELF文件组成,经过签名并选择加密,由TA的UUID和后缀.TA命名。它们由OP-TEE内核单独构建,在构建它们时使用相同的构建系统,并且使用原生OP-TEE内核的构建密钥进行签名。

因为TA是签名的,并且可以选择使用scripts/sign_encrypt.py脚本进行加密,它们可以存储在不受信任的REE文件系统中,tee-puplicant将负责将它们传送给Secure world OP-TEE内核进行检查和加载。

    OP-TEE内核保持ta_ver.db文件在安全存储中,以检查从REE文件系统加载REE TAs的版本,防止任何TA版本降级。TA版本可以通过TA构建选项进行配置:CFG_TA_VERSION=<unsigned integer>

    注意:这里只有当CFG_RPMB_FS=y时,回滚保护才有效

    REE文件系统TA有三种格式:

  1. 自版本3.7.0以来,生成脚本无法再创建签名的、未加密的旧TA
  2. Bootstrap TA,使用原生OP-TEE内核blob的构建密钥签名,未加密
  3. 加密的TA,先签名后加密再MAC,当CFG_ENCRYPT_TA=y时使用TA_ENC_KEY密钥进行加密。OP-TEE运行时,必须重写API以特定于平台方式提供解密TA的对称密钥
TEE_Result tee_otp_get_ta_enc_key(uint32_t key_type, uint8_t *buffer, size_t len);

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值