From ebaeedead1062335aa18e7093f95b8e93e294a7e Mon Sep 17 00:00:00 2001 From: Leonid Evdokimov Date: Fri, 11 Feb 2011 01:28:51 +0200 Subject: [PATCH] Improve nonce generation: srand() should be called only during startup. --- http-connect.c | 1 - http-relay.c | 1 - main.c | 9 +++++++++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/http-connect.c b/http-connect.c index 6df1a03..ce34c94 100644 --- a/http-connect.c +++ b/http-connect.c @@ -210,7 +210,6 @@ static struct evbuffer *httpc_mkconnect(redsocks_client *client) /* prepare an random string for cnounce */ char cnounce[17]; - srand(time(0)); for (int i = 0; i < 16; i += 4) sprintf(cnounce + i, "%02x", rand() & 65535); diff --git a/http-relay.c b/http-relay.c index 7ad2c67..33c90c7 100644 --- a/http-relay.c +++ b/http-relay.c @@ -321,7 +321,6 @@ static void httpr_relay_write_cb(struct bufferevent *buffev, void *_arg) /* prepare an random string for cnounce */ char cnounce[17]; - srand(time(0)); for (int i = 0; i < 16; i += 4) sprintf(cnounce + i, "%04x", rand() & 65535); diff --git a/main.c b/main.c index b8fb5a0..e375df8 100644 --- a/main.c +++ b/main.c @@ -46,6 +46,14 @@ static void terminate(int sig, short what, void *_arg) log_error(LOG_WARNING, "event_loopbreak"); } +static void red_srand() +{ + struct timeval tv; + gettimeofday(&tv, NULL); + // using tv_usec is a bit less predictable than tv_sec + srand(tv.tv_sec*1000000+tv.tv_usec); +} + int main(int argc, char **argv) { int error; @@ -56,6 +64,7 @@ int main(int argc, char **argv) int opt; int i; + red_srand(); while ((opt = getopt(argc, argv, "tc:p:")) != -1) { switch (opt) { case 't':