Windows compiles! (w/Visual Studio 2012) That's about all it does, but it's a start.

This commit is contained in:
Adam Ierymenko 2013-08-12 21:25:36 -04:00
parent 5076c75b07
commit d6414c9ff7
30 changed files with 191 additions and 87 deletions

View file

@ -29,6 +29,7 @@
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#include <sys/stat.h>
#include "Constants.hpp"
@ -37,19 +38,13 @@
#include <errno.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/uio.h>
#include <dirent.h>
#endif
#ifdef __WINDOWS__
#include <Windows.h>
#endif
#include <sys/stat.h>
#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<bytes;++i) {
if (randptr >= 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<sizeof(randbuf);++i) randbuf[i] = (char)rand();
}
s20.encrypt(randbuf,randbuf,sizeof(randbuf));
#else
no getSecureRandom() implementation;
#endif
#endif
randptr = 0;
}
((char *)buf)[i] = randbuf[randptr++];
}
#else // !__UNIX_LIKE__
#ifdef __WINDOWS__
probably use windows capi...;
#else // !__WINDOWS__
no getSecureRandom() implementation!
#endif // __WINDOWS__
#endif // __UNIX_LIKE__
}
void Utils::lockDownFile(const char *path,bool isDir)
@ -428,7 +441,7 @@ void Utils::lockDownFile(const char *path,bool isDir)
chmod(path,isDir ? 0700 : 0600);
#else
#ifdef _WIN32
error need win32;
// TODO: windows ACL hell...
#endif
#endif
}