瀏覽代碼

Merge pull request #2091 from aria2/crypto-lib-rand

Prefer random number generator from crypto libraries
Tatsuhiro Tsujikawa 2 年之前
父節點
當前提交
8ae5ce5df3
共有 1 個文件被更改,包括 22 次插入2 次删除
  1. 22 2
      src/SimpleRandomizer.cc

+ 22 - 2
src/SimpleRandomizer.cc

@@ -45,6 +45,14 @@
 #  include <Security/SecRandom.h>
 #endif // __APPLE__
 
+#ifdef HAVE_LIBGNUTLS
+#  include <gnutls/crypto.h>
+#endif // HAVE_LIBGNUTLS
+
+#ifdef HAVE_OPENSSL
+#  include <openssl/rand.h>
+#endif // HAVE_OPENSSL
+
 #include "a2time.h"
 #include "a2functional.h"
 #include "LogFactory.h"
@@ -101,7 +109,19 @@ void SimpleRandomizer::getRandomBytes(unsigned char* buf, size_t len)
 #elif defined(__APPLE__)
   auto rv = SecRandomCopyBytes(kSecRandomDefault, len, buf);
   assert(errSecSuccess == rv);
-#else  // !__MINGW32__ && !__APPLE__
+#elif defined(HAVE_LIBGNUTLS)
+  auto rv = gnutls_rnd(GNUTLS_RND_RANDOM, buf, len);
+  if (rv != 0) {
+    assert(0 == rv);
+    abort();
+  }
+#elif defined(HAVE_OPENSSL)
+  auto rv = RAND_bytes(buf, len);
+  if (rv != 1) {
+    assert(1 == rv);
+    abort();
+  }
+#else
   constexpr static size_t blocklen = 256;
   auto iter = len / blocklen;
   auto p = buf;
@@ -128,7 +148,7 @@ void SimpleRandomizer::getRandomBytes(unsigned char* buf, size_t len)
     assert(0);
     abort();
   }
-#endif // ! __MINGW32__
+#endif // !__MINGW32__ && !__APPLE__ && !HAVE_OPENSSL && !HAVE_LIBGNUTLS
 }
 
 } // namespace aria2