加密芯片ATSHA204之使用
目錄
- 看手冊
- Command Packets
- Configuration Zone
- Lock Command
- Nonce Command
- GenDig Command
- Write Command
- Read Command
- MAC Command
- DeriveKey Command
- 相關參考
本文旨在記錄 ATSHA204 的使用過程。ATSHA204 是一個安全認證和驗證設備,可防止設備被抄襲,應該可以算一個加密芯片。
看手冊
??了解一個芯片先看手冊,先看硬件相關部分,此芯片有多種封裝,3管腳芯片為單線通信,8引腳芯片為 I2C 通信,本文主要記錄 I2C 通信。
??由于設備在使用時需要先行喚醒,需要使用 SDA 管腳發送超過 tWLO = 60us 的時間,也是下面截圖提到的 I2C 的頻率在低于133kHz時,發送0x00能夠達到喚醒的效果。發送完成,需延時至少大于 tWHI = 2.5ms ,讓 SDA 管腳為高,其后可進行正常通信。雖然本器件的 I2C 速率可達 1MHz,但為了方便喚醒操作,直接設置速率為 100kMz。
以上簡單的描述了發送的數據與回復的數據,例如設備喚醒后,會回復4字節:0x04,0x11,2字節CRC
Command Packets
設備喚醒后就可正常通信,使用 Command 0x03
此處為發送的命令包格式:
Command 的一般命令為 0x03
Count 為 Count 及其之后的所有數據的個數
回復的數據包
Count 為 回復的所有值,包括 Count
Data 為 回復的數據值,有 1字節,4字節,32字節
以上分別列出了 Command 包的 Opcode、Param1、Param2 值列表。
相關的命令操作碼如上圖 Table 8-6 Command Opcodes ,主要用到了以下幾個,下面具體說說。
- DeriveKey Command
- GenDig Command
- Lock Command
- MAC Command
- Nonce Command
- Read Command
- Write Command
Configuration Zone
要想使用芯片,需要先對 Configuration Zone 進行數據進行配置。
主要配置 Slot Configuration:
數據 Slot 總共有16個區域,每個區域可以存儲 32 字節。
作為密鑰存儲,禁止讀寫,IsSecret(bit7)為1,EncryptRead(bit6)為0,WriteConfig(bit15-12)為never(x01x 或 10xx)
普通數據可以使用加密讀寫,也可以普通讀寫,本文主要說明加密讀寫。加密寫 WriteConfig(Bit14)設置為1;加密讀 IsSecret(bit7)為1,EncryptRead(bit6)為1
密鑰區設置 0x80 0x80
加密讀寫設置 0xC0 0xF0 (此處的兩個字節的低 4 位分別為加密讀與寫所使用的槽號,此處為 slot0)
Lock Command
寫完配置后,需要對 Configuration Zone 中的 Lock Config 加鎖
使用 Lock 命令 ,發送 0x03 0x07 0x17 0x80 0x00 0x00 + 2字節CRC
完成配置區域的鎖定,就可以寫入16個 slot 數據了
這里不加密些的話直接使用 0x12 命令即可,若要使用加密寫,則需要先發送 Nonce 與 Gendig, 生成值保存于 TempKey 中
Nonce Command
Nonce 發送 0x03 0x1B 0x16 0x00 0x00 0x00 + 20個隨機數 + 2字節CRC
此時芯片會返回 32 字節,按上圖就行 SHA-256 計算,得出存儲在芯片內部的 TempKey 值。
GenDig Command
下一步則是發送 GenDig ,GenDig 命令使用 SHA-256 將存儲的值與 TempKey 的內容組合起來。
GenDig 發送 0x03 0x07 0x15 0x00 0x00 0x00 + 2字節CRC
初次加密寫,此處使用 config 中的 slot0,芯片返回 0 則成功,通過上圖紅框計算出新的值,同時該值也會由芯片計算,存儲 TempKey 中。
Write Command
加密發送之前,需要先計算出 Mac 值(這里的 Mac 與 Mac Command 是兩碼事),
TempKey 為 GenDig 后,通過 SHA-256 計算出的值,32字節
PlainTextData 為要發送的數據,32字節
Opcode :0x12
Param1 : 0xC2
Param2 : 所要寫入數據的 Slot 值,如下所示:(32字節寫入,為其中的 Block)
上圖中要發送的 Value 為 GenDig 后,通過 SHA-256 計算出的值 與 所要發送的值 PlainTextData 異或后計算出的值。
數據寫完成后,還可對OTP寫入,同上。
完成后,鎖定數據區:
使用 Lock 命令 ,發送 0x03 0x07 0x17 0x81 0x00 0x00 + 2字節CRC
這時,完成了 config 與 data 區域的鎖定,configuration 設置 0x80 0x80 的就無法讀寫,設置 0xCx 0xFx 則可根據設置加密讀寫的 Slot 來進行加密讀寫。
Read Command
例如:讀取未加密 Data slot1 32字節值,直接發送 0x03 0x07 0x02 0x82 0x08 0x00 + 2字節CRC
則返回 0x23 + 32字節 slot1 存儲值 + 2字節CRC
讀取未加密 Data slot1 最后 4 字節值,直接發送 0x03 0x07 0x02 0x02 0x0F 0x00 + 2字節CRC
加密讀時需要先運行GenDig命令,以生成用于解密的密鑰。GenDig 使用上面已經提及,先發送 Nonce,然后 GenDig。
例如讀取設置 0xCF 0xFF 配置的 Slot1,使用密鑰 Slot15 數據,則發送 Nonce 命令,
后發送GenDig 命令 0x03 0x07 0x15 0x02 0x0F 0x00 + 2字節CRC
計算解密密鑰時,前32字節為 Slot15 數據,其他沒啥變化
而后發送讀命令則會返回加密后的 32 字節數據,與上面 GenDig 后計算的解密密鑰異或,則可得到 Slot1 中的值。
MAC Command
Mac 命令可返回一個 32字節的 SHA-256 digest,也就是一個在密鑰區計算后得出的一個 32字節的 SHA-256 計算值,可與程序內部的已知密鑰比較,正確則程序繼續運行。可用于相對簡單的防抄襲。
例如使用 Slot15 區域的密鑰,發送 Mac 命令時也是先發送 Nonce 命令。
Mac 命令發送 0x03 0x07 0x08 0x41 0x0F 0x00 + 2字節CRC,
mode值 0x41,具體如下圖,只使用 SN[2:3] 和 SN[4:7]
發送成功,則返回 32字節的 SHA-256 digest,
通過程序內部計算得出一個新的 SHA-256 digest 值,與返回值比較,相同則通過檢查,程序可繼續運行。相關 是否使用 OTP 與 SN,與發送 Mac 命令時的 Mode 值有關。
DeriveKey Command
該命令主要進行密鑰的滾動或者創建新密鑰,要使用它,需要在配置 Slot Configuration 時,將其中 Write Config 的 Bit 13 設置為1,同時還分為 Target 和 Parent key,Target key 主要指本身 Slot 值,Parent key 指配置 Slot Configuration 時 WriteKey 設置的 Slot 中的值
使用 DeriveKey 命令時,需要先發送 Nonce(設置mode 為 0x00),
則 DeriveKey 命令中的 TempKey.SourceFlag 為 0(Rand),SlotConfig[TargetKey].Bit15 若是設置,則需要計算 Mac 值,計算數據中的 ParentKey 是 SlotConfig[TargetKey].WriteKey 設置時的 Slot 中的值。
發送 DeriveKey 命令,則所在 Slot 的值發生變化,按上圖使用 SHA-256 計算得出值即為所在 Slot 的更新值。
對于 Slot 0~7( Slot 8~14 忽略 SingleUse 位) ,如果 SlotConfig [TargetKey] 的 Bit12 或 SlotConfig [TargetKey] 的 Bit15 被設置為1,且 SlotConfig[ParentKey].SingleUse 也設置為1,在 UseFlag[ParentKey] 為0x00 的情況下,DeriveKey 命令會返回錯誤。
UseFlag 值 0xFF 為 8 次使用,0x7F為 7次使用,以此類推。
當成功執行時,DeriveKey 總是將 Target key 的 UseFlag 重置為 0xFF,這是重置UseFlag位的唯一機制。
數據 Slot 15 比較特殊,其沒有重置機制,在 配置中的 LastKeyUse 都是描述 Slot 15 的有限使用次數,16個 LastKeyUse, 共 128 次使用(可更改使用次數),在128次使用之后,密鑰 Slot 15 將永久禁用。
在DeriveKey命令中,SingleUse 位用于 Parent key,但被 Target key 忽略。
相關參考
https://blog.csdn.net/a5882230/article/details/52214845
源碼 :https://github.com/nsood/sha204
總結
以上是生活随笔為你收集整理的加密芯片ATSHA204之使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 12【源码】数据可视化:基于 Echar
- 下一篇: 马士兵教你如何面试(记录原话)