本帖最后由 纪国圣 于 2021-1-28 21:29 编辑
#申请原创#
1.SLIB简介
安全库区(SLIB)是一项AT32特有的代码安全保护功能。有别于传统的软件加密和硬件代码加密,其从硬件上对特定地址的代码进行隔离,用户可以调用代码,但不能对其逆向操作,可以保护特定地址的代码不被恶意读写。其原理类似于TrustZone,但SLIB比其更加灵活。具体详见下图官方的介绍。
2.SLIB的启动与停止流程简介
3.SLIB使用方法
3.1被保护代码工程的建立
首先拿一个可以正常使用的AT32F407VG工程。在此基础之上添加一个二次函数求根函数、开方函数和常量sin_data,作为此次被SLIB保护的代码核心。
这里说明一下之所以写一个开方函数div_sqrt而不用math.h中的sqrt,是因为这牵扯到安全库区代码与用户区代码的关联性。
回到工程的建立。在main函数中添加Get_Quadratic_Function以验证代码的正确性。
编译下载,可以看到代码一项无误。
接下来开始对工程进行设置。首先将Get_Root.c与constant.c通过右键选择 Option for File ‘Get_Root.c’和Option for File ‘constant.c’将其编译过程设置为Execute-only Code。
之后将project\Objects下的AT32F407.sct拷贝出来放置在与AT32F407.uvprojx同一个文件路径中。
依次点击Target 1— Optios for Target 'Target 1'—Linker,按图所示设置拷贝出来的AT32F407.sct。
其中第二步选择与AT32F407.uvprojx同一个文件路径的AT32F407.sct。Get_Root.o被设置在0x08001000,0x08001000作为指令安全库区;constant.o被设置在0x08002000,0x08002000作为数据安全库区。IRAM1和IRAM2主要是为了避免SLIB保护区的代码与终端用户的代码用到相同的RAM而产生的冲突问题。
sin_data也要设置存储地址。
按照启动SLIB流程添加代码。
编译后会出现警告,暂不理会。打开ArteryICPProgrammer.exe,按图所示启动SLIB下载程序。
依次点击Target 1— Optios for Target 'Target 1'—Linker,在Misc controls这一栏,添加--symdefs=GetRoot.txt命令产生符号定义文件。
打开GetRoot.txt,可以看到各函数编译后的地址。
只保留Get_Quadratic_Function、div_sqrt、sin_data。
3.2测试工程的建立
新建工程,将AT32F407.sct拷贝出来放置在与AT32F407.uvprojx同一个文件路径中,按图所示修改。
其中第二步选择与AT32F407.uvprojx同一个文件路径的AT32F407.sct。第四步需要根据3.1中的AT32F407.sct配置修改。
添加GetRoot.txt到工程,将GetRoot.txt的文件类型更改为Object文件。
添加测试函数。
编译运行,一切正常。
进入调试状态,发现0x08001000开始的程序不能读取。
0x08002000开始的数据读取正常。
这些说明SLIB已如预期工作。
官方文档如下:
AT32F403A_407 安全库区(SLIB) 应用指南.pdf
(1.56 MB)
官方例程:
AT32F403A_407_sLib_Demo_V1.0.1.zip
(225.39 KB)
本文例程:
SLIB.zip
(2.02 MB)
|