WIOTA 镜像加密支持
镜像加密概述
镜像加密主要应用于生产,防止产品镜像被拷贝,镜像加密后通过烧写工具的加密烧写功能烧录到芯片上,烧录完成后,MCU将通过内部解密因子进行解密运行,板子外部无法读取到正确镜像。
要对镜像进行加密,主要通过修改link文件以及修改编译脚本完成。
加密烧写需要UC烧录工具V3.0.0以上版本支持,若烧写镜像为加密镜像,工具将自动进行加密烧写。
UC烧录工具下载地址:https://uc8088.com/t/topic/89,使用说明
修改link文件
link文件在工程目录的路径为:board/linker_scripts/link.flash.ld
修改如下图所示:
为避免修改错误,这里提供修改后的文本内容:
.fastfunc :
{
. = ALIGN(4);
*(.crt0);
*(.reset)
*(.download);
. = ALIGN(LENGTH(uc_boot) + LENGTH(uc_rom)) - 80;
LONG(0x00000000)
_stbl_end = . + 76;
} > uc_rom
修改编译脚本
编译脚本为工程根目录下的rtconfig.py文件。
修改如下图所示:
为避免修改错误,这里提供修改后的文本内容:
POST_ACTION += './tools/bintools.exe -e -f tools/uboot.bin.e -u $TARGET ' + TARGET_NAME + '\n'
主要增加-e参数,以及使用加密的uboot文件。
加密烧写概述
以下以UBOOT+RT-Thread组合的镜像,描述整个烧写的过程,如下图所示:
举例:UBOOT大小为28KByte,OS可以为RT-Thread或其他操作系统。以下描述顺序与上图标号一致
① 密文烧写
密文烧写从boot_strap区(12KByte)后,到OS的前(12KByte - 80Byte)位置,作为第一步烧写的区域。
② 密文烧写
这一步烧写,从OS的12KByte位置一直到OS镜像结束的位置。
③ 明文烧写
这是boot_strap区,MCU内部规定,该区域必须以明文方式烧写,否则MCU内部无法启用加解密模块进行工作,程序将出现未知情况。
④明文烧写
这里有80字节的数据,为程序中RODATA的映射地址,该部分在程序启动时需要从FLASH中读取并加载,由于程序内部无法知晓硬件加密后的解密方式,因此,必须以明文方式烧写,否则程序将出现未知异常。
明文/密文烧写控制寄存器
控制寄存器地址为0x1A107040,该寄存器长度为32位,其中决定明文或密文烧写的位是bit[4](从0开始编号),当该位为0
时,表示加密不使能,写入FLASH的数据是明文
;当该位为1
时,表示加密使能,写入FLASH数据为密文
。
要注意的是,该寄存器写入为小端模式,即写入时需要大小端转换,这里提供大小端转换宏定义可作参考:
#define BSWAP_32(x) \
(uint32_t)((((uint32_t)(x) & 0xFF000000) >> 24) | \
(((uint32_t)(x) & 0x00FF0000) >> 8) | \
(((uint32_t)(x) & 0x0000FF00) << 8) | \
(((uint32_t)(x) & 0x000000FF) << 24))
// 调用方法
int value = BSWAP_32(1); // value == 0x01000000
注:加密烧写后,只有MCU内部才能读取到正确的程序,因此程序本身无法对OS的烧写进行校验,可能会发生OS程序烧写完毕后,UBOOT无法跳转到OS运行的情况,这时候需要重新烧写OS。