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