安全存儲(chǔ)密鑰
安全存儲(chǔ)密鑰(Secure Storage Key, SSK)在每臺(tái)設(shè)備中的值都不同。
OP-TEE啟動(dòng)時(shí)會(huì)使用 芯片ID和HUK經(jīng)HMAC算法計(jì)算來(lái)獲得該值 ,并將SSK的值保存在結(jié)構(gòu)體變量tee_fs_ssk的密鑰成員中,以備生成其他密鑰使用。
工廠(chǎng)生 產(chǎn)時(shí)會(huì)將HUK寫(xiě)入到OTP/efuse中 ,且正常世界狀態(tài)無(wú)法讀取到HUK的值,而芯片ID在芯片出廠(chǎng)后就會(huì)被寫(xiě)入到芯片中。
OP-TEE啟動(dòng)過(guò)程中會(huì)執(zhí)行tee_fs_init_key_manager函數(shù),該函數(shù)使用SSK =HMAC(HUK, message)的方式來(lái)生成SSK。該函數(shù)的內(nèi)容如下:
static TEE_Result tee_fs_init_key_manager(void)
{
int res = TEE_SUCCESS;
struct tee_hw_unique_key huk;
uint8_t chip_id[TEE_FS_KM_CHIP_ID_LENGTH];
uint8_t message[sizeof(chip_id) + sizeof(string_for_ssk_gen)];
/* SSK的產(chǎn)生:
* SSK = HMAC(HUK, message)
* message := concatenate(chip_id, static string)
* */
/* 獲取HUK的值(該接口的實(shí)現(xiàn)與平臺(tái)有關(guān),不同的芯片具有不同讀取HUK值的方式)*/
tee_otp_get_hw_unique_key(&huk);
/* 獲取芯片ID的值(不同的芯片具有不同的讀取芯片ID值的方式)*/
tee_otp_get_die_id(chip_id, sizeof(chip_id));
/* 將chip id + string_for_ssk_gen連接后的值保存到message中,string_for_ssk_gen
是一個(gè)靜態(tài)的字符串,該值被寫(xiě)死在代碼中 */
memcpy(message, chip_id, sizeof(chip_id));
memcpy(message + sizeof(chip_id), string_for_ssk_gen,
sizeof(string_for_ssk_gen));
/* 使用huk的值對(duì)message的內(nèi)容做HMAC運(yùn)算,將獲取到的數(shù)據(jù)作為SSK保存到tee_fs_ssk變
量的key成員中 */
res = do_hmac(tee_fs_ssk.key, sizeof(tee_fs_ssk.key),
huk.data, sizeof(huk.data),
message, sizeof(message));
/* 標(biāo)記ssk已經(jīng)生產(chǎn) */
if (res == TEE_SUCCESS)
tee_fs_ssk.is_init = 1;
return res;
}
-
芯片
+關(guān)注
關(guān)注
456文章
51178瀏覽量
427265 -
密鑰
+關(guān)注
關(guān)注
1文章
141瀏覽量
19851 -
TEE
+關(guān)注
關(guān)注
0文章
29瀏覽量
10306
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論