1
0
mirror of https://github.com/lammertb/libhttp.git synced 2025-12-22 04:02:04 +03:00

Extract random number generator from websocket client code

This commit is contained in:
bel2125
2015-12-08 10:39:15 +01:00
parent 8e536227a4
commit ca3b2c14db

View File

@@ -1571,6 +1571,33 @@ mg_snprintf(const struct mg_connection *conn,
va_end(ap); va_end(ap);
} }
static int64_t
get_random(void)
{
static uint64_t lfsr = 0;
static uint64_t lcg = 0;
struct timespec now;
memset(&now, 0, sizeof(now));
clock_gettime(CLOCK_MONOTONIC, &now);
if (lfsr == 0) {
lfsr = (((uint64_t)now.tv_sec) << 21) ^ (uint64_t)now.tv_nsec
^ (uint64_t)(ptrdiff_t)&now;
lcg = (((uint64_t)now.tv_sec) << 25) + (uint64_t)now.tv_nsec
+ (uint64_t)(ptrdiff_t)&now;
} else {
lfsr = (lfsr >> 1)
| ((((lfsr >> 0) ^ (lfsr >> 1) ^ (lfsr >> 3) ^ (lfsr >> 4)) & 1)
<< 63);
lcg = lcg * 6364136223846793005 + 1442695040888963407;
}
return (lfsr ^ lcg ^ now.tv_nsec);
}
static int static int
get_option_index(const char *name) get_option_index(const char *name)
{ {
@@ -8262,27 +8289,7 @@ mg_websocket_client_write(struct mg_connection *conn,
{ {
int retval = -1; int retval = -1;
char *masked_data = (char *)mg_malloc(((dataLen + 7) / 4) * 4); char *masked_data = (char *)mg_malloc(((dataLen + 7) / 4) * 4);
uint32_t masking_key; uint32_t masking_key = (uint32_t)get_random();
static uint64_t lfsr = 0;
static uint64_t lcg = 0;
struct timespec now;
memset(&now, 0, sizeof(now));
clock_gettime(CLOCK_MONOTONIC, &now);
if (lfsr == 0) {
lfsr = (((uint64_t)now.tv_sec) << 21) ^ (uint64_t)now.tv_nsec
^ (uint64_t)&dataLen;
lcg = (((uint64_t)now.tv_sec) << 25) + (uint64_t)now.tv_nsec
+ (uint64_t)data;
} else {
lfsr = (lfsr >> 1)
| ((((lfsr >> 0) ^ (lfsr >> 1) ^ (lfsr >> 3) ^ (lfsr >> 4)) & 1)
<< 63);
lcg = lcg * 6364136223846793005 + 1442695040888963407;
}
masking_key = (uint32_t)lfsr ^ (uint32_t)lcg ^ (uint32_t)now.tv_nsec;
if (masked_data == NULL) { if (masked_data == NULL) {
/* Return -1 in an error case */ /* Return -1 in an error case */
@@ -11852,6 +11859,9 @@ mg_start(const struct mg_callbacks *callbacks,
return NULL; return NULL;
} }
/* Random number generator will initialize at the first call */
(void)get_random();
if (mg_atomic_inc(&sTlsInit) == 1) { if (mg_atomic_inc(&sTlsInit) == 1) {
#if defined(_WIN32) && !defined(__SYMBIAN32__) #if defined(_WIN32) && !defined(__SYMBIAN32__)