这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 软件与操作系统 » rtthread硬件加密-4RNG加密分析

共1条 1/1 1 跳转至

rtthread硬件加密-4RNG加密分析

高工
2025-03-12 23:42:22     打赏

      虽然写的是RNG加密,但个人认为他的真实叫法应该是硬件随机数生成。

源码分析

代码路径

components\drivers\hwcrypto\hw_rng.c
components\drivers\hwcrypto\hw_rng.h

数据结构

struct hwcrypto_rng_ops
{
    rt_uint32_t (*update)(struct hwcrypto_rng *ctx);    /**< 返回一个随机数 */
};

struct hwcrypto_rng
{
    struct rt_hwcrypto_ctx parent;          /**< 硬件加密框架设备 */
    const struct hwcrypto_rng_ops *ops;     /**< 初始化时需要提供的入口 */
};

获取RNG上下文

struct rt_hwcrypto_ctx *rt_hwcrypto_rng_create(struct rt_hwcrypto_device *device)
{
    struct rt_hwcrypto_ctx *ctx;

    ctx = rt_hwcrypto_ctx_create(device, HWCRYPTO_TYPE_RNG, sizeof(struct hwcrypto_rng));
    return ctx;
}

rt_err_t rt_hwcrypto_rng_default(struct rt_hwcrypto_device *device)
{
    struct rt_hwcrypto_ctx *tmp_ctx;

    /* 如果传入设备为空,则销毁设备,
       有些看不明白这操作,直接返回错误,让上层决定如何操作不更好嘛 */
    if (device == RT_NULL)
    {
        if (ctx_default)
        {
            rt_hwcrypto_rng_destroy(ctx_default);
            ctx_default = RT_NULL;
        }
        return RT_EOK;
    }
    /* 尝试获取默认的加密设备 */
    tmp_ctx = rt_hwcrypto_rng_create(device);
    if (tmp_ctx == RT_NULL)
    {
        return -RT_ERROR;
    }

    /* 销毁旧的上下文,并更新成新的上下文 */
    rt_hwcrypto_rng_destroy(ctx_default);
    ctx_default = tmp_ctx;

    return RT_EOK;
}

销毁RNG上下文

void rt_hwcrypto_rng_destroy(struct rt_hwcrypto_ctx *ctx)
{
    if (ctx == ctx_default)
    {
        ctx_default = RT_NULL;
    }
    rt_hwcrypto_ctx_destroy(ctx);
}

获取RNG值

rt_uint32_t rt_hwcrypto_rng_update_ctx(struct rt_hwcrypto_ctx *ctx)
{
    if (ctx)
    {
        return ((struct hwcrypto_rng *)ctx)->ops->update((struct hwcrypto_rng *)ctx);
    }
    return 0;
}

rt_uint32_t rt_hwcrypto_rng_update(void)
{
    // 没有则创建
    if (ctx_default == RT_NULL)
    {
        rt_hwcrypto_rng_default(rt_hwcrypto_dev_default());
    }
    // 获取值
    return rt_hwcrypto_rng_update_ctx(ctx_default);
}

总结

    从代码也可以看出来,这个部分,本质上就是硬件随机数生成,个人并不认为这属于加密设备,但既然这部分在RTT框架里也加到了硬件加密框架中,那就也总结一下驱动适配时的默认模板 。

#include <rtconfig.h>

#if defined(RT_USING_HWCRYPTO)
#include <rtdevice.h>
#include <rtdbg.h>
#include <board.h>

#if defined(BSP_USING_RNG)
rt_uint32_t rng_update(struct hwcrypto_rng *ctx)
{
    // TODO:rng生成实现
    return length;
}

static const struct hwcrypto_rng_ops rng_ops=
{
    .update = rng_update,
};
#endif

static rt_err_t hwcrypto_create(struct rt_hwcrypto_ctx *ctx)
{
    rt_err_t res = RT_EOK;

    switch (ctx->type & HWCRYPTO_MAIN_TYPE_MASK)
    {

#if defined(BSP_USING_RNG)
    case HWCRYPTO_TYPE_RNG:
    {
        ctx->contex = RT_NULL;
        //Setup rng operation
        ((struct hwcrypto_rng_ops *)ctx)->ops = &rng_ops;
        break;
    }
#endif /* BSP_USING_BIGNUM */
    default:
        res = -RT_ERROR;
        break;
    }

    return res;
}

static void hwcrypto_destroy(struct rt_hwcrypto_ctx *ctx)
{
    if (ctx->contex)
        rt_free(ctx->contex);
}

static rt_err_t hwcrypto_clone(struct rt_hwcrypto_ctx *des, const struct rt_hwcrypto_ctx *src)
{
    rt_err_t res = RT_EOK;

    if (des->contex && src->contex)
    {
        rt_memcpy(des->contex, src->contex, sizeof(struct rt_hwcrypto_ctx));
    }
    else
        return -RT_EINVAL;
    return res;
}

static void hwcrypto_reset(struct rt_hwcrypto_ctx *ctx)
{
    switch (ctx->type & HWCRYPTO_MAIN_TYPE_MASK)
    {
#if defined(BSP_USING_RNG)
    case HWCRYPTO_TYPE_RNG:
    {
        // TODO: rng reset
        break;
    }
#endif /* BSP_USING_RNG */

    default:
        res = -RT_ERROR;
        break;
    }
    return;
}

static const struct rt_hwcrypto_ops hwcrypto_ops =
{
    .create = hwcrypto_create,
    .destroy = hwcrypto_destroy,
    .copy = hwcrypto_clone,
    .reset = hwcrypto_reset,
};

int hwcrypto_device_init(void)
{
    static struct rt_hwcrypto_device hwcrypto_dev;

    hwcrypto_dev.ops = &hwcrypto_ops;
    hwcrypto_dev.id = 0;
    hwcrypto_dev.user_data = &hwcrypto_dev;

    // 硬件资源初始化

    // 注册加密设备
    if (rt_hwcrypto_register(&hwcrypto_dev, RT_HWCRYPTO_DEFAULT_NAME) != RT_EOK)
    {
        return -1;
    }

    return 0;
}
INIT_DEVICE_EXPORT(hwcrypto_device_init);
#endif //#if defined(RT_USING_HWCRYPTO)




关键词: rtthread     硬件     加密     RNG     hwcryp    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]