Leosac  0.8.0
Open Source Access Control
Random.cpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2014-2016 Leosac
3 
4  This file is part of Leosac.
5 
6  Leosac is free software: you can redistribute it and/or modify
7  it under the terms of the GNU Affero General Public License as published by
8  the Free Software Foundation, either version 3 of the License, or
9  (at your option) any later version.
10 
11  Leosac is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU Affero General Public License for more details.
15 
16  You should have received a copy of the GNU Affero General Public License
17  along with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19 
20 #include "tools/scrypt/Random.hpp"
21 #include <cassert>
22 #include <cstddef>
23 #include <openssl/rand.h>
24 #include <sstream>
25 #include <vector>
26 
27 std::mutex Random::mutex_;
28 
30 {
31  if (n == 0)
32  return {};
33  std::lock_guard<std::mutex> ul(mutex_);
34  ByteVector ret(n);
35 
36  int rc = RAND_bytes(&ret[0], n);
37  assert(rc == 1);
38  return ret;
39 }
40 
41 std::string Random::GetASCII(size_t n)
42 {
43  if (n == 0)
44  return "";
45 
46  std::stringstream ss;
47  auto bytes = GetBytes(n);
48  size_t idx = 0;
49  for (size_t i = 0; i < n; ++i)
50  {
51  if (idx == bytes.size())
52  {
53  bytes = GetBytes(n);
54  idx = 0;
55  }
56  if (isalnum(bytes[idx]))
57  {
58  ss << bytes[idx];
59  }
60  idx++;
61  }
62  assert(ss.str().size() == n);
63  return ss.str();
64 }
Random::mutex_
static std::mutex mutex_
OpenSSL's random number generation is not thread-safe.
Definition: Random.hpp:48
ByteVector
std::vector< uint8_t > ByteVector
Definition: Random.hpp:26
Random.hpp
Random::GetBytes
static ByteVector GetBytes(size_t n)
Generate n random bytes.
Definition: Random.cpp:29
Random::GetASCII
static std::string GetASCII(size_t n)
Return a random ASCII string.
Definition: Random.cpp:41