文章目录

  • 安全密钥库模块hks_client.c代码分析(中)
  • 一、代码分析
  • 二、总结



安全密钥库模块hks_client.c代码分析(中)

本篇文章主要分析hks_client.c中的相关内容
文件路径(security_huks\frameworks\huks_lite\source\hw_keystore_sdk\hks_client.c)

一、代码分析

获取sdk版本号
传入的参数主要为sdk的版本

void hks_get_sdk_version(struct hks_blob *sdk_version)
{
    if (sdk_version == NULL)
        return;//检查传入版本参数
    const size_t version_len = strlen(HKS_SDK_VERSION);
    if ((sdk_version->data != NULL) && (sdk_version->size > version_len)) {
        if (memcpy_s(sdk_version->data, sdk_version->size, HKS_SDK_VERSION, version_len) != EOK) {
            log_error("memcpy_s fail");
        //将sdk版本写进sdk_version->data数组中
            return;
        }
        sdk_version->data[version_len] = '\0';//字符数组的末端标志
        sdk_version->size = (uint32_t)version_len + 1;
    }
}

**生成一组密钥 **
基于所传入的参数信息生成一个密钥

//用来生成密钥
HKS_DLL_API_PUBLIC int32_t hks_generate_key(const struct hks_blob *key_alias,
    const struct hks_key_param *key_param)
{
#ifdef _CUT_AUTHENTICATE_
    return HKS_ERROR_NOT_SUPPORTED;
#else
    HKS_TRACE_IN;
    hks_if_status_error_return(hks_is_valid_auth_id(key_param));
    //检查密钥参数对应id是否可用
    hks_if_status_error_return(hks_is_valid_alias(key_alias));
    //检查临时密钥是否可用
    if (key_param->key_type != HKS_KEY_TYPE_EDDSA_KEYPAIR_ED25519)
        return HKS_ERROR_NOT_SUPPORTED;
    return hks_access_generate_key(key_alias, key_param);
    //根据别名和参数生成对应的密钥
#endif
}

生成一组非对称的密钥

//生成一对非对称的密钥
HKS_DLL_API_PUBLIC int32_t hks_generate_asymmetric_key(
    const struct hks_key_param *key_param, struct hks_blob *pri_key,
    struct hks_blob *pub_key)
{
#ifdef _CUT_AUTHENTICATE_
    return HKS_ERROR_NOT_SUPPORTED;
#else
    HKS_TRACE_IN;
    hks_if_true_return_error((key_param == NULL), HKS_ERROR_NULL_POINTER);
    if (key_param->key_type != HKS_KEY_TYPE_ECC_KEYPAIR_CURVE25519)
        return HKS_ERROR_NOT_SUPPORTED;
    //检查密钥类型
    if (key_param->key_mode != hks_alg_ecdh(HKS_ALG_SELECT_RAW))
        return HKS_ERROR_NOT_SUPPORTED;
    //检查密钥参数验证模式
    if ((pri_key == NULL) || (pri_key->data == NULL) || (pub_key == NULL) ||
        (pub_key->data == NULL))
        //查看私钥和公钥数据是否为空,为空则退出
        return HKS_ERROR_NULL_POINTER;
    return hks_access_generate_key_ex(key_param, pri_key, pub_key);
    //生成一对密钥(公钥和私钥)
#endif
}

导入公钥
参数详解:

  • key_alias:密钥别名
  • key_param:密钥参数
  • key:导入密钥
//用来导入公钥
HKS_DLL_API_PUBLIC int32_t hks_import_public_key(
    const struct hks_blob *key_alias,
    const struct hks_key_param *key_param, const struct hks_blob *key)
{
#ifdef _CUT_AUTHENTICATE_
    return HKS_ERROR_NOT_SUPPORTED;
#else
    HKS_TRACE_IN;
    hks_if_status_error_return(hks_is_valid_auth_id(key_param));
    int32_t status = hks_is_valid_alias(key_alias);

    if (status != HKS_STATUS_OK)
        return status;
    if (key_param->key_type != HKS_KEY_TYPE_EDDSA_PUBLIC_KEY_ED25519)
        return HKS_ERROR_NOT_SUPPORTED;
    hks_if_true_return_error((key == NULL), HKS_ERROR_NULL_POINTER);
    if ((key->data == NULL) || (key->size != CRYPTO_PUBLIC_KEY_BYTES))
        return HKS_ERROR_INVALID_PUBLIC_KEY;

    return hks_access_import_key(key_alias, key_param, key);
#endif
}

删除密钥
传入密钥对应的别名,删除密钥

//密钥的删除
HKS_DLL_API_PUBLIC int32_t hks_delete_key(const struct hks_blob *key_alias)
{
#ifdef _CUT_AUTHENTICATE_
    return HKS_ERROR_NOT_SUPPORTED;
#else
    /* to add log here track return value */
    int32_t status = hks_is_valid_alias(key_alias);
    //确认要删除的密钥是否可用
    if (status != HKS_STATUS_OK)
        return status;
    return hks_access_delete_key(key_alias);
    //删除密钥
#endif
}

获取密钥参数
函数功能主要是将key_alias密钥对应的参数读出,写进key_param。
参数详解

  • key_alias :密钥别名
  • key_param:存放密钥参数的数组
HKS_DLL_API_PUBLIC int32_t hks_get_key_param(const struct hks_blob *key_alias,
    struct hks_key_param *key_param)
{
#ifdef _CUT_AUTHENTICATE_
    return HKS_ERROR_NOT_SUPPORTED;
#else
    int32_t status = hks_is_valid_alias(key_alias);
	//检查对应密钥是否可用
    if (status != HKS_STATUS_OK)
        return status;
    if (key_param == NULL)
        return HKS_ERROR_NULL_POINTER;
    return hks_access_get_key_param(key_alias, key_param);
    //返回参数数组key_param
#endif
}

判断密钥是否存在
以传入的密钥别名为数据,判断密钥是否存在,并返回状态值

//确认密钥存在
HKS_DLL_API_PUBLIC int32_t hks_is_key_exist(const struct hks_blob *key_alias)
{
#ifdef _CUT_AUTHENTICATE_
    return HKS_ERROR_NOT_SUPPORTED;
#else
    int32_t status = hks_is_valid_alias(key_alias);
    //如果该密钥可用,判断是否存在并且返回状态值
    if (status != HKS_STATUS_OK)
        return status;
    status = hks_access_is_key_exist(key_alias);
    return status;
#endif
}

非对称通道标记签名
主要用来获取签名信息
参数详解:

  • key_alias:密钥
  • key_param:密钥参数
  • hash:存放哈希散列相关密钥数据
  • signature:定义签名,存放最后获取的签名
//非对称标记
HKS_DLL_API_PUBLIC int32_t hks_asymmetric_sign(
    const struct hks_blob *key_alias,
    const struct hks_key_param *key_param, const struct hks_blob *hash,
    struct hks_blob *signature)
{
#ifdef _CUT_AUTHENTICATE_
    return HKS_ERROR_NOT_SUPPORTED;
#else
    int32_t status = hks_is_valid_alias(key_alias);
    //先检查密钥是否可用
    hks_if_status_error_return(status);
    hks_if_true_return_error(((key_param == NULL) || (hash == NULL) ||
        (signature == NULL)), HKS_ERROR_NULL_POINTER);//检查所传入的参数
    if ((key_param->key_type != HKS_KEY_TYPE_EDDSA_KEYPAIR_ED25519) ||
        ((key_param->key_usage & HKS_KEY_USAGE_SIGN) == 0))//检查密钥信息
        return HKS_ERROR_NOT_SUPPORTED;
    if ((hash->data == NULL) || (hash->size <= 0))//检查哈希数据
        return HKS_ERROR_INVALID_ARGUMENT;
    if ((signature->data == NULL) ||//签名数据为空或者签名域过小,函数报错
        (signature->size < HKS_SIGNATURE_MIN_SIZE))
        return HKS_ERROR_BUFFER_TOO_SMALL;

    return hks_access_sign(key_alias, key_param, hash, signature);//返回密钥通道的标记
#endif
}

二、总结

以上就是hks_ client.c的最后一部分内容,分析了一些相关函数的定义和参数的解释。感谢阅读点赞。