12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/crypto/quic_random.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/singleton.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "crypto/random.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace net { 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DefaultRandom : public QuicRandom { 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static DefaultRandom* GetInstance(); 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // QuicRandom implementation 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void RandBytes(void* data, size_t len) OVERRIDE; 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual uint64 RandUint64() OVERRIDE; 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Reseed(const void* additional_entropy, 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t entropy_len) OVERRIDE; 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DefaultRandom() {}; 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~DefaultRandom() {} 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend struct DefaultSingletonTraits<DefaultRandom>; 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DefaultRandom); 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DefaultRandom* DefaultRandom::GetInstance() { 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return Singleton<DefaultRandom>::get(); 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DefaultRandom::RandBytes(void* data, size_t len) { 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) crypto::RandBytes(data, len); 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)uint64 DefaultRandom::RandUint64() { 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint64 value; 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RandBytes(&value, sizeof(value)); 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return value; 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DefaultRandom::Reseed(const void* additional_entropy, size_t entropy_len) { 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No such function exists in crypto/random.h. 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 54b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)QuicRandom* QuicRandom::GetInstance() { return DefaultRandom::GetInstance(); } 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace net 57