1. 程式人生 > >MTK平臺除錯加密晶片ATSHA204A---概括篇

MTK平臺除錯加密晶片ATSHA204A---概括篇

本文是概括篇,我會在我的資源那裡上傳程式碼,敬請後續關注,方便讀者參考使用,如有疑問或者有業務合作,可私信我。
除錯的平臺:mt6580 系統:android5.1
加密晶片:ATSHA204A(8腳S0IC封裝)
推薦:具有4.5kb eeprom,且價效比最高。
介面:Interface Type :Single-wire; I2C,推薦使用i2c介面,傳輸速率可達1Mb/s
I2C_Address:0x64 (由0xC8右移一位得到,至於為什麼右移是因為這個資料最高位溢位,詳情可百度)
datasheet pdf文件可在下面的連結下載(如不能下載,建議拷貝網址到別的瀏覽器試下或者百度找一下):

https://www.microchip.com/sitesearch/search/All/ATSHA204A

供電電壓範圍:2.0v~5.5v
通訊電壓範圍:1.8v~5.5v(io/i2c介面的電壓範圍)
休眠功耗:<150 nA
硬體連線:這個是ATSHA204A的SOIC封裝,只需要電源,地,I2C的SCL和SDA這4根線即可,SCL和SDA需要上拉電阻

應用範圍:
安全下載和引導
生態控制
反克隆
資訊保安

關於燒錄器這塊:官網上也有賣,不過價格有點略貴,網上自己買或者自己做,主要還是iic寫進去(所以也可以自己在驅動中新增程式碼I2C實現,強烈推薦在除錯過程中使用I2C寫入即可,可以省一筆錢,土豪隨意)。

ATSHA204A的EEPROM總共包含664位元組(5312位),並被劃分為以下區域:Data,Configuration,One Time Programmable

Data包含512位元組(4.0 kb)區域劃分為16個32位元組(256位)的通用只讀或讀/寫儲存器插槽,每個插槽可用於儲存金鑰、校準資料、型號或其他資訊,通常與ATSHA204A裝置所附加的專案相關。每個資料槽的訪問策略由程式設計到相應配置值的值決定。但是,策略僅在設定鎖值位元組時生效,slot主要意圖是存放金鑰,當然也可以設定成eeprom來使用,但一般使用者都不會這麼做。

Configuration包含序列號和其他ID資訊的88位元組(704位)EEPROM區域,以及訪問資料記憶體每個插槽的許可權資訊。在配置區域中程式設計的值決定了每個資料槽如何響應的訪問策略。可以修改配置區域,直到鎖定它為止(LockConfig設定為!=0x55)。為了啟用訪問策略,必須設定鎖值位元組。

OTP位的64位元組(512位)區域。在鎖定OTPzone,位可以使用標準的寫命令自由地寫。OTP區域可用於儲存只讀資料或單向保險絲型別的消耗日誌記錄資訊

我這裡使用的是I2C通訊,使用這個晶片可以分為三步,

第一步是調通I2C,實現加密IC跟mcu主控的通訊
1、喚醒加密ic:
對ATSHA204A操作時,首先要對裝置進行喚醒操作,喚醒操作如下 :
SDA線保持低電平60us,晶片退出休眠狀態,然後再等待2.5ms以上後,才能開始接受命令,詳細說明在datasheet的第36頁,見下表。
在這裡插入圖片描述
我這邊的做法是直接向裝置傳送0x00資料等效於拉低SDA資料線電平然後隔4ms使用i2c讀函式讀取返回值。
2、i2C通訊資料格式:
ATSHA204A有固定的接收包和傳送包的格式,主控MCU必須要按照固定的格式傳送資料包過來,ATSHA204A才能返回正確的響應位元組。
參考datasheet:8. Security Commands和8.5 Command Sequence(datasheet 44頁),Command Opcodes的定義在datasheet 45頁。Word Address Values定義在datasheet 31頁
傳送包結構:Command + Count + Opcode + Param1 + Param2 + Data + Checksum
在這裡插入圖片描述

接收包結構:count(包的長度(不包括command):byte:0)+Date-Packet(byte:1到N-1)+CRC兩個位元組的校驗和(N-1到N)

注意:command對應就是WordAddress,對晶片的操作主要使用command,即0x03來操作,其他command如下表說明。
在這裡插入圖片描述

ATSHA204A的Opcode主要有以下這幾種,見下表:

![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20181227140612888.?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwNjI0NTkx,size_16,color_FFFFFF,t_70
ATSHA204A的響應位元組如下表所示(例如你寫入位元組成功,會返回0x00,其他返回狀態見下表):
在這裡插入圖片描述
第二步是成功配置這個晶片。在config zone配置,配置完要鎖定配置區

關於IC的鎖定這塊的說明:

1、晶片的config區和data區一旦鎖定,沒有辦法解鎖,鎖的方法只能通過lock command來進行鎖定。

2、config區在沒鎖定的時候,可以使用write command來進行寫操作,但注意,0x00-0x03地址(word地址,詳情請參考手冊)不能被寫,0x15word地址不能使用write command來寫。

3、在config鎖定前,data區(包括slot區和OTP區)既不能寫也不能讀。而在config鎖定後,data區鎖定前,data區只能寫不能讀,在data區鎖定後,可以根據config中的配置來進行讀寫。

只有正確配置了config,atsha204a晶片才能按自己的意圖辦事(Configuration Zone的word adress定義和說明在datasheet的第10頁,其實可以按照datasheet的預設配置值來配置使用)。
在這裡插入圖片描述
由表知道配置區地址0x00-0x03是一直不允許寫的,只能讀。
對於一般使用者,0x04地址的4個配置按預設值設定即可(即配置成0xc8(atsha204a的i2C地址) 0x00 0x55 0x00)。
接下來是地址0x05-0x0C關於slot 的配置了,這裡才是這節的重點,也是需要注意最多的地方。

每個slot config佔用2個位元組,每個位具體配置如下:
一位一位的說

bit0-3:指定加密讀的slot區,這裡的意思是,如果你把slotX設定成可以加密讀取,則這裡要指定加密讀取的金鑰存放的slot,簡單來說,你要讀一個slotX,而slot config[X]已經被配置成可以加密讀,
但是需要知道slot config[X].ReadKey中指定的slot區的金鑰。

bit4:0:這個slot區可以用於所有加密命令,1:這個slot只能用於CheckMac命令和GenDig命令。

bit5:0:此slot中存放的金鑰可以無限使用,1:此slot存放的金鑰有限使用,次數根據UseFlag或LastKeyFlag指定。

bit6:0: 可以明文讀取,1:必須加密讀取。

bit7:0: 此slot不是金鑰區,可以隨意讀寫,1: 此slot作為金鑰區,如果能讀寫則必須是加密進行
bit8-bit11:指定加密寫操作的slot區金鑰,跟bit0-3類似,只不過這裡是寫操作,使用write command命令。

bit12-15對於DeriveKey Command 和 Write command命令有不同的意思,對於DeriveKey Command,就是決定生成的新的金鑰要通過什麼途徑來獲取(Target?,Parent?)

Write Command,定義如下

bit15 = 0;bit14 = 0;bit13 =0; 隨意寫

bit15 = x;bit14 = 0;bit13 =1; 不能寫

bit15 = 1;bit14 = 0;bit13 =x; 不能寫

bit15 = x;bit14 = 1;bit13 =x; 加密寫

Write Configuration Bits — Derivekey Command
bit15 = 0; bit14 = x; bit13 =1; bit12 =0;無需授權MAC (Roll)即可執行DeriveKey命令。
bit15 = 1; bit14 = x; bit13 =1; bit12 =0;為DeriveKey命令(Roll)授權MAC。
bit15 = 1; bit14 = x; bit13 =1; bit12 =1;為DeriveKey命令(建立)授權MAC。
bit15 = x; bit14 = x; bit13 =0; bit12 =x;WriteConfig欄位中具有此值的槽不能用作DeriveKey命令的目標。

以下是我的一個模板,可以把slotX的值填進來,再對應說明來看,就知道是配置的哪種策略了”
bit15 bit14 bit13 bit12 bit11 bit10 bit9 bit8 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0

Lock Data 和Lock Config是控制鎖定資料區和配置區的兩個位元組,

LockData = 0x55,data區沒有鎖定可以進行寫操作。

LockData = 0x00,data區進行鎖定,讀寫需要根據配置來進行。

LockConfig =0x55,config區沒有鎖定可以進行讀寫操作。

LockConfig = 0x00,config區不能寫。

鎖定config zone:Table 8-20 Input Parameters(datasheet 55頁)
在這裡插入圖片描述
由Table 8-20表格可知,輸入包資料結構:command+count+param1+param2+crc
Zone.bit0決定的是鎖config還是OTP區,Zone.bit7 = 1,則不計算需要鎖定區域的CRC16值,否則需要輸入一個CRC16值來校驗。
Summary如果Zone.bit7=0,那麼就這裡就需要填入相應鎖定區域的CRC16值,否則填0x0000。
如果命令成功就返回0。

往data區寫入資料:
此區的配置沒那麼複雜,slot主要意圖是存放金鑰,當然也可以設定成eeprom來使用,但一般使用者都不會這麼做。

slot區一共分16部分,slot0-15,每部分可以存放32位元組金鑰,相信足夠使用。

對slot區的配置無外乎讀寫內容,在config區鎖定前,所有對slot區的讀寫操作均返回錯誤。在config區鎖定後,data區鎖定前,只能寫slot區而不能讀取,在二者都鎖定後,可以根據上節所講的slot config
來進行讀寫。
假設我們配置完了config區,現在我們來寫slot區,很簡單,在data區鎖定前可以隨意讀寫,但強烈建議使用32位元組來寫操作,採用4位元組寫操作,會有很多的限制條件。

假如我們對slot0寫入0x11,0x11,……0x11(共32個0x11),使用write command,引數如下(這裡我們暫時先不考慮各種加密讀寫)。

command= 0x03(WordAddress);
opcode = 0x12(write);
zone = 0x80|0x02; (即0x82)//32位元組寫,寫slot區;
address = 0x00 0x00(byte0=00,byte1=0x00(固定是0x00);
data_1 = 32個位元組 0x11;
data_2 不填 ;
CRC = 0x00 0x00;

如果寫入成功,atsha204a將會返回0。

接下來就是往opt寫入資料,
OTP zone的說明Table 2-8. OTP Zone在datasheet的15頁;
OTP區和slot區配置類似,在atsha204a裡,OTP分16部分,每部分4位元組,預設值都是0xffffffff,OTP區在config區鎖定前無法進行任何讀寫操作,在config鎖定後,data區鎖定前,不能讀,只能寫,與slot區不同的是,OTP區並沒有加密讀寫這一概念,另外也強烈建議使用32位元組寫,4位元組寫入會有很多限制,在data區鎖定後,OTP區的讀寫操作由OTP Mode決定。
command:COMMAND_ADDRESS(0x03); Input Parameters:count = 0x27(39個byte); Opcode:0x12(write); Param1: 0x81(表示寫入的是otp zone); Param2:0x00 0x00(2 bytes address); data(32 bytes) ;CRC(0x00 0x00)

然後鎖定otp區,資料包格式參考下表。
在這裡插入圖片描述

第三步是進行認證(即實現加密驗證)

用通俗易懂的語言說一下atsha204a的加密原理:

首先我們要對atsha204a進行配置,寫密匙,設定為不可讀寫,鎖定。這樣晶片裡的密匙就只有你自己知道了。配置完成後接下來就是使用了,在你的程式啟動時首先初始化完i2c就開始與atsha204a通訊,驗證密匙。你在程式裡隨機生成32位元組的隨機數作為挑戰碼傳送給ATSHA204A 晶片。ATSHA204A 晶片會使用晶片內的 SN[0:1], SN[8], 還有你指定的某個slot區的ID(KeyID),此slot區的資料(32位元組),接收到的挑戰碼,KeyID , MAC 命令碼和mode使用SHA256演算法作一次雜湊運算, 輸出一組 32 字的Digest, 並傳回給主MCU,同時MCU也根據上述資料通過官方庫裡帶的SHA256演算法計算出自己的Digest然後與ATSHA204 晶片返回的Digest進行比較,如果完全一樣則通過,不一樣則密匙驗證失敗。由於你每次傳送的挑戰碼是隨機生成的,所以每次校驗碼也是不一樣的,別人也就無法拷貝你的程式了。
最後說說我使用的加密方案:
(一)使用MAC命令驗證密匙
MAC命令計算儲存在裝置中的key、一個挑戰(0到32位元組,一般是32 bytes)和裝置上的其他資訊的SHA-256摘要Digest。此命令的輸出是此訊息(例如挑戰)的摘要Digest。如果訊息中包含了裝置的序列號,則表示響應是“多樣化的”

使用此命令的一般命令流如下:

1、執行Nonce命令載入輸入挑戰(Chanllenge),並可選擇將其與生成的隨機數組合。該操作的結果是在tempkey中儲存在裝置內部的nonce。

2、可選地執行GenDig命令,將裝置中儲存的一個或多個EEPROM位置與nonce組合在一起。結果儲存在tempkey中的裝置內部。此功能允許將兩個或多個金鑰用作響應生成的一部分。

3、 執行這個MAC命令,將步驟1(如果需要,還可以將步驟2)的輸出與EEPROM金鑰結合起來,生成輸出響應(或摘要)。

寫入晶片的資料包格式輸入引數可以根據Table 8-22 Input Parameters(datasheet 的56頁),函式的執行可以參考庫函式檔案。
在這裡插入圖片描述

在這裡插入圖片描述

mode bit0設定使用Tempkey計算還是直接使用Data中的挑戰碼來計算返回的digest.
mode .bit1 設定使用slot區中的值計算還是Tempkey中的值來計算返回的digest.
mode .bit2 如果bit0或bit2設定了,那麼此位要結合Tempkey.sourceflag位設定.也就是說,使用了nonce命令的話,如果nonce命令中的nonce.mode == 0x00 或者0x01.這裡就等於0, 如果nonce .mode == 0x03,這裡就等於1.
mode .bit3 = 0.
mode .bit4和mode.bit5 是選擇是否使用OTP中的的值來參與計算.
mode .bit6 是使用序列號來參與計算.
mode .bit7 = 0.

使用SHA-256演算法雜湊的message由以下內容組成(88 bytes):
在這裡插入圖片描述

包含有Chanllenge的資料包傳送到加密晶片ATSHA204A後,如果執行正常,會返回一個32位元組的digest(摘要)給到MCU主控端讀取,同時MCU也根據上述資料(message)通過官方庫函式檔案裡帶的SHA256演算法計算出自己的Digest,然後與ATSHA204 晶片返回的Digest進行比較,如果完全一樣則金鑰驗證通過,不一樣則密匙驗證失敗。

關於ATSHA204A還有很多加密的功能,篇幅有限,我就不一一介紹了,建議大家還是多看看datasheet,才能更好的領會這個加密IC的作用和使用。

---------- 愛生活,愛安卓,愛Linux ----------