【问题标题】:Time measurements differ on microcontroller微控制器上的时间测量值不同
【发布时间】: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


【解决方案1】:

您使用的英飞凌 Aurix 微控制器专为硬实时应用而设计。它有意被设计为提供一致的运行时性能——它缺少大多数可能导致更复杂的 CPU 上性能不一致的功能,例如高速缓存或分支预测。

虽然显示您的代码在这部分具有恒定运行时间只是一个开始,但您的代码在其他 CPU 上运行时仍然可能具有可变运行时间。包含此 CPU 的设备也有可能通过其他渠道泄漏信息,特别是通过功率分析。如果使您的应用程序能够抵抗侧信道分析至关重要,您可能需要考虑使用专为加密应用程序设计的部件。 (Aurix 不是这样的部分。)

【讨论】:

  • 谢谢,是的,在不同的设备上可能存在非 const 运行时,但我专门为 aurix 设计了一篇论文的代码。定时侧信道是最容易利用的......这就是为什么我需要使代码保持恒定时间。 DPA 等将是不属于本论文的进一步步骤。您是否知道为什么不同的测量点会导致不同的输出?一个是 const time,另一个不是?
  • 调用代码之前的前提条件是否始终相同?也许处理器必须根据之前执行的代码清理一些内部寄存器。
  • 我只是在移动测量的入口点和出口点。没有别的……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多