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结构体的内容,该结构体定义如下:
structtee_fs_htree_image{//加密iv+enc_fek时使用的iv值,每次保存head时会使用随机数更新uint8_tiv[TEE_FS_HTREE_IV_SIZE];uint8_ttag[TEE_FS_HTREE_TAG_SIZE];//加密iv+Enc_fek生成的数据的tag部分uint8_tenc_fek[TEE_FS_HTREE_FEK_SIZE];//使用TSK加密一个安全文件的fek生成的//加密iv+Enc_fek生成的数据的imeta部分uint8_timeta[sizeof(struct tee_fs_htree_imeta)];uint32_tcounter;//用于计算在保存tee_fs_htree_image时是存到ver0还是ver1};
节点部分存放的是tee_fs_htree_node_image结构体的内容,在保存数据到每个物理块之前都会使用FEK和对应的IV值对需要被保存的数据进行加密,
而在打开读取文件时则会首先从文件头中读取enc_fek的值,然后使用TSK做解密操作来获取FEK,最后从需要被解密的物理块对应的节点中获取到IV值。tee_fs_htree_node_image的结构体的定义如下:
structtee_fs_htree_node_image{//保存节点的哈希值,用于在操作文件时找到该文件的headuint8_thash[TEE_FS_HTREE_HASH_SIZE];//加密安全文件数据区域中某一个块时使用的iv值,块数据的每次写入都会使用随机数更新uint8_tiv[TEE_FS_HTREE_IV_SIZE];uint8_ttag[TEE_FS_HTREE_TAG_SIZE];//加密安全数据区域中一个块数据时生成的taguint16_tflags;//用于计算使用块中的那个ver};
数据块中保存的是密文数据,该密文数据是使用该文件对应的FEK和块对应的IV值对需要被保存的数据进行加密操作来生成。
dirf.db文件的数据块区域保存的是所有使用安全存储功能保存的文件的相关信息,在安全存储功能中使用dirfile_entry结构体来表示每个安全文件的基本信息,该结构体定义如下:
structdirfile_entry{TEE_UUID uuid;//创建该安全文件的TA的UUIDuint8_toid[TEE_OBJECT_ID_MAX_LEN];//安全文件的名字(使用安全存储操作时的名字)uint32_toidlen;//文件名字的长度//data/tee目录下安全文件的root node的哈希值uint8_thash[TEE_FS_HTREE_HASH_SIZE];uint32_tfile_number;//保存在/data/tee目录下的文件编号};
全部0条评论
快来发表一下你的评论吧 !