TrustZone与OP-TEE技术详解 读书笔记二

安全存储

用来存储敏感数据,optee对需要保存的数据进行加密,每次更新文件时所用的加密秘钥都会使用随机数重新生成。

创建安全文件时会创建一个dirf.db文件,该文件保存了安全存储功能管理的所有安全文件信息,同时dirf.db也是被加密的。

 

文件的加密有AES算法加密,AES需要提供初始化向量IV和密钥来加密。

chip_id | String_for_ssk_gen

    HUK + String_for_ssk_gen ->HMA ->SSK

SSK 在和UUID进行HMAC产生TSK

TSK + Random number(FEK) 进行AES_CBC ->Encryption FEK

安全存储密钥(Secure Storage Key,SSK)

在每台设备中的值都不同。OP-TEE启动时会
使用芯片ID和HUK经HMAC算法计算来获得该值,并将SSK的值保存在结构体变量tee_fs_ssk
的密钥成员中,以备生成其他密钥使用。工厂生产时会将HUK写入到OTP/efuse中,且正常世
界状态无法读取到HUK的值,而芯片ID在芯片出厂后就会被写入到芯片中.

 

可信应用的存储密钥(Trusted Applicant Storage Key,TSK)

是生成FEK时使用到的密钥。TSK是使用SSK作为密钥TA的UUID经HMAC计算获得,类似于HMAC(SSK,UUID)

方式生成TSK。在调用tee_fs_fek_crypt函数时会计算TSK的值。TSK最终会被用来生成FEK,
FEK会在使用安全存储功能保存数据时被用来加密数据。

 

文件加密秘钥(File encryption Key FEK)

对文件数据加密,FEK的产生由每次生成文件时,会产生一个随机数,这个随机数就是FEK。然后用TSK对该随机数加密,得到enc_FEK,保存到head.enc_fek。

AES_CBC(Random(FEK), TSK). 调用tee_fs_fek_crypt函数产生。

 

dirf.db文件和安全文件的格式

安全文件将整个空间划分为若干个4KB大小的物理块,文件格式为: 头部 + 节点 + 数据

tee_fs_htree_image + tee_fs_htree_node_image + data block

 

节点部分存放的是tee_fs_htree_node_image结构体的内容,在保存数据到每个物理块之
前都会使用FEK和对应的IV值对需要被保存的数据进行加密,而在打开读取文件时则会首先从
文件头中读取enc_fek的值,然后使用TSK做解密操作来获取FEK,最后从需要被解密的物理块
对应的节点中获取到IV值。

数据块中保存的是密文数据,该密文数据是使用该文件对应的FEK和块对应的IV值对需要
被保存的数据进行加密操作来生成。

对应dirf.db文件来说,其数据块保存的是optee secure storage保存的所有文件的相关信息。

secure storage使用dirfile_entry结构体表示每个安全文件的基本信息。

struct dirfile_entry {
TEE_UUID uuid; //创建该安全文件的TA的UUID
uint8_t oid[TEE_OBJECT_ID_MAX_LEN]; //安全文件的名字(使用安全存储操作时的名字)
uint32_t oidlen;//文件名字的长度
//data/tee目录下安全文件的root node的哈希值
uint8_t hash[TEE_FS_HTREE_HASH_SIZE];
uint32_t file_number; //保存在/data/tee目录下的文件编号
}

查询安全文件中的特定数据块

to do

 

posted @ 2024-08-31 14:29  老胡同学  阅读(170)  评论(0)    收藏  举报