hks_client_check.c代码分析
该文件代码主要围绕check展开,全文都在check各种密钥的参数以及size和各种信息是否为空。
文件路径
一、代码注释
该部分代码都是检查结构体的数据域、size域是否为空或是否为0。
有一部分函数是基于其他检查函数的hks封装实现。
//检查进程名和参数
static int32_t CheckProcessNameAndKeyAliasSize(uint32_t processNameSize, uint32_t keyAliasSize)
{
if (processNameSize > HKS_MAX_PROCESS_NAME_LEN) {
HKS_LOG_E("processName size too long, size %u", processNameSize);
return HKS_ERROR_INVALID_ARGUMENT;
}
//先检查进程名的size是否合法
if (keyAliasSize > HKS_MAX_KEY_ALIAS_LEN) {
HKS_LOG_E("keyAlias size too long, size %u", keyAliasSize);
return HKS_ERROR_INVALID_ARGUMENT;
}
//检查密钥的size是否合法
return HKS_SUCCESS;
}
其中大部分函数都最后调用CheckProcessNameAndKeyAliasSize检查进程名和密钥参数,其他函数在调用时都是在实现一些特殊的检查后return调用该函数。
//进行进程名和参数检查的hks封装
int32_t HksCheckProcessNameAndKeyAlias(const struct HksBlob *processName, const struct HksBlob *keyAlias)
{
if (HksCheckBlob2(processName, keyAlias) != HKS_SUCCESS) {
//检查进程名和密钥别名是否为空,是否可用
return HKS_ERROR_INVALID_ARGUMENT;
}
//如果可用就进行size
return CheckProcessNameAndKeyAliasSize(processName->size, keyAlias->size);
}
几乎每个函数的返回值都是CheckProcessNameAndKeyAliasSize函数的使用
//导入密钥参数集
int32_t HksCheckGenAndImportKeyParams(const struct HksBlob *processName, const struct HksBlob *keyAlias,
const struct HksParamSet *paramSetIn, const struct HksBlob *key)
{
int32_t ret = HksCheckBlob3AndParamSet(processName, keyAlias, key, paramSetIn);
//检查密钥和参数集合
if (ret != HKS_SUCCESS) {
return ret;
}
//最后检查参数集合
return CheckProcessNameAndKeyAliasSize(processName->size, keyAlias->size);
}
//所有参数检查的hks封装
int32_t HksCheckAllParams(const struct HksBlob *processName, const struct HksBlob *keyAlias,
const struct HksParamSet *paramSet, const struct HksBlob *data1, const struct HksBlob *data2)
{
int32_t ret = HksCheckBlob4AndParamSet(processName, keyAlias, data1, data2, paramSet);
//检查进程信息和密钥信息是否为空
if (ret != HKS_SUCCESS) {
return ret;
}
return CheckProcessNameAndKeyAliasSize(processName->size, keyAlias->size);
//最后检查size
}
//检查参数集的设置
int32_t HksCheckGetKeyParamSetParams(const struct HksBlob *processName, const struct HksBlob *keyAlias,
const struct HksParamSet *paramSet)
{
if (HksCheckProcessNameAndKeyAlias(processName, keyAlias) != HKS_SUCCESS) {
//检查进程名和密钥是否为空
return HKS_ERROR_INVALID_ARGUMENT;
}
//如果参数集合为空或者参数集的size为0,则函数返回错误值
if ((paramSet == NULL) || (paramSet->paramSetSize == 0)) {
HKS_LOG_E("invalid paramSet");
return HKS_ERROR_INVALID_ARGUMENT;
}
return HKS_SUCCESS;
}
//检查导入公钥的参数
int32_t HksCheckExportPublicKeyParams(const struct HksBlob *processName, const struct HksBlob *keyAlias,
const struct HksBlob *key)
{
if (HksCheckBlob3(processName, keyAlias, key) != HKS_SUCCESS) {
return HKS_ERROR_INVALID_ARGUMENT;
}
return CheckProcessNameAndKeyAliasSize(processName->size, keyAlias->size);
}
//检查派生密钥
int32_t HksCheckDeriveKeyParams(const struct HksBlob *processName, const struct HksParamSet *paramSet,
const struct HksBlob *mainKey, const struct HksBlob *derivedKey)
{
return HksCheckGenAndImportKeyParams(processName, mainKey, paramSet, derivedKey);
}
从这里开始不再调用第一个函数赖检查进程名,都是实现一些自己定义的特殊的检查。
int32_t HksCheckGetKeyInfoListParams(const struct HksBlob *processName, const struct HksKeyInfo *keyInfoList,
const uint32_t *listCount)
{
if (CheckBlob(processName) != HKS_SUCCESS) {
HKS_LOG_E("invalid processName");
return HKS_ERROR_INVALID_ARGUMENT;
}
if (processName->size > HKS_MAX_PROCESS_NAME_LEN) {
HKS_LOG_E("processName size too long, size %u", processName->size);
return HKS_ERROR_INVALID_ARGUMENT;
}
if ((keyInfoList == NULL) || (listCount == NULL)) {
HKS_LOG_E("keyInfoList or listCount null.");
return HKS_ERROR_INVALID_ARGUMENT;
}
for (uint32_t i = 0; i < *listCount; ++i) {
if ((CheckBlob(&(keyInfoList[i].alias)) != HKS_SUCCESS) ||
(keyInfoList[i].paramSet == NULL) || (keyInfoList[i].paramSet->paramSetSize == 0)) {
return HKS_ERROR_INVALID_ARGUMENT;
}
}
return HKS_SUCCESS;
}
//检查初始化参数
int32_t HksCheckInitParams(const struct HksBlob *processName, const struct HksBlob *keyAlias,
const struct HksParamSet *paramSet, const uint64_t *operationHandle)
{
int32_t ret = HksCheckBlob2AndParamSet(processName, keyAlias, paramSet);
if (ret != HKS_SUCCESS) {
return ret;
}
ret = CheckProcessNameAndKeyAliasSize(processName->size, keyAlias->size);
if (ret != HKS_SUCCESS) {
return ret;
}
if (operationHandle == NULL) {
HKS_LOG_E("operation handle invalid.");
return HKS_ERROR_INVALID_ARGUMENT;
}
return HKS_SUCCESS;
}
#endif /* _CUT_AUTHENTICATE_ */
//检查生成随机数参数
int32_t HksCheckGenerateRandomParams(const struct HksBlob *processName, const struct HksBlob *random)
{
if (HksCheckBlob2(processName, random) != HKS_SUCCESS) {
return HKS_ERROR_INVALID_ARGUMENT;
}
if (processName->size > HKS_MAX_PROCESS_NAME_LEN) {
//判断name的size是否合法
HKS_LOG_E("processName size too long, size %u.", processName->size);
return HKS_ERROR_INVALID_ARGUMENT;
}
if (random->size > HKS_MAX_RANDOM_LEN) {
//判断size是否合法
HKS_LOG_E("random size too long, size %u.", random->size);
return HKS_ERROR_INVALID_ARGUMENT;
}
return HKS_SUCCESS;
}