From 8c12d98db1dd3087feb2f0aa8ebb2c2c917b6b13 Mon Sep 17 00:00:00 2001 From: Roy Shilkrot Date: Fri, 6 Dec 2024 09:11:45 -0500 Subject: [PATCH] Add SSL utility functions for HMAC and SHA-256, and update CMake configuration --- CMakeLists.txt | 1 + src/ssl-utils/ssl-utils.cpp | 102 ++++++++++++++++++++ src/ssl-utils/ssl-utils.h | 9 ++ src/timed-metadata/timed-metadata-utils.cpp | 86 +---------------- src/timed-metadata/timed-metadata-utils.h | 2 - 5 files changed, 113 insertions(+), 87 deletions(-) create mode 100644 src/ssl-utils/ssl-utils.cpp create mode 100644 src/ssl-utils/ssl-utils.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 0fc3407..ad73eb9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -65,6 +65,7 @@ target_sources( src/cloud-providers/cloud-provider.cpp src/cloud-providers/clova/clova-provider.cpp src/cloud-providers/google/google-provider.cpp + src/ssl-utils/ssl-utils.cpp src/timed-metadata/timed-metadata-utils.cpp) add_subdirectory(src/cloud-translation) diff --git a/src/ssl-utils/ssl-utils.cpp b/src/ssl-utils/ssl-utils.cpp new file mode 100644 index 0000000..e4cd756 --- /dev/null +++ b/src/ssl-utils/ssl-utils.cpp @@ -0,0 +1,102 @@ +#include "ssl-utils.h" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +#include "plugin-support.h" + +void init_openssl() +{ + OpenSSL_add_all_algorithms(); + ERR_load_crypto_strings(); +} + +// HMAC SHA-256 function +std::string hmacSha256(const std::string &key, const std::string &data, bool isHexKey) +{ + unsigned char *digest = (unsigned char *)bzalloc(EVP_MAX_MD_SIZE); + size_t len = EVP_MAX_MD_SIZE; + + // Prepare the key + std::vector keyBytes; + if (isHexKey) { + for (size_t i = 0; i < key.length(); i += 2) { + std::string byteString = key.substr(i, 2); + unsigned char byte = (unsigned char)strtol(byteString.c_str(), NULL, 16); + keyBytes.push_back(byte); + } + } else { + keyBytes.assign(key.begin(), key.end()); + } + + if (!HMAC(EVP_sha256(), keyBytes.data(), keyBytes.size(), (unsigned char *)data.c_str(), + data.length(), digest, (unsigned int *)&len)) { + obs_log(LOG_ERROR, "hmacSha256 failed during HMAC operation"); + return {}; + } + + std::stringstream ss; + for (size_t i = 0; i < len; ++i) { + ss << std::hex << std::setw(2) << std::setfill('0') << (int)digest[i]; + } + + bfree(digest); + return ss.str(); +} + +std::string sha256(const std::string &data) +{ + unsigned char hash[EVP_MAX_MD_SIZE]; + unsigned int lengthOfHash = 0; + + EVP_MD_CTX *context = EVP_MD_CTX_new(); + + if (context != nullptr) { + if (EVP_DigestInit_ex(context, EVP_sha256(), nullptr)) { + if (EVP_DigestUpdate(context, data.c_str(), data.length())) { + if (EVP_DigestFinal_ex(context, hash, &lengthOfHash)) { + EVP_MD_CTX_free(context); + + std::stringstream ss; + for (unsigned int i = 0; i < lengthOfHash; ++i) { + ss << std::hex << std::setw(2) << std::setfill('0') + << (int)hash[i]; + } + return ss.str(); + } + } + } + EVP_MD_CTX_free(context); + } + + return ""; +} + +std::string getCurrentTimestamp() +{ + auto now = std::chrono::system_clock::now(); + auto in_time_t = std::chrono::system_clock::to_time_t(now); + std::stringstream ss; + ss << std::put_time(std::gmtime(&in_time_t), "%Y%m%dT%H%M%SZ"); + return ss.str(); +} + +std::string getCurrentDate() +{ + auto now = std::chrono::system_clock::now(); + auto in_time_t = std::chrono::system_clock::to_time_t(now); + std::stringstream ss; + ss << std::put_time(std::gmtime(&in_time_t), "%Y%m%d"); + return ss.str(); +} diff --git a/src/ssl-utils/ssl-utils.h b/src/ssl-utils/ssl-utils.h new file mode 100644 index 0000000..b92fbca --- /dev/null +++ b/src/ssl-utils/ssl-utils.h @@ -0,0 +1,9 @@ +#pragma once + +#include + +void init_openssl(); +std::string hmacSha256(const std::string &key, const std::string &data, bool isHexKey = false); +std::string sha256(const std::string &data); +std::string getCurrentTimestamp(); +std::string getCurrentDate(); diff --git a/src/timed-metadata/timed-metadata-utils.cpp b/src/timed-metadata/timed-metadata-utils.cpp index 4eeca41..960c094 100644 --- a/src/timed-metadata/timed-metadata-utils.cpp +++ b/src/timed-metadata/timed-metadata-utils.cpp @@ -1,6 +1,7 @@ #include "plugin-support.h" #include "timed-metadata-utils.h" +#include "ssl-utils/ssl-utils.h" #include #include @@ -21,91 +22,6 @@ #include -void init_openssl() -{ - OpenSSL_add_all_algorithms(); - ERR_load_crypto_strings(); -} - -// HMAC SHA-256 function -std::string hmacSha256(const std::string &key, const std::string &data, bool isHexKey = false) -{ - unsigned char *digest = (unsigned char *)bzalloc(EVP_MAX_MD_SIZE); - size_t len = EVP_MAX_MD_SIZE; - - // Prepare the key - std::vector keyBytes; - if (isHexKey) { - for (size_t i = 0; i < key.length(); i += 2) { - std::string byteString = key.substr(i, 2); - unsigned char byte = (unsigned char)strtol(byteString.c_str(), NULL, 16); - keyBytes.push_back(byte); - } - } else { - keyBytes.assign(key.begin(), key.end()); - } - - if (!HMAC(EVP_sha256(), keyBytes.data(), keyBytes.size(), (unsigned char *)data.c_str(), - data.length(), digest, (unsigned int *)&len)) { - obs_log(LOG_ERROR, "hmacSha256 failed during HMAC operation"); - return {}; - } - - std::stringstream ss; - for (size_t i = 0; i < len; ++i) { - ss << std::hex << std::setw(2) << std::setfill('0') << (int)digest[i]; - } - - bfree(digest); - return ss.str(); -} - -std::string sha256(const std::string &data) -{ - unsigned char hash[EVP_MAX_MD_SIZE]; - unsigned int lengthOfHash = 0; - - EVP_MD_CTX *context = EVP_MD_CTX_new(); - - if (context != nullptr) { - if (EVP_DigestInit_ex(context, EVP_sha256(), nullptr)) { - if (EVP_DigestUpdate(context, data.c_str(), data.length())) { - if (EVP_DigestFinal_ex(context, hash, &lengthOfHash)) { - EVP_MD_CTX_free(context); - - std::stringstream ss; - for (unsigned int i = 0; i < lengthOfHash; ++i) { - ss << std::hex << std::setw(2) << std::setfill('0') - << (int)hash[i]; - } - return ss.str(); - } - } - } - EVP_MD_CTX_free(context); - } - - return ""; -} - -std::string getCurrentTimestamp() -{ - auto now = std::chrono::system_clock::now(); - auto in_time_t = std::chrono::system_clock::to_time_t(now); - std::stringstream ss; - ss << std::put_time(std::gmtime(&in_time_t), "%Y%m%dT%H%M%SZ"); - return ss.str(); -} - -std::string getCurrentDate() -{ - auto now = std::chrono::system_clock::now(); - auto in_time_t = std::chrono::system_clock::to_time_t(now); - std::stringstream ss; - ss << std::put_time(std::gmtime(&in_time_t), "%Y%m%d"); - return ss.str(); -} - size_t WriteCallback(void *ptr, size_t size, size_t nmemb, std::string *data) { data->append((char *)ptr, size * nmemb); diff --git a/src/timed-metadata/timed-metadata-utils.h b/src/timed-metadata/timed-metadata-utils.h index f34a7d7..78ca2bf 100644 --- a/src/timed-metadata/timed-metadata-utils.h +++ b/src/timed-metadata/timed-metadata-utils.h @@ -12,6 +12,4 @@ void send_timed_metadata_to_server(struct cloudvocal_data *gf, Translation_Mode const std::string &source_text, const std::string &source_lang, const std::string &target_text, const std::string &target_lang); -void init_openssl(); - #endif // TIMED_METADATA_UTILS_H