成功喚醒之後,纔可以做很多事情,實現它的命令功能。
- 芯片的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
|
忽略,由 Microchip 設置。
|
本文爲I2C接口操作。
1.3 0x04(始終讀,鎖前可寫)
(1)字節0爲I2C_Address:
Bit7-1
Bit0 |
I2C 器件地址
忽略。 |
能看到該器件默認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 | 源祕鑰 | |
0 | X | 1 | 0 | 目標 | DeriveKey 命令可在未授權 MAC 的情況下運行(滾動)。 |
1 | X | 1 | 0 | 目標 | DeriveKey 命令需要授權 MAC(滾動)。 |
0 | X | 1 | 1 | 父項 | DeriveKey 命令可在未授權 MAC 的情況下運行(創建)。 |
1 | X | 1 | 1 | 父項 | DeriveKey 命令需要授權 MAC(創建)。 |
X | X | 0 | X | — | 在 WriteConfig 字段中具有此值的槽不可用作 DeriveKey 命令的目標。 |
(2)WriteConfig寫配置位—— Write命令
Bit 15 | Bit 14 | Bit 13 | ||
0 | 0 | 0 | 始終 | 始終允許對此槽進行明文寫入。設置爲“始終”的槽始終不應用來存儲密鑰。可以向此槽寫入 4 個或 32 個字節。 |
X | 0 | 1 | 從不 | 始終不允許使用 Write 命令寫入此槽。設置爲“從不”的槽仍可用來存儲密鑰。 |
1 | 0 | X | 從不 | 始終不允許使用 Write 命令寫入此槽。設置爲“從不”的槽仍可用來存儲密鑰。 |
X | 1 | X | 加密 | 寫入此槽的內容需要一個正確計算的 MAC,並且輸入數據必須由系統通過 WriteKey 使用 Write 命令說明中記錄的加密算法進行加密。禁止對此槽進行 4 字節寫入。 |
(3)IsSecret和EncryptRead位的配置對slot讀操作的影響
IsSecret | EncryptRead | |
0 | 0 | 始終允許從此槽進行明文讀取。 設置爲此狀態的槽始終不應用來存儲密鑰。一次可以讀取 4 個或 32 個字節。 |
0 | 1 | 禁止。使用此代碼的槽不能保證安全性。 |
1 | 0 | 始終不允許從此槽進行讀取。 設置爲此狀態的槽仍可用來存儲密鑰。 |
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就鎖上了。