当前位置:   article > 正文

鸿蒙源码分析(十八)_hwkeystore

hwkeystore


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;
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

二、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;//返回状态值
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

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);//用来产生生成密钥情况下的状态值
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

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;//最后返回
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

该文件中类似下面的操作有很多,大致原理上面已经分析。

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;//返回状态值
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
//密钥通道标记的函数
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;//返回消息框结构体的状态值
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

这部分代码的结构都很类似容易理解。

三、总结

以上就是hks_access.c的内容,简单介绍了该文件中代码结构和原理。感谢阅读和点赞。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/325034
推荐阅读
相关标签
  

闽ICP备14008679号