注意:
不要隨便修改主秘鑰,本次跑代碼過程中,對主秘鑰進行修改,導致無法對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計算
一樣的調用接口即可