存储密钥与文件加密密钥介绍

可信应用的存储密钥可信应用的存储密钥(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; }

高通CEO:5G催生全新模式带来新机遇,成为全球经济复苏的关键
米家声波电动牙刷T500评测 早买早享受
继电保护充电保护是什么意思?继电保护的基本原理详解
一文解读FreeRTOS任务内存设置的大小
中国回应瑞典禁用华为中兴5G设备
存储密钥与文件加密密钥介绍
傅里叶变换的数学意义
基于多cpu方式的自动识别控制系统
通信运营商及服务提供商应为未来通信网络和后台系统做好准备
监控指挥中心如何选购液晶拼接屏
有关光电二极管和光电晶体管的硬核科普,值得收藏!
创新赋能,智造未来!德力西电气再度出席房地产产业链创新合作高峰论坛
电子病历如何在迷雾中找到光明?
超过 85% 的 iCloud 苹果用户受双重认证功能保护
小鹏G6电子架构与ADAS系统分析
小米5C本月发布 自主处理器竟然好过海思麒麟?
深度测评比亚迪宋 2.0TID 旗舰型
2017华为P8 Lite完美现身:玻璃机身、配置猛增
“洗”迎变革,华帝洗碗机获得行业首个干态认证
用TDA7294直接推动功放管,TDA7294 application