| Index: webrtc/base/helpers.cc
|
| diff --git a/webrtc/base/helpers.cc b/webrtc/base/helpers.cc
|
| index aa6a6aea187f3e8e4f33b9788315264514fe0d0b..a8389d462e9c08b8db56f130d59109fcb0ccf877 100644
|
| --- a/webrtc/base/helpers.cc
|
| +++ b/webrtc/base/helpers.cc
|
| @@ -13,7 +13,18 @@
|
| #include <limits>
|
| #include <memory>
|
|
|
| +#if defined(FEATURE_ENABLE_SSL)
|
| +#include "webrtc/base/sslconfig.h"
|
| +#if defined(SSL_USE_OPENSSL)
|
| #include <openssl/rand.h>
|
| +#else
|
| +#if defined(WEBRTC_WIN)
|
| +#define WIN32_LEAN_AND_MEAN
|
| +#include <windows.h>
|
| +#include <ntsecapi.h>
|
| +#endif // WEBRTC_WIN
|
| +#endif // else
|
| +#endif // FEATURE_ENABLED_SSL
|
|
|
| #include "webrtc/base/base64.h"
|
| #include "webrtc/base/basictypes.h"
|
| @@ -34,6 +45,7 @@
|
| virtual bool Generate(void* buf, size_t len) = 0;
|
| };
|
|
|
| +#if defined(SSL_USE_OPENSSL)
|
| // The OpenSSL RNG.
|
| class SecureRandomGenerator : public RandomGenerator {
|
| public:
|
| @@ -44,6 +56,79 @@
|
| return (RAND_bytes(reinterpret_cast<unsigned char*>(buf), len) > 0);
|
| }
|
| };
|
| +
|
| +#else
|
| +#if defined(WEBRTC_WIN)
|
| +class SecureRandomGenerator : public RandomGenerator {
|
| + public:
|
| + SecureRandomGenerator() : advapi32_(NULL), rtl_gen_random_(NULL) {}
|
| + ~SecureRandomGenerator() {
|
| + FreeLibrary(advapi32_);
|
| + }
|
| +
|
| + virtual bool Init(const void* seed, size_t seed_len) {
|
| + // We don't do any additional seeding on Win32, we just use the CryptoAPI
|
| + // RNG (which is exposed as a hidden function off of ADVAPI32 so that we
|
| + // don't need to drag in all of CryptoAPI)
|
| + if (rtl_gen_random_) {
|
| + return true;
|
| + }
|
| +
|
| + advapi32_ = LoadLibrary(L"advapi32.dll");
|
| + if (!advapi32_) {
|
| + return false;
|
| + }
|
| +
|
| + rtl_gen_random_ = reinterpret_cast<RtlGenRandomProc>(
|
| + GetProcAddress(advapi32_, "SystemFunction036"));
|
| + if (!rtl_gen_random_) {
|
| + FreeLibrary(advapi32_);
|
| + return false;
|
| + }
|
| +
|
| + return true;
|
| + }
|
| + virtual bool Generate(void* buf, size_t len) {
|
| + if (!rtl_gen_random_ && !Init(NULL, 0)) {
|
| + return false;
|
| + }
|
| + return (rtl_gen_random_(buf, static_cast<int>(len)) != FALSE);
|
| + }
|
| +
|
| + private:
|
| + typedef BOOL (WINAPI *RtlGenRandomProc)(PVOID, ULONG);
|
| + HINSTANCE advapi32_;
|
| + RtlGenRandomProc rtl_gen_random_;
|
| +};
|
| +
|
| +#elif !defined(FEATURE_ENABLE_SSL)
|
| +
|
| +// No SSL implementation -- use rand()
|
| +class SecureRandomGenerator : public RandomGenerator {
|
| + public:
|
| + virtual bool Init(const void* seed, size_t len) {
|
| + if (len >= 4) {
|
| + srand(*reinterpret_cast<const int*>(seed));
|
| + } else {
|
| + srand(*reinterpret_cast<const char*>(seed));
|
| + }
|
| + return true;
|
| + }
|
| + virtual bool Generate(void* buf, size_t len) {
|
| + char* bytes = reinterpret_cast<char*>(buf);
|
| + for (size_t i = 0; i < len; ++i) {
|
| + bytes[i] = static_cast<char>(rand());
|
| + }
|
| + return true;
|
| + }
|
| +};
|
| +
|
| +#else
|
| +
|
| +#error No SSL implementation has been selected!
|
| +
|
| +#endif // WEBRTC_WIN
|
| +#endif
|
|
|
| // A test random generator, for predictable output.
|
| class TestRandomGenerator : public RandomGenerator {
|
|
|