#include #include int consttime_memcmp0(const void *x, const void *y, size_t n) { const unsigned char *p = x; const unsigned char *q = y; int diff = 0; unsigned int mask = 0; size_t i; while (0 < n--) { const int d = *p++ - *q++; unsigned int u = d; u |= (u >> 1); u |= (u >> 2); u |= (u >> 4); for (i = 8; i <= CHAR_BIT; i <<= 1) u |= (u >> i); for (i = CHAR_BIT; i < CHAR_BIT*sizeof(u); i <<= 1) u |= (u << i); diff = ((mask & diff) | (~mask & d)); mask = ((mask & mask) | (~mask & u)); } return diff; } int consttime_memcmp1(const void *x, const void *y, size_t n) { const unsigned char *p = x; const unsigned char *q = y; int diff = 0; unsigned int mask = ~(unsigned int)0; size_t i; while (0 < n--) { const int d = *p++ - *q++; unsigned int u = d; u |= (u >> 1); u |= (u >> 2); u |= (u >> 4); for (i = 8; i <= CHAR_BIT; i <<= 1) u |= (u >> i); u &= 1; diff = ((~mask & diff) | (mask & d)); mask = ((~mask & mask) | (mask & (mask + u))); } return diff; }