12c6ffdb0SEd Tanous #pragma once 22c6ffdb0SEd Tanous 3*c160ae72SEd Tanous #include "logging.hpp" 4*c160ae72SEd Tanous 52c6ffdb0SEd Tanous #include <openssl/rand.h> 62c6ffdb0SEd Tanous 72c6ffdb0SEd Tanous #include <iostream> 82c6ffdb0SEd Tanous #include <limits> 92c6ffdb0SEd Tanous #include <string> 102c6ffdb0SEd Tanous 112c6ffdb0SEd Tanous namespace bmcweb 122c6ffdb0SEd Tanous { 132c6ffdb0SEd Tanous 142c6ffdb0SEd Tanous struct OpenSSLGenerator 152c6ffdb0SEd Tanous { 162c6ffdb0SEd Tanous uint8_t operator()() 172c6ffdb0SEd Tanous { 182c6ffdb0SEd Tanous uint8_t index = 0; 192c6ffdb0SEd Tanous int rc = RAND_bytes(&index, sizeof(index)); 202c6ffdb0SEd Tanous if (rc != opensslSuccess) 212c6ffdb0SEd Tanous { 22*c160ae72SEd Tanous BMCWEB_LOG_ERROR("Cannot get random number"); 232c6ffdb0SEd Tanous err = true; 242c6ffdb0SEd Tanous } 252c6ffdb0SEd Tanous 262c6ffdb0SEd Tanous return index; 272c6ffdb0SEd Tanous } 282c6ffdb0SEd Tanous 292c6ffdb0SEd Tanous static constexpr uint8_t max() 302c6ffdb0SEd Tanous { 312c6ffdb0SEd Tanous return std::numeric_limits<uint8_t>::max(); 322c6ffdb0SEd Tanous } 332c6ffdb0SEd Tanous static constexpr uint8_t min() 342c6ffdb0SEd Tanous { 352c6ffdb0SEd Tanous return std::numeric_limits<uint8_t>::min(); 362c6ffdb0SEd Tanous } 372c6ffdb0SEd Tanous 382c6ffdb0SEd Tanous bool error() const 392c6ffdb0SEd Tanous { 402c6ffdb0SEd Tanous return err; 412c6ffdb0SEd Tanous } 422c6ffdb0SEd Tanous 432c6ffdb0SEd Tanous // all generators require this variable 442c6ffdb0SEd Tanous using result_type = uint8_t; 452c6ffdb0SEd Tanous 462c6ffdb0SEd Tanous private: 472c6ffdb0SEd Tanous // RAND_bytes() returns 1 on success, 0 otherwise. -1 if bad function 482c6ffdb0SEd Tanous static constexpr int opensslSuccess = 1; 492c6ffdb0SEd Tanous bool err = false; 502c6ffdb0SEd Tanous }; 512c6ffdb0SEd Tanous 522c6ffdb0SEd Tanous std::string getRandomUUID(); 532c6ffdb0SEd Tanous 542c6ffdb0SEd Tanous } // namespace bmcweb 55