Changeset View
Changeset View
Standalone View
Standalone View
contrib/dhcpcd/compat/consttime_memequal.h
- This file was added.
Property | Old Value | New Value |
---|---|---|
svn:eol-style | null | native \ No newline at end of property |
svn:keywords | null | FreeBSD=%H \ No newline at end of property |
svn:mime-type | null | text/plain \ No newline at end of property |
/* | |||||
* Written by Matthias Drochner <drochner@NetBSD.org>. | |||||
* Public domain. | |||||
*/ | |||||
#ifndef CONSTTIME_MEMEQUAL_H | |||||
#define CONSTTIME_MEMEQUAL_H | |||||
inline static int | |||||
consttime_memequal(const void *b1, const void *b2, size_t len) | |||||
{ | |||||
const unsigned char *c1 = b1, *c2 = b2; | |||||
unsigned int res = 0; | |||||
while (len--) | |||||
res |= *c1++ ^ *c2++; | |||||
/* | |||||
* Map 0 to 1 and [1, 256) to 0 using only constant-time | |||||
* arithmetic. | |||||
* | |||||
* This is not simply `!res' because although many CPUs support | |||||
* branchless conditional moves and many compilers will take | |||||
* advantage of them, certain compilers generate branches on | |||||
* certain CPUs for `!res'. | |||||
*/ | |||||
return (1 & ((res - 1) >> 8)); | |||||
} | |||||
#endif /* CONSTTIME_MEMEQUAL_H */ |