xref: /openbmc/bmcweb/include/ossl_random.hpp (revision 2c6ffdb0)
1*2c6ffdb0SEd Tanous #pragma once
2*2c6ffdb0SEd Tanous 
3*2c6ffdb0SEd Tanous #include <openssl/rand.h>
4*2c6ffdb0SEd Tanous 
5*2c6ffdb0SEd Tanous #include <iostream>
6*2c6ffdb0SEd Tanous #include <limits>
7*2c6ffdb0SEd Tanous #include <string>
8*2c6ffdb0SEd Tanous 
9*2c6ffdb0SEd Tanous namespace bmcweb
10*2c6ffdb0SEd Tanous {
11*2c6ffdb0SEd Tanous 
12*2c6ffdb0SEd Tanous struct OpenSSLGenerator
13*2c6ffdb0SEd Tanous {
14*2c6ffdb0SEd Tanous     uint8_t operator()()
15*2c6ffdb0SEd Tanous     {
16*2c6ffdb0SEd Tanous         uint8_t index = 0;
17*2c6ffdb0SEd Tanous         int rc = RAND_bytes(&index, sizeof(index));
18*2c6ffdb0SEd Tanous         if (rc != opensslSuccess)
19*2c6ffdb0SEd Tanous         {
20*2c6ffdb0SEd Tanous             std::cerr << "Cannot get random number\n";
21*2c6ffdb0SEd Tanous             err = true;
22*2c6ffdb0SEd Tanous         }
23*2c6ffdb0SEd Tanous 
24*2c6ffdb0SEd Tanous         return index;
25*2c6ffdb0SEd Tanous     }
26*2c6ffdb0SEd Tanous 
27*2c6ffdb0SEd Tanous     static constexpr uint8_t max()
28*2c6ffdb0SEd Tanous     {
29*2c6ffdb0SEd Tanous         return std::numeric_limits<uint8_t>::max();
30*2c6ffdb0SEd Tanous     }
31*2c6ffdb0SEd Tanous     static constexpr uint8_t min()
32*2c6ffdb0SEd Tanous     {
33*2c6ffdb0SEd Tanous         return std::numeric_limits<uint8_t>::min();
34*2c6ffdb0SEd Tanous     }
35*2c6ffdb0SEd Tanous 
36*2c6ffdb0SEd Tanous     bool error() const
37*2c6ffdb0SEd Tanous     {
38*2c6ffdb0SEd Tanous         return err;
39*2c6ffdb0SEd Tanous     }
40*2c6ffdb0SEd Tanous 
41*2c6ffdb0SEd Tanous     // all generators require this variable
42*2c6ffdb0SEd Tanous     using result_type = uint8_t;
43*2c6ffdb0SEd Tanous 
44*2c6ffdb0SEd Tanous   private:
45*2c6ffdb0SEd Tanous     // RAND_bytes() returns 1 on success, 0 otherwise. -1 if bad function
46*2c6ffdb0SEd Tanous     static constexpr int opensslSuccess = 1;
47*2c6ffdb0SEd Tanous     bool err = false;
48*2c6ffdb0SEd Tanous };
49*2c6ffdb0SEd Tanous 
50*2c6ffdb0SEd Tanous std::string getRandomUUID();
51*2c6ffdb0SEd Tanous 
52*2c6ffdb0SEd Tanous } // namespace bmcweb
53