#include "rivide/utils/mem.h"
void rivide_cleanse(void *ptr, size_t len) {
volatile unsigned char *p = (volatile unsigned char *)ptr;
size_t i;
for (i = 0; i < len; i++) {
p[i] = 0;
}
#if defined(__GNUC__) || defined(__clang__)
__asm__ volatile("" ::: "memory");
#elif defined(_MSC_VER)
_ReadWriteBarrier();
#endif
}
int rivide_ct_memcmp(const void *a, const void *b, size_t len) {
const unsigned char *pa = (const unsigned char *)a;
const unsigned char *pb = (const unsigned char *)b;
unsigned int diff = 0;
size_t i;
for (i = 0; i < len; i++) {
diff |= (unsigned int)(pa[i] ^ pb[i]);
}
return (int)((diff | (0u - diff)) >> 31);
}
void rivide_ct_select(void *dst, const void *src_a, const void *src_b, size_t len, int selector) {
const unsigned char *a = (const unsigned char *)src_a;
const unsigned char *b = (const unsigned char *)src_b;
unsigned char *d = (unsigned char *)dst;
unsigned char mask;
size_t i;
mask = (unsigned char)(-(selector != 0));
for (i = 0; i < len; i++) {
d[i] = (unsigned char)(a[i] ^ (mask & (a[i] ^ b[i])));
}
}