闪存引导加载程序项目 shared_key_boot_serial 是一个基于当前闪存串行引导加载程序实现的示例,具有以下附加特性:
- 引导加载程序位于闪存空间的前 16KB 中。
- 引导加载程序将检查存储在两个 EEPROM 块中的 256 位密钥。
- 如果未找到有效密钥(全部为 FF 的密钥无效):
- 引导加载程序将进入等待上传映像而不解密该映像的模式。如果从地址 0x4000 开始的映像仅包含 1 到 4 个有效密钥,这些密钥将被复制到 EEPROM,并且 0x4000 处的扇区将被擦除。
- 引导加载程序将检查 JTAG 是否被禁用。如果未被禁用,它将禁用 JTAG 并对闪存的第一个扇区进行写保护(仅限发布版配置)。
- 如果找到了有效的密钥映像:
- 引导加载程序在对数据进行编程前,将使用带有 256 位密钥的 AES 解密来解密传入的数据流。
- 传入的映像应包含从地址 0x4000 开始的完整闪存映像,闪存末尾的 16 个字节包含身份验证签名。
- 闪存结束地址 APP_END 在头文件 linker_defines.h 中定义。该文件由密钥创建项目和引导加载程序项目使用。可以将闪存应用结束地址定义为小于实际的闪存结束地址,以减少更新器件的时间,但一旦在引导加载程序中进行了定义,这个值就将成为可以上传到该器件的映像的最大尺寸。
- 引导加载程序将根据地址 0x4000 到闪存末尾减去 16 个字节的数据,计算 AES-CBCMAC 签名。
- 如果该签名与存储在闪存末尾的签名匹配,引导加载程序将隐藏包含密钥的 EEPROM 块并跳转到应用程序代码。
提示: 更改加密密钥的方法是添加一个新函数,该函数可以使用具有当前密钥和特定命令的有效散列来撤销当前密钥。