#include "Hasher.h"
#include <openssl/evp.h>
#include <sstream>
#include <iomanip>


std::vector<unsigned char> SIGN::Hasher::sha256(const unsigned char* data, size_t length)
{
	EVP_MD_CTX* context = EVP_MD_CTX_new();
	EVP_DigestInit_ex(context, EVP_sha256(), NULL);
	EVP_DigestUpdate(context, data, length);
	std::vector<unsigned char> buffer(EVP_MD_size(EVP_sha256()));
	EVP_DigestFinal_ex(context, buffer.data(), NULL);
	EVP_MD_CTX_free(context);
	return buffer;
}

SIGN::Hasher::Hasher()
{
}


SIGN::Hasher::~Hasher()
{
}

std::vector<unsigned char> SIGN::Hasher::hash()
{
	return sha256(data.data(), data.size());
}

void SIGN::Hasher::reset()
{
	data.clear();
}

size_t SIGN::Hasher::size(void)
{
	return EVP_MD_size(EVP_sha256());
}

std::string SIGN::Hasher::print(std::vector<unsigned char> bytes, bool uppercase)
{
	std::ostringstream result;

	for (std::string::size_type i = 0; i < bytes.size();i++)
	{
		result << std::hex << std::setfill('0') << std::setw(2) << (uppercase ? std::uppercase : std::nouppercase) << (int)bytes[i];
		if (i != bytes.size() - 1)
		{
			result << std::setw(1) << " ";
		}
	}
		

	return result.str();
}