#ifndef UTILS_H #define UTILS_H #include // for snprintf, size_t #include // for vector #ifdef _WIN32 #include #include #include "win32shim.h" #else #endif #include // for uint8_t, uint64_t #include // for memcpy #include // for unique_ptr #include // for runtime_error #include // for string #define HMAC_SHA1_BLOCKSIZE 64 /** * @brief Returns current timestamp * * @return unsigned long long resulting timestamp in milliseconds from unix time zero */ unsigned long long getCurrentTimestamp(); /** * @brief portable 64bit equivalent of htons / htonl. aka endianess swap * * @param value input value to swap * @return uint64_t swapped result */ uint64_t hton64(uint64_t value); std::vector bigNumDivide(std::vector num, int n); /** * @brief Performs big number multiplication on two numbers * * @param num big num in vector format * @param n secondary number * @return std::vector resulting number */ std::vector bigNumMultiply(std::vector num, int n); /** * @brief Performs big number addition on two numbers * * @param num big num in vector format * @param n secondary number * @return std::vector resulting number */ std::vector bigNumAdd(std::vector num, int n); unsigned char h2int(char c); std::string urlDecode(std::string str); /** * @brief Converts provided hex string into binary data * * @param s string containing hex data * @return std::vector vector containing binary data */ std::vector stringHexToBytes(const std::string& s); /** * @brief Converts provided bytes into a human readable hex string * * @param bytes vector containing binary data * @return std::string string containing hex representation of inputted data */ std::string bytesToHexString(const std::vector& bytes); /** * @brief Extracts given type from binary data * * @tparam T type to extract * @param v vector containing binary data to extract from * @param pos position offset * @return T extracted type */ template T extract(const std::vector& v, int pos) { T value; memcpy(&value, &v[pos], sizeof(T)); return value; } /** * @brief Packs given type into binary data * * @tparam T type of data to pack * @param data data to pack * @return std::vector resulting vector containing binary data */ template std::vector pack(T data) { std::vector rawData((std::uint8_t*)&data, (std::uint8_t*)&(data) + sizeof(T)); return rawData; } template std::string string_format(const std::string& format, Args... args) { int size_s = std::snprintf(nullptr, 0, format.c_str(), args...) + 1; // Extra space for '\0' if (size_s <= 0) { throw std::runtime_error("Error during formatting."); } auto size = static_cast(size_s); std::unique_ptr buf(new char[size]); std::snprintf(buf.get(), size, format.c_str(), args...); return std::string(buf.get(), buf.get() + size - 1); // We don't want the '\0' inside } #endif