我正在测量不同的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
谢谢
答案 0 :(得分:1)
您使用的Infineon Aurix微控制器是为硬实时应用设计的。 故意旨在提供一致的运行时性能-它缺少大多数功能,这些功能可能导致更复杂的CPU上的性能不一致,例如高速缓存或分支预测。
尽管这表明您的代码在这部分上具有恒定的运行时间,但在其他CPU上运行时,代码仍可能具有可变的运行时间。包含此CPU的设备也有可能通过其他渠道(特别是通过功耗分析)泄漏信息。如果使您的应用程序对旁通道分析具有抵抗力至关重要,则您可能需要考虑使用专为加密应用程序设计的部件。 (Aurix并不是这样的一部分。)