Bladeren bron

Make generateRandomBytes less biased.

Nils Maier 12 jaren geleden
bovenliggende
commit
86c61fcf5b
3 gewijzigde bestanden met toevoegingen van 22 en 3 verwijderingen
  1. 19 0
      src/SimpleRandomizer.cc
  2. 2 0
      src/SimpleRandomizer.h
  3. 1 3
      src/util.cc

+ 19 - 0
src/SimpleRandomizer.cc

@@ -115,4 +115,23 @@ long int SimpleRandomizer::operator()(long int to)
   return getRandomNumber(to);
 }
 
+void SimpleRandomizer::getRandomBytes(unsigned char *buf, size_t len)
+{
+#ifdef __MINGW32__
+  if (!CryptGenRandom(cryProvider_, len, (PBYTE)buf)) {
+    throw std::bad_alloc();
+  }
+#else
+  while (len) {
+    union {
+      int32_t r;
+      uint8_t b[4];
+    } r = { (int32_t)random() };
+    for (auto i = 0; i < 4 && len; ++i, --len) {
+      *buf++ = r.b[i];
+    }
+  }
+#endif
+}
+
 } // namespace aria2

+ 2 - 0
src/SimpleRandomizer.h

@@ -71,6 +71,8 @@ public:
    */
   virtual long int getRandomNumber(long int to) CXX11_OVERRIDE;
 
+  void getRandomBytes(unsigned char *buf, size_t len);
+
   long int operator()(long int to);
 };
 

+ 1 - 3
src/util.cc

@@ -1595,9 +1595,7 @@ namespace {
 void generateRandomDataRandom(unsigned char* data, size_t length)
 {
   const auto& rd = SimpleRandomizer::getInstance();
-  for(size_t i = 0; i < length; ++i) {
-    data[i] = static_cast<unsigned long>(rd->getRandomNumber(256));
-  }
+  rd->getRandomBytes(data, length);
 }
 } // namespace