时间测量在微控制器上有所不同

时间:2018-11-24 19:30:08

标签: c gcc microcontroller cpu-cycles

我正在测量不同的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

谢谢

1 个答案:

答案 0 :(得分:1)

您使用的Infineon Aurix微控制器是为硬实时应用设计的。 故意旨在提供一致的运行时性能-它缺少大多数功能,这些功能可能导致更复杂的CPU上的性能不一致,例如高速缓存或分支预测。

尽管这表明您的代码在这部分上具有恒定的运行时间,但在其他CPU上运行时,代码仍可能具有可变的运行时间。包含此CPU的设备也有可能通过其他渠道(特别是通过功耗分析)泄漏信息。如果使您的应用程序对旁通道分析具有抵抗力至关重要,则您可能需要考虑使用专为加密应用程序设计的部件。 (Aurix并不是这样的一部分。)