可信應用的存儲密鑰
可信應用的存儲密鑰(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)是安全存儲功能用于對數據進行加密時使用的AES密鑰,該密鑰在生成文件時會 使用PRNG算法隨機產生 ,產生的 FEK會使用TSK進行加密 ,然后保存到head.enc_fek變量中。
(PRNGPRNG(pseudorandom number generator)偽隨機數生成器是指通過特定算法生成一系列的數字,使得這一系列的數字看起來是隨機的,但是實際是確定的,所以叫偽隨機數。)
TA在每次使用 安全存儲功能創建一個安全文件時就會生成一個隨機數作為FEK ,即每個TA 中的每個安全文件都有一個FEK用于加密對應文件中的數據 。(安全加倍啊)
關于FEK的產生可簡單理解為如下公式,使用的初始化向量IV值為0:
AES_CBC(in_key, TSK)
OP-TEE通過調用tee_fs_fek_crypt函數來生成一個FEK,該函數代碼如下:
TEE_Result tee_fs_fek_crypt(const TEE_UUID *uuid, TEE_OperationMode mode,
const uint8_t *in_key, size_t size,
uint8_t *out_key)
{
TEE_Result res;
uint8_t *ctx = NULL;
size_t ctx_size;
uint8_t tsk[TEE_FS_KM_TSK_SIZE];
uint8_t dst_key[size];
/* 檢查輸入的用于生成FEK的隨機數in_key和用于存放生成的out_key地址是否合法 */
if (! in_key || ! out_key)
return TEE_ERROR_BAD_PARAMETERS;
/* 檢查in_key長度 */
if (size ! = TEE_FS_KM_FEK_SIZE)
return TEE_ERROR_BAD_PARAMETERS;
/* 判定SSK是否已經被初始化 */
if (tee_fs_ssk.is_init == 0)
return TEE_ERROR_GENERIC;
/* 如果調用時參數uuid不為0,則調用HMAC算法生成TSK。如果UUID的值為0,則默認生成TSK
使用的原始數據為0 */
if (uuid) {
res = do_hmac(tsk, sizeof(tsk), tee_fs_ssk.key,
TEE_FS_KM_SSK_SIZE, uuid, sizeof(*uuid));
if (res ! = TEE_SUCCESS)
return res;
} else {
uint8_t dummy[1] = { 0 };
res = do_hmac(tsk, sizeof(tsk), tee_fs_ssk.key,
TEE_FS_KM_SSK_SIZE, dummy, sizeof(dummy));
if (res ! = TEE_SUCCESS)
return res;
}
/* 獲取調用AEC_CBC操作需要的context的大小 */
res = crypto_ops.cipher.get_ctx_size(TEE_FS_KM_ENC_FEK_ALG, &ctx_size);
if (res ! = TEE_SUCCESS)
return res;
/* 分配一份進行AES_CBC操作時需要的context空間 */
ctx = malloc(ctx_size);
if (! ctx)
return TEE_ERROR_OUT_OF_MEMORY;
/* 使用TSK作為進行AES_CBC計算使用的key,而IV值默認為0 */
res = crypto_ops.cipher.init(ctx, TEE_FS_KM_ENC_FEK_ALG, mode, tsk,
sizeof(tsk), NULL, 0, NULL, 0);
if (res ! = TEE_SUCCESS)
goto exit;
/* 將輸入的in_key填充到context中,做完AES_CBC操作之后,輸出的數據將會被保存到dst_
key中 */
res = crypto_ops.cipher.update(ctx, TEE_FS_KM_ENC_FEK_ALG,
mode, true, in_key, size, dst_key);
if (res ! = TEE_SUCCESS)
goto exit;
/* 執行AES_CBC的加密運算,生成FEK */
crypto_ops.cipher.final(ctx, TEE_FS_KM_ENC_FEK_ALG);
/* 將生成的FEK的值復制到輸出參數中 */
memcpy(out_key, dst_key, sizeof(dst_key));
exit:
free(ctx);
return res;
}
-
存儲
+關注
關注
13文章
4296瀏覽量
85800 -
數據庫
+關注
關注
7文章
3794瀏覽量
64362 -
密鑰
+關注
關注
1文章
138瀏覽量
19753
發布評論請先 登錄
相關推薦
評論