杰发科技AC7840——CSE硬件加密模块使用(2)
注意:
不要随便修改主秘钥,本次跑代码过程中,对主秘钥进行修改,导致无法对cse模块恢复出厂设置
更新秘钥例程
第2个例程主要是把cse的key加载到cse安全区域中
这里刚看到加载秘钥并不是直接把明文加载到cse模块
测试第3个例程
复位之后异常,查看说明是更新失败,说明这个代码只能更新一次
重新烧录后,异常一样,说明烧录不影响秘钥加载
再刷一遍第2个例程后重新刷更新秘钥代码
没有变化,秘钥只能更新一次?
刷了恢复出厂的代码之后再刷更新秘钥的代码
刷加载秘钥的代码
刷完加载秘钥的再刷更新秘钥的
后面我们会带着问题来进行分析,为什么更新会失败
随机数的生成
从下图可以看出,加载Key不是直接简单的load就可以
CSE_DRV_InitRNG();; 初始化RNG
没有对RNG进行操作,看样子是用指令初始化了伪随机数生成器
CSE_DRV_GenerateRND(RNG); 初始化RND
生成了一个128bit的随机数
调用的RNG是个空的值
然后把伪随机数写到RNG里面
用指令把RNG读出来
CSE_DRV_ExtendSeed(RNG); 扩展RNG
用之前的随机数扩展成随机数种子
CSE_DRV_GenerateRND(RNG); 再计算RND
最后把二次生成的随机数读出来,这个作为真随机数使用(这个作为真随机数,实际上通过算法生成的,应该也是伪随机数)
再看看PRNG和RNG的区别
第一次加载秘钥
从这个图里面看出来,最终计算结果是M4/M5。
请教了大佬,第一个和最后三个是固定的key
通过空白秘钥来计算M1-M5
通过计算的M1-M5来加载主密钥CSE_MASTER_ECU
通过这个数据看到其实只是把数组放进去计算???
通过剩下两个对比,说明确实是把数组放在里面做了计算
秘钥的计算
再看下秘钥计算过程
用KeyID去计算M1
用第一个数组去计算M2
用M1和M2来计算M3
CBC计算M4
计算M5
对秘钥的理解
再返回秘钥管理看看
更新秘钥
上面的例程没更新成功
通过以上的学习再试试更新秘钥
期间对主秘钥进行修改过,后面的更新秘钥都失败了,恢复出厂设置也不生效。
换一块开发板之后先加载秘钥
进行更新,更新时候需要counter++,2的28次方个,uint32_t范围可以随便设置,如果在不知道是多少的情况下往大设置即可。
加载失败
恢复出厂,成功
在出厂状态更新,报错405,秘钥空,符合状况
重新初始化
失败
修改为2之后更新成功
仔细检查是秘钥ID写错,改为11之后更新成功
因此可以确定,更新秘钥就是修改这几个数据即可,实际上就是重新加载秘钥
ECB计算
调用接口即可
CBC计算
一样的调用接口即可