如何编写一个常量时间函数来将最高有效位复制到所有位

时间:2013-11-18 22:38:34

标签: c cryptography bit-manipulation

我想在C中编写一个函数,它取uint8_t的MSB,如果已设置,则返回0xFF,如果不是0x00。简而言之,它返回一个整数,其中所有位都设置为与MSB相同的值。

但是我想以完全恒定的时间方式完成它,没有分支,没有数组偏移,只是保证总是触及相同位数的数学运算。理想情况下,没有任何未定义的行为。怎么办呢?

3 个答案:

答案 0 :(得分:6)

怎么样:

#define uint8_msb_to_all_bits(x) (0xFF * ((x) >> 7))

甚至更好:

#define uint8_msb_to_all_bits(x) (-((x) >> 7))

这两种方法的工作方式是,如果x是8位无符号整数,则x >> 7如果x的MSB设置则为1,否则为0。剩下的就是将1映射到0xFF,这可以通过乘法来完成,或者在这种特殊情况下,只需通过否定数字来完成。

(是的,negating an unsigned number is well defined in C。)

答案 1 :(得分:5)

怎么样?
- (x >> 7)

仅保留MSB,并使用数学否定将其复制到所有位。

答案 2 :(得分:2)

鉴于你uint8_t声明:

uint8_t x = // MSB is either 1 or 0 if `x` depending on the signed value of `x`

假设有符号整数的2补码的作弊:

return (((uint16_t)(int8_t)x) >> 8) & 0xff;