【发布时间】:2019-04-26 22:48:24
【问题描述】:
我正在测量不同 C 函数的循环计数,我尝试将其设为恒定时间以减轻侧通道攻击(加密)。
我正在使用一个微控制器(来自英飞凌的 aurix),它有一个板载周期计数器,每个时钟周期都会递增,我可以读出它。
考虑以下几点:
int result[32], cnt=0;
int secret[32];
/** some other code***/
reset_and_startCounter(); //resets cycles to 0 and starts the counter
int tmp = readCycles(); //read cycles before function call
function(secret) //I want to measure this function, should be constant time
result[cnt++] = readCycles() - tmp; //read out cycles and subtract to get correct result
当我测量如上所示的周期时,有时我会收到不同数量的周期,具体取决于给函数的输入。 (〜1-10个周期差异,功能本身需要大约3000个周期)。
我现在想知道它是否还不是完全恒定的时间,并且计算取决于一些输入。我查看了该函数并执行了以下操作:
void function(int* input){
reset_and_startCounter();
int tmp = readCycles();
/*********************************
******calculations on input******
*********************************/
result[cnt++] = readCycles() - tmp;
}
无论给出什么输入,我都会收到相同数量的周期。
然后我还测量了仅调用函数以及从函数返回所需的时间。无论输入什么,这两个测量值都是相同的。
我一直使用 gcc 编译器标志 -O3,-fomit-frame-pointer。 -O3 因为运行时很关键,我需要它快速。同样重要的是,微控制器上没有运行其他代码(没有操作系统等)
有没有人对此有可能的解释。我想要安全,我的代码是恒定的时间,而那些周期是任意的......
很抱歉这里没有提供可运行的代码,但我相信没有多少人有 Aurix 躺在周围:O
谢谢
【问题讨论】:
-
你的代码中有条件吗?是每次将数据提供给函数时对齐的数据。每当您更改实验时,您的代码是否会更改对齐方式。你能保证测试期间没有中断吗?您是否针对被测代码检查了每个实验的反汇编?
-
预计会有变化,预计微控制器将比微处理器更加一致,这不是因为处理器,而是因为它们周围的系统以及它们的确定性。 (但处理器在它如何获取和缓存以及其他因素方面也发挥着作用)。
-
代码不包含条件。我没有处理数据对齐,我将看看对齐。代码本身不会改变对齐方式。不,我还没有看过汇编代码。中断被禁用并且没有使用缓存。
-
tmp 应该是易变的,以避免混淆时间测量的优化。和/或检查拆卸。
-
你依赖于一个函数来获取周期,如果它真的是一个 cpu 寄存器,那么它应该是一个或一个被测代码两侧的几行代码。 (是的,库调用应该是一致的,但必须查看与库调用相关的所有代码)
标签: c gcc microcontroller cpu-cycles