赞
踩
本篇主题:本篇博客主要分析hks_access.c相关代码
文件路径(security_huks\frameworks\huks_lite\source\hw_keystore_sdk\hks_access.c)
access.c中主要用到两种结构体,第一种是作为msg_box出现的sec_mod_msg。主要结构如下:
第一个是命令的类型cmd_id,有各种不同的hks相关命令,cmd-id主要用来存放命令的类型。用来区分不通的操作命令。
第二个参数status是该结构体的创建状态
第三个参数共用体msg_data,用来声明各种不同操作对应要申请的结构体空间。
struct sec_mod_msg {
enum hks_cmd_type cmd_id;//枚举类型cmd_id
int32_t status;
union {//对数据定义一个共用体,节省空间
struct hks_generate_key_msg generate_key_msg;
struct hks_generate_ex_msg generate_ex_msg;
struct hks_encrypt_decrypt_msg encrypt_decrypt_msg;
struct hks_sign_verify_msg sign_verify_msg;
struct hks_import_key_msg import_key_msg;
struct hks_export_key_msg export_key_msg;
struct hks_delete_key_msg delete_key_msg;
struct hks_get_key_param_msg get_key_param_msg;
struct hks_key_exist_msg key_exist_msg;
struct hks_generate_random_msg generate_random_msg;
struct hks_key_agreement_msg key_agreement_msg;
struct hks_key_derivation_msg key_derivation_msg;
struct hks_hmac_msg hmac_msg;
struct hks_hash_msg hash_msg;
struct hks_bn_exp_mod_msg bn_exp_mod_msg;
struct hks_get_pub_key_list_msg get_pub_key_list_msg;
} msg_data;
};
hks_access.c主要分为下面三个部分,第一个部分前期准备
前面的函数主要用来密钥信息的准备和状态的获取
static void __hks_handle_secure_call(struct sec_mod_msg *msg_box);
void hks_enter_secure_mode(struct sec_mod_msg *msg)//进入安全模式
{
if (msg == NULL)
return;
__hks_handle_secure_call(msg);
//处理安全响应
}
#ifndef _CUT_AUTHENTICATE_
int32_t hks_access_init(void)
{
int32_t status = hks_service_key_info_init();
hks_if_status_error_return(status);
//检查状态,状态正确就返回状态值
return status;
}
void hks_access_destroy(void)
{
hks_service_destroy();
//摧毁安全通道和服务
}
//用来刷新密钥信息-
int32_t hks_access_refresh_key_info(void)
{
int32_t status = hks_service_refresh_key_info();
hks_if_status_error_return(status);//检查该状态值是否会引起错误
return status;//返回状态值
}
status主要基于各种不同操作情况对应的结果来生成status,具体写入再下面__hks_handle_secure_call函数当中写入并返回。下面代码块有很多类似情况,这里只列举生成密钥的情况,其他不再列举,大致结构类似。
static void hks_handle_generate_key(struct sec_mod_msg *msg_box)
{
struct hks_generate_key_msg *msg = &msg_box->msg_data.generate_key_msg;
msg_box->status = hks_service_generate_key(msg->key_alias, msg->key_param);//用来产生生成密钥情况下的状态值
}
status的获取主要基于__hks_handle_secure_call()函数,函数传入一个msg_box结构体,如果对应的cmd_id合理并且对msg_box对应的对象进行指定操作,如果操作失败就把操作码写进status。
static void __hks_handle_secure_call(struct sec_mod_msg *msg_box)
{
if (msg_box == NULL)
return;
//检查传入的结构体信息是否为空,如果空的话就函数返回
if (msg_box->cmd_id < HKS_CMD_MAX) {
//检查结构体中cmdid参数,小于cmd最大值进行下一重判断
if (g_hks_handle_func[msg_box->cmd_id])
g_hks_handle_func[msg_box->cmd_id](msg_box);
} else {
//否则返回错误情况对应的错误值写进stastus
msg_box->status = HKS_ERROR_NOT_SUPPORTED;
}
}
这一部分主要是根据不同情况,先创建一个msg_box结构体。将命令写进结构体的cmd_id,之后申请不同情况对应的结构体,并进行初始化。这部分函数的返回值都为msg_box的状态值。
//用来生成密钥信息
int32_t hks_access_generate_key(const struct hks_blob *key_alias,
const struct hks_key_param *key_param)
{
struct sec_mod_msg msg_box;
(void)memset_s(&msg_box, sizeof(msg_box), 0, sizeof(msg_box));
//将结构体中内容全部初始化为0
struct hks_generate_key_msg *msg = &msg_box.msg_data.generate_key_msg;
//生成密钥信息的结构体msg
msg_box.cmd_id = HKS_GENERATE_KEY;
msg->key_alias = key_alias;
msg->key_param = key_param;
hks_enter_secure_mode(&msg_box);
//对msg各个属性进行初始化
return msg_box.status;//最后返回
}
该文件中类似下面的操作有很多,大致原理上面已经分析。
int32_t hks_access_generate_key_ex(const struct hks_key_param *key_param, struct hks_blob *priv_key,
struct hks_blob *pub_key)
{
struct sec_mod_msg msg_box;
(void)memset_s(&msg_box, sizeof(msg_box), 0, sizeof(msg_box));
//定义msg_box以及初始化
struct hks_generate_ex_msg *msg = &msg_box.msg_data.generate_ex_msg;
//用来生成一对密钥
msg_box.cmd_id = HKS_GENERATE_KEY_EX;
msg->key_param = key_param;
msg->priv_key = priv_key;
msg->pub_key = pub_key;
//对msg各个属性进行赋值,初始化私钥,公钥以及
hks_enter_secure_mode(&msg_box);
return msg_box.status;//返回状态值
}
//密钥通道标记的函数
int32_t hks_access_sign(const struct hks_blob *key_alias, const struct hks_key_param *key_param,
const struct hks_blob *hash, struct hks_blob *signature)
{
struct sec_mod_msg msg_box;
(void)memset_s(&msg_box, sizeof(msg_box), 0, sizeof(msg_box));
//定义消息框结构体以及初始化值
struct hks_sign_verify_msg *msg = &msg_box.msg_data.sign_verify_msg;
msg_box.cmd_id = HKS_SIGN;//对cmdid进行赋值
msg->key = key_alias;
msg->key_param = key_param;
msg->message = hash;
msg->signature = signature;
//初始化msg结构体中各值信息
hks_enter_secure_mode(&msg_box);
return msg_box.status;//返回消息框结构体的状态值
}
这部分代码的结构都很类似容易理解。
以上就是hks_access.c的内容,简单介绍了该文件中代码结构和原理。感谢阅读和点赞。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。