安全存储密钥(Secure Storage Key, SSK)在每台设备中的值都不同。
OP-TEE启动时会使用 芯片ID和HUK经HMAC算法计算来获得该值 ,并将SSK的值保存在结构体变量tee_fs_ssk的密钥成员中,以备生成其他密钥使用。
工厂生 产时会将HUK写入到OTP/efuse中 ,且正常世界状态无法读取到HUK的值,而芯片ID在芯片出厂后就会被写入到芯片中。
OP-TEE启动过程中会执行tee_fs_init_key_manager函数,该函数使用SSK =HMAC(HUK, message)的方式来生成SSK。该函数的内容如下:
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的产生:
* SSK = HMAC(HUK, message)
* message := concatenate(chip_id, static string)
* */
/* 获取HUK的值(该接口的实现与平台有关,不同的芯片具有不同读取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
是一个静态的字符串,该值被写死在代码中 */
memcpy(message, chip_id, sizeof(chip_id));
memcpy(message + sizeof(chip_id), string_for_ssk_gen,
sizeof(string_for_ssk_gen));
/* 使用huk的值对message的内容做HMAC运算,将获取到的数据作为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));
/* 标记ssk已经生产 */
if (res == TEE_SUCCESS)
tee_fs_ssk.is_init = 1;
return res;
}
全部0条评论
快来发表一下你的评论吧 !