工厂数据

工厂数据是在制造过程中使用的一组默认参数。它包括各种认证、固件信息、密码密钥、产品 ID 等。

概述

工厂数据内容

工厂数据的详细组成部分及其大小如下。

工厂数据的内容

名称

大小(字节)

描述

CertificationDeclaration

600

CSA 授予的加密文档

PAI Certificate

600

PAA 直接签名的证书

DAC Certificate

600

PAI 直接签名的证书

DAC key

32(或256)

DAC 证书所对应的私钥(或加密后的私钥防止泄露)

Discriminator

2

一个12位无符号整型,用来区分正在广播的不同Matter设备

Spake2pIterationCount

4

事实上是 SPAKE2+PBKDF 算法使用的参数,它用来决定 PRF 生成 MK 的迭代次数。

Spake2pSalt

32

事实上是 SPAKE2+ 中 PBKDF 算法使用的参数,它是主要用来抵抗字典攻击的一个随机数。

Spake2pVerifier

97

一个由 passcode、spake2psalt 衍生出的,用于SPAKE2+算法的验证值。

Passcode

4

一个用来建立配对的口令,范围在0x01-0x5F5E0FE之间。

VendorName

32

一个厂商名称的可读字符串。

VendorId

2

一个唯一的16比特数字,用来标识特定的制造商,组织或者团体。

ProductName

32

一个产品名称的可读字符串。

ProductId

2

一个唯一的16比特数字,用来唯一标识某个厂商的某款产品。

ManufacturingDate

4

一个产品生产日期的可读字符串,格式是"YYYY-MM-DD"。

HardwareVersion

4

一个设备硬件版本号。

HardwareVersionString

64

一个关于设备硬件版本号的可读字符串。

RotatingDeviceIdUniqueId

16

一个设备用的不可跟踪标识符。

SerialNum

最多32

定义了制造设备的唯⼀编号。

工厂数据格式

工厂数据保存为一个可以从 0x4000000 地址开始刷写的工厂数据 bin (factory_data.bin)文件。它由 Protocol Buffers 编码,这是一个语言中立、平台中立的扩展机制,用于序列化结构化数据。Protocol Buffers 使用 .proto 文件定义数据结构的格式。更多详情请参考 https://protobuf.dev/overview/

启用工厂数据支持

Matter 平台代码的默认配置不启用客户工厂数据。

用户可以通过在./subsys/openthread/CMakePresets.json文件中,设置 preset 中的ENABLE_FACTORY_DATAON,来使能工厂数据。

工厂数据生成

本节介绍使用脚本生成工厂数据。

  1. 脚本位置subsys/matter/vendor/factory_data/tool

    • factory_data.proto:定义如上所述的工厂数据消息格式。

    • factory_data_pb2.py:由协议缓冲工具自动生成的factory_data.proto。它便于 factory_data 生成factory_data.bin

    • factory_data.py:生成factory_data.binmanual_pairing_code.txtqrcode.txtqrcode.png的主要脚本。

    • factory_data_invoke.py:使用 RTK PKI 生成的大量 DAC,批量生成工厂数据 bin 文件。事实上它间接地调用了factory_data.py

    • requirements.txt:一个文本文件,用于管理 python 脚本的依赖项。为了下载 python 的依赖项, 请运行pip install -r requirements.txt

    • spake2p: 用来生成 spake 参数。最好用户在自己的电脑上重新编译。

  2. 脚本使用:运行factory_data.py可以生成一个factory_data.bin文件,同时还生成以下三个相关文件:

    • manual_pairing_code.txt:包含手动配对码,供调试使用。

    • qrcode.txt:包含二维码信息,供调试使用。

    • qrcode.png:二维码图像文件。

必填参数

  1. --spake2p_path:spake2p 的路径。构建 spake2p 的步骤如下:

cd connectedhomeip
source scripts/activate.sh
cd src/tools/spake2p
gn gen out
ninja -C out
  1. --passcode 或 -p:配对的设置码,范围:0x01-0x5F5E0FE。

  2. --discriminator 或 -d:配对的分辨码,范围:0x00-0x0FFF。

可选参数

  1. --vendor-id

  2. --vendor-name

  3. --product-id

  4. --product-name

  5. --hw-ver:硬件版本。

  6. --hw-ver-str:硬件版本字符串。

  7. --mfg-date:制造日期,格式为 "YYYY-MM-DD"。

  8. --serial-num:序列号。

  9. --dac_cert:DER 格式的 DAC 证书路径。

  10. --dac_key:DER 格式的 DAC 私钥路径。

  11. --pai_cert:DER 格式 PAI 证书路径。

  12. --cd:证书声明 DER 格式的路径。

  13. --rd-id-uid:用于生成旋转设备标识的 128 位唯一标识符,提供 32 字节的十六进制字符串,例如:1234567890abcdef1234567890abcdef。

  14. --factorydata-key:用于加密factory_data.bin的 32 字节密钥。

  15. --factorydata-iv:用于加密factory_data.bin的 16 字节初始化向量。

  16. --gen_qrcode:生成用于初始配置的二维码。

  17. --gen_manual_pairing_code:生成用于初始配置的手动配对码。

  18. --chip_cert: 如果提供这个参数,那么它会检查DAC证书链的有效性。

  19. --paa_cert: 搭配--chip_cert使用,用于检查DAC证书链的有效性。

示例:

python3 factory_data.py -p 20202021 -d 3840 --spake2p_path ./spake2p --vendor-id 0x1316 --vendor-name "TEST_VENDOR" --product-id 0x8702 --product-name "TEST_PRODUCT" --serial-num "TEST_sn" --hw-ver 1 --hw-ver-str "1.0" --rd-id-uid 00112233445566778899aabbccddeeff --dac_cert ../test/certs/Matter-Test-DAC-Cert.der --dac_key ../test/certs/Matter-Test-DAC-Key.der --pai_cert ../test/certs/Matter-Test-PAI-Cert.der --cd ../test/certs/cd.der --chip_cert ../../../connectedhomeip/out/host/chip-cert --paa_cert ../test/certs/Matter-Test-PAA-Cert.der

此外,可以通过批量方式生成包含 RealTek 证书的工厂数据,具体细节请参见批量生成携带 RealTek 证书的工厂数据

烧录工厂数据

Factory_data.bin 应该通过 MP Tool(tools/BeeMPTool)写入 MCU

  1. 按下加载布局输入框下的 User Data

  2. 有一个对话框显示所有额外的 bin 文件。
    Browse 选择由 factory_data.py 生成的 Factory_data.bin。它会给出闪存地址 0x04000000。

    备注

    用户数据中的 bin 文件应与普通 bin 文件一起烧录。

  3. 勾选 User Data 复选框,使 MP Tool 下载用户数据中的 bin 文件。

  4. 请按 Download 按钮,像正常一样下载 bin 文件。

../../../../_images/download_factory_data.png

启用用户数据下载

工厂数据安全性

出于安全考虑,特别是 DAC 密钥,工厂数据 bin 应通过 MPTool 加密到闪存中。

启用安全工厂数据支持

默认的 matter 平台配置没有启用安全工厂数据支持。

用户可以通过在./subsys/openthread/CMakePresets.json文件中,设置 preset 中的ENABLE_FACTORY_DATA_ENCRYPTIONON,来使能工厂数据的加密。 目前 SDK 中的实现,需要搭配 烧录安全工厂数据 使用。

此外,还可以设置ENABLE_DAC_KEY_ENCRYPTIONON来保护 DAC 私钥,防止产线中发生泄密。 目前 SDK 中的实现,需要搭配 使用 RealTek PKI 的工厂数据 使用。

烧录安全工厂数据

加密配置(DEK 配置)

MPTool 应该下载 efuse 文件。这个文件用来配置加密,包括加密模式,密钥长度,加密算法等。

  1. 预加载 factory_data.bin:

    1. 点击 User Data

    2. 通过 Browse 按钮选择 factory_data.bin

    3. 点击 Confirm

../../../../_images/preload_factory_data.png

预加载 factory_data.bin 文件

  1. DEK 配置:DEK 是用于加密 bin 文件的一组密钥:

    1. 点击 RD_Setting进入 RD 设置页面来配置 DEK。

    2. 设置 DEK0为自己想要的加密类型。

    3. 设置 factory_data.bin的密钥为 DEK0

    4. 点击 Confirm按钮。随后 MPTool 会生成 EfuseWriteFile_xxx文件。

../../../../_images/dek_configuration.png

DEK 配置

将 factory_data.bin 文件打包进 pack bin 文件

当需要加密时,factory_data.bin必须用 MP Pack Tool 打包进 pack bin 文件。

  1. 通过 button按钮添加所有的映像文件。

  2. 勾选 User Data 并选择 factory_data.bin

  3. 点击 confirm按钮。

  4. 忽略警告对话框,随后会生成 ImgPacketFile_WithUserData_xxx文件。

../../../../_images/pack_bin.png

Pack Bin

下载 pack bin 文件和 DEK 配置

  1. 下载配置

    1. 通过 MP_Setting 进入 MP_Setting 页面。

    2. UNLOCK 来解锁这个页面,并随后输入密码为 1。后面配置完毕后要记得 LOCK 来重新上锁。

    3. 选择 Efuse 文件,不要使能 Only Write Efuse

    4. 选择 pack bin 映像文件。

../../../../_images/flashing_pack_bin_and_dek_configuration.png

下载 pack bin 和 dek 配置

  1. 下载:点击 Download按钮来启动下载。

../../../../_images/flashing.png

下载

使用 RealTek PKI 的工厂数据

为了方便使用,RealTek 为客户提供了一套 PKI 设施

获得 RealTek 的 DAC 和 PAI 证书

获取 RealTek DAC 和 PAI 大体的几个步骤:

  1. 安装 openssl

    sudo apt update
    sudo apt-get install openssl
    
  2. 生成一个 2048 bit 的 RSA 密钥对。这样生成的密钥名为private.pem。为了降低 DAC 私钥泄露的风险,这个密钥会用来对 DAC 私钥进行一次加密。

    openssl genrsa -out private.pem 2048
    
  3. 从私钥提取公钥。提取的公钥被命名为public.pem

    openssl rsa -in private.pem -pubout -out public.pem
    
  4. 如果 CA 管理员接受 DAC 申请,客户将会通过 Anchor Account 收到一个 zip 文件。

请通过 Anchor Account 联系 RealTek PM 或者 AE 索要详细的参考文档。

zip file 解压后输出的文件夹命名和布局

  1. 如果 CA 通过 DAC 申请,客户将会收到命名为CUST_NAME-Cert 的 zip 文件。

    1. 每个 zip 文件都对应于一个批次(Batch),并包含一个 tarball 文件和一个 sha1 哈希校验。sha1 校验用于保证文件的完整性。

      └── CUST_NAME-Cert
         ├── CUST_NAME-Cert.sha1
         └── CUST_NAME-Cert.tar
      
    2. tarball 文件包含 DAC 密钥(被公钥签名)、DAC 证书、PAI 证书。

  2. 解压缩的 tar 文件包含一套 PAI 证书(der 或 pem 格式),以及一个 DAC-VID-PID-Batch ID 文件夹。

  3. 子文件夹根据 DAC-VID-PID-Batch ID-Unit No 这样的格式来命名,内部包含证书、密钥且命名中还要 Batch ID 加上 Unit No。

  4. Tarball 文件解压后,生成的文件夹布局如下:

    └── CUST_NAME-Cert
       ├── DAC-1316-1A25-A0001
          ├── DAC-1316-1A21-A0001-00000001
             ├── DAC-1316-1A21-cert-A0001-00000001.der
             ├── DAC-1316-1A21-cert-A0001-00000001.pem
             ├── DAC-1316-1A21-Key-A0001-00000001.pem.enc
             └── DAC-1316-1A21-PrivateKey-A0001-00000001.der.enc
          ├── DAC-1316-1A21-A0001-00000002
             ├── DAC-1316-1A21-cert-A0001-00000002.der
             ├── DAC-1316-1A21-cert-A0001-00000002.pem
             ├── DAC-1316-1A21-Key-A0001-00000002.pem.enc
             └── DAC-1316-1A21-PrivateKey-A0001-00000002.der.enc
          └── DAC-1316-1A21-A0001-00000003
             ├── DAC-1316-1A21-cert-A0001-00000003.der
             ├── DAC-1316-1A21-cert-A0001-00000003.pem
             ├── DAC-1316-1A21-Key-A0001-00000003.pem.enc
             └── DAC-1316-1A21-PrivateKey-A0001-00000003.der.enc
       ├── Pankore-Test-PAA-novid-Cert.der
       ├── Pankore-Test-PAA-novid-Cert.pem
       ├── Chip-Test-CD-1316-1A25.der
       ├── Test-PAI-1316-1A25-Cert.der
       └── Test-PAI-1316-1A25-Cert.pem
    

批量生成携带 RealTek 证书的工厂数据

factory_data_invoke.py 是一个批量生成工厂数据的示例代码。它位于 subsys/matter/vendor/factory_data/tool 文件夹。 搭配下面几个参数来运行这个脚本:

  1. --sn: 这个批次设备的起始序列号。

  2. --rtk_dir: RealTek 证书目录 CUST_NAME-Cert

  3. --chip_cert: connectedhomeip官方的证书工具的路径,具体作用参考 CHIP Certificate Tool。这是可选参数,如果指定--chip_cert会在生成factory data bin文件时顺便检查一下DAC证书链的有效性。

一个示例命令:

python3 factory_data_invoke.py --rtk_dir subsys/matter/vendor/factory_data/test/cn4-Cert --sn 0x0011223344556677 --chip_cert subsys/matter/connectedhomeip/out/host/chip-cert

factory_data_invoke.py 会生成如下图所示的一些文件

└── CUST_NAME-Cert
   ├── DAC-1316-1A25-A0001                            “DAC-VID-PID-Batch ID”文件夹
   └── device_1316_1A25                               生成的工厂数据文件和相关文件所在的顶层文件夹
      ├── 001122334455667A                            生成的单个设备对应的文件夹,以序列号命名
         ├── factory_data_001122334455667A.bin        生成的工厂数据 bin 文件
         ├── pairing_code.txt                         生成的配对码文件
         └── qrcode.png                               生成的 QR 码图像
      ├── 001122334455667B                            生成的单个设备对应的文件夹,以序列号命名
         ├── factory_data_001122334455667B.bin        生成的工厂数据 bin 文件
         ├── pairing_code.txt                         生成的配对码文件
         └── qrcode.png                               生成的 QR 码图像
      └── 001122334455667C                            生成的单个设备对应的文件夹,以序列号命名
         ├── factory_data_001122334455667C.bin        生成的工厂数据 bin 文件
         ├── pairing_code.txt                         生成的配对码文件
         └── qrcode.png                               生成的 QR 码图像
   └── sn_device_map.csv                              生成的包含所有设备的汇总文件

使用 MPCli 进行批量生产时的烧录

相比于 MP Tool,使用 MPCli 烧录工厂数据 bin 文件更加方便,因为 MP Tool 只能对一批设备烧录同一份映像文件。

必要的参数:

  1. -c: COM 口。

  2. -u: 烧录 eFuse 文件(用于文件的加密)。

  3. -F: 烧录文件的路径。

  4. -A: 十六进制格式的地址,例如 -A 0x801000。

  5. -S: 烧录的大小。

  6. -e: 擦除扇区,需要搭配 -A 和 -S 使用。

  7. -p: 下载 -F 指定的文件,并且要搭配 -A 和 -S 使用。

  8. -v: 验证下载的文件,需要搭配 -A 和 -S 使用。

一个使用的例子是:

mpcli.exe -c COM3 -u EfuseWriteFile.json -F factory_bin -A 0x4000000 -S 1803 -e -p -v

MPCli 将根据 eFuse json 文件来对映像文件进行烧录,它给出了加密的格式。这里有一个 eFuse json 文件的模板:

{
   "data_protection":        {
         "key":      [{
               "id": 0,
               "type":       "AES128_CTR",
               "key_gen":    "TRNG"
            }],
         "data":     [{
               "key_id":     0,
               "address":    "0x04000000",
               "size":       "1708"
            }]
   }
}

一般来说,用户只需要根据工厂数据 bin 文件的大小来修改 size 字段就可以了。更多信息请参考在 MPCli 的 doc/ 目录中的文档。

不同 DAC/FactoryData 配置与编译方式说明

本节介绍几种常见的 FactoryData和 DAC组合方式下的编译和配置方法,便于适配不同的产品研发、测试和量产流程。

1. 自定义 DAC,再生成含 DAC 的 FactoryData,不开 TrustZone

  • 配置方式:

    "ENABLE_FACTORY_DATA": "ON",
    "ENABLE_FACTORY_DATA_ENCRYPTION": "OFF",  // 可选
    "ENABLE_DAC_KEY_ENCRYPTION": "OFF",
    
  • 编译范例:

    ./build.py rtl8777g lighting
    

2. 自定义 DAC,再生成含 DAC 的 FactoryData,开启 TrustZone

  • 配置方式:

    "ENABLE_FACTORY_DATA": "ON",
    "ENABLE_FACTORY_DATA_ENCRYPTION": "OFF",  // 可选
    "ENABLE_DAC_KEY_ENCRYPTION": "OFF",
    
  • 编译范例:

    ./build.py rtl8777g lighting --preset secure
    
  • 生成产物参考路径:

    subsys\openthread\vendor\rtl87x2g\rtl8777g\firmware\trustzone_enable
    

3. RTK DAC,生成含 RTK DAC 的 FactoryData,不开 TrustZone

  • 配置方式:

    "ENABLE_FACTORY_DATA": "ON",
    "ENABLE_FACTORY_DATA_ENCRYPTION": "OFF",  // 可选
    "ENABLE_DAC_KEY_ENCRYPTION": "ON",
    
  • 编译范例:

    ./build.py rtl8777g lighting
    

4. 量产方式,RTK DAC,生成含 RTK DAC 的 FactoryData,开启 TrustZone

  • 配置方式:

    "ENABLE_FACTORY_DATA": "ON",
    "ENABLE_FACTORY_DATA_ENCRYPTION": "OFF",  // 可选
    "ENABLE_DAC_KEY_ENCRYPTION": "ON",
    
  • 编译范例:

    ./build.py rtl8777g lighting --preset secure
    

5. 全景量产方式,不含 DAC 的 FactoryData,含有 DAC 的全景自定义 bin,开启 TrustZone

  • 配置方式:

    "ENABLE_CG_SECURE_DAC_VENDOR": "ON",
    "ENABLE_FACTORY_DATA": "ON",
    "ENABLE_FACTORY_DATA_ENCRYPTION": "OFF",
    "ENABLE_DAC_KEY_ENCRYPTION": "OFF",
    
  • 编译范例:

    ./build.py rtl8777g lighting --preset secure
    

备注

  • 详情可结合实际项目需求选择最合适的方案。

  • 若需自定义 FactoryData 或 bin 文件,请参考项目相关工具链或脚本说明文档。