Implements a generic method to retrieve SHA hashes

This commit is contained in:
Anthony Louis committed 2021-04-09 19:34:23 -03:00
1 parent af05c21171
commit f3e1d13e99
2 files changed
+12 -44

No files matched your search

+8 -44
View File
@@ -5,48 +5,13 @@
namespace gandiva {
const char * HashUtils::hash_using_SHA256(int64_t context, const void *message, size_t message_length) {
if(message == nullptr){
HashUtils::error_message(context, "A null value was given to be hashed.");
return "";
}
EVP_MD_CTX *md_ctx = EVP_MD_CTX_new();
EVP_DigestInit_ex(md_ctx, EVP_sha256(), nullptr);
EVP_DigestUpdate(md_ctx, message, message_length);
int sha256_hash_size = EVP_MD_size(EVP_sha256());
auto* result = static_cast<unsigned char*>(OPENSSL_malloc(sha256_hash_size));
unsigned int result_length;
EVP_DigestFinal_ex(md_ctx, result, &result_length);
char* hex_buffer = new char[4];
char* result_buffer = new char[65];
clean_char_array(hex_buffer);
clean_char_array(result_buffer);
for (unsigned int j = 0; j < result_length; j++) {
unsigned char hex_number = result[j];
sprintf(hex_buffer, "%02x", hex_number);
strcat(result_buffer, hex_buffer);
}
result_buffer[64] = '\0';
// free the resources to avoid memory leaks
EVP_MD_CTX_free(md_ctx);
delete[] hex_buffer;
free(result);
return result_buffer;
return HashUtils::get_hash(context, message, message_length, EVP_sha256());
}
const char * HashUtils::hash_using_SHA128(int64_t context, const void *message, size_t message_length) {
return HashUtils::get_hash(context, message, message_length, EVP_sha1());
}
const char* HashUtils::get_hash(int64_t context, const void *message, size_t message_length, const EVP_MD *hash_type){
if(message == nullptr){
HashUtils::error_message(context, "A null value was given to be hashed.");
return "";
@@ -54,13 +19,13 @@ namespace gandiva {
EVP_MD_CTX *md_ctx = EVP_MD_CTX_new();
EVP_DigestInit_ex(md_ctx, EVP_sha1(), nullptr);
EVP_DigestInit_ex(md_ctx, hash_type, nullptr);
EVP_DigestUpdate(md_ctx, message, message_length);
int sha128_hash_size = EVP_MD_size(EVP_sha1());
int hash_size = EVP_MD_size(hash_type);
auto* result = static_cast<unsigned char*>(OPENSSL_malloc(sha128_hash_size));
auto* result = static_cast<unsigned char*>(OPENSSL_malloc(hash_size));
unsigned int result_length;
@@ -89,7 +54,6 @@ namespace gandiva {
return result_buffer;
}
uint64_t HashUtils::double_to_long(double value) {
uint64_t result;
memcpy(&result, &value, sizeof(result));
+4
View File
@@ -4,17 +4,21 @@
#include <cstdlib>
#include <cstdint>
#include "gandiva/visibility.h"
#include "openssl/evp.h"
namespace gandiva {
class GANDIVA_EXPORT HashUtils {
public:
static const char * hash_using_SHA256(int64_t context, const void *message, size_t message_length);
static const char *hash_using_SHA128(int64_t context, const void *message, size_t message_length);
static uint64_t double_to_long(double value);
private:
static inline void clean_char_array(char *buffer);
static const char *get_hash(int64_t context, const void *message, size_t message_length, const EVP_MD *hash_type);
static void error_message(int64_t context_ptr, char const *err_msg);
};
}