文章目录
- 安全密钥库模块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的最后一部分内容,分析了一些相关函数的定义和参数的解释。感谢阅读点赞。