我正在测量不同 C 函数的循环计数,我尝试将其设为恒定时间以减轻侧信道攻击(加密)。
我正在使用一个微控制器(来自 infineon 的 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
谢谢