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