Skip to content

WIOTA 镜像加密支持

镜像加密概述

镜像加密主要应用于生产,防止产品镜像被拷贝,镜像加密后通过烧写工具的加密烧写功能烧录到芯片上,烧录完成后,MCU将通过内部解密因子进行解密运行,板子外部无法读取到正确镜像。

要对镜像进行加密,主要通过修改link文件以及修改编译脚本完成。

加密烧写需要UC烧录工具V3.0.0以上版本支持,若烧写镜像为加密镜像,工具将自动进行加密烧写。

UC烧录工具下载地址https://uc8088.com/t/topic/89使用说明

link文件在工程目录的路径为:board/linker_scripts/link.flash.ld

修改如下图所示:

link文件修改

为避免修改错误,这里提供修改后的文本内容:

    .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。

Back to top