| Index: third_party/WebKit/Source/wtf/CryptographicallyRandomNumber.cpp
|
| diff --git a/third_party/WebKit/Source/wtf/CryptographicallyRandomNumber.cpp b/third_party/WebKit/Source/wtf/CryptographicallyRandomNumber.cpp
|
| index 227a806eaa9ce1c8ce1332c8381db5fc7e3168ee..a3b1551f53f393aff153c850960606ac3cf3f584 100644
|
| --- a/third_party/WebKit/Source/wtf/CryptographicallyRandomNumber.cpp
|
| +++ b/third_party/WebKit/Source/wtf/CryptographicallyRandomNumber.cpp
|
| @@ -15,25 +15,9 @@
|
| * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
| */
|
|
|
| -/*
|
| - * Arc4 random number generator for OpenBSD.
|
| - *
|
| - * This code is derived from section 17.1 of Applied Cryptography,
|
| - * second edition, which describes a stream cipher allegedly
|
| - * compatible with RSA Labs "RC4" cipher (the actual description of
|
| - * which is a trade secret). The same algorithm is used as a stream
|
| - * cipher called "arcfour" in Tatu Ylonen's ssh package.
|
| - *
|
| - * RC4 is a registered trademark of RSA Laboratories.
|
| - */
|
| -
|
| #include "config.h"
|
| #include "wtf/CryptographicallyRandomNumber.h"
|
|
|
| -#include "wtf/StdLibExtras.h"
|
| -#include "wtf/Threading.h"
|
| -#include "wtf/ThreadingPrimitives.h"
|
| -
|
| namespace WTF {
|
|
|
| static RandomNumberSource sourceFunction;
|
| @@ -43,143 +27,16 @@ void setRandomSource(RandomNumberSource source)
|
| sourceFunction = source;
|
| }
|
|
|
| -namespace {
|
| -
|
| -class ARC4Stream {
|
| -public:
|
| - ARC4Stream();
|
| -
|
| - uint8_t i;
|
| - uint8_t j;
|
| - uint8_t s[256];
|
| -};
|
| -
|
| -class ARC4RandomNumberGenerator {
|
| - USING_FAST_MALLOC(ARC4RandomNumberGenerator);
|
| -public:
|
| - ARC4RandomNumberGenerator();
|
| -
|
| - uint32_t randomNumber();
|
| - void randomValues(void* buffer, size_t length);
|
| -
|
| -private:
|
| - inline void addRandomData(unsigned char *data, int length);
|
| - void stir();
|
| - void stirIfNeeded();
|
| - inline uint8_t getByte();
|
| - inline uint32_t getWord();
|
| -
|
| - ARC4Stream m_stream;
|
| - int m_count;
|
| - Mutex m_mutex;
|
| -};
|
| -
|
| -ARC4Stream::ARC4Stream()
|
| -{
|
| - for (int n = 0; n < 256; n++)
|
| - s[n] = static_cast<uint8_t>(n);
|
| - i = 0;
|
| - j = 0;
|
| -}
|
| -
|
| -ARC4RandomNumberGenerator::ARC4RandomNumberGenerator()
|
| - : m_count(0)
|
| -{
|
| -}
|
| -
|
| -void ARC4RandomNumberGenerator::addRandomData(unsigned char* data, int length)
|
| -{
|
| - m_stream.i--;
|
| - for (int n = 0; n < 256; n++) {
|
| - m_stream.i++;
|
| - uint8_t si = m_stream.s[m_stream.i];
|
| - m_stream.j += si + data[n % length];
|
| - m_stream.s[m_stream.i] = m_stream.s[m_stream.j];
|
| - m_stream.s[m_stream.j] = si;
|
| - }
|
| - m_stream.j = m_stream.i;
|
| -}
|
| -
|
| -void ARC4RandomNumberGenerator::stir()
|
| -{
|
| - unsigned char randomness[128];
|
| - size_t length = sizeof(randomness);
|
| - (*sourceFunction)(randomness, length);
|
| - addRandomData(randomness, length);
|
| -
|
| - // Discard early keystream, as per recommendations in:
|
| - // http://www.wisdom.weizmann.ac.il/~itsik/RC4/Papers/Rc4_ksa.ps
|
| - for (int i = 0; i < 256; i++)
|
| - getByte();
|
| - m_count = 1600000;
|
| -}
|
| -
|
| -void ARC4RandomNumberGenerator::stirIfNeeded()
|
| -{
|
| - if (m_count <= 0)
|
| - stir();
|
| -}
|
| -
|
| -uint8_t ARC4RandomNumberGenerator::getByte()
|
| -{
|
| - m_stream.i++;
|
| - uint8_t si = m_stream.s[m_stream.i];
|
| - m_stream.j += si;
|
| - uint8_t sj = m_stream.s[m_stream.j];
|
| - m_stream.s[m_stream.i] = sj;
|
| - m_stream.s[m_stream.j] = si;
|
| - return (m_stream.s[(si + sj) & 0xff]);
|
| -}
|
| -
|
| -uint32_t ARC4RandomNumberGenerator::getWord()
|
| -{
|
| - uint32_t val;
|
| - val = getByte() << 24;
|
| - val |= getByte() << 16;
|
| - val |= getByte() << 8;
|
| - val |= getByte();
|
| - return val;
|
| -}
|
| -
|
| -uint32_t ARC4RandomNumberGenerator::randomNumber()
|
| -{
|
| - MutexLocker locker(m_mutex);
|
| -
|
| - m_count -= 4;
|
| - stirIfNeeded();
|
| - return getWord();
|
| -}
|
| -
|
| -void ARC4RandomNumberGenerator::randomValues(void* buffer, size_t length)
|
| -{
|
| - MutexLocker locker(m_mutex);
|
| -
|
| - unsigned char* result = reinterpret_cast<unsigned char*>(buffer);
|
| - stirIfNeeded();
|
| - while (length--) {
|
| - m_count--;
|
| - stirIfNeeded();
|
| - result[length] = getByte();
|
| - }
|
| -}
|
| -
|
| -ARC4RandomNumberGenerator& sharedRandomNumberGenerator()
|
| -{
|
| - AtomicallyInitializedStaticReference(ARC4RandomNumberGenerator, randomNumberGenerator, new ARC4RandomNumberGenerator);
|
| - return randomNumberGenerator;
|
| -}
|
| -
|
| -}
|
| -
|
| -
|
| uint32_t cryptographicallyRandomNumber()
|
| {
|
| - return sharedRandomNumberGenerator().randomNumber();
|
| + uint32_t result;
|
| + cryptographicallyRandomValues(&result, sizeof(result));
|
| + return result;
|
| }
|
|
|
| void cryptographicallyRandomValues(void* buffer, size_t length)
|
| {
|
| - sharedRandomNumberGenerator().randomValues(buffer, length);
|
| + (*sourceFunction)(reinterpret_cast<unsigned char*>(buffer), length);
|
| }
|
|
|
| }
|
|
|