Skip to content

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);
}
Clone this wiki locally