30 行
1.1 KiB
C
30 行
1.1 KiB
C
/* mem.c —— 常量时间内存操作与安全清零 */
|
|
#include "paze/mem.h"
|
|
#include <string.h>
|
|
|
|
int paze_ct_equal(const void *a, const void *b, size_t n) {
|
|
const volatile uint8_t *x = (const volatile uint8_t *)a;
|
|
const volatile uint8_t *y = (const volatile uint8_t *)b;
|
|
uint8_t diff = 0;
|
|
for (size_t i = 0; i < n; i++) diff |= (uint8_t)(x[i] ^ y[i]);
|
|
return diff; /* 0 = equal, non-zero = different */
|
|
}
|
|
|
|
void paze_ct_select(void *dst, const void *src, size_t n, int cond) {
|
|
/* cond -> mask: 真=0xFF,假=0x00 */
|
|
uint8_t mask = cond ? 0xFFu : 0x00u;
|
|
volatile uint8_t *d = (volatile uint8_t *)dst;
|
|
const volatile uint8_t *s = (const volatile uint8_t *)src;
|
|
for (size_t i = 0; i < n; i++) d[i] = (uint8_t)(d[i] ^ ((d[i] ^ s[i]) & mask));
|
|
}
|
|
|
|
void paze_memzero(void *p, size_t n) {
|
|
/* volatile 指针逐字节清零,阻止死存储消除。 */
|
|
volatile uint8_t *v = (volatile uint8_t *)p;
|
|
while (n--) *v++ = 0;
|
|
}
|
|
|
|
void paze_xor_block(uint8_t *dst, const uint8_t *a, const uint8_t *b, size_t n) {
|
|
for (size_t i = 0; i < n; i++) dst[i] = (uint8_t)(a[i] ^ b[i]);
|
|
}
|