ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Matter NXP 工厂数据生成器(NXP Factory Data Generator)实战指南:从 KLV 架构到产线烧写与安全加固

Matter NXP 工厂数据生成器(NXP Factory Data Generator)实战指南:从 KLV 架构到产线烧写与安全加固 Matter NXP 工厂数据生成器NXP Factory Data Generator实战指南从 KLV 架构到产线烧写与安全加固【免费下载链接】connectedhomeipMatter (formerly Project CHIP) creates more connections between more objects, simplifying development for manufacturers and increasing compatibility for consumers, guided by the Connectivity Standards Alliance.项目地址: https://gitcode.com/GitHub_Trending/co/connectedhomeip本文以 Matterconnectedhomeip仓库中 NXP 平台专用的工厂数据生成工具为核心讲解其基于 (K, L, V) 元组的设计架构、generate.py/default.py/custom.py三文件的实现原理并贯通 NXP 制造数据Manufacturing Data的完整生产流程证书生成、数据二进制产出、烧写地址选择、应用构建启用以及 EdgeLock 2GO 与 SSS 加密 Blob 两类 DAC 私钥安全加固方案。读完本文你将掌握该工具的参数全貌、二进制格式细节、扩展新参数的标准方法并能够在真实产线上落地一套可复用的 NXP 设备工厂数据写入流程。一、工具概览三个文件各司其职NXP 工厂数据生成器位于 scripts/tools/nxp/factory_data_generator整个工具仅由三个 Python 文件组成文件职责generate.py工具入口使用argparse解析命令行参数将参数对象转换为(K, L, V)元组列表并负责输出二进制文件含可选加密default.py定义基础类InputArgument及其派生类整数、Base64、字符串、文件等统称默认类default classescustom.py为每一个需要写入输出二进制的参数定义具体类统称自定义类custom classes从源码结构看三者的协作关系是generate.py通过argparse解析命令行参数凡是指定type为某个自定义类的参数都会被解析成对应的对象实例随后KlvGenerator.generate()从全部参数中筛选出InputArgument实例调用其output()方法产出(K, L, V)元组最后to_bin()把这些元组序列化写入二进制文件。并非所有参数都会被编码进输出二进制例如spake2p_path和out就只是普通字符串参数它们只参与工具运行逻辑不进入工厂数据。二、核心架构KLV 元组与二进制格式2.1 (K, L, V) 元组设计工具的核心数据模型是(Key, Length, Value)三元组KKey1 字节标识符唯一标志该数据项如 Verifier1、Salt2、IterationCount3……LLength2 字节小端长度值标识 V 的字节数VValue编码后的实际数据字节。InputArgument定义于 default.py提供抽象接口key()、length()、encode()三者通过公开方法output()组合成元组def output(self): out (self.key(), self.length(), self.encode()) log.info(%s length: %d, type(self).__name__, self.length()) return out其中output()是所有类共享的公共逻辑不应被重写子类只需实现三个抽象方法。2.2 二进制布局to_bin()generate.py将 KLV 列表写入文件时每条记录按1 字节 Key 2 字节小端 Length Length 字节 Value顺序排列并在整体前后附加如下结构未加密场景[Hash ID (4B, CE47BA5E 字节反转)] [数据总长度 (4B, 小端)] [SHA256 前 4 字节] [KLV 条目...]hash_id为全局常量CE47BA5E写入前先做字节反转用于标识工厂数据结构数据总长度以 4 字节小端写入供设备端计算 SHA 校验完整性校验对整个 KLV 内容计算 SHA256取前 4 字节8 个十六进制字符附加在头部。2.3 排序保证可复现generate()方法特别强调args本质上是字典条目无序因此必须按 key 排序后再产出 KLV 列表以保证每次生成的二进制顺序一致从而确保两份输出可以通过 SHA256 可靠对比data [obj for key, obj in vars(self.args).items() if isinstance(obj, InputArgument)] return [arg.output() for arg in sorted(data, keylambda x: x.key())]2.4 可选 AES 加密当传入--aes128_key或--aes256_keyto_bin优先采用 aes256时KLV 内容会先补齐到 16 字节对齐再使用Crypto.Cipher.AES以ECB 模式加密整段数据见 generate.py。因此该加密是全数据集加密而非逐条加密。使用加密前务必确认目标应用/板卡具备解密机制并可访问密钥否则设备无法读取工厂数据。三、默认类与自定义类扩展新参数的规范路径3.1 default.py 中的默认类default.py 定义的基础类及行为如下类行为InputArgument抽象基类key()/length()/encode()仅记录错误日志必须由子类实现IntArgument构造函数以int(arg, 0)解析支持十进制与 0x 前缀十六进制length()默认 4小端编码Base64Argument构造函数以base64.b64decode(arg)解码encode()返回 base64 编码后的字节StrArgument字符串编码max_length()默认上限 32 字节FileArgument构造函数直接读取文件字节作为 valuelength()为文件长度注意默认类不应被直接用来实例化参数新增参数必须从默认类派生自定义类。3.2 custom.py 中的自定义类与 Key 分配custom.py 为每个输出参数定义了类并分配了唯一的 KeyKey类说明1VerifierSPAKE2 verifierBase642SaltSPAKE2 saltBase643IterationCountSPAKE2 迭代次数int4DacPKeyDAC 私钥DER → 32 字节大端私钥值5DacCertDAC 证书DER 文件6PaiCertPAI 证书DER 文件7DiscriminatorBLE 配对 discriminatorint8SetupPasscodePASE 会话 passcodeint9VendorIdVIDlength()覆盖为 210ProductIdPIDlength()覆盖为 211CertDeclarationCertification DeclarationDER 文件12VendorName厂商名字符串13ProductName产品名字符串14SerialNum序列号字符串15ManufacturingDate生产日期max_length()为 1616HardwareVersion硬件版本号length()覆盖为 217HardwareVersionStr硬件版本字符串max_length()为 6418UniqueId旋转设备 ID 生成用唯一标识19PartNumber料号字符串20ProductURL产品 URLmax_length()为 25621ProductLabel产品标签max_length()为 6422ProductFinish表面处理编码为枚举索引1 字节23ProductPrimaryColor主色编码为枚举索引1 字节24El2GoObjectEdgeLock 2GO 安全对象二进制25El2GoDacKeyIDEL2GO DAC 密钥 ID26El2GoDacCertIDEL2GO DAC 证书 ID其中两个特殊类值得关注DacPKey并不直接写入文件原始字节。其generate_private_key(password, use_sss_blobFalse)会调用load_der_private_key解析 DER 私钥提取大端序 32 字节私钥数值P-256 曲线。若use_sss_blobTrue则直接将传入文件内容即加密 Blob原样作为 value 写入。ProductFinish/ProductPrimaryColor可接受的值有严格枚举。ProductFinish仅接受[Other, Matte, Satin, Polished, Rugged, Fabric]ProductPrimaryColor仅接受[Black, Navy, Green, ... Gold]等 21 个取值编码为枚举下标1 字节非法输入会直接报错退出。命令行--help中会以 metavar 展示这些取值。3.3 如何新增一个参数官方示例在 custom.py 中定义新类必须从默认类派生而不是直接继承InputArgumentclass FooArgument(BarArgument): def __init__(self, arg): super().__init__(arg) def key(self): return unique key identifier def length(self): return actual length of data def encode(self): return data as encoded bytes def custom_function(self): pass其中BarArgument是某个默认类开发者可根据需要附加其他方法例如DacPKey类中的generate_private_key。随后在generate.py中把新类挂到参数上parser.add_argument(--foo, requiredTrue, typeFooArgument, help[int | hex] Foo argument.)argparse的type属性指向类构造器后字符串参数会被自动解析为FooArgument实例并参与 KLV 生成。3.4 参数校验逻辑KlvGenerator._validate_args()generate.py在生成前执行关键约束检查未提供--dac_key_password且未提供--EL2GO_bin时仅打印警告意味着 DAC 私钥未受保护不能同时提供--dac_key和--EL2GO_bin两种 DAC 供给方式必须提供 DAC 供给方式--dac_key--dac_cert或--EL2GO_bin否则抛异常使用--EL2GO_bin时必须同时提供--EL2GO_DAC_KEY_ID与--EL2GO_DAC_CERT_ID所有StrArgument的长度通过assert校验不得超过max_length()超长会中断生成。四、完整制造流程Manufacturing Flow工具的完整用法由 docs/platforms/nxp/nxp_manufacturing_flow.md 说明。默认情况下示例应用使用内嵌在应用代码中的通用测试证书与预置数据最终量产应用可按下述流程生成自己的制造数据。4.1 前置条件构建 chip-cert 与 spake2p在 Matter 仓库根目录执行gn gen out ninja -C out chip-cert ninja -C out spake2pchip-cert用于生成各类 Matter 证书spake2p用于按需生成 SPAKE2 verifier若传入现成 verifier 则无需调用。4.2 生成证书NXP 提供 scripts/tools/nxp/generate_certs.py 生成证书。该脚本始终生成 PAI 与 DAC 证书/密钥并根据参数决定是否额外生成 Certification Declaration 与 PAA 证书/密钥。参数一览参数说明类型必填--chip_cert_pathchip-cert 可执行文件路径string是--output证书输出目录string是--vendor_id厂商标识号integer/hex integer是--product_id产品标识号integer/hex integer是--vendor_name可读的厂商名string是--product_name可读的产品名string是--gen_cd启用 Certification Declaration 生成boolean否--cd_typeCD 类型0开发、1临时、2正式integer否--device_type节点实现的主设备类型int否--paa_certPAA 证书路径未提供则自动生成string否--paa_keyPAA 密钥路径未提供则自动生成string否--valid_from证书有效期起始日期string否--lifetime证书有效期整天数string否可运行python scripts/tools/nxp/generate_certs.py --help查看默认值等更多细节。生成 CD、PAA、PAI、DAC 证书及密钥同时输出 .pem 与 .der 格式的完整示例python scripts/tools/nxp/generate_certs.py --gen_cd --cd_type 1 --chip_cert_path ./out/chip-cert --vendor_id 0x1037 --product_id 0xA220 --vendor_name NXP Semiconductors --product_name all-clusters-app --device_type 65535 --output .从源码看generate_certs.pyCD 使用仓库内置的测试签名证书credentials/test/certification-declaration/Chip-Test-CD-Signing-Cert.pem与对应密钥签发PAA 默认通过gen-att-cert以类型a生成PAI 以类型i并由 PAA 签发DAC 由 PAI 签发。未提供 PAA 路径时会自动生成新 PAA。注意文中的命令仅为示例请按实际使用场景调整 VID/PID、路径与参数。4.3 生成工厂数据二进制明文未加密模式python3 ./scripts/tools/nxp/factory_data_generator/generate.py -i 10000 -s UXKLzwHdN3DZZLBaL2iVGhQi/OoQwIwJRQV4rpEalbA -p 14014 -d 1000 --vid 0x1037 --pid 0xA220 --vendor_name NXP Semiconductors --product_name Lighting app --serial_num 12345678 --date 2023-01-01 --hw_version 1 --hw_version_str 1.0 --cert_declaration ./Chip-Test-CD-1037-A220.der --dac_cert ./Chip-DAC-NXP-1037-A220-Cert.der --dac_key ./Chip-DAC-NXP-1037-A220-Key.der --pai_cert ./Chip-PAI-NXP-1037-A220-Cert.der --spake2p_path ./out/spake2p --unique_id 00112233445566778899aabbccddeeff --out ./factory_data.bin传入现成 verifier跳过 spake2p 调用python3 ./scripts/tools/nxp/factory_data_generator/generate.py -i 10000 -s UXKLzwHdN3DZZLBaL2iVGhQi/OoQwIwJRQV4rpEalbA -p 14014 -d 1000 --vid 0x1037 --pid 0xA220 --vendor_name NXP Semiconductors --product_name Lighting app --serial_num 12345678 --date 2023-01-01 --hw_version 1 --hw_version_str 1.0 --cert_declaration ./Chip-Test-CD-1037-A220.der --dac_cert ./Chip-DAC-NXP-1037-A220-Cert.der --dac_key ./Chip-DAC-NXP-1037-A220-Key.der --pai_cert ./Chip-PAI-NXP-1037-A220-Cert.der --spake2p_path ./out/spake2p --spake2p_verifier ivD5n3L2t5zeFt6SjW7BhHRF30gFXWZVvvXgDxgCNcEBGuTA5AUaVm3qDZBcMMKn1a6CakI4SxyPUnJr0CpJ4pwpr0DvpTlkQKqaRvkOQfAQ1XDyf55DuavM5KVGdDrg --unique_id 00112233445566778899aabbccddeeff --out ./factory_data.binAES 加密模式在以上任一命令中追加--aes128_key 2B7E151628AED2A6ABF7158809CF4F3C必填参数释义-i - SPAKE2 iteration -s - SPAKE2 saltbase64 字符串 -p - SPAKE2 passcode -d - discriminator --vid - Vendor ID --pid - Product ID --vendor_name - Vendor Name --product_name - Product Name --hw_version - Hardware Version数值 --hw_version_str - Hardware Version字符串 --cert_declaration - Certification Declaration 路径der 格式 --pai_cert - PAI 路径der 格式 --spake2p_path - spake2p 工具路径 --out - 输出二进制文件名可选参数释义--dac_cert - DAC 证书路径der 格式 --dac_key - DAC 密钥路径der 格式 --EL2GO_bin - EdgeLock 2Go 二进制路径bin 格式 --EL2GO_DAC_KEY_ID - EdgeLock 2Go 中配置的 DAC key IDhex --EL2GO_DAC_CERT_ID - EdgeLock 2Go 中配置的 DAC 证书 IDhex --dac_key_password - 解密 DAC key 的密码 --dac_key_use_sss_blob - 当 --dac_key 指向加密 blob 而非真实私钥时使用blob 元数据为 24 字节 总长度 私钥长度 32 24 56。默认 False --spake2p_verifier - 现成 SPAKE2 verifierbase64。设置后全部 SPAKE2 输入直接编码进二进制 不再调用 spake2p 工具现场生成 --aes128_key - 128 位 AES 密钥加密整个数据集。需确保目标应用/板卡支持解密 --date - 生产日期YYYY-MM-DD 格式 --part_number - 料号字符串 --product_url - 产品 URL字符串 --product_label - 产品标签字符串 --serial_num - 序列号 --unique_id - 用于旋转设备 ID 生成的唯一标识 --product_finish - 产品可见表面处理 --product_primary_color - 产品可见部分代表色 --hw_params - 使用 Hardware Parameters 组件的应用工厂数据4.4 SPAKE2 verifier 的现场生成机制若未提供--spake2p_verifierSpake2p.generate()generate.py会调用spake2p gen-verifier将迭代次数、salt、PIN code 传入并把输出的 Verifier、Salt、Iteration Count 写回参数对象。因此无论哪种方式verifier/salt/迭代次数最终都会进入输出二进制。4.5 烧写工厂数据到目标平台不同 NXP 平台使用不同的烧写工具与地址平台工具命令说明mcxw71JLinkloadfile factory_data.bin 0xFE080—mcxw72blhostwrite-memory 0x2002680 factory_data.bin工厂数据写入IFR0扇区 1 的预定义偏移处地址已展开rw61xJLinkloadfile factory_data.bin 0xBFFF0000xBFFF000为对应.map文件中__FACTORY_DATA_START符号的值rt1060MCUXpresso Flash Tool GUI—地址由.map文件中的__FACTORY_DATA_START符号给出rt1170MCUXpresso Flash Tool GUI—地址由.map文件中的__FACTORY_DATA_START符号给出4.6 在应用中启用工厂数据并验证启用方式GN 构建在gn gen命令中加入nxp_use_factory_datatrueCMake 构建在构建命令中加入-DCONFIG_CHIP_FACTORY_DATAy或使用支持工厂数据的prj_flavour.conf完整配置列表见 docs/platforms/nxp/nxp_examples_freertos_platforms.md。使用 chip-tool 携带新 PAA 进行配对验证./chip-tool pairing ble-thread 2 hex: $hex_value 14014 1000 --paa-trust-store-path /home/ubuntu/certs/paa--paa-trust-store-path - 生成的 PAA 路径der 格式注意事项paa-trust-store-path目录中只能放置 PAA 证书混入其他证书会干扰 chip-toolPAA 证书可用 SCP 等工具拷贝到 chip-tool 所在机器该步骤用于验证自生成的 DAC若使用正式 PAI 签发的 DAC真实量产场景通常无需此步骤。五、DAC 私钥安全加固方案5.1 方案一SSS EdgeLock 2GOEdgeLock 2GO 服务可在制造阶段安全地预置 DAC 密钥/证书。支持平台rw61x。生成工厂数据二进制前需先按 EL2GO 流程生成 EL2GO 数据含加密的 DAC 私钥与证书随后在工厂数据生成命令中添加--EL2GO_bin ~/secure_objects.bin包含 EL2GO 信息加密 DAC 私钥与证书--EL2GO_DAC_KEY_ID 0x40000与 EL2GO 密钥生成时选择的 DAC key ID 对应--EL2GO_DAC_CERT_ID 0x40001与 EL2GO 密钥生成时选择的 DAC 证书 ID 对应。参考命令python3 ./scripts/tools/nxp/factory_data_generator/generate.py -i 10000 -s UXKLzwHdN3DZZLBaL2iVGhQi/OoQwIwJRQV4rpEalbA -p ${passcode} -d ${discriminator} --vid 0x$VID --pid 0x$PID --vendor_name NXP Semiconductors --product_name Thermostat --serial_num 12345678 --date $DATE --hw_version 1 --hw_version_str 1.0 --cert_declaration $FACTORY_DATA_DEST/Chip-Test-CD-$VID-$PID.der --EL2GO_bin ~/secure_objects.bin --EL2GO_DAC_KEY_ID 0x40000 --EL2GO_DAC_CERT_ID 0x40001 --pai_cert $FACTORY_DATA_DEST/Chip-PAI-NXP-$VID-$PID-Cert.der --spake2p_path ./out/spake2p --unique_id 00112233445566778899aabbccddeeff --out $FACTORY_DATA_DEST/factory_data.bin构建启用方式GN 构建在nxp_use_factory_datatrue基础上追加nxp_enable_secure_EL2GO_factory_datatrueCMake 构建启用CONFIG_CHIP_ENABLE_EL2GO_FACTORY_DATAKconfig可通过支持工厂数据的prj_flavour.conf配置或构建命令行加-DCONFIG_CHIP_ENABLE_EL2GO_FACTORY_DATAy。此模式下 EdgeLock 2GO 密钥始终加密仅SSSSecure Subsystem可使用所有需要 DAC 私钥的操作都会被转移到 SSS 执行。5.2 方案二SSS 加密 Blob无 EdgeLock 2GO支持平台mcxw71、rw61x。对于带安全子系统SSS的平台可将 DAC 私钥转换为加密 Blob该 Blob 会替换工厂数据中的 DAC 私钥并由工厂数据 provider 实例导入 SSS。制造流程之外DAC 私钥始终仅 SSS 可用所有需要 DAC 私钥的操作都转移到 SSS。应用会在初始化时检查 DAC 私钥是否已转换必要时自行转换但出于安全考虑转换应在制造阶段完成。参考生成命令注意--hw_params的使用python3 ./scripts/tools/nxp/factory_data_generator/generate.py -i 10000 -s UXKLzwHdN3DZZLBaL2iVGhQi/OoQwIwJRQV4rpEalbA -p 14014 -d 1000 --vid 0x1037 --pid 0xA221 --vendor_name NXP Semiconductors --product_name Lighting app --serial_num 12345678 --date 2023-01-01 --hw_version 1 --hw_version_str 1.0 --cert_declaration ./Chip-Test-CD-1037-A221.der --dac_cert ./Chip-DAC-NXP-1037-A221-Cert.der --dac_key ./Chip-DAC-NXP-1037-A221-Key.der --pai_cert ./Chip-PAI-NXP-1037-A221-Cert.der --spake2p_path ./out/spake2p --unique_id 00112233445566778899aabbccddeeff --hw_params --out ./factory_data.bin此场景无需额外二进制流程为烧写工厂数据二进制 → 以nxp_use_factory_datatrueGN或-DCONFIG_CHIP_FACTORY_DATAy/ 支持工厂数据的prj_flavour.confCMake构建应用 → 正常烧写运行。完成后工厂数据中应包含对应的加密 Blob 而非 DAC 私钥明文。如果加密 Blob 已通过其他方式预先获得可跳过转换过程改用--dac_key_use_sss_blobpython3 ./scripts/tools/nxp/factory_data_generator/generate.py -i 10000 -s UXKLzwHdN3DZZLBaL2iVGhQi/OoQwIwJRQV4rpEalbA -p 14014 -d 1000 --vid 0x1037 --pid 0xA221 --vendor_name NXP Semiconductors --product_name Lighting app --serial_num 12345678 --date 2023-01-01 --hw_version 1 --hw_version_str 1.0 --cert_declaration ./Chip-Test-CD-1037-A221.der --dac_cert ./Chip-DAC-NXP-1037-A221-Cert.der --dac_key ./Chip-DAC-NXP-1037-A221-Key-encrypted-blob.bin --pai_cert ./Chip-PAI-NXP-1037-A221-Cert.der --spake2p_path ./out/spake2p --unique_id 00112233445566778899aabbccddeeff --dac_key_use_sss_blob --out ./factory_data_with_blob.bin注意此时--dac_key指向的是包含加密 Blob 的二进制文件。另外若想绕开 SSS 直接使用明文 DAC 私钥可加 GN 参数chip_use_plain_dac_keytruerw61x 不支持。六、补充信息与已知注意事项制造数据预置实现已使用OpenSSL 1.1.1l生成的测试证书验证通过启用工厂数据所需的演示用 DAC、PAI、PAA 证书位于 scripts/tools/nxp/demo_generated_certs包含dac/dut1、dac/dut2、paa、pai各目录的 .pem/.der 文件可用于本地快速验证流程--hw_params选项会将工厂数据按 Hardware Parameters 组件的 APP 段格式组织。从 generate.py 的to_bin()实现看启用后会追加APP_FACT_DATA:魔数头部、4 字节小端大小、数据本体以及 2 字节 CRC16XMODEM校验尾生成过程中to_bin()会在日志中输出 4 字节段哈希、最终二进制大小与整体 SHA256可用于产线校验两份二进制可通过 SHA256 直接对比NXP 相关构建配置如 config/nxp/chip-module/Kconfig.defaults、config/nxp/chip-module/generate_factory_data.cmake中可见工厂数据的构建期生成与 Kconfig 开关逻辑可在 CMake 构建体系内联动。七、小结NXP 工厂数据生成器以极简的三文件结构完成了从命令行参数到 KLV 序列化、再到可烧写二进制含可选 AES 加密与完整性校验的完整链路。其核心设计——抽象基类 默认类 自定义类的三层派生体系——保证了新增产线字段的成本极低且可复现。配合generate_certs.py的证书体系、按平台区分的烧写地址表以及 EL2GO / SSS Blob 两类 DAC 私钥安全方案开发者可以在 Matter 认证设备量产时建立一套从证书签发到数据写入再到安全存储的完整工厂数据流水线。【免费下载链接】connectedhomeipMatter (formerly Project CHIP) creates more connections between more objects, simplifying development for manufacturers and increasing compatibility for consumers, guided by the Connectivity Standards Alliance.项目地址: https://gitcode.com/GitHub_Trending/co/connectedhomeip创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表