安全文件、dirf.db文件的數(shù)據(jù)格式和操作過(guò)程
OP-TEE的安全存儲(chǔ)功能可滿足用戶保存敏感數(shù)據(jù)的需求,需要被保存的數(shù)據(jù)會(huì)被加 密保存到文件系統(tǒng)或RPMB分區(qū)中 。
當(dāng)選擇將數(shù)據(jù)保存到文件系統(tǒng)中時(shí),默認(rèn)情況下,加密后的數(shù)據(jù)會(huì)被保存在/data/tee目錄中。
安全存儲(chǔ)功能使用二叉樹(shù)的方式來(lái)保存加密后的文件。
當(dāng)?shù)谝淮问褂冒踩鎯?chǔ)功能創(chuàng)建用于保存敏感數(shù)據(jù)的安全文件時(shí),OP-TEE將會(huì)在/data/tee目錄中生成兩個(gè)文件:dirf.db文件和以數(shù)字命名的文件。
dirf.db文件保存的是整個(gè)安全存儲(chǔ)功能管理的所有文件的目錄信息和節(jié)點(diǎn)信息。 當(dāng)用戶使用某個(gè)已經(jīng)存在的安全文件時(shí),OP-TEE首先會(huì)讀取dirf.db文件中的相關(guān)內(nèi)容,然后根據(jù)需要操作的安全文件名字的哈希值在dirf.db文件中找到對(duì)應(yīng)的文件編號(hào),最終按照這個(gè)編號(hào)實(shí)現(xiàn)對(duì)文件的打開(kāi)、關(guān)閉、寫(xiě)入、讀出、重命名、裁剪等操作。(這里為什么要存hash,知道hash值和知道名字,安全性還是不一樣,你知道怎么操作,但是不需要知道操作的本身?)
保存在/data/tee目錄以數(shù)字命名的文件是被安全存儲(chǔ)保護(hù)的用戶文件。
該文件保存的是加密之后的用戶數(shù)據(jù), 加密使用的密鑰則是對(duì)應(yīng)的FEK 。
dirf.db文件和安全文件的格式
使用安全存儲(chǔ)功能生成的文件都會(huì)使用相同的格式被保存,而且dirf.db文件與安全文件的格式也相同。
且dirf.db文件與安全文件的格式也相同。安全文件中的內(nèi)容分為三個(gè)區(qū)域,分別用于保 存文件頭、結(jié)點(diǎn)、數(shù)據(jù),文件的內(nèi)容 ,其格式如圖所示。
安全文件將整個(gè)空間劃分成相等大小的物理塊,每個(gè)物理塊的大小為4KB,其中文件頭部分存放的是tee_fs_htree_image結(jié)構(gòu)體的內(nèi)容,該結(jié)構(gòu)體定義如下:
struct tee_fs_htree_image {
//加密iv+enc_fek時(shí)使用的iv值,每次保存head時(shí)會(huì)使用隨機(jī)數(shù)更新
uint8_t iv[TEE_FS_HTREE_IV_SIZE];
uint8_t tag[TEE_FS_HTREE_TAG_SIZE]; //加密iv+Enc_fek生成的數(shù)據(jù)的tag部分
uint8_t enc_fek[TEE_FS_HTREE_FEK_SIZE]; //使用TSK加密一個(gè)安全文件的fek生成的
//加密iv+Enc_fek生成的數(shù)據(jù)的imeta部分
uint8_t imeta[sizeof(struct tee_fs_htree_imeta)];
uint32_t counter; //用于計(jì)算在保存tee_fs_htree_image時(shí)是存到ver0還是ver1
};
節(jié)點(diǎn)部分存放的是tee_fs_htree_node_image結(jié)構(gòu)體的內(nèi)容,在保存數(shù)據(jù)到每個(gè)物理塊之前都會(huì)使用FEK和對(duì)應(yīng)的IV值對(duì)需要被保存的數(shù)據(jù)進(jìn)行加密,
而在打開(kāi)讀取文件時(shí)則會(huì)首先從文件頭中讀取enc_fek的值,然后使用 TSK做解密操作來(lái)獲取FEK ,最后從需要被解密的物理塊對(duì)應(yīng)的節(jié)點(diǎn)中獲取到IV值。 tee_fs_htree_node_image的結(jié)構(gòu)體的定義如下:
struct tee_fs_htree_node_image {
//保存節(jié)點(diǎn)的哈希值,用于在操作文件時(shí)找到該文件的head
uint8_t hash[TEE_FS_HTREE_HASH_SIZE];
//加密安全文件數(shù)據(jù)區(qū)域中某一個(gè)塊時(shí)使用的iv值,塊數(shù)據(jù)的每次寫(xiě)入都會(huì)使用隨機(jī)數(shù)更新
uint8_t iv[TEE_FS_HTREE_IV_SIZE];
uint8_t tag[TEE_FS_HTREE_TAG_SIZE]; //加密安全數(shù)據(jù)區(qū)域中一個(gè)塊數(shù)據(jù)時(shí)生成的tag
uint16_t flags; //用于計(jì)算使用塊中的那個(gè)ver
};
數(shù)據(jù)塊 中保存的是密文數(shù)據(jù) ,該密文數(shù)據(jù)是使用該文件對(duì)應(yīng)的FEK和塊對(duì)應(yīng)的IV值對(duì)需要被保存的數(shù)據(jù)進(jìn)行加密操作來(lái)生成。
dirf.db文件的數(shù)據(jù)塊區(qū)域保存的是所 有使用安全存儲(chǔ)功能保存的文件的相關(guān)信息 ,在安全存儲(chǔ)功能中 使用dirfile_entry結(jié)構(gòu)體來(lái)表示每個(gè)安全文件的基本信息 ,該結(jié)構(gòu)體定義如下:
struct dirfile_entry {
TEE_UUID uuid; //創(chuàng)建該安全文件的TA的UUID
uint8_t oid[TEE_OBJECT_ID_MAX_LEN]; //安全文件的名字(使用安全存儲(chǔ)操作時(shí)的名字)
uint32_t oidlen; //文件名字的長(zhǎng)度
//data/tee目錄下安全文件的root node的哈希值
uint8_t hash[TEE_FS_HTREE_HASH_SIZE];
uint32_t file_number; //保存在/data/tee目錄下的文件編號(hào)
};
-
數(shù)據(jù)庫(kù)
+關(guān)注
關(guān)注
7文章
3846瀏覽量
64685 -
文件
+關(guān)注
關(guān)注
1文章
570瀏覽量
24822 -
數(shù)據(jù)格式
+關(guān)注
關(guān)注
0文章
31瀏覽量
8918
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論