Nordic DFU(Device Firmware Update)

192 阅读2分钟

应用程序验证

引导加载程序通常无法更新/更改,因此被称为不可变引导加载程序(见注释)。当不可变引导加载程序由受信任方编程到芯片上时,不可变引导加载程序被视为永远受信任,因为我们知道它无法更改。在安全术语中,这被称为信任根

现在,可以使用受信任的不可变引导加载程序通过公钥加密来验证应用程序。互联网上有很多关于公钥加密的资源,因此如果您以前从未听说过,我们建议您查找它(特别是数字签名)。

数字签名用于验证应用程序。简单解释一下它的工作原理:

  • 开发者拥有私钥,不应与任何人共享,并应保密。
  • 公钥由私钥生成。
  • 公钥嵌入到引导加载程序代码中。
  • 应用程序固件使用私钥进行签名。
  • 引导加载程序可以将公钥与签名进行匹配,以验证应用程序固件是否由私钥签名。这保证了应用程序固件也来自开发人员,因为只有开发人员才拥有密钥。

image.png

通过这个签名验证,我们知道只有我们签名的应用程序才能在芯片上运行。

image.png

从上图可以看出:左图中,验证成功,因为引导加载程序能够找到签名(红点),右图中,引导加载程序无法找到签名(空放大镜),它将跳过步骤 2 并且不运行应用程序。

DFU

我们从应用程序和引导加载程序开始。我们知道我们无法更改不可变的引导加载程序。因此,对于 DFU,我们只能为应用程序上传新固件。

image.png

现在,我们应该在引导加载程序还是应用程序中运行 DFU 接收器代码?

我们的新固件应该是一个新的应用程序,并且由于我们无法在应用程序运行时覆盖该应用程序,因此我们将在引导加载程序中运行 DFU 接收器代码。

image.png

当引导加载程序处于 DFU 模式时,外部设备(例如 PC)会通过 UART/USB/低功耗蓝牙/LTE-M/NB-IoT/Wi-Fi 分块传输新的固件十六进制。引导加载程序接收这些并将新的固件十六进制写入非易失性存储器。然后芯片再次重置,在新的重新启动时,如果验证成功,引导加载程序将启动到新固件。