鸿蒙源码分析(二十八)

本文详细解析了安全模块中hks_mbedtls_bn.c文件,该文件主要涉及两个函数,实现了大数运算中的expmod操作。首先介绍了参数检查,确保取模数n为大奇数且x能容纳运算结果。接着详述了运算执行过程,利用mbedtls_mpi库进行大数幂运算,并将结果写入指定结构体。文章总结了这一标准大数运算的关键步骤。
摘要由CSDN通过智能技术生成

hks_mbedtls_bn.c代码详细

本篇主要分析安全模块下hks_mbedtls_bn.c文件,主要涉及到两个函数,都是为了实现大数运算中的expmod运算。
文件位置

一、相关知识

大数运算代码

二、代码分析

运算参数的检查
该函数主要是为了检查运算中的x和n参数,来判断n是否为大奇数,该运算要求取模数n必须为大奇数,该函数基于与运算对n的最后一位进行判断奇偶。同时比较x和n的数据域宽度,如果x_data.size < n_data.size函数报错返回,即x小于n则有可能无法存放最后结果。
参数详解:

  • n主要是为了存储该计算过程中的要取模的数字
  • x:是为了存储最后结果的数组

//检查取模的数n和最终结果数x
//原理x = a^e mod n
static int32_t CheckBnExpModNx(const struct HksBlob *n, const struct HksBlob *x)
{
    /* zero is even number, so doesn't have to be checked */
    if ((n->data[n->size - 1] & 0x1) == 0x0) {
    //用来检查n的数据域中最后一位数来判断n是奇数还是偶数
        HKS_LOG_E("The param n(modular) must be odd!");
    //如果与运算结果为0,说明n为偶数,程序报错。n必须为奇数
        return HKS_ERROR_INVALID_ARGUMENT;
    }

    if (x->size < n->size) {
    //如果存放结果的数据域宽度小于mod数n的宽的,说明x的数据与太小,不够存放结果
        HKS_LOG_E("The param x's size is too samll! x size = 0x%X", x->size);
        return HKS_ERROR_BUFFER_TOO_SMALL;
    }

    return HKS_SUCCESS;
}

运算执行过程
该过程主要目的是为了计算:x = a^e mod n。
函数传入的参数功能同上面表达式,分别是计算中的四个数据。函数原理主要是基于mbedtls_mpi中所封装的结构体和函数,先申请四个临时结构体空间,将函数传入的a,e,n分别读进临时变量,mbedtls_mpi_exp_mod函数将运算执行并且结果写进临时变量bnX,最后再将bnX数据写进函数传入参数HksBlob结构体:x

//实现ExpMod运算
//原理 x = a^e mod n
int32_t HksMbedtlsBnExpMod(const struct HksBlob *a,
    const struct HksBlob *e, const struct HksBlob *n, struct HksBlob *x)
{
    int32_t ret = CheckBnExpModNx(n, x);//先对结果x和大数mod进行判断
    if (ret != HKS_SUCCESS) {
        return ret;
    }
    mbedtls_mpi bnX;
    mbedtls_mpi bnA;
    mbedtls_mpi bnE;
    mbedtls_mpi bnN;
    mbedtls_mpi_init(&bnX);
    mbedtls_mpi_init(&bnA);
    mbedtls_mpi_init(&bnE);
    mbedtls_mpi_init(&bnN);
    //定义大数A,X,E,N并且初始化
    do {
        ret = mbedtls_mpi_read_binary(&bnA, a->data, a->size);
        if (ret != HKS_MBEDTLS_SUCCESS) {
            HKS_LOG_E("Mbedtls mpi read a failed! mbedtls ret = 0x%X", ret);
            break;
        }
        ret = mbedtls_mpi_read_binary(&bnE, e->data, e->size);
        if (ret != HKS_MBEDTLS_SUCCESS) {
            HKS_LOG_E("Mbedtls mpi read e failed! mbedtls ret = 0x%X", ret);
            break;
        }
        ret = mbedtls_mpi_read_binary(&bnN, n->data, n->size);
        if (ret != HKS_MBEDTLS_SUCCESS) {
            HKS_LOG_E("Mbedtls mpi read n failed! mbedtls ret = 0x%X", ret);
            break;
        }
        //将函数传入参数a,e,n分别调用mbedtls_mpi_read_binary函数读进刚刚定义的bnA,bnE,bnN
        ret = mbedtls_mpi_exp_mod(&bnX, &bnA, &bnE, &bnN, NULL);
        if (ret != HKS_MBEDTLS_SUCCESS) {
            HKS_LOG_E("Mbedtls exp mod failed! mbedtls ret = 0x%X", ret);
            break;
            //调用库函数执行x=a^e mod n
        }

        ret = mbedtls_mpi_write_binary(&bnX, x->data, x->size);
        //将最后结果从bnX写进函数传入的HksBlob结构体x
        if (ret != HKS_MBEDTLS_SUCCESS) {
            HKS_LOG_E("Mbedtls mpi write x failed! mbedtls ret = 0x%X", ret);
        }
    } while (0);

    mbedtls_mpi_free(&bnX);
    mbedtls_mpi_free(&bnA);
    mbedtls_mpi_free(&bnE);
    mbedtls_mpi_free(&bnN);
    //最后释放刚刚临时申请的四个大数对应的空间
    return ret;
}

三、总结

以上为standard中大数幂运算相关细节,感谢阅读点赞。

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、付费专栏及课程。

余额充值