成功喚醒之後,才可以做很多事情,實作它的指令功能。
- 晶片的config區和data區一旦鎖定,沒有辦法解鎖,鎖的方法隻能通過lock command來進行鎖定。
- config區在沒鎖定的時候,可以使用write command來進行寫操作,但注意,0x00-0x03位址(word位址,詳情請參考手冊)不能被寫,0x15word位址不能使用write command來寫。
- 在config鎖定前,data區(包括slot區和OTP區)既不能寫也不能讀。而在config鎖定後,data區鎖定前,data區隻能寫不能讀,在data區鎖定後,可以根據config中的配置來進行讀寫。
1. config區的組成
包含序列号和其他 ID資訊以及通路資料存儲器各槽權限資訊的 88位元組(704位)EEPROM區域。
配置區域鎖定(LockConfig 設定為!=0x55)之前可進行修改。
該區域預設設定如下:

Config的配置都是按照word(字)位址進行的,每個word為4位元組。
1.1 0x00-0x03(始終可讀)
ATSHA204A中包含了各種固定資訊,無論鎖定位的狀态如何,在任何情況下都不能寫入,但始終可以讀取。
1.1.1 SerialNum
9 個位元組(SN<0:8>),一起形成 CryptoAuthentication 系列中任何器件都不會重複的惟一值。序列号分為兩組:
(1) SN<0:1> SN<8>
在 ATSHA204A 的大多數版本中,這些位的值是在制造時固定的。其預設值為(0x01 0x23 0xEE),這 24 位始終包含在 ATSHA204A 所執行的 SHA-256 計算中,也就是所有晶片都有這幾個值都是有的。
(2)SN<2:7>
這些位的值由 Microchip 在制造過程中程式設計,對于每個晶片均有所不同。這 6 個位元組(48 位)可視情況包含在 ATSHA204A 所執行的一些 SHA-256 計算中。
1.1.2 RevNum
Microchip用來提供制造版本資訊的 4位元組資訊。這些位元組可以自由讀取為 RevNum<0:3>,但始終不應被系統軟體使用,因為它們可能會因晶片版本發生變化。
1.2 字0x03(始終可讀)
位元組2為I2C_Enable:
Bit7-1 Bit0 | 忽略,由 Microchip 設定。 0 = 單線接口模式。 1 = I2C 接口模式。 |
本文為I2C接口操作。
1.3 0x04(始終讀,鎖前可寫)
(1)位元組0為I2C_Address:
Bit7-1 Bit3 Bit0 | I2C 器件位址 TTL 使能(雙用途位) I2C 位址的一部分,設定門檻值。 0 = 輸入電平使用固定參考。 1 = 輸入電平使用 VCC 作為參考。 忽略。 |
能看到該器件預設I2C位址為C8。
(2) 位元組1為CheckMacConfig
此位元組僅适用于 CheckMac、Read 和 Write 指令:
- Read Write: CheckMacConfig<0>控制slot 0和 1,CheckMacConfig<1>控制slot 2 和 3,依此類推,一個位元組8位,控制16個slot。如果 TempKey.SourceFlag中的值與此位元組中的相應位不比對,則任何加密 Read 或 Write 指令都将失敗。對于明文讀取和寫入,此位元組被忽略。
- CheckMac: CheckMacConfig<0>控制slot 1,CheckMacConfig<1>控制slot 3,依此類推。隻有在目标槽對應的 CheckMacSource值與 CheckMac 指令的 Modebit2的值比對時才會使能複制功能。如果Modebit2與 TempKey.SourceFlag不比對,則此指令将失敗,是以這相當于要求此位元組中的相應位與 TempKey.SourceFlag比對。
(3) 位元組2為OTP模式
0xAA(隻讀模式)=當 OTP 區域鎖定時,禁止寫操作,允許所有字的讀操作。
0x55(消耗模式)=當 OTP 區域鎖定時寫入 OTP 區域會導緻位僅從 1 轉換為 0。允許讀取所有字。
0x00(傳統模式)=當 OTP 區域鎖定時,禁止寫操作,并會禁止字 0 和 1 的讀操作以及 32 位元組讀操作。
所有其他模式均保留。
(4)位元組3為選擇器模式
如果為 0x00,将用 UpdateExtra 更新 Selector。
如果為其他值,将隻允許 Selector 在值為零時更新。
1.4 word address為0x05-0x0c的區域(始終讀,鎖前可寫)
每個slot配置占2個位元組,也就是由16個位組成,它們控制特定槽或密鑰的使用和通路。當資料區域鎖定時,SlotConfig字段根據下表進行解析。當資料區域解鎖時,這些限制不适用,所有槽均可自由寫入,但不能讀取。
配置每個槽的16位,具體作用如下:
Bit | ||
15-12 | WriteConfig | 請參見下面的詳細功能定義。 |
11-8 | WriteKey | 要用于驗證加密寫操作的密鑰的槽。跟bit0-3類似,隻不過這裡是寫操作,使用write command指令。 |
7 | IsSecret | 0 = 槽并非機密資訊槽,允許明文讀取、明文寫入,無 MAC 檢查且無 Derivekey 指令 1 = 槽為機密資訊槽。讀操作和寫操作(如果允許)必須進行加密。 |
6 | EncryptRead | 0 = 允許明文讀取。 1 = 要求槽為機密資訊槽,并以加密讀取的方式進行通路。 |
5 | LimitedUse(1) | 0 = 密鑰可使用的次數無限制。 1 = 根據槽的 UseFlag(或 LastKeyUse)對密鑰的使用次數進行限制。 |
4 | CheckOnly | 0 = 此槽可用于所有加密指令。 1 = 此槽隻能用于 CheckMac 以及後跟 CheckMac 的 GenDig 指令。 |
3-0 | ReadKey | 要用于加密讀取的密鑰的槽。如果你想把某個slot設定成可以加密讀取,則在這裡要指定加密讀取的密鑰存放的slot。 如果為 0x0,則此槽可用作 CheckMac/Copy 指令的源槽。 |
(1)WriteConfig寫配置位—— Derivekey指令
Bit 15 | Bit 14 | Bit 13 | Bit 12 | 源秘鑰 | |
X | 1 | 目标 | DeriveKey 指令可在未授權 MAC 的情況下運作(滾動)。 | ||
1 | X | 1 | 目标 | DeriveKey 指令需要授權 MAC(滾動)。 | |
X | 1 | 1 | 父項 | DeriveKey 指令可在未授權 MAC 的情況下運作(建立)。 | |
1 | X | 1 | 1 | 父項 | DeriveKey 指令需要授權 MAC(建立)。 |
X | X | X | — | 在 WriteConfig 字段中具有此值的槽不可用作 DeriveKey 指令的目标。 |
(2)WriteConfig寫配置位—— Write指令
Bit 15 | Bit 14 | Bit 13 | ||
始終 | 始終允許對此槽進行明文寫入。設定為“始終”的槽始終不應用來存儲密鑰。可以向此槽寫入 4 個或 32 個位元組。 | |||
X | 1 | 從不 | 始終不允許使用 Write 指令寫入此槽。設定為“從不”的槽仍可用來存儲密鑰。 | |
1 | X | 從不 | 始終不允許使用 Write 指令寫入此槽。設定為“從不”的槽仍可用來存儲密鑰。 | |
X | 1 | X | 加密 | 寫入此槽的内容需要一個正确計算的 MAC,并且輸入資料必須由系統通過 WriteKey 使用 Write 指令說明中記錄的加密算法進行加密。禁止對此槽進行 4 位元組寫入。 |
(3)IsSecret和EncryptRead位的配置對slot讀操作的影響
IsSecret | EncryptRead | |
始終允許從此槽進行明文讀取。 設定為此狀态的槽始終不應用來存儲密鑰。一次可以讀取 4 個或 32 個位元組。 | ||
1 | 禁止。使用此代碼的槽不能保證安全性。 | |
1 | 始終不允許從此槽進行讀取。 設定為此狀态的槽仍可用來存儲密鑰。 | |
1 | 1 | 從此槽中讀取的内容使用 Read指令描述中記錄的加密算法進行加密。 加密密鑰位于由 ReadKey 指定的槽中。禁止 4 位元組讀寫操作。 |
1.5 0x0d-0x10
UseFlag:
用于“限制使用的槽”。“1”位的數量表示在禁止前槽 0 至 7 可使用的次數。也就是指明了對應的slot區(隻限slot0-7)中的key還能使用多少次,但前提是slot config.SingleUse = 1,UseFlag才會有用。
UpdateCount:
表示槽 0 至 7 已用 DeriveKey 更新的次數。
1.6 0x11-0x14
LastKeyUse:
用于控制槽 15 的限制使用次數。每個“1”位表示槽 15 的一次剩餘使用次數。僅适用于 SlotConfig<5>LimitedUse 置 1 的情況。而計算剩餘使用次數的方法是,所有LastKeyUse位1的個數加起來,那麼總共就有16*8 = 128次了,用完後,slot15就徹底不能再使用,無法被DeriveKey更新。
1.7 0x15
UserExtra:
對于一般的系統使用,可通過 UpdateExtra 指令進行修改。
UpdateExtra指令格式:
【注】
- Mode.bit1 = 1時,這條指令做的操作是,減少NewValue中指定的SlotID的使用次數。
- UserExtra中的值不為0,那麼此條指令如果更新UserExtra的話将會傳回失敗。
- 如果SelectorMode不為0,而且Selector不為0,那麼那麼此條指令如果更新Selector的話将會傳回失敗。
選擇器:
選擇哪個器件将在執行 Pause 指令後保持工作模式。
LockValue:
控制資料和 OTP 區域是否解鎖、可自由寫入但不能讀取。
0x55 = 資料和 OTP 區域已解鎖,且具有寫通路權限。
0x00 = 資料和 OTP 區域已鎖定,并采用配置區域中定義的通路政策。資料區域中的槽隻能根據相應WriteConfig 字段進行修改。OTP 區域隻能根據 OTP 模式進行修改。
LockConfig:
配置區域通路。
0x55 = 配置區域具有寫通路(已解鎖)。
0x00 = 配置區域沒有寫通路(已鎖定)。
LOCK指令格式:
2 Config 區的配置決定DATA區的操作權限
每個slot占兩個位元組,每一位什麼作用上面都寫了,利用I2C寫入就可以了,就實作了配置,可以直接按照位址寫,位址直接用word就可以,4位元組或者32位元組。在讀寫操作的資料包中,該區zone的值為0x00,如果直接用0x00隻能讀寫4bytes,如果zone = 0x00 | 0x80就可以讀寫32bytes。
确定各slot的使用權限,全部寫入,成功後,确定正确,就可以clock了。按照clock的指令資料包的格式,寫config區的最後一個位元組LockConfig,寫成0x00就鎖上了。