mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2025-06-07 13:03:45 +02:00
A bit more optimization/cleanup.
This commit is contained in:
parent
97cd184211
commit
94c35d395e
2 changed files with 10 additions and 11 deletions
|
@ -99,18 +99,16 @@ bool secureEq(const void *a, const void *b, unsigned int len) noexcept
|
||||||
return (diff == 0);
|
return (diff == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Crazy hack to force memory to be securely zeroed in spite of the best efforts of optimizing compilers.
|
void burn(volatile void *ptr, unsigned int len)
|
||||||
static void _Utils_doBurn(volatile uint8_t *ptr, unsigned int len)
|
|
||||||
{
|
{
|
||||||
for (unsigned int i = 0; i < len; ++i)
|
Utils::zero((void *)ptr, len);
|
||||||
ptr[i] = 0;
|
// This line is present to force the compiler not to optimize out the memory
|
||||||
|
// zeroing operation above, as burn() is used to erase secrets and other
|
||||||
|
// sensitive data.
|
||||||
|
if ((reinterpret_cast<volatile uint8_t *>(ptr)[0] | reinterpret_cast<volatile uint8_t *>(ptr)[len-1]) != 0)
|
||||||
|
throw BadAllocException;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void (*volatile _Utils_doBurn_ptr)(volatile uint8_t *, unsigned int) = _Utils_doBurn;
|
|
||||||
|
|
||||||
void burn(void *ptr, unsigned int len)
|
|
||||||
{ (_Utils_doBurn_ptr)((volatile uint8_t *)ptr, len); }
|
|
||||||
|
|
||||||
static unsigned long _Utils_itoa(unsigned long n, char *s)
|
static unsigned long _Utils_itoa(unsigned long n, char *s)
|
||||||
{
|
{
|
||||||
if (n == 0)
|
if (n == 0)
|
||||||
|
|
|
@ -137,12 +137,13 @@ bool secureEq(const void *a, const void *b, unsigned int len) noexcept;
|
||||||
/**
|
/**
|
||||||
* Be absolutely sure to zero memory
|
* Be absolutely sure to zero memory
|
||||||
*
|
*
|
||||||
* This uses some hacks to be totally sure the compiler does not optimize it out.
|
* This uses a few tricks to make sure the compiler doesn't optimize it
|
||||||
|
* out, including passing the memory as volatile.
|
||||||
*
|
*
|
||||||
* @param ptr Memory to zero
|
* @param ptr Memory to zero
|
||||||
* @param len Length of memory in bytes
|
* @param len Length of memory in bytes
|
||||||
*/
|
*/
|
||||||
void burn(void *ptr, unsigned int len);
|
void burn(volatile void *ptr, unsigned int len);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param n Number to convert
|
* @param n Number to convert
|
||||||
|
|
Loading…
Add table
Reference in a new issue