Really remove RNG seeds from the stack

This commit is contained in:
Nick Mathewson 2013-08-19 09:52:29 -04:00
parent bb524712f6
commit f5ced88cec
3 changed files with 20 additions and 6 deletions

View File

@ -161,7 +161,7 @@ arc4_seed_win32(void)
if (!CryptGenRandom(provider, sizeof(buf), buf)) if (!CryptGenRandom(provider, sizeof(buf), buf))
return -1; return -1;
arc4_addrandom(buf, sizeof(buf)); arc4_addrandom(buf, sizeof(buf));
memset(buf, 0, sizeof(buf)); evutil_memclear_(buf, sizeof(buf));
arc4_seeded_ok = 1; arc4_seeded_ok = 1;
return 0; return 0;
} }
@ -199,7 +199,7 @@ arc4_seed_sysctl_linux(void)
return -1; return -1;
arc4_addrandom(buf, sizeof(buf)); arc4_addrandom(buf, sizeof(buf));
memset(buf, 0, sizeof(buf)); evutil_memclear_(buf, sizeof(buf));
arc4_seeded_ok = 1; arc4_seeded_ok = 1;
return 0; return 0;
} }
@ -239,7 +239,7 @@ arc4_seed_sysctl_bsd(void)
return -1; return -1;
arc4_addrandom(buf, sizeof(buf)); arc4_addrandom(buf, sizeof(buf));
memset(buf, 0, sizeof(buf)); evutil_memclear_(buf, sizeof(buf));
arc4_seeded_ok = 1; arc4_seeded_ok = 1;
return 0; return 0;
} }
@ -284,8 +284,8 @@ arc4_seed_proc_sys_kernel_random_uuid(void)
arc4_addrandom(entropy, nybbles/2); arc4_addrandom(entropy, nybbles/2);
bytes += nybbles/2; bytes += nybbles/2;
} }
memset(entropy, 0, sizeof(entropy)); evutil_memclear_(entropy, sizeof(entropy));
memset(buf, 0, sizeof(buf)); evutil_memclear_(buf, sizeof(buf));
arc4_seeded_ok = 1; arc4_seeded_ok = 1;
return 0; return 0;
} }
@ -309,7 +309,7 @@ static int arc4_seed_urandom_helper_(const char *fname)
if (n != sizeof(buf)) if (n != sizeof(buf))
return -1; return -1;
arc4_addrandom(buf, sizeof(buf)); arc4_addrandom(buf, sizeof(buf));
memset(buf, 0, sizeof(buf)); evutil_memclear_(buf, sizeof(buf));
arc4_seeded_ok = 1; arc4_seeded_ok = 1;
return 0; return 0;
} }

View File

@ -2109,6 +2109,18 @@ _evutil_weakrand(void)
#endif #endif
} }
/**
* Volatile pointer to memset: we use this to keep the compiler from
* eliminating our call to memset.
*/
void * (*volatile evutil_memset_volatile_)(void *, int, size_t) = memset;
void
evutil_memclear_(void *mem, size_t len)
{
evutil_memset_volatile_(mem, 0, len);
}
int int
evutil_sockaddr_is_loopback(const struct sockaddr *addr) evutil_sockaddr_is_loopback(const struct sockaddr *addr)
{ {

View File

@ -320,6 +320,8 @@ HANDLE evutil_load_windows_system_library(const TCHAR *library_name);
#endif #endif
#endif #endif
void evutil_memclear_(void *mem, size_t len);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif