ATSHA204A Chip Usage Instructions
来自Waveshare Wiki
|
| ||||||||||||||||
| ||||||||||||||||
ATSHA204A 说明
产品概述
ATSHA204A 是 Microchip 推出的 CryptoAuthentication 硬件安全芯片,集成硬件 SHA-256 引擎和 4.5 Kbit 安全 EEPROM,内部最多可存储 16 把 256-bit 密钥,并提供唯一序列号、随机数发生器等安全功能。芯片支持 I²C 接口,可与 Raspberry Pi 配合,实现设备与配件认证、密钥与敏感数据的安全存储、消耗品计数等应用。配置区和数据区可通过一次性锁定机制防止后续篡改,是物联网节点、防伪、防克隆等场景中常用的安全元件。
注意事项
- 执行锁区操作后,区域将不可解锁,请在未确认参数前不要进行批量操作
- 目前仅部分产品搭载 ATSHA204A 加密芯片,请注意产品参数
- Microchip 有提供官方库文件,若需要相应操作可以参考官方示例实现 cryptoauthlib
Raspberry Pi 下使用操作
环境搭建
- 安装依赖 + 编译 C 库(此为 Microchip 官方库文件)(克隆失败请点击此处下载,而后将下载下来的文件拷贝至使用的系统中)
#sudo apt-get update sudo apt-get install -y git build-essential cmake libssl-dev git clone https://github.com/MicrochipTech/cryptoauthlib.git cd cryptoauthlib mkdir build && cd build cmake -DATCA_HAL_I2C=ON .. # 默认会启用 Linux I²C HAL make sudo make install sudo ldconfig cd ../../
使用操作
- 产品主要功能为以下内容,相关解说根据以下内容展开
- 初始化 / 关闭
- 读芯片信息 / 序列号
- 读随机数
- Nonce(更新 TempKey)
- 计算 MAC
- 查询 / 锁定 Config/Data 区
- 读 / 写 Config 区
- 读 / 写 Data 区 slot
- 注意官方库文件的 Python 只是一个很薄的 ctypes 封装,真正干活的还是 C 版 libcryptoauth.so,并且 ctypes 封装缺少很多函数,即许多函数不可调用,故在本示例中使用的 Python 示例,底层也是有封装一层 C 库的。
初始化 / 关闭
- 在安装完官方库文件后,执行参数初始化操作
ATCA_STATUS atsha204a_init(void)
{
if (g_initialized)
return ATCA_SUCCESS; // 已初始化,直接成功返回
ATCA_STATUS status = atcab_init(&g_atsha_cfg); // 调用 cryptoauthlib 的 init
if (status == ATCA_SUCCESS)
g_initialized = true; // 标记为已初始化
return status;
}
读芯片信息 / 序列号
ATCA_STATUS atsha204a_get_info(uint8_t info[4])
{
if (!info)
return ATCA_BAD_PARAM; // 空指针,参数错误
ATCA_STATUS status = atsha204a_init(); // 确保已初始化
if (status != ATCA_SUCCESS)
return status;
return atcab_info(info); // 调用底层 info 命令
}
ATCA_STATUS atsha204a_get_serial(uint8_t sn[9])
{
if (!sn)
return ATCA_BAD_PARAM; // 空指针,参数错误
ATCA_STATUS status = atsha204a_init(); // 确保已初始化
if (status != ATCA_SUCCESS)
return status;
return atcab_read_serial_number(sn); // 调用底层 Serial 命令
}
其他功能
- 示例中已通过各个函数实现相关功能,具体解析请查看相关示例程序
- C 示例
- Python 示例(底层使用的也是 C 文件,当前已将基本函数封装好了)
- 执行锁区操作后,区域将不可解锁,请在未确认参数前不要进行批量操作
- 注意,以上未锁区,读取出来的随机数等一系列参数无法看出相关性,只有在锁区后才可正常看出数据
- 锁区后若配置为“普通存储槽”,则可进行读写验证,注意锁区后不可解锁!!
- 这里修改了 Python 示例中的锁区程序(最下面的注释,注意锁区后不可解锁!)
config 区与 Data 区说明
Config 区(Configuration Zone)
Config 区存的是:芯片的配置和权限,比如:
- 每个 Data slot 能不能读?能不能写?写的时候要不要加密?
- 用的是 I²C 还是单线接口?I²C 地址是多少?
- 锁状态、一些全局选项(比如是否允许某些命令)。
- 有点像“系统设置 / BIOS”。
特点:
- 大小固定(128 字节),布局在 datasheet 里是死的:前面有 SN、Rev,后面是 SlotConfig/KeyConfig 等。
- 一般只在出厂配置阶段写一次:
- 你把每个 slot 的策略都设计好;写入 Config 区;确认没问题后,执行一次 LockConfig → 永久锁死,以后再也改不了。
- 一旦 Config 区锁了:Config 里的“权限规则”定死;Data 区后续的访问行为就完全按这些规则来。
所以:Config 区更像“规则说明书 + 权限表”。
{
uint8_t slot = 15; // 指定 slot 15
size_t offset = 20u + (size_t)slot * 2u; // 查找偏移字节
// TODO:下面两个字节改成你真正算好的 SlotConfig[15] 值,当前设置为 “普通存储槽”
cfg[offset + 0] = 0x00; // 低字节(LSB,cfg[offset + 0])
// bit 0–3:ReadKey = 0 指定“读这个 slot 时用到的 Key 编号”(0–15)
// bit 4: CheckOnly = 0 0:正常槽,可以参与读 / 写 / MAC 等操作 1 = “只用于 CheckMac,不允许普通读写”
// bit 5: SingleUse = 0 0:可多次使用(普通槽) 1 = “一次性使用(配合计数器),用过就作废”
// bit 6: EncryptRead = 0 0:明文读,读这个 slot 时,返回数据就是槽里存的原始字节 1 = “读这个 slot 时必须加密读取(不能明文读)”
// bit 7: IsSecret = 0 0:非机密槽,芯片不会强制用“密钥安全策略”对待这个 slot 1 = “这个 slot 被当成密钥 / 机密数据”
cfg[offset + 1] = 0x00; // 高字节(MSB,cfg[offset + 1])
// bit 0~3:WriteKey = 0 指向一个“写保护 key 槽”,如果 WriteConfig 要求“加密写入”,芯片会用 WriteKey 指定的那个 key 槽参与计算(例如 MAC / 解密数据)
// bit 4–7:WriteConfig = 0 设成某个“加密写模式”,具体看手册,如果 WriteConfig 是 Always / Never 这类明文模式,WriteKey 可以保持 0,不参与。
}
Data 区(Data Zone)
Data 区存真正“有价值的东西”的地方,比如:
- 对称密钥(AES/HMAC key);
- 序列号扩展、用户 ID;
- 小块配置数据、计数器、flag 等等。
结构:
- 被划分成多个 slot(槽位),每个通常是 32 字节或多倍数;
- 每个 slot 的“行为和权限”由 Config 区里的 SlotConfig/KeyConfig 决定:
- 有的 slot 允许明文读 / 写;
- 有的 slot 只允许通过加密命令间接访问(比如只能用 MAC/CheckMac 来验证,不能直接读出密钥);
- 有的 slot 做计数器、限制使用次数。
- 只要 LockConfig 还是 0x55(Config 未锁),对 Data/OTP 的读写全部禁止。
- 只要 LockData 还是未锁状态, Data/OTP 的是否读写成功标志无效,不可作为参考。
锁区
Data 区也有一个整体的锁位:LockData; 通常流程是:
- 注意:在未熟悉相关配置前,请不要锁区,锁定后将无法解锁!!!
- Config 区写好并锁定;
- 按 Config 的规则往各个 slot 写入密钥和参数;
- 确认都对了以后 → 执行 LockData → 整个 Data 区权限生效、不可更改。
所以:Data 区 = 真正放“秘密”和应用数据的仓库, Config 区 = 决定这些“仓库”每个门怎么锁、谁能怎么进去的规则。
资料
手册
示例程序
FAQ
请降低 I2C 通信速率。




