38. OP-TEE中secure stroage------安全文件数据格式和操作过程
2017-06-23 20:12
405 查看
OP-TEE的secue sotrage功能能够满足用户保存敏感数据的需求,需要保存的数据会被加密保存到文件系统或者是RPMB中,当选择将数据保存到文件系统中时,默认情况下加密后的数据会被保存在/data/tee目录中。secure storage使用二叉树的方式来保存加密自后的文件。
当第一次使用secure storage创建用于保存敏感数据的时候,OP-TEE将会在/data/tee目录中生成两个文件:dirf.db文件和以数字命名的文件。
其中dirf.db文件保存的是整个secure storage保护的文件的所有目录信息和节点信息,当使用某个已经存在的安全文件时,首先需要读取到dirf.db文件中的相关内容,然后根据需要操作的安全文件名字的hash值在dirf.db文件中找到对应的文件编号,最终按照这个编号实现对文件的打开,关闭,写入,读出,重命名,裁剪等操作。
保存在/data/tee目录下的以数字命名的文件则是具体的被secure storage保存的用户文件。该文件保存的是用户数据加密之后的数据。而加密使用的key则是FEK,该key的生成请阅读《37.OP-TEE中secure
storage----安全存储使用的key的产生》一文。
每个Pysb block的大小为4K,其中tee_fs_htree_image的结构体如下:
在dirf.db文件中的data block区域保存的是所有使用secure storage保存的文件的相关信息,在secure sotrage中使用dirfile_entry结构体来表示每个安全文件的基本信息,该结构体如下:
tee_fs_htree_node_image:用于保存文件的节点信息,通过node可以找到对应的文件的head或者是data block
tee_fs_htree_image: 用于保存安全文件的head数据,通过head数据,读取head主要是用来获取安全文件的加密key和j加密head时使用的iv值
tee_fs_fd: secure storage操作时使用的重要结构体,存放文件操作的fd, dir,TA的UUID等信息。
查询到安全文件的文件编号之后就需要被该安全进行操作,同样会读取需要被操作的数据在安全中的位置,计算出block number,然后获得该block对应的node id获得该block的iv值,然后使用保存在安全文件head中的fek和获得的block的iv值对block进行解密操作来获取明文的数据,或者执行加密操作,将密文数据写入到block中。整个过程的大致流程如下图所示:
整个过程中node id与block number的对应关系是node id = block number + 1,而选取的是block中的哪个ver则与node id的ver相同。
当第一次使用secure storage创建用于保存敏感数据的时候,OP-TEE将会在/data/tee目录中生成两个文件:dirf.db文件和以数字命名的文件。
其中dirf.db文件保存的是整个secure storage保护的文件的所有目录信息和节点信息,当使用某个已经存在的安全文件时,首先需要读取到dirf.db文件中的相关内容,然后根据需要操作的安全文件名字的hash值在dirf.db文件中找到对应的文件编号,最终按照这个编号实现对文件的打开,关闭,写入,读出,重命名,裁剪等操作。
保存在/data/tee目录下的以数字命名的文件则是具体的被secure storage保存的用户文件。该文件保存的是用户数据加密之后的数据。而加密使用的key则是FEK,该key的生成请阅读《37.OP-TEE中secure
storage----安全存储使用的key的产生》一文。
1. dirf.db文件和安全文件的格式
使用secure storage保存的文件都会使用同一的格式进行保存,而且dirf.db文件与实际的文件的格式也完全一样。安全文件中保存的内容格式如下图所示:每个Pysb block的大小为4K,其中tee_fs_htree_image的结构体如下:
struct tee_fs_htree_image { uint8_t iv[TEE_FS_HTREE_IV_SIZE];//加密iv+enc_fek时使用的iv值,每次保存head时会使用随机数更新 uint8_t tag[TEE_FS_HTREE_TAG_SIZE];//加密iv+Enc_fek生成的数据的tag部分 uint8_t enc_fek[TEE_FS_HTREE_FEK_SIZE];//使用TSK加密一个安全文件的fek生成的 uint8_t imeta[sizeof(struct tee_fs_htree_imeta)];//加密iv+Enc_fek生成的数据的imeta部分 uint32_t counter;//用于计算在保存tee_fs_htree_image的时候是存到ver0还是ver1 };在保存每个block的时候都会使用fek来对需要保存的数据进行加密,而在打开读取文件的时候则会首先冲head中读取出enc_fek的值,然后使用tsk做解密操作来获取fek,最终使用解密后的fek对数据模块做解密操作获取明文的数据,再根据实际的需求获取到数据。tee_fs_htree_node_image的结构体如下:
struct tee_fs_htree_node_image { /* Note that calc_node_hash() depends on hash first in struct */ uint8_t hash[TEE_FS_HTREE_HASH_SIZE];//保存节点的hash值,用于在操作文件的时候找到该文件的head uint8_t iv[TEE_FS_HTREE_IV_SIZE];//加密安全文件数据区域中某一个block时使用的iv值,block数据的每次写入都会使用随机数更新 uint8_t tag[TEE_FS_HTREE_TAG_SIZE];//加密安全数据区域中够一个block数据时生成的ta uint16_t flags;//用于计算使用block中的那个ver };data block是加密之后的需要被保存的数据,该数据使用该文件对应的fek和iv值进行加密。
在dirf.db文件中的data block区域保存的是所有使用secure storage保存的文件的相关信息,在secure sotrage中使用dirfile_entry结构体来表示每个安全文件的基本信息,该结构体如下:
struct dirfile_entry { TEE_UUID uuid;//创建该安全文件的TA的UUID uint8_t oid[TEE_OBJECT_ID_MAX_LEN];//安全文件的名字(使用secure storage操作是的名字) uint32_t oidlen;//文件名字的长度 uint8_t hash[TEE_FS_HTREE_HASH_SIZE];//data/tee目录下安全文件的root node的hash值 uint32_t file_number;//保存在/data/tee目录下的文件编号 };
2. secure storage中重要的结构体
在整个的secure storage的操作过程中存在一些很重要的结构体,这些结构体用于记录或者保存所有安全文件和dirf.db文件的操作信息,整体结构体框图如下:tee_fs_htree_node_image:用于保存文件的节点信息,通过node可以找到对应的文件的head或者是data block
tee_fs_htree_image: 用于保存安全文件的head数据,通过head数据,读取head主要是用来获取安全文件的加密key和j加密head时使用的iv值
tee_fs_fd: secure storage操作时使用的重要结构体,存放文件操作的fd, dir,TA的UUID等信息。
3. secure storage中的文件节点组成
在secure storage中,dirf.db文件和安全文件都使用的是二叉树的方式来保存文件编号或者是数据块。如果是在dirf.db文件中,数据块中保存的是dirfile_entry结构体变量(密文保存),而dirf.db文件中保存的就是与保存的数据块想对应的节点信息。通过dirf.db文件中的tee_fs_htree_node_image就能找到对应的保存了dirfile_entry数据块的数据。而在安全文件中同样也存在这样的对应关系,只不过数据块中保存的不再是dirfile_entry而是实际需要被保存的数据。而二叉树的保存方式如下,第一个节点作为dirf.db文件或者安全文件的root节点使用。4. secure storage中寻找安全文件中特定数据块的操作过程
使用secure storage对已经保存的安全文件执行读写等操的时候都会先打开dirf.db文件,然后读取dirf.db文件中的数据区域,获取到整个secure storage中保存的所有文件的dirfile_entry信息,使用每个dirfile_entry中的uuid和obj_id与需要被操作的安全文件的uuid和obj_id进行对比来找到该安全文件保存在/data/tee目录下的文件编号。查询到安全文件的文件编号之后就需要被该安全进行操作,同样会读取需要被操作的数据在安全中的位置,计算出block number,然后获得该block对应的node id获得该block的iv值,然后使用保存在安全文件head中的fek和获得的block的iv值对block进行解密操作来获取明文的数据,或者执行加密操作,将密文数据写入到block中。整个过程的大致流程如下图所示:
整个过程中node id与block number的对应关系是node id = block number + 1,而选取的是block中的哪个ver则与node id的ver相同。
相关文章推荐
- 39. OP-TEE中secure stroage------安全文件数据的打开过程(open)
- 41. OP-TEE中secure stroage------安全文件中数据的加密操作
- 40. OP-TEE中secure stroage------读写安全文件数据(read and write)
- Mysql 将结果保存到文件 从文件里运行sql语句 记录操作过程(tee 命令的使用)
- 《零基础入门学习Python》学习过程笔记【31pickle对文件中的数据进行提取等操作】(没看)
- 【Hex 格式文件操作】二、判断是否为有效的intel_hex文件,并进行数据校验
- 42. OP-TEE中secure stroage------安全文件的创建
- PHP之文件操作,http请求数据格式,模拟get和post,CURL模拟请求的使用
- Mysql 将结果保存到文件 从文件中执行sql语句 记录操作过程(tee 命令的使用)
- 数据库操作_连接SQL Server数据库示例;连接ACCESS数据库;连接到 Oracle 数据库示例;SqlCommand 执行SQL命令示例;SqlDataReader 读取数据示例;使用DataAdapter填充数据到DataSet;使用DataTable存储数据库表;将数据库数据填充到 XML 文件;10 使用带输入参数的存储过程;11 使用带输入、输出参数的存储过程示;12 获得数据库中表的数目和名称;13 保存图片到SQL Server数据库示例;14 获得插入记录标识号;Exce
- 操作QQWary.dat数据文件的类
- vi部分命令. 替换操作; 文本格式转换; 在整个文件中替换; 在行首尾添加字符串.
- 把数据库里的数据用Excel文件的格式显示在浏览器中
- 用Ms SQL Server 存储过程操作DBF文件
- C语言中文件操作--如何将文本数据正确读到字符串数组中
- 以用户指定的格式复制一个数据文件至数据库表或视图中。
- 对某网站LINUX FSCK后丢失大量文件的数据恢复过程摘录
- ASP.Net 向xml文件中添加数据(insert操作)
- 分词词库文件数据格式设计
- 构建更加安全的 Web 应用程序-一个新的保护框架可帮助您防止操作和数据篡改