est.是什么意思| 脉沉细是什么意思| 佟丽娅是什么民族| 扁桃体发炎吃什么药好得快| 起床口苦是什么原因| 什么时候开始| 谦虚的近义词是什么| 老虎头衣服是什么牌子| 猫藓长什么样| 盛情款待是什么意思| 签发是什么意思| 舌头白色是什么原因| 黑枸杞泡水是什么颜色| 产前筛查是检查什么| 喉炎雾化用什么药| 粘纤是什么面料| 不典型鳞状细胞是什么意思| bmo是什么意思| 入睡困难是什么原因| 复检是什么意思| 桑葚泡水喝有什么好处| 不care是什么意思| 鼎是干什么用的| 顶臂长是什么意思| 吃红薯有什么好处和坏处| 脸上发红是什么原因| 4月11号是什么星座| 麦粒肿用什么眼药水| 蟾宫是什么意思| 三月初六是什么星座| 脚背肿是什么原因引起的| 杀什么吓什么| 经常拉肚子挂什么科| 脍炙人口什么意思| 拉屎发黑是什么原因| 头皮屑是什么东西| 你干什么呢| 感冒嗓子哑了吃什么药| 农村做什么致富| 三月份有什么节日| 梦见蟒蛇是什么预兆| 转载是什么意思| 什么是代孕| 小儿拉肚子吃什么药好得快| 来大姨妈吃什么| 尘埃落定什么意思| 护理员是干什么的| 小猪佩奇为什么这么火| 玄关是什么| 辰砂是什么| 07是什么生肖| 第三者责任险是什么意思| 小孩低烧吃什么药| 野生刺猬吃什么| 水瓶座是什么星座| 猩红热是什么症状| 宝宝出急疹要注意什么| 孕反应最早什么时候开始| 豪爽是什么意思| 胃属什么五行| 什么是交感神经紊乱| nbc是什么意思| 咳嗽有黄痰吃什么消炎药| 怀孕了什么时候做检查| 翡翠属于什么玉| 耳廓有痣代表什么| 茹毛饮血什么意思| 吃绝户是什么意思| 白斑是什么| 解酒吃什么药| 白细胞低吃什么药| 头一直摇晃是什么病| 树菠萝什么时候成熟| 肺痨是什么病| 动脉导管未闭对宝宝有什么影响| 什么惊什么怪| 肝看什么科| 自恋什么意思| 毛的部首是什么| 水过鸭背是什么意思| 糜烂性胃炎吃什么药好| vivo手机是什么牌子| 什么夫妻百事哀| 产后恶露是什么| mcm是什么意思| 小孩子上户口需要什么证件| 胎位roa是什么意思| 爱新觉罗是什么旗| 爱的意义是什么| 女性真菌感染是什么原因造成的| 梦见车掉水里了什么征兆| 什么动物捉害虫| 白脉病西医叫什么病| 什么叫985大学| 吃什么蔬菜可以降血脂| 右肾肾盂分离什么意思| 什么是传染性软疣| 观音菩萨成道日是什么意思| 稳重什么意思| 越什么越什么的词语| 肾动脉狭窄有什么症状| a是什么| 深喉是什么感觉| 热疹子是什么症状图片| 玉屏风颗粒治什么病| sc1是什么意思| 怀孕期间不能吃什么| luxury是什么牌子| 死猪不怕开水烫是什么意思| 嘴边长痘痘是什么原因| 脚踝肿是什么原因| 立克次体病是什么意思| 体检报告都检查什么| 1963年属兔的是什么命| 苯扎氯铵是什么| 卤水点豆腐的卤水是什么| 四季如春是什么生肖| 生姜什么时候种植最合适| 嘴唇紫红色是什么原因| 又双叒叕念什么啥意思| 一线炎是什么病严重吗| 苹果对身体有什么好处| 血脂粘稠有什么症状| 历时是什么意思| 什么烟危害最小| 胃溃疡吃什么| peaches是什么意思| 大便变黑是什么原因| 什么情况下做试管婴儿| 抗结剂对人有什么伤害| 电器发生火灾用什么灭火器| 什么什么似火| 白带褐色什么原因| 夏天适合喝什么茶| 儒家思想的核心是什么| 一进大门看见什么最好| 汗毛重的女人意味着什么| 胎盘植入是什么意思| 什么叫通勤| 牛郎叫什么名字| 吗啡是什么| 吃什么东西可以除湿气| 人为什么有五根手指| 佩戴狼牙有什么好处| 开户名是什么| 刘强东开什么车| 便秘喝什么| 纤维化是什么意思| 儿童便秘吃什么最管用| 藏青色t恤配什么颜色裤子| 白球比偏低吃什么补| 什么是靶向治疗| 激素是什么意思| 什么是腹式呼吸的正确方法| 办银行卡需要什么条件| 食管裂孔疝是什么意思| 什么伐桂| 煮牛骨头放什么调料| 1985年出生是什么命| 孕妇梦见猫是什么意思| 矗读什么| 查肝胆胰脾肾挂什么科| 首台套是什么意思| 脚浮肿是什么原因| 猪鞭是什么| 1921年属什么生肖| 治疗肺部气肿有什么方法| 心率低吃什么药好| 宝宝辅食虾和什么搭配| 3月5号是什么星座| 怀孕前三个月为什么不能告诉别人| 为什么抽烟就想拉屎| 为什么老是抽筋| 时光如梭是什么意思| 什么的北风| 吃什么可以降火| 咳嗽一直不好是什么原因| 手掌纹路多且杂乱是为什么| 肝肾阴虚吃什么药| 什么学海无涯苦作舟| 脸上长斑是因为什么原因引起的| 环状肉芽肿是什么皮肤病| 脱头发严重是什么原因引起的| 驴友是什么意思| 夹生饭是什么意思| 略施小计是什么动物| 圆房要做什么| 祛斑什么季节做最好| 什么值得买怎么用| 1.13是什么星座| 拉肚子吃什么药| 磨玻璃影是什么意思| 车什么马什么| cbd什么意思| 灵芝泡水喝有什么功效| 人出现幻觉是什么原因| 怀孕吃什么可以快速流产| palladium是什么牌子| 胃里有胀气吃什么药| 好巴适是什么意思| 串串房是什么意思| 吃完饭就想睡觉是什么原因| 饿了手抖是什么原因| 神经疼痛吃什么药| 眼力见是什么意思| 12朵玫瑰代表什么意思| 脱头发严重是什么原因引起的| 朝花夕拾什么意思| 肚脐眼周围疼是什么原因| reald厅什么意思| 什么药能治痛风| 通讯地址是什么意思| 越狱男主角叫什么| 蛔虫和蛲虫有什么区别| 拐子是什么鱼| 丙烯颜料用什么洗掉| 卧推练什么肌肉| 查尿常规挂什么科| 艾灸后痒是什么原因| 白色念珠菌是什么意思| 98年属什么的| 燕子喜欢吃什么| 哀莫大于心死什么意思| 天蝎后面是什么星座| 葡萄糖高是什么意思| 内分泌失调是什么原因| 健身吃什么长肌肉最快| daks是什么品牌| 两个方一个土读什么| 六月初六是什么日子| 为什么同房后小腹疼痛| 白茶泡出来是什么颜色| 宫腔积液排出什么颜色| 跪乳的动物是什么生肖| 什么是偏光眼镜| 凝血六项是检查什么的| 丙磺舒是什么药| kailas是什么牌子| 88年属龙的是什么命| 美的是做什么起家的| 性格开朗是什么意思| 旖旎什么意思| 甲状腺是什么部位| cnv是什么意思| aoerbo是什么牌子的手表| 若干是什么意思| 葡萄糖偏低是什么意思| 岁月匆匆像一阵风是什么歌| 什么叫窦性心律不齐| 灰指甲是什么原因引起| 五月二十九是什么日子| 白羊座是什么象星座| iwc是什么牌子手表| 尿酸高吃什么药降尿酸效果好| 吃什么促进腺样体萎缩| 彩金是什么材质| 什么血型是万能血型| 血脂高吃什么能降下来| 血糖高要忌口什么| 动一下就出汗是什么原因| 聚酯纤维是什么材料| 打板是什么意思| 不停的出汗是什么原因| 左肾积水是什么意思| 百度
这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 ? 论坛首页 ? 嵌入式开发 ? 软件与操作系统 ? rtthread硬件加密-5hash加密分析

共2条 1/1 1 跳转至

rtthread硬件加密-5hash加密分析

高工
2025-08-04 01:50:19   被打赏 10 分(兑奖)     打赏
百度   理政就是治官。

      从rtt的加密列表中可以知道,MD5,SHA1和SHA2都属于hash加密,因此这三种加密方式都可以通过HASH加密框架向下封装。

/* HASH Type */
    HWCRYPTO_TYPE_MD5     = ((__LINE__ - HWCRYPTO_TYPE_HEAD) & 0xffff) << 16,  /**< MD5 */
    HWCRYPTO_TYPE_SHA1    = ((__LINE__ - HWCRYPTO_TYPE_HEAD) & 0xffff) << 16,  /**< SHA1 */
    HWCRYPTO_TYPE_SHA2    = ((__LINE__ - HWCRYPTO_TYPE_HEAD) & 0xffff) << 16,  /**< SHA2 */

源码解读

代码路径

components\drivers\hwcrypto\hw_hash.c
components\drivers\hwcrypto\hw_hash.h

数据结构

struct hwcrypto_hash_ops
{
    rt_err_t (*update)(struct hwcrypto_hash *hash_ctx,
                       const rt_uint8_t *in, rt_size_t length);     /**< hash运算入口 */
    rt_err_t (*finish)(struct hwcrypto_hash *hash_ctx,
                       rt_uint8_t *out, rt_size_t length);          /**< 计算后的hash值获取入口 */
};

struct hwcrypto_hash
{
    struct rt_hwcrypto_ctx parent;              /**< 硬件加密框架设备 */
    const struct hwcrypto_hash_ops *ops;        /**< 注册对象时需提供的操作入口 */
};

创建入口

struct rt_hwcrypto_ctx *rt_hwcrypto_hash_create(struct rt_hwcrypto_device *device, hwcrypto_type type)
{
    struct rt_hwcrypto_ctx *ctx;

    ctx = rt_hwcrypto_ctx_create(device, type, sizeof(struct hwcrypto_hash));
    return ctx;
}

设备加密类型入口

rt_err_t rt_hwcrypto_hash_set_type(struct rt_hwcrypto_ctx *ctx, hwcrypto_type type)
{// 传入参数可以是
 //   HWCRYPTO_TYPE_MD5, 
 //   HWCRYPTO_TYPE_SHA1,
 //   HWCRYPTO_TYPE_SHA224,
 //   HWCRYPTO_TYPE_SHA256,
 //   HWCRYPTO_TYPE_SHA384。
 //   HWCRYPTO_TYPE_SHA512
 // 中的一个
    return rt_hwcrypto_set_type(ctx, type);
}

      个人理解类型限制应该在hash代码里面实现,而不是继续往下传递,因为驱动层目前看都属于复用方式实现的,如果还存在其他方式加密也需要设置类型,就会出现驱动无法区分的情况。

计算入口

rt_err_t rt_hwcrypto_hash_update(struct rt_hwcrypto_ctx *ctx, const rt_uint8_t *input, rt_size_t length)
{
    if (ctx && ((struct hwcrypto_hash *)ctx)->ops->update)
    {
        return ((struct hwcrypto_hash *)ctx)->ops->update((struct hwcrypto_hash *)ctx, input, length);
    }
    return -RT_ERROR;
}

获取计算结果入口

rt_err_t rt_hwcrypto_hash_finish(struct rt_hwcrypto_ctx *ctx, rt_uint8_t *output, rt_size_t length)
{
    if (ctx && ((struct hwcrypto_hash *)ctx)->ops->finish)
    {
        return ((struct hwcrypto_hash *)ctx)->ops->finish((struct hwcrypto_hash *)ctx, output, length);
    }
    return -RT_ERROR;
}

复制上下文入口

rt_err_t rt_hwcrypto_hash_cpy(struct rt_hwcrypto_ctx *des, const struct rt_hwcrypto_ctx *src)
{
    return rt_hwcrypto_ctx_cpy(des, src);
}

复位入口

void rt_hwcrypto_hash_reset(struct rt_hwcrypto_ctx *ctx)
{
    rt_hwcrypto_ctx_reset(ctx);
}

销毁入口

void rt_hwcrypto_hash_destroy(struct rt_hwcrypto_ctx *ctx)
{
    rt_hwcrypto_ctx_destroy(ctx);
}

总结

      整体来说,hash加密在实现方面相对容易理解,基本上一瞄代码就能看明白是怎么实现的,唯一需要注意的是设置类型时传入的参数。经过以上分析,新增hash加密的驱动适配部分实现框架如下:

#include <rtconfig.h>

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

#if defined(BSP_HWCRYPTO_USING_MD5) || defined(BSP_HWCRYPTO_USING_SHA1) \
|| defined(RT_HWCRYPTO_USING_SHA2_224)|| defined(RT_HWCRYPTO_USING_SHA2_256) \
|| defined(RT_HWCRYPTO_USING_SHA2_384) || defined(RT_HWCRYPTO_USING_SHA2_512)
rt_uint32_t hash_update(struct hwcrypto_hash *hash_ctx,
                       const rt_uint8_t *in, rt_size_t length)
{
    switch (hash_ctx->parent.type)
    {
#if defined(BSP_HWCRYPTO_USING_MD5)
    case HWCRYPTO_TYPE_MD5:
        // TODO: md5 caculate
        // lentgh = md5(hash_ctx, in, length);
        break;
#endif
#if defined(BSP_HWCRYPTO_USING_SHA1)
    case HWCRYPTO_TYPE_SHA1:
        // TODO: sha1 caculate
        // lentgh = sha1(hash_ctx, in, length);
        break;
#endif
#if defined(RT_HWCRYPTO_USING_SHA2_224)
    case HWCRYPTO_TYPE_SHA224:
        // TODO: sha2_224 caculate
        // lentgh = sha2_224(hash_ctx, in, length);
        break;
#endif
#if defined(RT_HWCRYPTO_USING_SHA2_256)
    case HWCRYPTO_TYPE_SHA256:
        // TODO: sha2_256 caculate
        // lentgh = sha2_256(hash_ctx, in, length);
        break;
#endif
#if defined(RT_HWCRYPTO_USING_SHA2_384)
    case HWCRYPTO_TYPE_SHA384:
        // TODO: sha2_384 caculate
        // lentgh = sha2_384(hash_ctx, in, length);
        break;
#endif
#if defined(RT_HWCRYPTO_USING_SHA2_512)
    case HWCRYPTO_TYPE_SHA512:
        // TODO: sha2_512 caculate
        // lentgh = sha2_512(hash_ctx, in, length);
        break;
#endif
    default:
        return 0;
    }
    return length;
}

rt_uint32_t hash_finish(struct hwcrypto_hash *hash_ctx,
                       rt_uint8_t *out, rt_size_t length)
{
    // TODO:hash导出值实现
    switch (hash_ctx->parent.type)
    {
#if defined(BSP_HWCRYPTO_USING_MD5)
    case HWCRYPTO_TYPE_MD5:
        // TODO: Get MD5 result
        // length = md5_finish(hash_ctx, out, length);
        break;
#endif
#if defined(BSP_HWCRYPTO_USING_SHA1)
    case HWCRYPTO_TYPE_SHA1:
        // TODO: Get SHA1 result
        // length = sha1_finish(hash_ctx, out, length);
        break;
#endif
#if defined(RT_HWCRYPTO_USING_SHA2_224)
    case HWCRYPTO_TYPE_SHA224:
        // TODO: Get SHA2 result
        // length = sha2_224_finish(hash_ctx, out, length);
        break;
#endif
#if defined(RT_HWCRYPTO_USING_SHA2_256)
    case HWCRYPTO_TYPE_SHA256:
        // TODO: Get SHA2 result
        // length = sha2_256_finish(hash_ctx, out, length);
        break;
#endif
#if defined(RT_HWCRYPTO_USING_SHA2_384)
    case HWCRYPTO_TYPE_SHA384:
        // TODO: Get SHA2 result
        // length = sha2_384_finish(hash_ctx, out, length);
        break;
#endif
#if defined(RT_HWCRYPTO_USING_SHA2_512)
    case HWCRYPTO_TYPE_SHA512:
        // TODO: Get SHA2 result
        // length = sha2_512_finish(hash_ctx, out, length);
        break;
#endif
        default:
            return 0;
    }
    return length;
}

static const struct hwcrypto_hash_ops hash_ops=
{
     .update = hash_update,
     .finish = hash_finish;
};
#endif

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

    switch (ctx->type)
    {
#if defined(BSP_HWCRYPTO_USING_MD5)
    case HWCRYPTO_TYPE_MD5:
    {
        ctx->contex = RT_NULL;
        //Setup hash operation
        ((struct hwcrypto_hash_ops *)ctx)->ops = &hash_ops;
        break;
    }
#endif 

#if defined(BSP_HWCRYPTO_USING_SHA1)
    case HWCRYPTO_TYPE_SHA1:
    {
        ctx->contex = RT_NULL;
        //Setup hash operation
        ((struct hwcrypto_hash_ops *)ctx)->ops = &hash_ops;
        break;
    }
#endif

#if defined(RT_HWCRYPTO_USING_SHA2_224)
    case HWCRYPTO_TYPE_SHA224:
    {
        ctx->contex = RT_NULL;
        //Setup hash operation
        ((struct hwcrypto_hash_ops *)ctx)->ops = &hash_ops;
        break;
    }
#endif

#if defined(RT_HWCRYPTO_USING_SHA2_256) 
    case HWCRYPTO_TYPE_SHA256:
    {
        ctx->contex = RT_NULL;
        //Setup hash operation
        ((struct hwcrypto_hash_ops *)ctx)->ops = &hash_ops;
        break;
    }
#endif

#if defined(RT_HWCRYPTO_USING_SHA2_384) 
    case HWCRYPTO_TYPE_SHA384:
    {
        ctx->contex = RT_NULL;
        //Setup hash operation
        ((struct hwcrypto_hash_ops *)ctx)->ops = &hash_ops;
        break;
    }
#endif

#if defined(RT_HWCRYPTO_USING_SHA2_512)
    case HWCRYPTO_TYPE_SHA512:
    {
        ctx->contex = RT_NULL;
        //Setup hash operation
        ((struct hwcrypto_hash_ops *)ctx)->ops = &hash_ops;
        break;
    }
#endif

    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)
    {
#if defined(BSP_HWCRYPTO_USING_MD5)
    case HWCRYPTO_TYPE_MD5:
    {
        // TODO: hash reset
        break;
    }
#endif 

#if defined(BSP_HWCRYPTO_USING_SHA1)
    case HWCRYPTO_TYPE_SHA1:
    {
        // TODO: hash reset
        break;
    }
#endif

#if defined(RT_HWCRYPTO_USING_SHA2_224)
    case HWCRYPTO_TYPE_SHA224:
    {
        // TODO: hash reset
        break;
    }
#endif

#if defined(RT_HWCRYPTO_USING_SHA2_256) 
    case HWCRYPTO_TYPE_SHA256:
    {
        // TODO: hash reset
        break;
    }
#endif

#if defined(RT_HWCRYPTO_USING_SHA2_384) 
    case HWCRYPTO_TYPE_SHA384:
    {
        // TODO: hash reset
        break;
    }
#endif

#if defined(RT_HWCRYPTO_USING_SHA2_512)
    case HWCRYPTO_TYPE_SHA512:
    {
        // TODO: hash reset
        break;
    }
#endif
    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)





关键词: 硬件     加密     hash     rtthread    

院士
2025-08-04 09:50:37     打赏
2楼

这几个算法还是属于散队计算使用,主要应用于加密。

不过,他们特别之处在于不能解密


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]
夜不能寐什么意思 乌龟爬进家暗示什么 1908年中国发生了什么 蒸汽机是什么 10.16是什么星座
c6是什么 脚后跟疼为什么 久经沙场是什么意思 脚麻挂什么科 三公经费指什么
护照办理需要什么材料 糖类抗原724偏高是什么原因 饺子有什么馅 头秃了一块是什么原因 sanag是什么牌子
早上10点是什么时辰 皮肤长斑是什么原因引起的 雨露均沾是什么意思 没有胎心胎芽是什么原因造成的 油皮适合用什么护肤品
小孩满月送什么礼物好hcv9jop5ns7r.cn 30号来的月经什么时候是排卵期hcv8jop9ns9r.cn 鼠目寸光是什么意思hcv8jop2ns0r.cn 五行缺什么怎么查询chuanglingweilai.com 喝酒胃出血吃什么药96micro.com
男士蛋皮痒用什么药hcv7jop7ns2r.cn 牛肉烧什么菜好吃hcv9jop4ns6r.cn 养肝护肝吃什么药效果最好hcv9jop0ns6r.cn 海纳百川是什么意思hcv7jop5ns5r.cn 治烫伤最好的药膏是什么hcv8jop7ns3r.cn
诸行无常是什么意思hcv8jop0ns9r.cn 阴毛的作用是什么hcv8jop9ns5r.cn 酸梅汤不能和什么一起吃luyiluode.com 四大发明是什么shenchushe.com 肉桂和桂皮有什么区别hcv8jop8ns9r.cn
la是什么ff14chat.com 小马过河的故事告诉我们什么道理hcv8jop5ns1r.cn 东莞有什么区hcv9jop4ns5r.cn 小猫来家里有什么预兆hcv8jop4ns4r.cn 县副局长是什么级别wzqsfys.com
百度