Cortex-M3的微构造能力模拟器(地图)
概述
快速Cortex-M3模拟器创建功率迹线。更多信息可以在https://eprint.iacr.org/2017/1253.pdf中找到
- 用C ++撰写速度
- 读取并模拟使用GNU ARM工具链从汇编/C源创建的.bin文件
仅支持加密原始编码中通常发现的说明。可以在cpu.cpp中添加不支持的说明。
编译
- 编译模拟器:模拟器(包括)主函数存储在静态库中。
- CD libsim/build
- 制作
- 进行安装
- 编译实施固件。我们以sec_add_v05为例:
- CD sec_add_v05/fw/build
- 制作
- 编译实现模拟器(仍以SEC_ADD_V05为例):
- CD sec_add_v05/sim/build
- 制作
使用模拟器
模拟器读取必须位于当前目录中的.bin文件。 .bin文件的名称取决于模拟器源中指定的内容。
开发固件时应该使用模拟器,因此运行模拟的通常方法是
- 将目录更改为固件目录:CD sec_add_v05/fw/build
- 运行模拟器:../ ../sim/build/sim_sec_add_v05 -n 1000
选项'-h'显示有效的选项和参数。
编码新的FW实施
FW实现只是C函数(可能包含装配代码),遵循ARM ABI(R0中的第一个参数,等等),没有主函数。所有C和处理前的功能都可以使用。
该固件可以由支持Cortex-M3的任何ARM编译器编译。仅对ARM GCC进行了测试。通过修改变量“ dir”,可以在脚本/fw.mak中更改ARM编译器可执行文件的路径。
编码新的模拟器
最好启动并修改已经放映的模拟器。模拟器必须包含3个功能:
- void check_sec_algo(void):此函数应用了一些测试向量,并在测试是否通过。
- void t_test_sec_algo(选项和选项):此功能通过生成输入和收集轨迹运行T_TEST
- 包装器调用FW函数(将要模拟)。该包装器(其签名取决于FW函数)必须在模拟器内存中写入参数,并相应地设置处理器寄存器。然后,它开始模拟。模拟后,它必须从模拟内存中复制结果。
支持更多的ARM V7-M说明
按照这些步骤支持模拟器中的指令:
- 在文件libsim/src/opcodes.h中添加解码和掩码值
- 在libsim/src/cpu.cpp中的函数步骤()中解码说明
- 在同一文件中添加函数的执行
- 不要忘记将此新功能添加到cpu.h中的方法列表
宏test_ins32和test_ins16也简化了指令的解码,请不要忘记验证新模拟指令的行为,尤其是管道寄存器reg_a和reg_b的行为!
验证
模拟器支持的每个指令都必须针对RTL模拟进行验证。 RTL树未存储在此存储库中,因为它属于ARM Limited。下面描述的大多数过程仅用于我自己的文档。
- 在模拟器树中的文件实验中添加新说明
- 在模拟器树中的FW构建方向中执行检查> sim_trace.log 2>&1
- 在rtl树中的文件leakage.c中添加新说明
- 编译:制作testcode testName =泄漏
- 模拟:进行运行testName =泄漏
- 将tarmac.log跟踪文件转换为寄存器跟踪文件:../../../../../../../../python/gen_trace.py> verilog_trace.log
- 在模拟器树中复制寄存器跟踪文件:cp〜/documents/repos/maps/rendered/sse050/逻辑/testBench/execution_tb/verilog_trace.log。
- 比较模拟器跟踪和RTL跟踪。视觉使用gvim -d sim_trace.log verilog_trace.log,或使用:./../../../../../../../python/compare_traces.py
错误/限制
知道限制是:
- LDRB/STRB指令的管道比模拟器中实现的管道更为复杂。例如,对于以下代码:
ldrb r2, [r0]
strb r2, [r0]
reg_a和reg_b将无法通过模拟器正确模拟。功能仍然正确。当LDRB和STRB指令之间插入其他指令时,模拟是正确的。