我有两段代码片段,应该研究一下它们是否满足常量时间需求。如果没有实现,则应修订规范。
首先:
unit8_t a[128]
unit8_t data[128]
if(k) //k is a secret variable
memcpy(data,a,128);这段代码不满足常量时间要求,因为如果k为false,则不会执行任何复制指令,并且执行时间将比执行memcpy快得多。但我真的不知道,如何改变才能满足需求。
第二:
uint8_t a[128], b[128];
uint8_t data[128];
memcpy(data, k ? a : b, 128);我猜它也不满足常量时间的要求,因为三元运算符构成了一个分支。但在这里我不确定,我也不知道如何重写代码。
发布于 2018-10-15 03:42:07
第一个示例:
unit8_t a[128]
unit8_t data[128]
if(k) //k is a secret variable
memcpy(data,a,128);让我们对其进行分支:
分支A对于k ==为真:
unit8_t a[128];
unit8_t data[128];
memcpy(data,a,128);分支B表示k ==为false:
unit8_t a[128];
unit8_t data[128];
//no memcpy第二个例子:
uint8_t a[128], b[128];
uint8_t data[128];
memcpy(data, k ? a : b, 128);分支A对于k ==为真:
uint8_t a[128], b[128];
uint8_t data[128];
memcpy(data, a, 128); //from a to data分支B表示k ==为false:
uint8_t a[128], b[128];
uint8_t data[128];
memcpy(data, b, 128); //from b to data显然,这两个示例执行不同的任务,但是第二个示例可以在两个分支的相同步骤中执行。但是在那里有一个很大的“但是”,因为编译器可能会将其优化为对两个分支都不相同的代码,并且不会为该任务提供恒定的执行时间。
发布于 2018-10-15 04:04:12
在没有其他细节的情况下,我们不能假设优化器在这里是“聪明的”。在第一种情况下,您可以添加
else
memcpy(a, data, 128);在第二种情况下,没有什么可添加的。
让我添加一些可能会影响计时的考虑因素
然而,由于示例的简单性,它看起来像是计时攻击的第一个练习。我现在不会担心所有这些事情。
https://stackoverflow.com/questions/52806327
复制相似问题