security_huks模块下hks_service.c代码评注(四)

本文详细介绍了security_huks模块下hks_service.c的服务函数,包括密钥导入、导出、删除和判断是否存在等关键操作,以及与安全相关的服务如注册文件回调、获取公钥别名列表、初始化和销毁密钥信息等。这些服务确保了密钥的安全管理和高效使用。

本篇概述

本篇接续security_huks模块下hks_service.c代码评注(三),继续讲解hks_service下有关密钥的导入导出服务、密钥删除与判断是否存在服务以及部分与密钥安全性相关的服务函数。

代码框架

hks_service.c
├── transfer&check_service
│ └── hks_service_import_public_key
│ └── hks_service_export_public_key
│ └── hks_service_delete_key
│ └── hks_service_is_key_exist
├── security_service
│ └── hks_service_register_file_callbacks
│ └── hks_service_get_pub_key_alias_list
│ └── hks_service_key_info_init
│ └── hks_service_destroy
│ └── hks_service_refresh_key_info
│ └── hks_service_register_get_hardware_udid_callback

密钥检查服务

1. hks_service_import_public_key

函数功能:导入公钥服务
导出公钥的步骤为:首先要根据密钥别名判断密钥是否能被存储,通过调用hks_is_key_can_store()实现,接着为密钥信息结构体赋值,填入密钥参数、密钥、保留空间,并将私有密钥置空,最后调用写入密钥存储信息函数进行密钥导入。详细代码和标注如下:

//函数功能:导入公钥服务
int32_t hks_service_import_public_key(const struct hks_blob* key_alias,
    const struct hks_key_param* key_param, const struct hks_blob* key)
{
    //判断输入密钥别名、密钥参数、以及密钥是否合规
    hks_if_true_return_error(((key_alias == NULL) || (key_param == NULL) || (key == NULL)), HKS_ERROR_NULL_POINTER);

    //根据密钥别名判断密钥是否能被存储
    if (hks_is_key_can_store(key_alias,
        HKS_LOCAL_STORAGE_KEY_MAX_NUM) != HKS_BOOL_TRUE)
        return HKS_ERROR_INSUFFICIENT_STORAGE;

    //定义密钥存储信息结构体
    struct hks_storage_key_info key_info;

    //为密钥信息结构体赋值,填入密钥参数、密钥、保留空间,并将私有密钥置空
    key_info.param = (struct hks_key_param*)key_param;
    key_info.public_key = (struct hks_blob*)key;
    key_info.private_key = NULL;
    key_info.reserve[0] = 0;
    key_info.reserve[1] = 0;

    //调用写入密钥存储信息函数进行密钥导入
    return hks_storage_write_key_info(key_alias, &key_info);
}

2. hks_service_export_public_key

函数功能:公钥导出服务
导出公钥的方法就是在检查完传参,定义并初始化密钥信息结构体后调用hks_storage_read_key_info()函数,从key_alias对应的存储位置读取密钥信息到key_info中去,完成导出工作。详细代码及标注如下:

//函数功能:公钥导出服务
int32_t hks_service_export_public_key(const struct hks_blob* key_alias,
    struct hks_blob* key)
{
    //判断传入参数是否为空
    hks_if_true_return_error(((key_alias == NULL) || (key == NULL)), HKS_ERROR_NULL_POINTER);

    //定义密钥信息结构体
    struct hks_storage_key_info key_info;

    //密钥信息结构体初始化
    key_info.param = NULL;
    key_info.private_key = NULL;
    key_info.public_key = key;
    key_info.reserve[0] = 0;
    key_info.reserve[1] = 0;
    //从key_alias对应的存储位置读取密钥信息到key_info中去
    int32_t status = hks_storage_read_key_info(key_alias, &key_info);

    //判断系统状态看看是否成功导出
    if (status == HKS_STATUS_OK &&
        key_info.public_key->size != CRYPTO_PUBLIC_KEY_BYTES)
        return HKS_ERROR_INVALID_PUBLIC_KEY;
    return status;
}

3. hks_service_delete_key

函数功能:密钥删除服务
调用存储模块密钥信息移除服务,对应删除key_alias所代表的密钥信息。调用模块函数hks_storage_remove_key_info()如下:

int32_t hks_storage_remove_key_info(const struct hks_blob *key_alias)
{
    if (key_alias == NULL)
        return HKS_ERROR_NULL_POINTER;

    if ((key_alias->size > HKS_ALIAS_MAX_SIZE) || (key_alias->data == NULL))
        return HKS_ERROR_INVALID_ARGUMENT;

    uint8_t *key_pos = NULL;
    int32_t status = hks_get_key_pos(key_alias, &key_pos);

    if (status != HKS_STATUS_OK)
        return status;

    if (key_pos == NULL)
        return HKS_ERROR_KEY_NOT_EXIST;
    
    //将密钥槽中的所有内容置零
    if (memset_s(key_pos, hks_get_key_slot_len(), 0,
        hks_get_key_slot_len()) != EOK)
        return HKS_ERROR_BAD_STATE;

    //减少密钥数
    status = hks_reduce_key_count();
    if (status != HKS_STATUS_OK)
        return status;

    //更新hash头
    status = hks_refresh_header_hash();
    if (status != HKS_STATUS_OK)
        return status;

    //返回将缓冲区信息写入文件后的状态
    status = hks_sync_buf_to_file();

    return status;
}

密钥删除服务函数hks_service_delete_key()代码及注释如下:

//函数功能:密钥删除服务
int32_t hks_service_delete_key(const struct hks_blob *key_alias)
{
    //调用存储模块密钥信息移除服务,对应删除key_alias所代表的密钥信息
    return hks_storage_remove_key_info(key_alias);
}

4. hks_service_is_key_exist

函数功能:判断密钥存在性服务
该服务主要是通过调用存储部分hks_is_key_exist_in_store()函数来判断密钥是否已被存储,详细hks_is_key_exist_in_store()函数代码如下:

int hks_is_key_exist_in_store(const struct hks_blob *key_alias)
{
    //判断密钥别名是否合规
    int32_t status = hks_is_valid_alias(key_alias);

    if (status != HKS_STATUS_OK)
        return HKS_BOOL_FALSE;

    //定义一个密钥存在性终端标记变量
    uint8_t *key_pos = NULL;

    //调用函数hks_get_key_pos()判断
    status = hks_get_key_pos(key_alias, &key_pos);
    if (status != HKS_STATUS_OK)
        return HKS_BOOL_FALSE;

    //通过终端标记来辨识密钥是否被存储
    if (key_pos != NULL)
        return HKS_BOOL_TRUE;

    return HKS_BOOL_FALSE;
}

函数hks_service_is_key_exist()的代码与标注如下:

//函数功能:判断密钥存在性服务
int32_t hks_service_is_key_exist(const struct hks_blob *key_alias)
{
    uint32_t size = 0;
    //从存储中获取key_alias对应的密钥大小
    int32_t status = hks_storage_get_key_size(key_alias, &size);

    if (status != HKS_STATUS_OK)
        return status;

    //调用函数hks_is_key_exist_in_store来判断密钥是否已被存储
    if ((size > 0) && (hks_is_key_exist_in_store(key_alias) ==
        HKS_BOOL_TRUE))
        return HKS_STATUS_OK;
    return HKS_ERROR_KEY_NOT_EXIST;
}

安全相关服务

1. hks_service_register_file_callbacks

函数功能:注册文件回调服务
该服务通过调用hks文件模块中注册回调函数hks_file_register_callbacks()进行回调,函数hks_file_register_callbacks()如下:

//HKS文件注册回调
int32_t hks_file_register_callbacks(const struct hks_file_callbacks *callbacks)
{
    hks_if_true_return_error((callbacks == NULL), HKS_ERROR_NULL_POINTER);
    hks_if_true_return_error((callbacks->read == NULL ||
        callbacks->write == NULL || callbacks->file_size == NULL),
        HKS_ERROR_NULL_POINTER);
    
    //重新生成一个g_file_callbacks文件,并把对应信息写入
    g_file_callbacks.file_size = callbacks->file_size;
    g_file_callbacks.read = callbacks->read;
    g_file_callbacks.write = callbacks->write;

    return HKS_STATUS_OK;
}

注册文件回调服务函数hks_service_register_file_callbacks()代码及标注如下:

//函数功能:注册文件回调服务
int32_t hks_service_register_file_callbacks(
    const struct hks_file_callbacks *callbacks)
{
    if (callbacks == NULL)
        return HKS_ERROR_NULL_POINTER;

    //调用hks文件模块中注册回调函数进行回调
    return hks_file_register_callbacks(callbacks);
}

2. hks_service_get_pub_key_alias_list

函数功能:获取公钥别名列表服务
该服务通过调用storage模块中获取密钥别名列表函数hks_get_key_alias_list()完成主服务,函数hks_get_key_alias_list()如下:

int32_t hks_get_key_alias_list(struct hks_blob *key_alias_list,
    uint32_t *list_count)
{
    uint8_t *buffer = hks_get_buffer();

    if ((buffer == NULL) || (key_alias_list == NULL) ||
        (list_count == NULL))
        return HKS_ERROR_NULL_POINTER;

    uint8_t slot_count_loop = hks_get_slot_count_loop();
    uint8_t *tmp = buffer + hks_get_header_len();
    uint16_t slot_shift = hks_get_key_slot_len();
    uint8_t flags = 0;
    uint8_t alias_size = 0;
    uint32_t num = 0;

    for (uint8_t j = 0; j < slot_count_loop; j++) {
        hks_blob_read_uint8(&flags, tmp);
        if (flags == HKS_SLOT_PUBLIC_KEY_OCCUPY) {
            uint32_t alias_size_shift = sizeof(uint8_t) + HKS_SEALING_NONCE_SIZE;

            hks_blob_read_uint8(&alias_size, (tmp + alias_size_shift));
            uint32_t alias_shift = alias_size_shift + sizeof(uint8_t);

            if (num >= (*list_count))
                return HKS_ERROR_BUFFER_TOO_SMALL;

            if (key_alias_list[num].size < alias_size)
                return HKS_ERROR_BUFFER_TOO_SMALL;

            if (memcpy_s(key_alias_list[num].data, key_alias_list[num].size,
                tmp + alias_shift, alias_size) != EOK)
                return HKS_ERROR_BAD_STATE;

            key_alias_list[num].size = alias_size;
            ++num;
        }
        tmp += slot_shift;
    }
    *list_count = num;
    return HKS_STATUS_OK;
}

获取公钥别名列表服务函数hks_service_get_pub_key_alias_list()如下:

//函数功能:获取公钥别名列表服务
int32_t hks_service_get_pub_key_alias_list(
    struct hks_blob *key_alias_list, uint32_t *list_count)
{
    if ((key_alias_list == NULL) || (list_count == NULL))
        return HKS_ERROR_NULL_POINTER;

    //调用storage模块中获取密钥别名列表函数完成主服务
    return hks_get_key_alias_list(key_alias_list, list_count);
}

3. hks_service_key_info_init

函数功能:密钥信息初始化服务
该服务的具体代码及标注如下:

//密钥信息初始化服务
int32_t hks_service_key_info_init(void)
{
    //日志信息冲初始化开始与结束信息要求写入
    log_info("hks init : begin");
    int32_t is_key_info_exist = HKS_BOOL_FALSE;
    int32_t status;
    //将文件载入缓冲区中
    status = hks_load_file_to_buffer(HKS_KEY_STORE_FILE_NAME, &is_key_info_exist);
    hks_if_status_error_return(status);

    //调用根密钥组件初始化函数进行初始化
    status = hks_rkc_init(NULL, is_key_info_exist);
    hks_if_status_error_return(status);
    log_info("hks init : end");
    return status;
}

4. hks_service_destroy

函数功能:空间释放服务
该服务是对存储空间的释放与内存空间的释放的封装,代码如下:

//空间释放服务
void hks_service_destroy(void)
{
    //存储空间的释放
    hks_storage_destroy();
    //内存空间的释放
    hks_rkc_destroy();
}

void hks_storage_destroy(void)
{
    hks_clean_buffer();

    int32_t status = hks_sync_buf_to_file();

    log_info("clean key store, status=%d", status);
    (void)status; /* hilink compile will replace log with {} */
    hks_free_ptr(g_storage_image_buffer);
}

void hks_rkc_destroy(void)
{
    //更改根密钥组件配置状态为已删除状态
    g_hks_rkc_cfg.state = HKS_RKC_STATE_ON_DEL;

    uint32_t i = 0;

    //安全删除密钥库文件属性名中的部分
    for (; i < HKS_RKC_KSF_NUM; ++i)
        hks_file_del_s(g_hks_rkc_cfg.ksf_attr.name[i]);

    //清除内存空间
    hks_rkc_clear_mem();
}

5. hks_service_refresh_key_info

函数功能:重置密钥信息服务
该服务的主要思路为:封装功能函数。先进行密钥信息存储的清理,随后进行内存空间的释放,最后进行根密钥组件的初始化。详细代码及标注如下:

//重置密钥信息服务
int32_t hks_service_refresh_key_info(void)
{
    //先进行密钥信息存储的清理
    int32_t status = hks_storage_clean_key_info();
    hks_if_status_error_return(status);

    //内存空间的释放
    hks_rkc_destroy();
    //根密钥组件的初始化
    status = hks_rkc_init(NULL, HKS_BOOL_FALSE);
    return status;
}

6. hks_service_register_get_hardware_udid_callback

函数功能:寄存器获取硬件udid回调服务
该服务的核心在于调用接口函数g_hks_get_hardware_udid_callback返回回调值,接口函数g_hks_get_hardware_udid_callback()如下:

/*
 * register callback for get hardware UDID(Unique Device Identifier)
 * parameter:
 *     callback - [in]   - The callback functions for get hardware UDID.
 * return value:
 *     success or error code
 */
int32_t hks_reg_get_hardware_udid_callback(
    hks_get_hardware_udid_callback callback)
{
    if (callback == NULL) {
        log_error("invalid callback");
        return HKS_ERROR_NULL_POINTER;
    }

    g_hks_get_hardware_udid_callback = callback;

    return HKS_STATUS_OK;
}

函数hks_service_register_get_hardware_udid_callback()代码及标注如下:

//寄存器获取硬件udid回调服务
int32_t hks_service_register_get_hardware_udid_callback(
    hks_get_hardware_udid_callback callback)
{
    //调用接口函数g_hks_get_hardware_udid_callback返回回调值
    return hks_reg_get_hardware_udid_callback(callback);
}

本篇小结

至此,hks_service.c服务部分全部代码评析结束,感谢您的学习与交流!

本课题设计了一种利用Matlab平台开发的植物叶片健康状态识别方案,重点融合了色彩与纹理双重特征以实现对叶片病害的自动化判别。该系统构建了直观的图形操作界面,便于用户提交叶片影像并快速获得分析结论。Matlab作为具备高效数值计算与数据处理能力的工具,在图像分析与模式分类领域应用广泛,本项目正是借助其功能解决农业病害监测的实际问题。 在色彩特征分析方面,叶片影像的颜色分布常与其生理状态密切相关。通常,健康的叶片呈现绿色,而出现黄化、褐变等异常色彩往往指示病害或虫害的发生。Matlab提供了一系列图像处理函数,例如可通过色彩空间转换与直方图统计来量化颜色属性。通过计算各颜色通道的统计参数(如均值、标准差及主成分等),能够提取具有判别力的色彩特征,从而为不同病害类别的区分提供依据。 纹理特征则用于描述叶片表面的微观结构与形态变化,如病斑、皱缩或裂纹等。Matlab中的灰度共生矩阵计算函数可用于提取对比度、均匀性、相关性等纹理指标。此外,局部二值模式与Gabor滤波等方法也能从多尺度刻画纹理细节,进一步增强病害识别的鲁棒性。 系统的人机交互界面基于Matlab的图形用户界面开发环境实现。用户可通过该界面上传待检图像,系统将自动执行图像预处理、特征抽取与分类判断。采用的分类模型包括支持向量机、决策树等机器学习方法,通过对已标注样本的训练,模型能够依据新图像的特征向量预测其所属的病害类别。 此类课题设计有助于深化对Matlab编程、图像处理技术与模式识别原理的理解。通过完整实现从特征提取到分类决策的流程,学生能够将理论知识与实际应用相结合,提升解决复杂工程问题的能力。总体而言,该叶片病害检测系统涵盖了图像分析、特征融合、分类算法及界面开发等多个技术环节,为学习与掌握基于Matlab的智能检测技术提供了综合性实践案例。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
<think>嗯,用户遇到了找不到模块@ohos.security.hash的问题,这需要我帮忙解决。首先,我得回想一下鸿蒙开发的模块结构。根据用户提供的引用资料,特别是引用[2]和引用[3],鸿蒙的安全模块主要是通过@ohos.security.huks来管理密钥和加密操作的。可能用户提到的hash模块其实是集成在HUKS中的,而不是单独的模块。 接下来,我需要确认是否存在@ohos.security.hash这个官方模块。查阅鸿蒙的官方文档,发现确实没有这个模块,而是哈希功能被包含在HUKS里。用户可能在文档或示例中看到过类似名称,导致混淆了模块名称。 然后,用户可能导入了错误的模块名,应该改用@ohos.security.huks。需要指导用户检查代码中的import语句,替换为正确的模块。同时,确保系统能力SystemCapability.Security.Huks已正确配置,这在引用[2]中提到过。 另外,用户可能需要使用HuksParam来指定摘要算法,比如SHA256。需要提供示例代码,展示如何正确调用HUKS的接口进行哈希操作,并处理可能的错误。 最后,提醒用户检查SDK版本和依赖,确保一切更新到最新,避免兼容性问题。如果问题依然存在,建议用户查阅官方资源或社区寻求帮助。总结下来,核心问题在于模块名称的错误,替换成HUKS并正确使用其API应该能解决问题。</think>### 如何解决 `@ohos.security.hash` 模块未找到的问题? #### 问题分析 根据你提供的引用信息,鸿蒙系统的安全模块中并未直接提供名为 `@ohos.security.hash` 的独立模块。鸿蒙的安全功能主要通过 `@ohos.security.huks`(通用密钥库系统)实现,包括哈希算法、加密解密等操作[^2][^3]。 #### 解决步骤 1. **确认模块名称的正确性** - 官方文档中,哈希算法功能通过 `@ohos.security.huks` 提供,而非单独的 `@ohos.security.hash`。需检查代码中是否错误引用了模块名称。 2. **使用 `@ohos.security.huks` 实现哈希功能** - 哈希算法(如 SHA1、SHA256)在 `huks` 模块中被定义为摘要算法。例如,`HUKS_DIGEST_SHA256` 表示使用 SHA256 算法。 - **示例代码**: ```typescript import huks from '@ohos.security.huks'; // 定义哈希参数 let options = { properties: [ { tag: huks.HuksTag.HUKS_TAG_ALGORITHM, value: huks.HuksKeyAlg.HUKS_ALG_RSA }, { tag: huks.HuksTag.HUKS_TAG_DIGEST, value: huks.HuksKeyDigest.HUKS_DIGEST_SHA256 } ] }; // 调用哈希功能 async function hashData(data: Uint8Array) { try { const hashResult = await huks.initSession('default_key', options); console.info('Hash result:', hashResult); } catch (error) { console.error('Hash failed:', error); } } ``` 3. **检查系统能力配置** - 在 `module.json5` 文件中,确保已声明系统能力 `SystemCapability.Security.Huks`[^2]: ```json { "module": { "requestPermissions": [ { "name": "SystemCapability.Security.Huks" } ] } } ``` 4. **确认 SDK 版本与依赖** - 若开发环境版本过旧,可能导致模块缺失。建议更新 DevEco Studio 至最新版本,并同步鸿蒙 SDK。 #### 相关问题 1. **鸿蒙中如何实现数据加密与解密?** - 通过 `@ohos.security.huks` 提供密钥管理和加密接口,支持 AES、RSA 等算法。 2. **如何选择适合的摘要算法?** - 根据安全需求选择,例如 SHA256 平衡性能与安全性,SHA512 适用于更高安全场景[^1]。 3. **鸿蒙安全模块代码结构如何分析?** - 可参考 `security_huks` 的框架层次,其核心逻辑在 `.c` 和 `.cpp` 文件中实现,结合单元测试验证功能。 #### 总结 问题根源在于模块名称引用错误,正确使用 `@ohos.security.huks` 并配置对应参数即可实现哈希功能。若仍存在问题,建议查阅官方文档或社区资源进一步验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值