-
Notifications
You must be signed in to change notification settings - Fork 15
C Macros for Constant Time
scauligi edited this page Mar 19, 2018
·
2 revisions
// Equivalent to (a < 0 ? -1 : 0)
uint32_t const_msb(uint32_t a) {
return 0 - (a >> (sizeof(a) * 8 - 1));
}
// Equivalent to (a == 0 ? -1 : 0)
uint32_t const_is_zero(uint32_t a) {
return const_msb(~a & (a - 1));
}
// Equivalent to (a < b ? -1 : 0)
uint32_t const_lt(uint32_t a, uint32_t b) {
return const_msb(a ^ ((a ^ b) | ((a - b) ^ b)));
}
// Equivalent to (a >= b ? -1 : 0)
uint32_t const_ge(uint32_t a, uint32_t b) {
return ~const_lt(a, b);
}
// Equivalent to (a == b ? -1 : 0)
uint32_t const_eq(uint32_t a, uint32_t b) {
return const_is_zero(a ^ b);
}
// Equivalent to (cond ? a : b)
uint32_t const_select(uint32_t cond, uint32_t a, uint32_t b) {
return (cond & a) | (~cond & b);
}