1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "remoting/host/host_secret.h"
6
7#include <string>
8
9#include "base/logging.h"
10#include "base/rand_util.h"
11#include "base/strings/string_number_conversions.h"
12
13namespace remoting {
14
15namespace {
16
17// 5 digits means 100K possible host secrets with uniform distribution, which
18// should be enough for short-term passwords, given that we rate-limit guesses
19// in the cloud and expire access codes after a small number of attempts.
20const int kHostSecretLength = 5;
21const char kHostSecretAlphabet[] = "0123456789";
22
23// Generates cryptographically strong random number in the range [0, max).
24int CryptoRandomInt(int max) {
25  uint32 random_int32;
26  base::RandBytes(&random_int32, sizeof(random_int32));
27  return random_int32 % max;
28}
29
30}  // namespace
31
32std::string GenerateSupportHostSecret() {
33  std::string result;
34  int alphabet_size = strlen(kHostSecretAlphabet);
35  result.resize(kHostSecretLength);
36  for (int i = 0; i < kHostSecretLength; ++i) {
37    result[i] = kHostSecretAlphabet[CryptoRandomInt(alphabet_size)];
38  }
39  return result;
40}
41
42}  // namespace remoting
43