虽然写的是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)										
			
			
			
						
			
 我要赚赏金
