ATSHA204A Chip Usage Instructions

来自Waveshare Wiki
跳转至: 导航搜索
CM5
{{{name2}}}
{{{name3}}}
功能简介
特性 无特性,不解释
' 无特性,不解释
' 无特性,不解释
' 无特性,不解释
' 无特性,不解释
接口 I2C

ATSHA204A 说明

产品概述

ATSHA204A 是 Microchip 推出的 CryptoAuthentication 硬件安全芯片,集成硬件 SHA-256 引擎和 4.5 Kbit 安全 EEPROM,内部最多可存储 16 把 256-bit 密钥,并提供唯一序列号、随机数发生器等安全功能。芯片支持 I²C 接口,可与 Raspberry Pi 配合,实现设备与配件认证、密钥与敏感数据的安全存储、消耗品计数等应用。配置区和数据区可通过一次性锁定机制防止后续篡改,是物联网节点、防伪、防克隆等场景中常用的安全元件。

注意事项

  • 执行锁区操作后,区域将不可解锁,请在未确认参数前不要进行批量操作
  • 目前仅部分产品搭载 ATSHA204A 加密芯片,请注意产品参数
  • Microchip 有提供官方库文件,若需要相应操作可以参考官方示例实现 cryptoauthlib

Raspberry Pi 下使用操作

环境搭建

#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 示例

ATSHA204A-WIKI-1.jpg

  • Python 示例(底层使用的也是 C 文件,当前已将基本函数封装好了)

ATSHA204A-WIKI-2.jpg

  • 执行锁区操作后,区域将不可解锁,请在未确认参数前不要进行批量操作
  • 注意,以上未锁区,读取出来的随机数等一系列参数无法看出相关性,只有在锁区后才可正常看出数据
  • 锁区后若配置为“普通存储槽”,则可进行读写验证,注意锁区后不可解锁!!

ATSHA204A-WIKI-3.jpg

  • 这里修改了 Python 示例中的锁区程序(最下面的注释,注意锁区后不可解锁!)

ATSHA204A-WIKI-4.jpg

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