ksf信息的提取填充与保存
总体概述
这部分代码是信息的提取填充与保存模块,将密钥所需要的信息分函数分块提取,并进行信息摘要的验证保证数据的完整性,然后本地化保存在密钥文件中,实现保存
代码解读
1.信息提取模块
这一模块的代码大多是检查并从所给参数ksfFromFile中提取相应参数
1.1RkcExtractKsfFileFlag
函数功能:提取并检查fileFlag
函数实现:通过memcpy_s和HksMemCmp和调用封装好的Rkc函数来进行参数的提取和检查
1.2RkcExtractTime
函数功能:从ksfFromFile中提取年月日时分秒到time中
由于提取全部使用了memcpy_s配合offset进行数据的读入和拷贝,所以这里不放源码
1.3 RkcExtractKsfRk
函数功能:从ksfFromFile中提取各类信息存入ksfData中
信息包括:
- version
- CreatedTime
- ExpiredTime
- two material
- iteratorNumber
- salt
- hashAlg
- rkRsv(reserve field)
调用了函数RkcExtractTime进行两次时间的获取,其余的信息通过memcpy_s进行拷贝
1.4RkcExtractKsfMk
函数功能:从ksfFromFile提取信息入ksfData
Mk类型
信息包括:
- CreatedTime
- ExpiredTime
- EncryptAlg
- IV
- cipherText
- reserve field
初步估计封装的数据用于加解密传输的
1.5RkcExtractKsfBuf
函数功能:Buf的构造
信息包括:
- FileFlag
- Rk
- Mk
函数实现:调用函数RkcExtractKsfFileFlag获取fileFlag---->调用RkcExtractKsfRk将Rk进行封装进ksfData---->调用RkcExtractKsfMk将Mk封装入ksfData---->最后调用RkcExtractKsfHash进行hash摘要的生成与验证
2.信息验证模块
这部分函数主要用于数据信息的验证
2.1RkcExtractKsfHash
函数功能:利用hash算法进行摘要的生成并与传入的摘要进行一致性检查
2.2RkcFillKsfHash
函数功能:进行hash算法摘要生成
3.填充模块
*这部分函数主要是针对上述的信息提取函数中获得数据的结构体将其中的数据转移到HksBlob ksfBuf所指的数据块中
3.1RkcFillKsfTime
3.2RkcFillKsfRk
3.3RkcFillKsfMk
3.4RkcFillKsfBuf
由于这四个函数与上述的信息提取的实现方法几乎一致,只是memcpy_s是从上述模块中的参数比如time,ksfBuf中获取的。同样是通过offset进行数据拷贝,所以这里不再贴代码
4.顶层读写模块
主要是对于上述信息提取和填充的顶层调用模块
4.1HksRkcReadKsf
函数功能:根据传入的ksfName获取到存储在file中的ksfData
函数实现:首先调用函数HksGetProcessName获取processName当前进程的名称---->然后构造processNameBlob和fileNameBlob---->根据两个Blob进行文件的获取---->调用函数RkcExtractKsfBuf将buf相关的数据存入ksfData
4.2HksRkcWriteKsf
函数功能:将ksfData中的数据写入密钥存储的文件中
int32_t HksRkcWriteKsf(const char *ksfName, const struct HksRkcKsfData *ksfData)
{
struct HksBlob ksfBuf;
ksfBuf.data = (uint8_t *)HksMalloc(HKS_RKC_KSF_BUF_LEN);
if (ksfBuf.data == NULL) {
HKS_LOG_E("Malloc ksf buffer failed!");
return HKS_ERROR_MALLOC_FAIL;
}
ksfBuf.size = HKS_RKC_KSF_BUF_LEN;
(void)memset_s(ksfBuf.data, ksfBuf.size, 0, ksfBuf.size);
int32_t ret;
do {
/* Fill data into buffer */
ret = RkcFillKsfBuf(ksfData, &ksfBuf);
if (ret != HKS_SUCCESS) {
HKS_LOG_E("Fill ksf buf failed! ret = 0x%X", ret);
break;
}
char *processName = NULL;
if (HksGetProcessName(&processName) != HKS_SUCCESS) {
HKS_LOG_E("get process name failed");
ret = HKS_ERROR_INTERNAL_ERROR;
break;
}
struct HksBlob processNameBlob = { strlen(processName), (uint8_t *)processName };
/* write buffer data into keystore file */
const struct HksBlob fileNameBlob = { strlen(ksfName), (uint8_t *)ksfName };
ret = HksStoreKeyBlob(&processNameBlob, &fileNameBlob, HKS_STORAGE_TYPE_ROOT_KEY, &ksfBuf);
if (ret != HKS_SUCCESS) {
HKS_LOG_E("Store ksf failed! ret = 0x%X", ret);
}
} while (0);
(void)memset_s(ksfBuf.data, ksfBuf.size, 0, ksfBuf.size);
HKS_FREE_BLOB(ksfBuf);
return ret;
}