OP-TEE的安全存储功能可满足用户保存敏感数据的需求,需要被保存的数据会被加 密保存到文件系统或RPMB分区中 。
当选择将数据保存到文件系统中时,默认情况下,加密后的数据会被保存在/data/tee目录中。
安全存储功能使用二叉树的方式来保存加密后的文件。
当第一次使用安全存储功能创建用于保存敏感数据的安全文件时,OP-TEE将会在/data/tee目录中生成两个文件:dirf.db文件和以数字命名的文件。
dirf.db文件保存的是整个安全存储功能管理的所有文件的目录信息和节点信息。 当用户使用某个已经存在的安全文件时,OP-TEE首先会读取dirf.db文件中的相关内容,然后根据需要操作的安全文件名字的哈希值在dirf.db文件中找到对应的文件编号,最终按照这个编号实现对文件的打开、关闭、写入、读出、重命名、裁剪等操作。(这里为什么要存hash,知道hash值和知道名字,安全性还是不一样,你知道怎么操作,但是不需要知道操作的本身?)
保存在/data/tee目录以数字命名的文件是被安全存储保护的用户文件。
该文件保存的是加密之后的用户数据, 加密使用的密钥则是对应的FEK 。
使用安全存储功能生成的文件都会使用相同的格式被保存,而且dirf.db文件与安全文件的格式也相同。
且dirf.db文件与安全文件的格式也相同。安全文件中的内容分为三个区域,分别用于保 存文件头、结点、数据,文件的内容 ,其格式如图所示。
安全文件将整个空间划分成相等大小的物理块,每个物理块的大小为4KB,其中文件头部分存放的是tee_fs_htree_image结构体的内容,该结构体定义如下:
struct tee_fs_htree_image {
//加密iv+enc_fek时使用的iv值,每次保存head时会使用随机数更新
uint8_t iv[TEE_FS_HTREE_IV_SIZE];
uint8_t tag[TEE_FS_HTREE_TAG_SIZE]; //加密iv+Enc_fek生成的数据的tag部分
uint8_t enc_fek[TEE_FS_HTREE_FEK_SIZE]; //使用TSK加密一个安全文件的fek生成的
//加密iv+Enc_fek生成的数据的imeta部分
uint8_t imeta[sizeof(struct tee_fs_htree_imeta)];
uint32_t counter; //用于计算在保存tee_fs_htree_image时是存到ver0还是ver1
};
节点部分存放的是tee_fs_htree_node_image结构体的内容,在保存数据到每个物理块之前都会使用FEK和对应的IV值对需要被保存的数据进行加密,
而在打开读取文件时则会首先从文件头中读取enc_fek的值,然后使用 TSK做解密操作来获取FEK ,最后从需要被解密的物理块对应的节点中获取到IV值。 tee_fs_htree_node_image的结构体的定义如下:
struct tee_fs_htree_node_image {
//保存节点的哈希值,用于在操作文件时找到该文件的head
uint8_t hash[TEE_FS_HTREE_HASH_SIZE];
//加密安全文件数据区域中某一个块时使用的iv值,块数据的每次写入都会使用随机数更新
uint8_t iv[TEE_FS_HTREE_IV_SIZE];
uint8_t tag[TEE_FS_HTREE_TAG_SIZE]; //加密安全数据区域中一个块数据时生成的tag
uint16_t flags; //用于计算使用块中的那个ver
};
数据块 中保存的是密文数据 ,该密文数据是使用该文件对应的FEK和块对应的IV值对需要被保存的数据进行加密操作来生成。
dirf.db文件的数据块区域保存的是所 有使用安全存储功能保存的文件的相关信息 ,在安全存储功能中 使用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目录下的文件编号
};
全部0条评论
快来发表一下你的评论吧 !