鸿蒙源码分析(二十三)


安全密钥库模块hks_common.c代码分析

本篇文章主要分析hks_common.c中的相关内容
文件路径(security_huks\frameworks\huks_lite\source\hw_keystore_sdk\common\hks_common.c)

一、背景知识

头文件介绍
相关算法介绍

二、hks_common.c代码分析

生成随机数算法
该函数用来生成一个随机数,其中使用到了ctr_drbg这个伪随机数生成器。
参数解释

  • random :随机数存储的缓冲区
  • len :随机数的长度

返回值:返回成功或者错误码

//生成随机数函数,返回错误码或者成功
int32_t hks_gen_random(uint8_t *random, uint32_t len)
{
    if (random == NULL) {
        log_error("invalid random");
        return HKS_ERROR_NULL_POINTER;
    }

    if ((len == 0) || (len > HKS_RANDOM_MAX_LEN)) {
        log_error("invalid len=%u", len);
        return HKS_ERROR_INVALID_ARGUMENT;
    }
    //检查传入参数的合理性

    mbedtls_ctr_drbg_context ctr_drbg;
    mbedtls_entropy_context entropy;

    (void)memset_s(&ctr_drbg, sizeof(ctr_drbg), 0, sizeof(ctr_drbg));
    //初始化ctr_drbg内容
    mbedtls_entropy_init(&entropy); //初始化entropy
    int ret = HKS_SUCCESS;

    /* use the g_hks_random_seed_custom without string terminator */
    int32_t rc = mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func,
        &entropy, g_hks_random_seed_custom,
        sizeof(g_hks_random_seed_custom));
    //生成一个伪随机数

    if (rc != HKS_STATUS_OK) {
        log_error("ctr drbg seed fail,rc=%d", rc);
        ret = HKS_ERROR_INTERNAL_UNKOWN;
        goto exit;
    }//对生成随机数的成功状态进行检查

    rc = mbedtls_ctr_drbg_random(&ctr_drbg, random, len);
    if (rc != HKS_STATUS_OK) {
        log_error("ctr drbg random fail,rc=%d", rc);
        ret = HKS_ERROR_INTERNAL_UNKOWN;
    }
exit:
    mbedtls_ctr_drbg_free(&ctr_drbg);
    mbedtls_entropy_free(&entropy);
    //释放相关空间,返回ret值。
    return ret;
}

计算sha526相关算法原理
这个函数主要涉及SHA256算法中的计算过程,SHA256算法是一个单向的哈希函数
参数详解:

  • hash_src :哈希函数的来源、
  • hash_src_num:哈希函数来源的数量
  • hash_result :哈希函数的结果

返回值:成功则返回成功值,否则返回错误代码

//计算sha526相关算法原理
int32_t hks_calc_sha256(const struct hks_blob *hash_src, uint32_t hash_src_num, struct hks_blob *hash_result)
{
    if (hash_src == NULL) {
        log_error("invalid hash src");
        return HKS_ERROR_NULL_POINTER;
    }
    if (hash_result == NULL) {
        log_error("invalid hash result");
        return HKS_ERROR_NULL_POINTER;
    }
    //检查传入参数的合理性
    mbedtls_sha256_context sha256_ctx;
    mbedtls_sha256_init(&sha256_ctx);
    //定义SHA256并且完成初始化
    int rc = mbedtls_sha256_starts_ret(&sha256_ctx, HKS_BOOL_FALSE);
    //SHA256开始设置
    if (rc != HKS_SUCCESS) {
        log_error("sha256 starts fail,rc=%d", rc);
        return HKS_ERROR_INTERNAL_UNKOWN;
        //start_ret设置失败的处理
    }

    do {
        uint32_t i = 0;
        for (; i < hash_src_num; ++i) {
            rc = mbedtls_sha256_update_ret(&sha256_ctx,
                hash_src[i].data, hash_src[i].size);
            //更新相关内容
            if (rc != HKS_SUCCESS) {
                log_error("sha256 update fail,rc=%d,i=%u", rc, i);
                break;
            }
        }
        if (rc != HKS_STATUS_OK)
            break;

        rc = mbedtls_sha256_finish_ret(&sha256_ctx, hash_result->data);
        //结束sha256算法
        if (rc != HKS_SUCCESS) {
            log_error("sha256 finish fail,rc=%d,i=%u", rc, i);
            break;
        }
    } while (0);//用来执行一次的循环

    mbedtls_sha256_free(&sha256_ctx); //释放sha256_ctx空间
    if (rc != HKS_STATUS_OK)
        return HKS_ERROR_INTERNAL_UNKOWN;

    return HKS_STATUS_OK;
}

检查缓冲区数据初始化的参数
基于hks_chk_init_buf_data_para函数实现上述功能,
参数详解:

  • data_type :数据类型
  • buf :缓冲区
  • buf_len :缓冲区的长度

返回值:成功值或者失败代码

//用来检查缓冲区数据初始化的参数
static int32_t hks_chk_init_buf_data_para(uint8_t data_type, const uint8_t *buf, uint32_t buf_len)
{
    if (buf == NULL) {
        log_error("invalid buf");
        return HKS_ERROR_NULL_POINTER;
    } //检查缓冲区是否为空

    if ((data_type > HKS_INIT_DATA_TYPE_MAX) || (buf_len == 0)) {
        log_error("invalid para,data_type=%u,buf_len=%u", data_type,
            buf_len);
    //检查数据类型和混缓冲区长度
        return HKS_ERROR_INVALID_ARGUMENT;
    }

    return HKS_STATUS_OK;
}

初始化缓冲区数据
hks_init_buf_data函数用来初始化buf_data中数据。
参数详解:

  • data_type :数据类型
  • buf :缓冲区
  • buf_len :缓冲区的长度
int32_t hks_init_buf_data(uint8_t data_type, uint8_t *buf, uint32_t buf_len)
{
    int32_t rc = hks_chk_init_buf_data_para(data_type, buf, buf_len);

    if (rc != HKS_STATUS_OK)
        return rc;

    if (data_type == HKS_INIT_DATA_TYPE_ALL_ZERO) {
        (void)memset_s(buf, buf_len, 0, buf_len);
        //初始化为全0
    } else if (data_type == HKS_INIT_DATA_TYPE_ALL_ONE) {
        (void)memset_s(buf, buf_len, 0xFF, buf_len);
        //初始化为全1
    } else {
        /* random data */
        rc = hks_gen_random(buf, buf_len);//初始化为随机值
    }

    return rc;
}

申请并且初始化内存
hks_malloc_init_ptr函数基于malloc来申请斌初始化申请的内存空间
参数解释

  • size:索要申请的内存空间大小
  • ptr:输出的指针
//申请并初始化内存空间
int32_t hks_malloc_init_ptr(uint32_t size, uint8_t **ptr)
{
    if (ptr == NULL)
        return HKS_ERROR_NULL_POINTER;
    if (size == 0)
        return HKS_ERROR_INVALID_ARGUMENT;
    //先检查传入的参数是否合理
    *ptr = (uint8_t *)HKS_MALLOC(size);
    //申请空间
    if (*ptr == NULL)
        return HKS_ERROR_INSUFFICIENT_MEMORY;
    //检查是否申请成功
    if (memset_s(*ptr, size, 0, size) != EOK) {
        //初始化内存空间,否则就释放
        hks_free_ptr(*ptr);
        return HKS_ERROR_BAD_STATE;
    }
    return HKS_STATUS_OK;
    //返回状态值
}

摧毁hks_blob
这个函数主要用来释放blob->data所指向的内存空间。

void hks_blob_destroy(struct hks_blob *blob)
{
    if (blob == NULL)
        return;
    if (blob->size == 0)
        return;
    //检查传入的参数合理性

    if (blob->data != NULL) {
        (void)memset_s(blob->data, blob->size, 0, blob->size);
        hks_free_ptr(blob->data);
    //如果blob->data指向的内容不为空,先初始化其中内容为0,然后就释放所指向的空间,
    }

    blob->size = 0;
    blob->type = HKS_BLOB_TYPE_RAW;
    //重置相关属性值
}

三、总结

以上就是hks_common.c的第一部分内容,分析了一些相关函数的定义和参数的解释。后面会分析剩余的内容,感谢阅读点赞。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HarmonyOS是华为公司自主研发的操作系统,其内核是实现系统各项功能的核心部分。对于HarmonyOS内核源码分析,可以从以下几个方面进行讨论。 首先,HarmonyOS内核源码分析可以关注其整体架构。HarmonyOS内核采用微内核架构,将各个功能模块拆分成独立的服务,通过消息传递进行通信,实现了更高的灵活性和可靠性。通过分析内核的整体架构,可以深入了解到HarmonyOS是如何进行进程管理、内存管理、文件系统等各个方面的功能实现。 其次,可以重点关注HarmonyOS内核的调度机制。调度机制是操作系统内核决定进程、线程执行顺序和时间分配的重要部分。HarmonyOS内核采用了全局时钟中断驱动的抢占式调度机制,能够确保不同任务的公平和高效执行。通过对调度机制的分析可以了解到HarmonyOS内核是如何进行多任务切换、时间片轮转以及任务优先级管理的。 此外,HarmonyOS内核源码分析还可以关注线程同步和通信机制。线程同步和通信是多线程协作的基础,也是操作系统内核重要的功能之一。HarmonyOS内核通过互斥锁、条件变量和信号量等机制实现了线程之间的同步和通信。了解这些机制可以更好地理解HarmonyOS是如何处理多线程并发访问共享资源和协调线程之间的执行顺序的。 最后,分析HarmonyOS内核源码还可以关注其安全性。安全性是一个操作系统内核不能忽视的重要问题。HarmonyOS内核采用了多种安全机制,如安全IPC、安全网卡等,确保系统资源和用户数据的安全。通过分析内核源码中的安全措施可以了解到HarmonyOS是如何保障系统的安全性并防止恶意攻击。 综上所述,对于HarmonyOS内核源码分析需要关注整体架构、调度机制、线程同步和通信机制以及安全性等方面。通过深入分析内核源码,可以更好地了解操作系统的具体实现细节和原理,为开发者提供更好的参考和指导。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值