Portable VerusHash and CPU check

This commit is contained in:
Michael Toutonghi
2018-06-16 14:51:13 -07:00
parent 2c05c25598
commit 5296a85018
10 changed files with 537 additions and 5 deletions

View File

@@ -11,9 +11,12 @@ This provides the PoW hash function for Verus, enabling CPU mining.
#include <cstring>
#include <vector>
#include <cpuid.h>
extern "C"
{
#include "crypto/haraka.h"
#include "crypto/haraka_portable.h"
}
class CVerusHash
@@ -51,6 +54,52 @@ class CVerusHash
size_t curPos = 0;
};
class CVerusHashPortable
{
public:
static void Hash(void *result, const void *data, size_t len);
CVerusHashPortable() {}
CVerusHashPortable &Write(const unsigned char *data, size_t len);
CVerusHashPortable &Reset()
{
curBuf = buf1;
result = buf2;
curPos = 0;
std::fill(buf1, buf1 + sizeof(buf1), 0);
}
void Finalize(unsigned char hash[32])
{
if (curPos)
{
std::fill(curBuf + 32 + curPos, curBuf + 64, 0);
haraka512_port(hash, curBuf);
}
else
std::memcpy(hash, curBuf, 32);
}
private:
// only buf1, the first source, needs to be zero initialized
unsigned char buf1[64] = {0}, buf2[64];
unsigned char *curBuf = buf1, *result = buf2;
size_t curPos = 0;
};
extern void verus_hash(void *result, const void *data, size_t len);
inline bool IsCPUVerusOptimized()
{
unsigned int eax,ebx,ecx,edx;
if (!__get_cpuid(1,&eax,&ebx,&ecx,&edx))
{
return false;
}
return ((ecx & (bit_AVX | bit_AES)) == (bit_AVX | bit_AES));
};
#endif