1. 主要特性
- SHA-256哈希算法
- 256位密鑰長度;最多可存儲 16個密鑰
- 惟一 72位序列號
- 內部高質量隨機數發生器(RandomNumberGenerator,RNG)
- 用於存儲密鑰和數據的 4.5kbEEPROM
- 用於固定信息的 512位可一次性編程(OneTimeProgrammable,OTP)位
- 多個 I/O選項: 兼容 UART的高速單線接口; 1MHz I2C接口
2. 接口
NC | 無連接 |
GND | 地 |
SDA | 串行數據 |
SCL | 串行時鐘輸入 |
VCC | 電源 |
通過標準 I2C接口訪問器件,速度最高 1Mbps。
3. 內部組成:EEPROM+SRAM
我們只看EEPROM:共有 664 字節(5312 位),分爲以下幾個區域
88個字節的config區, 512字節的slot區, 64個字節的OTP區
(1)關於config區,放的是SN和每個slot的訪問權限信息等。喚醒之後,我們需要配置slot區的訪問權限,就在這個區。
(2)關於slot區,這個區有16個slot,每個slot可以放32字節。在config區lock之後,data區(slot區和OTP區)lock之前,只能寫slot區而不能讀。在config區和data區都lock之後,按照config區對於slot的訪問權限進行讀寫。
(3)關於OTP,一次可編程,固定信息。在鎖定 OTP 區域之前,可以使用標準Write 命令自由寫入相應位。
4. 讀寫命令數據包
1byte |
1byte |
Nbyte |
2byte |
Command |
Count |
Data |
CRC(LSB:MSB) |
- Command指示這個數據包是爲何作用,也就是word address;
- count是數據包的長度,包括count本身, data, crc;
- data是數據內容;
- CRC16是數據包的校驗碼,校驗內容從count到data。
4.1 Command域
如下值:
復位 | 0x00 | 復位地址計數器。下一個讀取或寫入事務將從 I/O 緩衝區起始處開始。 |
休眠(低功耗) | 0x01 | ATSHA204A 志。器件的整個易失性狀態將復位。 進入低功耗休眠模式,忽略所有後續的 I/O 轉換,直到下一個喚醒標 |
空閒 | 0x02 | ATSHA204A 進入空閒狀態,忽略所有後續的 I/O 轉換,直到下一個喚醒標誌。 TempKey 和 RNGSeed 寄存器的內容將保留。 |
命令 | 0x03 | 將後續字節寫入輸入命令緩衝區中先前寫入內容之後的連續地址。這是正常操作。 |
保留 | 0x04-0xFF | 這些地址不應發送到器件。 |
4.2 數據包data域格式
寫:
opcode |
Write | 1 | 0x12 |
Param1 | Zone | 1 |
Bit 7: Bit 6: Bit 5-2: 必須爲 0。 在 Config、OTP 或 Data 中進行選擇。 |
Param2 | Address | 2 | 區域內要寫入的第一個字的地址。 |
Data_1 | Value | 4 或 32 | 要寫入區域的信息;可進行加密。 |
Data_2 | Mac | 0 或 32 | 用於使地址和數據生效的報文驗證代碼。 |
讀:
opcode | Read | 1 | 0x02 |
Param1 | Zone | 1 |
Bit 7: 所有位必須爲 0。 在 Config、OTP 或 Data 中進行選擇。 |
Param2 | Address | 2 | 區域內要讀取的第一個字的地址。請參見 一節。 |
data | — | 0 | — |
- 第一個字節是操作碼,Read command 的操作碼是0x02, Write command 的操作碼是0x12
- 第二個字節的最高位bit7指示是讀寫32字節還是4字節,1爲讀寫32字節。bit0-1指示讀寫哪個區,0:Config區,1:OTP區,2:Data區。
- 第三和第四個字節是Address地址。
- 其他爲數據。
4.2.1 opcode
DeriveKey | 0x1C | 從目標密鑰或父密鑰得出目標密鑰值。 |
DevRev | 0x30 | 返回器件版本信息。 |
GenDig | 0x15 | 通過隨機或輸入種子和密鑰生成數據保護摘要。 |
HMAC | 0x11 | 使用 HMAC/SHA-256 計算密鑰和其他內部數據的響應。 |
CheckMac | 0x28 | 驗證在另一個 MicrochipCryptoAuthentication 器件上計算的MAC。 |
Lock | 0x17 | 防止進一步修改器件的某個區域。 |
MAC | 0x08 | 使用 SHA-256 計算密鑰和其他內部數據的響應。 |
Nonce | 0x16 | 生成一個 32 字節的隨機數和一個內部存儲的臨時值。 |
Pause | 0x01 | 選擇性地僅將共用總線上的一個器件置於空閒狀態。 |
Random | 0x1B | 生成一個隨機數。 |
Read | 0x02 | 從器件讀取 4 個字節,可以使用或不使用身份驗證和加密。 |
SHA | 0x47 | 計算 SHA256 摘要以用於系統中的任一功能。 |
UpdateExtra | 0x20 | 配置區域鎖定後,更新配置區域內的字節 84 或 85。 |
Write | 0x12 | 向器件寫入 4 個或 32 個字節,可以使用或不使用身份驗證和加密。 |
容易看出讀的命令爲0x02,寫操作命令爲0x12。
4.2.2 param1的區域編碼
Param1 | ||||
config | 0 | 704 位 88 字節 3 個槽 |
始終支持。 | 解鎖時,部分支持。 鎖定時,始終不支持。 始終不加密。 |
OTP | 1 | 512 位 64 字節 2 個槽 |
解鎖時,始終不支持。鎖定時始 終支持,傳統模式除外。 請參見 OTP 一節。 |
LockConfig 解鎖時不允許。 LockConfig 鎖定且 LockValue 解鎖時,均可寫。 LockValue 鎖定時由 OTPmode 控制。 請參見 OTP 一節。 |
data | 2 | 4096 位 512 字節 16 個槽 |
解鎖時,始終不支持;其他情況 下,由 IsSecret 和 EncryptRead 控制。 |
LockConfig 解鎖時不允許。 LockConfig 鎖定且 LockValue 解鎖時,均可寫。 LockValue 鎖定時由 WriteConfig 控制。 請參見 一節。 |
4.2.3 param2的地址編碼
Param2 包含一個地址,表示要訪問的存儲器。所有讀操作和寫操作均以字(4 字節)爲單位。合法ATSHA204A 地址的最高有效字節始終爲 0。所有未使用地址位均應始終設爲 0。地址中的低位描述了塊/槽內要訪問的第一個字的偏移量,而高位指定了槽號,如下表所示:
可以看出字節1的高8位全爲0,低8位的前3位是偏移量,高5位是block(不同的區域block佔的位數不一樣),一個block爲32字節,所以config 分3個block(0-2),slot分16個block(0-15),otp分2個block(0-1),如果是使用32字節進行讀寫的話,則忽略前3位offset。
偏移量的意思就是某個block第一個字的偏移量,例如config區的0x10就是block2,所以block就是2,offset就是0,所以(0001 0000b) = (10h),沒有問題。如果block還是2,但offset是1,則(0001 0001b) = (11h),就是word的0x11處。
又爲什麼是block2呢?看一下config的block劃分,每個word對應是4字節,所以一個block就是8個word,那麼0x00 -0x07這8個就是block,0,0x08-0x0F這8個爲block1,0x10-0x15(最後一個)這6個是block2,同樣的slot和otp兩個區也是這個規則。
4.3 例
讀config區的第一個word 0x00:
word address | count | opcode | param1 | param2 | crc |
0x03 | 0x07 | 0x02 | 0x00 | 0x0000 | 2bytes |
根據上述總結
0x03: 表示命令操作;
0x07:字節數=自己1字節+opcode的1字節+param1的1字節+param2的2字節+crc的2字節= 0x07 ;
0x02::表示讀操作;
0x00:0表示config區;
0x0000:word的0x00處
有了上述命令包,就有了操作方式、操作區域、區域中的具體哪個位置,這樣config區域的0x00處的4個地址的數據就讀出了,也就是SN號的一部分值。
【注】config區的具體內容和配置,參見下一篇文章。