ATSHA204芯片手册阅读笔记
使用心得:
(1)配置好IIC,訪問芯片之前先喚醒。
(2)按個人需求配置好Config區域,配置好之后鎖住Config。只有鎖住了Config,才能去操作Data區。
(3)開始寫數據區,可以將一些自己覺得重要的數據寫到數據區,寫完之后,鎖住才能讀。
????關于ATSHA204的庫文件,Atmel會更新,內容可能會不一樣,下面的鏈接是我在2021/12/07在Github上下載的,本人用的也是這個庫文件:
https://pan.baidu.com/s/148GmFoX_r940jYtDje85ng
密碼:10af
????關于怎么使用這個庫文件,可以向下拉看文章結尾處。
1 簡介
1.1 芯片介紹和應用
ATSHA204A是Atmel公司的加密認證芯片。
基于硬件,具有受保護的密鑰存儲的加密元件
安全對稱身份驗證設備主機和客戶端操作
具有消息身份驗證碼(MAC)的高級SHA-256哈希算法
具有唯一的72位序列號
具有內部高質量的隨機數產生器(RNG)
具有4.5Kb的EEPROM,用于存儲密鑰和數據
具有512位OTP(一次性可編程)用于保存固定信息
可以使用IIC接口,也可以使用單串口。
可應用于如下場景:
????*安全下載和boot
????*系統控制
????*反克隆
????*消息加密
????該芯片有靈活的命令,用戶可以通過命令將芯片設置成不同的功能,可以應用于:
(1)防偽
????驗證可移動、可更換或可消費的客戶端的身份,還可用于驗證軟件或者內存存儲元件。
(2)保護固件程序
????驗證boot啟動時存儲在閃存中的代碼,以防止未經授權的修改(這也稱為安全啟動);加密下載的媒體文件;并對代碼映像進行唯一加密,使其僅在單個系統上可用。
(3)交換會話密鑰
????安全方便地交換加密密鑰,供MCU處理器使用,以管理機密通信通道、加密下載和類似項目。
(4)安全保存數據
????在標準微處理器中存儲加密加速器使用的密鑰。可以用來存儲配置、校準、過程值、消耗數據或者校準所需的少量數據和其他密鑰。通過加密、認證讀寫保護實現可編程保護。
(5)檢查用戶密碼
????驗證用戶輸入的密碼而不讓期望值被人知道,將簡單密碼映射到復雜密碼,并與遠程系統安全地交換密碼值。
1.2 設備特性
????ATSHA204A設備包含一個電可擦除可編程只讀存儲器(EEPROM),可用于密鑰存儲、讀/寫數據、只讀、保密數據、消耗記錄和安全配置。可以通過多種方式限制對內存各個部分的訪問,然后可以鎖定配置以防更改。ATSHA204具有廣泛的防御機制,專門設計用于防止對設備本身的物理攻擊或對設備與系統之間傳輸數據的邏輯攻擊(說白了就是防止別人抄板子)。
????可以使用標準I2 C總線(高達1Mb/s的速度)訪問芯片。
????每個ATSHA204A都附帶一個保證唯一的9字節(72位)序列號。使用芯片支持的加密協議,主機系統或遠程服務器可以證明序列號是真實的,而不是副本(反克隆)。序列號通常存儲在標準的串行EEPROM中,可以很容易地復制,主機無法知道序列號是真實的還是克隆的,必須使用整個序列號來保證唯一性。
????ATSHA204A可以生成高質量的隨機數,并將其用于任何目的,包括作為該設備加密協議的一部分。由于每個32字節(256位)隨機數不依賴于此設備或任何其他設備上生成的過去的數字,因此將其包含在協議計算中可確保重播攻擊(即重新傳輸以前成功的事務)無計可施。
1.3 加密操作
????ATSHA204A支持標準隨機數響應協議,以簡化編程。在其最基本的安裝中,主機系統向客戶機中的設備發送隨機數,芯片通過使用來自系統的消息認證碼(MAC)命令將該隨機數與密鑰相結合,并將該MAC命令響應發送回MCU。該芯片使用加密哈希算法進行組合(也稱為摘要)。散列算法的使用可以防止別人在通訊總線上導出密鑰的值,同時允許接收者通過執行相同的計算來驗證響應是否正確,該計算將隨機數與密鑰相結合,以使用存儲的密鑰副本創建摘要。
????由于ATSHA204A的靈活命令集,對芯片的基本操作可以以多種方式擴展。通過使用GenDig命令,使其他SLOT(Slot可以理解為一個32字節的存儲單元)中的值可以包含在響應摘要中,這提供了一種有效的方法來證明讀取的數據確實來自設備,而不是由中間人攻擊者插入。該命令可用于將兩個密鑰與隨機數組合在一起,這在需要執行多層身份驗證時非常有用。
????DeriveKey命令,實施密鑰滾動方案。例如,根據命令模式參數,產生的操作可能類似于遙控車庫門開啟器中實現的操作。每次使用密鑰時,密鑰的當前值將以加密方式與特定于該系統的值組合,然后該結果將形成下一次加密操作的密鑰。即使攻擊者獲得一個密鑰的值,該密鑰在下次使用時也將永遠消失。
????DeriveKey還可用于生成新的隨機密鑰,這些密鑰可能僅對特定主機ID、特定時間段或某些其他限制條件有效。每個生成的密鑰都不同于任何設備上生成的任何其他密鑰。通過以這種方式在字段中“激活”主機-客戶端,單個客戶端的克隆將無法在任何其他主機上工作。
????在主機-客戶端配置中,主機(如移動電話)需要驗證客戶端(如OEM電池),需要將密鑰存儲在主機中,以驗證客戶機的響應。CheckMac命令允許主機設備安全地存儲客戶端的機密,并從SDA引腳上隱藏正確的響應值,僅向微控制器返回是/否答案。
????在需要用戶輸入密碼的情況下,CheckMac命令還提供了一種方法,既可以驗證密碼而不在通信總線上公開密碼,也可以將密碼映射到具有更高熵的存儲值。
????最后,隨機數和密鑰的散列組合(即摘要)可以保存在芯片上,并與Slot的內容異或以實現加密讀取,或者可以與加密輸入數據異或以實現加密寫入。通過在計算中包含隨機nonce(32字節),可以保護這些操作免受重放攻擊。
????所有安全功能均使用行業標準SHA-256安全哈希算法實現,ATSHA204A使用的是256位密鑰,以防止任何類型的窮舉攻擊。
2.芯片內部結構
設備包含下面的兩個內存區:
????*EEPROM
????*SRAM
2.1 EEPROM結構
EEPROM總共包含664字節(5312位),分為以下幾個區域:
>Data區(512字節)
????一個512字節(4Kbit)的區域,分為16個32字節(256位)的通用、只讀或讀/寫內存Slot,每個Slot可用于存儲鑰匙、校準數據、型號或與ATSHA204A設備所連接項目相關的其他信息。根據存儲在配置區域中的值,每個Slot可能具有不同的訪問限制。
>Configuration(88字節)
????一個88字節(704位)的區域,包含序列號和其他ID信息以及數據存儲器每個Slot的訪問權限信息。88字節可從三塊地址空間中訪問
>OTP(一次性可編程)區(64字節)
????一個64字節(512位)區域,可用于存儲只讀數據或單向(保險絲類型)消耗記錄信息。在鎖定OTP區域之前,可以使用標準寫入命令自由寫入位。OTP區域可從兩塊地址空間內訪問。在本文件中,術語OTP[bb]表示OTP區域內的一個字節,而OTP[aa:bb]表示一個字節范圍。
????在鎖定設備的配置和/或數據部分之前,必須使用所需內容覆蓋此數據。
2.1.1 Data Zone
????數據區為512字節(4Kbit),是EEPROM陣列的一部分,可用于安全存儲目的。在使用lock(Config)鎖定配置之前,數據區域是不可訪問的,既不能讀取也不能寫入。配置鎖定后,可以使用Write命令寫入整個數據區域。如果需要,可以對要寫入的數據進行加密。
2.1.2 Configuration Zone
????配置區中的88字節(704位)包含數據區內Slot的訪問權限配置。這88字節的值始終可以使用Read命令獲得。該區域的字節排列如表所示。
????這個表格比較重要,從表格中我們可以知道配置區中有序列號,修訂碼,I2C相關,CheckMac配置,OTP模式,選擇模式,并且有對應數據區的Slot配置信息,還有其他一些配置信息等等。這0x15個字的內容都是可以讀取訪問的。
2.1.2.1 I2C Enable
????如果Bit0為0,設備使用的是單串;否則使用的是IIC接口。
2.1.2.2 I2C Address
(1)如果設備是工作在IIC模式下,忽視掉Bit0,Bit1-7是I2C地址,如果Bit0為1,我們可以把它看作是I2C的讀(設備地址|0x01)
(2)如果設備是工作在單串模式下,那么Bit3為TTL的使能,為1代表輸入電平使用Vcc作參考。
2.1.2.3 CheckMacConfig
????這個字節僅僅使用于命令CheckMac,Read,和Write:
(1)Read和Write情況下:
????位0控制Slot0、1,位1控制Slot2、3,依此類推。如果TempKey.SourceFlag與此字節中的相應位不匹配,則任何加密的讀/寫命令都將失敗。對于明文讀取和寫入,忽略此字節。
(2)CheckMac情況下:
????位0控制Slot1,位1控制Slot3,依此類推。僅當與目標Slot對應的CheckMacSource值與CheckMac命令的模式位2的值匹配時,才會啟用復制功能。如果模式位2與TempKey.SourceFlag不匹配,則該命令將失敗。因此這相當于要求該字節中的相應位與TempKey.SourceFlag匹配。
2.1.2.4 OTP Mode
????0xAA(只讀模式)=當OTP區域被鎖定時,將禁用寫入,并允許讀取所有字。
????0x55(消耗模式)=OTP區域鎖定時寫入OTP區域將導致位僅從1轉換為零。允許閱讀所有字。
????0x00(傳統模式)=當OTP區域被鎖定時,寫入被禁用,字0和1的讀取以及32字節讀取被禁用。
????所有其他模式均保留。
2.1.2.5 Selector Mode
????如果為0,則選擇器將更新為UpdateExtra。
2.1.2.6 SlotConfig
????總共有16個Slot,每個Slot對應一個Slot Config。Slot Config用于配置Slot的讀寫方式。下面是SlotConfig每個位的意義:
淺析下上面的表格:
Bit0-3:用于加密讀取的密鑰Slot,值可以是0-15,恰好16個Slot。如果為0,則此Slot可以用作CheckMac Copy命令。
Bit4: 如果為0,代表這個Slot可以用于所有加密命令;如果為1,代表這個Slot能用于CheckMac和GenDig命令
Bit5: 如果為0,沒有限制鑰匙的使用次數;如果為1,根據Slot的UseFlag(或LastKeyUse)限制可以使用密鑰 的次數。
Bit6: 如果為0,允許明文讀;如果為1,要求Slot是加密的,加密讀取才能訪問。
Bit7: 如果為0,Slot不是加密的,允許明文讀取、明文寫入、無MAC檢查和無Derivekey命令。如果為1,Slot是加密的,允許加密讀寫。
????除非WriteConfig為“始終”,否則要啟用正確的芯片操作,必須設置此位。設置該位為1的Slot,禁止4字節訪問。用于存儲密鑰的Slot應始終將IsSecret設置為1,將EncryptRead設置為0(禁止讀取),以獲得最大的安全性。對于固定密鑰,WriteConfig應設置為“從不”。以這種方式配置時,數據區域鎖定后無法讀取或寫入密鑰。它只能用于加密操作。
Bit8-11: 4個位,用于驗證加密寫入的密鑰Slot
Bit12-15: 4個位,具體看下面的表格:
(1)執行DeriveKey命令情況下:
(2)執行寫命令情況下:
注意:上面的表格會重疊。例如,0110表示可以使用Write命令以加密形式寫Slot,并且該SLOT也可以是未經授權的DeriveKey命令的目標。
2.1.2.7 Use Flag
????用于“一次性Slot”。“1”位的數量表示Slot0到7在被禁用之前可以使用的次數
2.1.2.8 Update Count
????指示Slot0到7已使用DeriveKey更新了多少次(所以我們這里可以知道DeriveKey命令是更新Slot內容)。
2.1.2.9 Last Key Use
????用于控制slot15的有限使用,也即是說上面表格的16個Last Key Use都是給Slot15使用的,Slot15的有限使用次數最大為16*8 = 128。每個“1”位表示Slot15的剩余使用。僅當設置了SlotConfig.SingleUse單次使用時適用
2.1.2.10 UserExtra
????為了通用系統使用,可以通過UpdateExtra命令修改。
2.1.2.11 Selector
????選擇執行Pause命令后將保持活動模式的設備
2.1.2.12 Lock Data
????0x55:表示數據和OTP區未上鎖,可以寫訪問。
????0x00:表示數據和OTP區上鎖。只能根據相應的WriteConfig字段修改數據區中的Slot。OTP區域只能根據OTP模式進行修改。
2.1.2.13 Lock Config
????0x55:表示配置區擁有寫訪問(未上鎖)。
????0x00:表示配置區失去寫訪問(上鎖)。
2.1.2.14 配置區的特殊內存值(Bytes 0-12)
????ATSHA204A中包含各種固定信息,這些信息在任何情況下都無法寫入,并且始終可以讀取,而不管鎖位的狀態如何。
SerialNum
????9個字節的序列號(SN[0:8]),形成一個唯一的值,加密身份驗證系列中的任何設備不可能存在相同的序列號,序列號分為兩組:
1.SN[0:1]和SN[8]
????在大多數版本的ATSHA204A中,這些位的值在制造時是固定的。其默認值為(0x01 0x23 0xEE)。這24位始終包含在ATSHA204A進行的SHA-256計算中.
2.SN[2:7]
????這些位的值在制造過程中由Atmel編程,每個芯片的值都不同。這些6字節(48位)可選地包括在ATSHA204A進行的一些SHA-256計算中。
RevNum
????Atmel用于提供制造版本信息的4字節信息。這些字節可以自由讀取為RevNum[0:3],但系統軟件不應使用這些字節,因為它們可能會不時變化。(小編不知道這里啥意思,為啥可能,試了好幾次沒變化)
2.1.3 OTP區
????64字節(512位)的OTP區域是EEPROM陣列的一部分,可用于只讀存儲。在鎖定配置部分(使用lockConfig)之前,OTP區域是不可訪問的,既不能讀取也不能寫入。在配置鎖定之后,但在鎖定OTP區域之前(使用lockData),可以使用Write命令寫入整個OTP區域。如果需要,可以對要寫入的數據進行加密。OTP未上鎖是無法讀取OTP區域。
????鎖定OTP區域后,配置區域中的OTPmode字節將控制此區域的權限。
2.1.4 設備鎖
設備兩個獨立的鎖字節:
????配置區的鎖和數據及OTP的鎖。
(上面的兩把鎖都放在配置區里面,通過Lock命令修改鎖的值。內存區一旦鎖上,無法解鎖。)
????在應用芯片時,根據需求對設備進行個性化配置,并鎖定配置區域。此鎖定完成后,應使用寫入命令(允許的話,可以加密寫入)將所有必要的公共和機密信息寫入EEPROM Slot。完成對數據和OTP區域的寫入后,應鎖定數據和OTP區域。
????在鎖定配置節之前讀取或寫入數據或OTP節的操作都會導致芯片返回錯誤。
2.1.4.1 配置區上鎖
????無論LockConfig的狀態如何,都無法修改配置區域中的某些字節,比如前面說到的序列號和修訂號碼。看下面的圖(Table2-7),使用配置區域中的LockConfig字節控制對區域內剩余字節的訪問。如果LockConfig為0x55,則表示配置區域未上鎖;否則它是鎖定狀態。
2.1.4.2 數據區及OTP上鎖
2.2靜態RAM
2.2.1TempKey
????TempKey是SRAM陣列中的一個存儲寄存器,可用于存儲來自Nonce、GenDig、CheckMac或SHA命令。該寄存器的內容永遠無法被微控制器讀取(只有芯片本身可以內部讀取和使用該TempKey)
????在應用中,我們說的“TempKey”指的是32字節(256位)數據寄存器的內容。其余的位字段稱為TempKey.SourceFlag,TempKey.GenData等等。
TempKey在以下的幾種情況下是無效的:
*上電,睡眠,斷電,看門狗溢出,篡改檢測。(空閑模式下TempKey的內容是保留的)。
*無論命令執行是否成功,執行除Nonce或GenDig以外的任何命令后。除非成功復制,否則可通過CheckMac命令清除。如果存在通信問題,則不會清除,比如循環冗余校驗(CRC)錯誤。
*分析或執行GenDig和/或Nonce命令時出錯。
*GenDig的執行將會使用其輸出替換Nonce命令的輸出。Nonce命令的執行同樣會替換GenDig命令以前的任何輸出。
3 安全特性
3.1 物理加密
????主要介紹了內存的硬件加密。
3.2 RNG
????ATSHA204A包括向主控制器返回32字節隨機數的高質量RNG。該芯片將生成的數字與單獨的輸入數字組合,以形成一個nonce,該nonce存儲在設備中的TempKey中,可供后續命令使用。系統可將此RNG用于任何目的。一個常見的用途是在單獨的加密身份驗證設備上作為MAC命令的輸入隨機數。該芯片為此目的提供了一個特殊的隨機命令,該命令不會影響內部存儲的nonce。
????為了簡化系統測試,在鎖定配置區域之前,RNG始終返回以下值:ff ff 00 ff 00…其中ff是從設備讀取的第一個字節,用于SHA消息。我們可以在應用中用邏輯分析儀抓取波形驗證。
????為了防止對傳遞給ATSHA204A或從ATSHA204A傳遞來的加密數據的重播攻擊,芯片要求在用于保護正在讀取或寫入的數據的加密序列中包含一個新的內部生成的nonce。為實現此要求,GenDig生成(并由Read或Write命令使用)的數據保護密鑰必須使用內部RNG,所以Gendig命令的輸入參數沒有隨機數,而是SlotID。
????隨機數由硬件RNG的輸出和內部種子值的組合生成,外部MCU無法訪問該值。內部種子存儲在EEPROM中,通常在每次通電或睡眠/喚醒循環后更新一次。更新后,該種子值保留在設備內的SRAM寄存器中,如果設備進入睡眠模式或電源斷開,該寄存器將失效。
4 通用I/O信息
4.1 字節和位排序
CryptoAuthentication對字節以及數據表中數字和數組的表示方式使用通用的排序方案:
所有多字節聚合單元都被視為字節數組,并按照索引#0首先接收或發送的順序進行處理。
2字節(16位)整數,典型的Param2,低字節優先傳輸在總線上。
5 I2C接口
· 通信速度<1Mhz
· 喚醒的條件是SDA維持60us以上的低電平,這里我直接將IIC總線的頻率設置成100KHZ,然后發送字節0x00,低電平超過了60us就會被喚醒,喚醒之后延遲2.5ms就可以開始通訊了。
在IIC寫過程中,第一個字節是寫信號,第二個字節是Word Address Values,Word Address Values如下表所示:
????看起來也就4個word address value有用到,前面3個都很簡單,但是后面的Command功能就多了,我們配置芯片和讀寫操作都是通過這個Command展開的,后面會講到。
5.1 I2C同步
????系統可能會失去與ATSHA204A上I/O端口的同步,例如,由于系統復位、I/O噪聲或某些其他情況。在這種情況下,ATSHA204A可能沒有按預期響應,可能處于休眠狀態,或者可能在系統預期發送數據的時間間隔內發送數據。當系統和設備失去同步時,I/O緩沖區中的任何命令都可能丟失,這時就需要同步芯片的I2C接口了。下面是I2C同步步驟:
(1).發送IIC起始信號
(2).發送九個時鐘周期的SDA_H(總線上會返回NACK)
(3).重新發送IIC起始信號
(4).發送IIC停止信號
(5).嘗試發送讀信號,同步成功的話是會返回ACK的
(6).如果(5)有ACK,那么就發送Reset(Word Address Values)給芯片,以強制忽略可能已發送的任何部分輸入命令。如果(5)接收到的是NACK,那么芯片可能進入睡眠模式,此時需要先將設備喚醒;如果芯片仍然沒有相應,那么它就是在執行命令,此情況下需要等待tEXEC,再發送讀信號給芯片,芯片會有應答的。
6 安全命令
這一小節講解的命令都是使用Word address value = Command展開的,總線的寫命令格式是這樣子的:
| IIC_address_Write | 寫信號 |
| Command | 字地址值0x03 |
| Count | 數據包字節長度(包含Count,Data,Checksum) |
| N Data | 如果命令有參數的話,非空 |
| Checksum | CRC-16,多項式為0x8005 |
6.1 Status/Error Codes
芯片是沒有狀態寄存器的,但是輸出FIFO能返回一些狀態碼代表芯片的工作狀態。狀態有:
6.2 命令排序
6.2.1 命令打包
6.2.2 命令操作碼和執行時間
????注意,在使用芯片的過程中,命令的執行時間也是值得關心的,當你在執行完一條命令后,到從機的響應這段期間就是命令的執行時間,在這段時間內嘗試讀,會無響應(NACK)。
????后面我們會來學習上面涉及到的命令。在學習這些命令之前,我們先來了解區編碼和地址編碼。
6.2.3 區編碼
????命令數據幀中,我們使用參數1來指定命令訪問的是哪一個區,如下圖所示:
????可以看到,(1)配置區任何時候都能讀訪問。未上鎖時,部分內存支持寫。在上鎖或者加密后是寫禁止的。
(3)OTP區在未上鎖時不允許讀,鎖上之后能讀,除了遺留模式。當配置區未上鎖不允許寫;當配置區上鎖數據區不上鎖支持寫。
(4)Data區未上鎖是不能讀的,鎖上之后根據IsSecret和EncryptRead進行讀操作。當配置區未上鎖不允許寫;當配置區上鎖數據區未上鎖支持寫操作;當數據區上鎖之后寫訪問通過WriteConfig位控制。
6.2.4 地址編碼
????命令數據幀中,我們使用參數2來指定命令訪問的是區的哪個字地址,如下圖所示
????可以看到,Data有16個塊;Config有3個塊;OTP有2個塊,每個塊32字節,即8個字,因此偏移offset占3個位。
下面我們就開始了解指令吧。
6.2.5 CheckMac Command
????CheckMac命令計算和生成MAC響應,并將內部MAC響應與外部輸入的Digest進行比較,返回一個布爾結果。
在運行此命令之前,可以選擇運行Nonce和/或GenDig命令,以在TempKey中創建和加載Key或Nonce值。
輸入參數格式:
參數1:Mode:bit0決定“key”(SHA消息的前32字節)的源;
???????Mode:bit1決定“challenge/nonce”(SHA消息的第二個32字節)的源。
???????Mode:bit2,如果TempKey被使用,這個位必須與TempKey.SourceFlag的值匹配。
???????Mode:bit3-4:0。
???????Mode:bit5,SHA消息中的8字節,0:Zeros;1:OTP區。
???????Mode:bit6-7:0。
參數2:SlotID: bit0:3用于指定哪個內部Slot用作響應產生。
數據1:微控制器給的隨機數,32字節
數據2:微控制器的響應,32字節,這里的響應最終是要跟CheckMac命令產生的內部響應做比較的。
數據3:其他數據,目的是構造一條SHA-256消息,該消息將與MAC消息完全匹配,通過比較MAC命令的SHA-256所使用的消息,其他數據可以定義為如下:
????輸出參數:返回1個字節,0代表相應與芯片內部計算出的摘要匹配;1代表不匹配。
????如果TempKey是計算值的一部分,Mode:bit2控制對隨機nonce的要求。如果bit2為1,則必須使用Nonce(固定)生成TempKey;如果為零,則必須使用Nonce(隨機)生成TempKey。
如果比較結果匹配,則可以將目標Slot值復制到TempKey中。如果SlotID為偶數,則目標Slot為SlotID+1,否則目標插槽為SlotID。要進行復制,必須滿足以下條件。如果它們不是全部為真,則ATSHA204A將返回比較結果,但不會復制Key值。
1.CheckMac的Mode參數的值必須為0x01或0x05。
2.目標Key的SlotConfig.ReadKey必須為零。
3.與Slot對應的Config.CheckMacSource的值必須與Mode:bit2匹配。
CheckMac命令執行流程大致是:
TempKey與Slot或者隨機數組合,然后加入Sha認證,認證會生成一個摘要,將摘要與微處理器發送過來的響應進行匹對,相同輸出0,不相同輸出1。
6.2.6 DeriveKey命令
前面說到這個命令是用來更新Slot內容的,先來看看該命令的輸入參數格式:
????命令執行之后將會返回1個有效字節,表示命令執行成功與否,為0x00表示成功。
????芯片組合key的當前值和存儲在TempKey中的Nonce,然后將結果存放在目標key Slot里面。注意,SlotConfig[目標Key].Bit13必須為1,不然DeriveKey將返回錯誤。
????如果SlotConfig[目標Key].Bit12為0,即將與TempKey組合的源Key是命令行中指定的目標Key;如果SlotConfig[目標Key].Bit12為1,源Key就是目標Key的Parent Key(這里我譯為上級Key),上級Key可以SlotConfig[目標Key].WriteKey中找到。
在執行DeriveKey命令之前,必須先運行Nonce命令以在TempKey中創建有效的Nonce。根據輸入模式第二位的狀態,該nonce可能是使用內部RNG創建的,也可能是固定。
若SlotConfig[TargetKey].Bit15為1,則必須存在輸入MAC,即命令中的Data不能少。
如果SlotConfig[TargetKey].Bit12或者Bit15為1,并且SlotConfig[ParentKey].SingleUse為1,那么在UseFlag[ParentKey]為0的情況下命令最終將返回錯誤。如果SlotConfig[TargetKey].Bit12和Bit15都0的話DeriveKey命令忽視目標Key的SingleUse和UseFlag。
????注意該命令只對Slot0到7有效。
6.5.7 DevRev命令
????DevRev命令返回四個字節表示設備版本號。它可能會時不時更改。該指令比較簡單,輸入參數格式如下:
成功執行之后會返回四個有效字節。
6.5.8 GenDig命令
????GenDig命令使用SHA-256將存儲值與TempKey的內容組合在一起,TempKey的內容必須在執行此命令之前有效。存儲值可以來自其中一個數據Slot、OTP頁、配置區域的前兩個頁或從硬件傳輸密鑰數組檢索。生成的摘要保留在TempKey中,可按以下三種方式之一使用:
1.它(結果)可以作為MAC、CheckMac或HMAC命令使用的消息的一部分。由于MAC響應輸出包含GenDig計算中使用的數據和來自MAC命令的密鑰,因此它用于驗證存儲在數據和/或OTP區域中的數據。
2.后續讀或寫命令可以使用該摘要為數據提供身份驗證和加密,在這種情況下,它又被稱為數據保護摘要。
3.通過使用傳輸密鑰數組中的值,此命令可用于安全個性化。生成的數據保護摘要可以被Write命令使用。
先來看看該命令的輸入參數格式:
參數1:選擇存儲值的區,可以是Data、Config或者OTP。
????0x00,選擇的是Config區,根據參數2(SlotID)來決定選擇配置區的 哪一塊數據作為組合對象,只能選擇第0塊和第1塊。
????0x01,選擇的是OTP區,根據參數2(SlotID)來決定選擇第0/1塊數 據作為組合對象。
????0x02,選擇的是Data區,根據參數2(SlotID)來決定組合對象是來自 Data區的某個Slot還是來自硬件陣列傳輸密鑰。
注意:SlotID<=15時,GenDig命令會將TempKey.GenData置1,并且 TempKey.SlotID = SlotID(參數2)。
參數2:指定使用哪個密鑰,或者選擇哪個OTP塊。
Data: 如果使用CheckOnly Key那么這里應該為SHA運算填上4個字節。否則 忽視。
不管計算的結果摘要如何,我們都不能讀的到。TempKey.Valid如果是無效(0),命令執行失敗返回Error;如果是有效(1),那么摘要已經存放到TempKey中。
????如果命令執行成功返回1個有效字節表示成功狀態,0表示成功。
6.5.9 HMAC命令
????HMAC命令計算存儲在芯片中的密鑰的HMAC/SHA-256摘要、隨機數和其他信息。
正常使用步驟:
1.運行Nonce命令加載輸入隨機數,并可以選擇將其與生成的隨機數組合。此操作的結果是芯片內部Tempkey存儲一個nonce。
2.可選地運行GenDig命令,將設備中的一個或多個存儲值與nonce組合。結果存儲在設備內部。
3.運行此HMAC命令,將步驟1(和步驟2,如果需要)的輸出與EEPROM Key組合,以生成輸出響應。
輸入參數格式如下:
參數1:Mode決定哪個區用于消息中。該字節描述如下:
????HMAC命令執行成功的話返回32個有效字節(HMAC摘要)。
6.5.10 Lock命令
????Lock命令用于將配置區和Data(OTP)區上鎖。如果已經上鎖了再執行這條命令會返回錯誤。
輸入參數格式如下:
????一般我們只需配置參數1的Bit0,和參數2,指定了哪個區,區里邊的哪個,不過我用的時候是把Param2直接設置成0。
執行成功返回0。
6.5.11 MAC命令
????MAC命令計算存儲在設備中的密鑰的SHA-256摘要、隨機數以及設備上的其他信息。此命令的輸出是此消息的摘要。
正常使用步驟:
??1.運行Nonce命令加載輸入隨機數,并可以選擇將其與生成的隨機數組合。此操作的結果是設備內部存儲一個nonce。
??2.可選地運行GenDig命令,將設備中的一個或多個存儲值與nonce組合。結果存儲在設備內部。
??3.運行此MAC命令,將步驟1(和步驟2,如果需要)的輸出與EEPROM Key組合,以生成輸出響應。
輸入參數格式如下:
????其中的參數1(Mode)的定義如下:
????其中注意Bit2,如果bit0或是bit1為1,表示數值取于Tempkey,那么bit2就要匹配Tempkey.sourceflag位,前面使用了Nonce命令的話,如果nonce命令中的nonce.mode等于0或者1,這里就等于0,如果nonce.mode等于3,這里就等于1.
????命令執行完成將會返回32字節(SHA-256摘要)。
6.5.12 Nonce命令
????這條命令很常用,Nonce命令通過將內部生成的隨機數與來自系統的輸入值相結合,生成一個Nonce,供后續GenDig、MAC、HMAC、Read或Write命令使用。生成的nonce存儲在TempKey內部,生成的隨機數返回給系統。輸入值旨在防止針對主機的重播攻擊,必須由系統從外部生成,并使用此命令傳遞到設備中。它可以是任何持續變化的值,例如非易失性計數器、當前實時時間等;也可以是外部生成的隨機數。
????為隨后的加密命令提供nonce值,輸入碼和輸出隨機數散列(are hashed)在一起。結果摘要(nonce)始終存儲在TempKey寄存器TempKey中。TempKey.Valid置1、TempKey.SourceFlag清0使內部產生隨機數。
??或者,如果后續命令需要固定的nonce,則此命令也可以在傳遞模式下運行。在這種情況下,輸入值必須為32字節長,并且直接傳遞給TempKey而無需修改。
輸入參數格式如下:
????在此再貼出Mode參數的定義表格:
????可以從Mode的表格中看出Bit0:1為0代表內部隨機數和傳入芯片的Numln數據組合生成一個nonce存儲在TempKey中,在隨機數產生之前自動更新EEPROM種子;為1代表內部隨機數和傳入芯片的Numln數據組合生成一個nonce存儲在TempKey中,使用EEPROM中已存在的種子生成隨機數,不更新EEPROM種子;為2無效;為3工作在旁路模式下,直接使用傳入芯片的值寫入到TempKey。
值得注意的是命令中的Data有20個字節或者是32個字節長度,那么怎么確定命令中Data的長度呢?如果Mode[Bit0:1]為0或者1,那么Data為20個字節的隨機數,為3則是32字節。另外為3命令執行結果只返回1個字節,否則返回的是32字節(隨機數)。
6.5.13 Random命令
????顧名思義,該命令用來產生隨機數的。
????隨機數是通過硬件RNG的輸出和存儲在EEPROM或SRAM中的內部種子值的組合生成的。外部系統可選擇在生成隨機數之前更新內部存儲的EEPROM種子值。生成的隨機數可以作為nonce或random命令執行的一部分,為了最高安全性,Atmel建議始終更新EEPROM種子。
下面是輸入參數格式:
????Mode設置為0可以確保更新EEPROM隨機數種子,一般我們就設置為0。
????命令執行成功返回32字節的隨機數。
6.5.15 Read命令
????該命令用的頻率非常高,如果讀取SlotConfig.EncryptRead為1的對應Slot,那么在執行這條命令之前必須先執行GenDig命令獲取加密使用的Key。SlotConfig.ReadKey中指定的密鑰必須已在GenDig計算中使用。
????該設備通過將從EEPROM讀取的每個字節與TempKey中相應的字節進行異或來加密要讀取的數據。不允許對配置和OTP區域進行加密讀取。
????對于Data,如果數據區未上鎖,Read命令返回Error;否則,根據SlotConfig來對Slot進行讀訪問。如果SlotConfig.IsSecret置1和嘗試讀四字節,最終只會返回Error。如果EncrytRead置1,Read命令按指定方式加密數據。如果IsSecret置1并且EncryptRead為0,命令執行結果Error;如果IsSecret為0并且EncryptRead為0,命令返回的是明文的Slot數據。
????對于Config,數據允許在任何情況下讀取。
????對于OTP,如果OTP區未上鎖,不能讀。一旦鎖上,并且OTP模式沒設置成Legacy,所有的字都能被讀取;如果OTP模式設置成Legacy,只允許四字節讀,讀取地址0或者1將返回錯誤。
下面是該命令的輸入參數格式:
????上面的表格理解起來也簡單,再看看數據區的讀操作中涉及到的一個重要的表格:
????如果要讀取的Slot號是偶數,那么TempKey.SourceFlag必須為Rand(隨機數);如果Slot號為奇數,TempKey.SourceFlag必須與相應Slot的Config.CheckMacSource匹配。內存區的數據異或上TempKey的值就能返回明文。
這里參考8981文檔,簡單說一下標準的加密讀取流程:
(1)運行一次Random命令獲取高質量隨機數;
(2)運行一次Nonce命令,將第一步的隨機數作為輸入參數使用,mode=1,執行后更新TempKey;
(3)MCU使用相同的Nonce函數算出ATSHA204中的TempKey,并返回32字節的隨機數(Randout);
(4)運行一次Gendig命令,傳參中的SlotID是讀取密鑰的ID號,ID號等于想讀的Slot的ReadKey,比如我想讀Slot5的內容,但是我們先前就將Slot5配置成加密讀取的,密鑰是存在Slot3(也就是Readkey);
(5)MCU使用相同的Gendig函數算出Tempkey的值;
(6)接下來就使用Read命令,指定讀取的Slot,返回32字節,這32字節是密文的;
(7)將讀取到32字節與TempKey異或,這樣就得到了Slot里面的明文數據。
上面講到的Nonce函數和Gendig函數是Atmel提供的,可以在官網上下載得到,函數在help.c里面。
6.5.16 Write命令
????Write命令將一個4字節的字或一個32字節的8字塊寫入設備上的一個EEPROM區域。根據此Slot的WriteConfig字節的值,微控制器可能需要在將數據發送到設備之前對其進行加密。
????對于Data,如果配置區域已鎖定且數據區域未上鎖,則所有區域中的所有字節都可以使用純文本或加密數據寫入,使用32字節方式寫入。鎖定數據區域后,WriteConfig字節中的值控制對數據Slot的訪問。如果此Slot的WriteConfig位設置為“始終”,則輸入數據應以明文方式傳遞給設備。如果SlotConfig的位:14設置為1,則應加密輸入數據并計算輸入MAC。
????對于Config,如果配置區域已鎖定或Zone:6為1,則此命令返回錯誤;否則,將按請求寫入字節。
????對于OTP,如果OTP區域已解鎖,則可以使用此命令寫入所有字節。如果OTP區域被鎖定,且OTPmode字節為只讀或Legacy(遺留),則此命令返回錯誤;否則,OTP模式為消耗模式,此命令將OTP區域中與輸入參數值中的零位對應的位設置為零。當OTP區域被鎖定時,無論OTP模式如何,都不允許對其進行加密寫入。
輸入參數格式如下:
如果滿足以下四個條件,則僅允許在數據和OTP區域中進行四字節寫入:
???? *SlotConfig.IsSecret必須為0
???? *SlotConfig.WriteConfig必須為Always
????*輸入數據必須是沒加密的
????*Data/OTP區必須上鎖
在其他情況下,四字節寫將會返回錯誤。
命令上面的Address格式可以參考前面的Address編碼,如果是32位的寫忽略Address[0:2]。
命令執行成功返回0。
6.5.17 SHA命令
????SHA命令計算供系統通用的SHA-256摘要。可以容納任何消息長度。MCU負責發送最后一個塊的pad和length字節。
可以通過下面兩個步驟生成一個摘要:
1.初始化
????通過使用初始化常量覆蓋TempKey的當前值來設置SHA-256計算單元。強制TempKey標志與Nonce(Fixed)命令后的狀態匹配。此模式不接受任何消息字節。
2.計算
????在這種模式下,可以多次調用該命令以向消息中添加字節。此模式的每次迭代必須包含64字節的消息。輸出緩沖區始終包含摘要,如果需要,可以忽略摘要。摘要也會加載到TempKey中。
????先執行初始化再執行計算。微控制器可以根據需要運行任意多個SHA(Compute)命令來計算所需摘要。如果在“Init”迭代和最后一次“Compute”迭代之間運行SHA以外的任何命令,則返回錯誤。如果模式字節的值不是0或1,則該命令還返回分析錯誤。
????如果設備處于睡眠狀態或看門狗計時器過期,則存儲在TempKey中的中間摘要將無效。系統軟件必須確保在單個喚醒/看門狗間隔期間將整個消息發送至設備。
下面是該命令的輸入參數格式:
????應用SHA需要調用該命令兩次,一次是初始化,一次是運算。
????初始化成功返回0,計算摘要成功返回32字節的SHA-256摘要。
7 庫文件的使用
解壓之后會有兩個文件夾:
sha204_library文件夾和sha204_helper文件夾
sha204_library文件夾目錄內容如下:
????其中arch文件夾里面存的是IIC的驅動和延時的驅動,平臺不一樣,我們可能需要修改它們。
????sha204_comm.c文件主要是提供CRC計算檢查,芯片的喚醒和收發函數API,不是底層。
????sha204_comm_marshaling.c有命令執行函數,我們所有的命令都是通過調用里面的一個函數執行的。
????其中的傳參tx_size和rx_size其實不起作用,函數會根據命令來決定tx_size和rx_size是多大,我們需要做的是tx_buffer和rx_buffer指向的緩存足夠就可以,40個字節應該就夠了。
????sha204_i2c.c文件就是調用底層IIC驅動對芯片進行訪問,比如進入空閑模式,進入睡眠模式,復位IO等等。
sha204_helper文件目錄如下:
????我們可以利用sha204_helper.c文件里面提供的函數算出芯片內部的TempKey等數據,實現對稱加密。
8 總結
????關于ATSHA204的了解就到這。
????在應用的過程,筆者使用的是AtmelSamE70Q21做主控,使用TWI接口實現與ATsha204芯片的通訊,過程中出現點小問題就是不能讀取TWI_SR寄存器里面的NACK位來判斷從機有沒有響應,導致我讀ATSHA204命令執行響應需要中間靠延時來確保在執行時間之后正常讀取執行結果數據。
總結
以上是生活随笔為你收集整理的ATSHA204芯片手册阅读笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通过php执行mysql语句进行学生成绩
- 下一篇: MYsql建立学生成绩表