|
@@ -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
|
|
|
}
|