通过Z-Wave OTA协处理器

您还有第二个MCU或其他要通过Z-Wave OTA传输的数据文件。如何重用Bootloader固件来验证签名并解密数据?

引导加载程序中已经存在用于验证和解密文件的代码,并且众所周知。重用现有的引导程序代码比重新发明轮子(在这种情况下是加密)要小得多,也更安全。

附件项目是经过修改的Z-Wave门锁示例应用程序,该示例应用程序演示了如何对Z-Wave固件以外的OTA代码/数据进行编码。Z-Wave固件的OTA已在示例应用程序中运行-但必须首先生成加密密钥。查看https://www.silabs.com/community/wireless/z-wave/knowledge-base.entry.html/2019/04/09/z-wave_700_ota_ofe-i00M关于如何生成密钥。请参阅注释部分中的两个.BAT文件,它们将为您运行所有必需的命令。它们也包含在KEYS目录中的此.sls文件中。您必须创建自己的OTA Z-Wave固件或任何其他数据的项目密钥。

要OTA其他类型的文件,您需要以二进制文件。大多数微处理器开发环境将输出二进制文件,因此请使用该文件代替HEX文件。如果您有Intel十六进制或Mototola S记录文件,请使用SREC_CAT之类的实用程序将其转换为二进制文件。 SREC_CAT 可以将几乎任何文件类型转换为任何其他文件类型。如果文件大于200K字节,则需要将文件分成200K或更小的文件,每个文件分别为OTA。这样做超出了本项目的范围。请注意,无需加密文件。我们将使用Commander生成的密钥对它进行签名和加密

操作原理:

改变SimplicityStudio v4 DoorlockKeyPad示例项目,以注释 “AKER” 表示 -search 这些内容以查找更改。您还可以使用来自SimplicityStudio v4的DoorLockKeyPad示例应用程序的新副本来比较文件。该文件中大多数支持外部处理器OTA的代码。在ZAF_CommandClasses_FirmwareUpdate中对ota_util.c进行了一些更改,但这些更改应在7.13以后的SDK版本中(当前在7.13上进行了测试)。

Commander用于生成一对公钥和私钥。然后将私钥编程到每个要进行OTA处理的设备中。然后,Commander会对二进制文件进行加密和签名,并使用引导加载程序令牌将其包装。下载gbl文件,检查签名,然后将加密的数据一次传递给64个字节的回调函数。然后,您必须存储数据或将其传递给外部MCU。本示例仅将数据打印到UART中。

实现:

步骤1:生成秘钥
此项目的KEYS目录中有两个.BAT文件。这些是Windows脚本文件。对于其他平台,您可以轻松地将它们转换为平台特定的命令。有关更多详细信息,请参见文件中的注释。在Windows Shell中,键入:
GenGblToken.bat
这将使用Commander在文件vendor _ . 中生成一个项目密钥集。仅一次执行此命令。在项目期间将使用相同的Key。如果更改密钥,则由于密钥不再匹配无法对设备进行OTA。

步骤2:将密钥编程到devkit和每个DUT中
生产的每个设备都必须将私钥编程到闪存中。使用PgmToken.bat将密钥编程到通过USB连接的目标设备中。请注意,每个生产的设备都必须在其中编程这些keys。

步骤3:生成.gbl文件
使用以下命令从二进制文件创建.gbl文件:
commander gbl create <OTA_FileName> .gbl --metadata <BinaryFile> --sign vendor_sign.key --encrypt vendor_encrypt.key
–metadata选项将包装二进制数据带有引导加载程序解析数据所需的令牌。不要使用–compress选项。如果需要压缩数据,请使用自己的算法。KEYS目录中有3个示例二进制文件 -a small.wav音频文件, large.M4A音频文件和PNG图像文件。使用上面的命令用OTA必需的令牌包装文件。

步骤4:OTA .gbl文件
使用PC Controller 或其他应用程序通过Z-Wave发送gbl文件。发送完整个文件并检查CRC是否良好后,将调用FinishFwUpdate函数以开始处理Image。请注意,在PC Controller中,您必须首先获取当前固件,然后选择Target: 1以下载元数据。然后单击UPDATE ,OTA将开始。将终端连接到WSTK的VCOM端口,以查看OTA期间向下传输的数据。一旦所有数据发送完毕,就检查签名并将解密后的数据发送到UART。在这里,您需要更改代码以存储数据,而不是将其打印出UART。
在这里插入图片描述
步骤5:验证签名并传递回调函数
调用bootloader_verifyImage()函数,并传入metadataCallback函数。如果签名匹配bootloader_verifyImage首先返回零。如果签名失败,则返回错误值,其中提供有关失败原因的一些详细信息。验证签名的时间可能会很长,具体取决于Image的大小,因此在处理过程中将禁用看门狗定时器。

步骤6:MetadataCallback传递解密数据的64字节块
调用传递给bootloader_verifyImage的函数,并使用指向数据和每个块中字节数的指针进行调用。块的大小最多可以变化64个字节。在这个例子中,数据只是简单地从UART中打印出来。在您的应用程序中,您可以将此代码替换为代码,以根据需要在其他MCU或外部NVM上存储数据。

步骤7:重新启动
建议在存储完Image数据后重新启动,以确保正确清理了闪存。但是,当前演示无法重启。

注意:这是SSv4 SDK
7.13示例,但相同的概念应在SimplicityStudio v5中工作。在将来的发行版中,对ota_util.c所做的更改将被合并到SDK中,但是现在这些更改是必需的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Smartlabs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值