鸿蒙源码分析(十八)


hks_access.c代码分析

本篇主题:本篇博客主要分析hks_access.c相关代码
文件路径(security_huks\frameworks\huks_lite\source\hw_keystore_sdk\hks_access.c)

一、背景知识

hks_access.h介绍

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_accesss.c代码详细分析

hks_access.c主要分为下面三个部分,第一个部分前期准备

2.1前期准备

前面的函数主要用来密钥信息的准备和状态的获取

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;//返回状态值
}

2.2 状态值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;
    }
}

2.3 根据不同命令申请空间并定义

这一部分主要是根据不同情况,先创建一个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的内容,简单介绍了该文件中代码结构和原理。感谢阅读和点赞。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值