W80X系列芯片的程序保护措施操作步骤

发布于 2022-10-18 11:09:20

W80X系列芯片的程序保护措施共有三种方式:防拷贝、固件加密、固件签名。在防拷贝的基础上使用固件签名和固件加密可以进一步提高保护级别。防拷贝的原理是利用芯片的Flash Unique ID的唯一性来对比判断,如果一致才能继续运行程序。在生产烧录固件阶段,我们将待烧录测试的设备称作DUT,在固件烧录时,烧录工具会读取DUT的Flash Unique ID,加密后写入Flash的A地址,烧录成功后,设备程序运行时,先读取芯片的Flash Unique ID,接着读取A地址存放的加密ID,进行解密,解密后对比两个ID是否一致,如果一致,接着运行程序,如果不一致,则认为程序被拷贝运行,停止运行。
1、安装openssl工具
需要1.0及以上版本,文件夹中自带了win 64位1.1版本的安装文件,也可以从其他地方下载。安装过程按照提示点下一步直到完成即可。
2、解压FirmUpdate_2.2.0.8.zip
3、从官网获取SDK
4、固件加密和固件签名
4.1使用CDK编译工具

  • 在tools/W80x/utilities/aft_build_project.sh文件中:
    设置code_encrypt = 1表示使能固件加密;
    设置signature = 1标识使能固件签名;
    将5个openssl.exe添加对应的安装路径;
    设置固件加密秘钥参数,参数长度为16字节,比如下图中使用的是0~F这16个十六进制数字,则在.sh文件中参数位置写的是对应的ASCII码;
  • 在tools/W80x/ca/key.txt文件中:
    修改为对应的固件加密key值,长度为16字节数据;
    image.png
  • 在tools/W80x/ca/cakey.pem和capub.pem文件中:
    cakey.pem是RSA签名私钥,用于openssl签名固件,capub.pem是公钥,用于解签,将两个文件里的内容替换为自己的公私钥。

4.2使用make编译工具

  • 在tools/w800/.config文件中:
    设置 CONFIG_W800_IMAGE_SIGNATURE = 1,使能固件签名;
    设置CONFIG_W800_CODE_ENCRYPT = 1,使能固件加密;
    在tools/w800/rules.mk文件中:
    如下图位置,修改固件加密使用的key,长度为16字节数据转换为对应的ASCII字符串;
    image.png
  • 在tools/w800/ca/key.txt文件中:
    修改为对应的固件加密key值,长度为16字节数据;
  • 在tools/800/ca/cakey.pem和capub.pem文件中:
    cakey.pem是RSA签名私钥,用于openssl签名固件,capub.pem是公钥,用于解签,将两个文件里的内容替换为自己的公私钥。

5、防拷贝判断
SDK demo中的Avoid_Copy_Firm接口为参考实现,主要流程为读取当前芯片的Flash Unique ID,读取ID加密后的数据,解密对比是否一致,若不一致则中断程序运行。可以将该接口放在mian函数的起始位置或者关键路径。
示例中有三个地方用户可以自定义,对应于烧录工具用例中的修改,即:解密方式、加密数据存储位置、秘钥。

  • 解密方式:芯片提供了硬件加解密的功能,能实现rc4、aes、des、3des的加解密,如果采用了其他的加密方式,则需要自己实现相关的解密功能;
  • 加密数据存储位置:需要和烧录工具AvoidCopyTestCase用例中的Location参数一致;
  • 秘钥:需要和烧录工具AvoidCopyTestCase用例中的Key参数一致,demo中直接用数组的方式指定了秘钥,也可以是存放在flash中的某个位置去读取;

6、固件烧录

  • 将编译后的固件复制到烧录工具文件夹内;
  • 用自己的capub.pem替换工具文件夹中的已有文件;
  • 在ToolConfig.ini文件中:
    修改TestCaseConfig=AvoidCopyTestCases.xml,此处以防拷贝烧录为例,如果还需要其他测试功能,可以参考《WM_W800批量烧录工具具体操作指南_V2.1.doc》进行用例组合;
    添加设备端口号至COMS Layout;
    保存关闭,如果已打开工具,需要关闭工具后重新打开,配置才能生效;
  • 在AvoidCopyTestCases.xml文件中:
    倒数第三个用例AvoidCopyTestCase的功能为读取DUT的Flash Unique ID,用参数Key的值做为秘钥进行AES128 ECB加密,将加密结果写入参数Location指定的位置。需要与步骤5中的三个地方对应:
    加密方式:工具使用的加密方式为AES128 ECB,如果想采用其他的加密方式需要提出需求对工具进行修改;
    加密秘钥,需要和加密方式对应,如果采用默认的AES128 ECB加密,那么秘钥的长度为16字节,转化为对应的ASCII字符串,如示例中的秘钥为0~F这16个十六进制数转化为对应的ASCII字符串;
    保存位置,加密后的数据保存位置。
  • 修改最后的FirmUpdateTestCase用例中固件的名字,与复制的固件名字一致,保存关闭;
    打开FirmUpdate.exe,勾选设备端口号,拉低boot(PA0),按下reset,开始烧录固件,烧录完成后会提示成功或者失败;
    拉高boot,按下reset复位设备,即可验证防拷贝功能是否生效。

7、注意事项
如果在开发验证阶段使用了FirmUpdate.exe烧录了防拷贝固件,后续想烧录不带防拷贝功能的固件,则需要修改AvoidCopyTestCases.xml中倒数第四个用例WriteSignEnableTestCase中的参数Enable改为0,同时WriteDebugLevelTestCase的调试级别改为0,烧录固件后即可。之后就可以使用Upgrade Tools工具正常烧录固件。

1 条评论

发布
问题