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: 0 = 4 位元組資料寫入指定的區域。 1 = 32 位元組資料寫入指定的區域。 Bit 6: 0 = 資料以明文寫入。 1= 輸入資料必須加密。 如果資料/OTP 區域鎖定,則必須為 0。 Bit 5-2: 必須為 0。 Bit 1-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 = 讀取 4 位元組。 1 = 讀取 32 位元組。在傳統模式下,從 OTP 區域讀取時必須為 0。 Bit6-2: 所有位必須為 0。 Bit1-0 : 在 Config、OTP 或 Data 中進行選擇。 |
Param2 | Address | 2 | 區域内要讀取的第一個字的位址。請參見 一節。 |
data | — | — |
- 第一個位元組是操作碼,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 | 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區的具體内容和配置,參見下一篇文章。