| 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 {
 | 
| 
 |