From d6414c9ff74e3f8076a1e94d3c6074366119900e Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Mon, 12 Aug 2013 21:25:36 -0400 Subject: Windows compiles! (w/Visual Studio 2012) That's about all it does, but it's a start. --- node/Utils.cpp | 47 ++++++++++++++++++++++++++++++----------------- 1 file changed, 30 insertions(+), 17 deletions(-) (limited to 'node/Utils.cpp') diff --git a/node/Utils.cpp b/node/Utils.cpp index e8561b4c..4f04fb0c 100644 --- a/node/Utils.cpp +++ b/node/Utils.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include "Constants.hpp" @@ -37,19 +38,13 @@ #include #include #include -#include #include #include #endif -#ifdef __WINDOWS__ -#include -#endif - -#include - #include "Utils.hpp" #include "Mutex.hpp" +#include "Salsa20.hpp" namespace ZeroTier { @@ -390,14 +385,18 @@ unsigned int Utils::unhex(const char *hex,void *buf,unsigned int len) void Utils::getSecureRandom(void *buf,unsigned int bytes) { -#ifdef __UNIX_LIKE__ static Mutex randomLock; static char randbuf[32768]; static unsigned int randptr = sizeof(randbuf); +#ifdef __WINDOWS__ + static Salsa20 s20; + volatile bool s20Initialized = false; +#endif Mutex::Lock _l(randomLock); for(unsigned int i=0;i= sizeof(randbuf)) { +#ifdef __UNIX_LIKE__ int fd = ::open("/dev/urandom",O_RDONLY); if (fd < 0) { fprintf(stderr,"FATAL ERROR: unable to open /dev/urandom: %s"ZT_EOL_S,strerror(errno)); @@ -408,18 +407,32 @@ void Utils::getSecureRandom(void *buf,unsigned int bytes) exit(-1); } ::close(fd); +#else +#ifdef __WINDOWS__ + if (!s20Initialized) { + s20Initialized = true; + char ktmp[32]; + char ivtmp[8]; + for(int i=0;i<32;++i) ktmp[i] = (char)rand(); + for(int i=0;i<8;++i) ivtmp[i] = (char)rand(); + double now = Utils::nowf(); + memcpy(ktmp,&now,sizeof(now)); + DWORD tmp = GetCurrentProcessId(); + memcpy(ktmp + sizeof(double),&tmp,sizeof(tmp)); + tmp = GetTickCount(); + memcpy(ktmp + sizeof(double) + sizeof(DWORD),&tmp,sizeof(tmp)); + s20.init(ktmp,256,ivtmp); + for(int i=0;i