鸿蒙源码分析(四十六)

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;
}

猜你喜欢

转载自blog.csdn.net/m0_46976252/article/details/120067042