]> Git Repo - VerusCoin.git/blob - src/crypto/verus_hash.h
Use Windows specific __cpuid() for Windows.
[VerusCoin.git] / src / crypto / verus_hash.h
1 // (C) 2018 The Verus Developers\r
2 // Distributed under the MIT software license, see the accompanying\r
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.\r
4 \r
5 /*\r
6 This provides the PoW hash function for Verus, enabling CPU mining.\r
7 */\r
8 #ifndef VERUS_HASH_H_\r
9 #define VERUS_HASH_H_\r
10 \r
11 #include <cstring>\r
12 #include <vector>\r
13 \r
14 #if !XERCES_HAVE_INTRIN_H\r
15 #include <cpuid.h>\r
16 #endif\r
17 \r
18 extern "C" \r
19 {\r
20 #include "crypto/haraka.h"\r
21 #include "crypto/haraka_portable.h"\r
22 }\r
23 \r
24 class CVerusHash\r
25 {\r
26     public:\r
27         static void Hash(void *result, const void *data, size_t len);\r
28 \r
29         CVerusHash() {}\r
30 \r
31         CVerusHash &Write(const unsigned char *data, size_t len);\r
32 \r
33         CVerusHash &Reset()\r
34         {\r
35             curBuf = buf1;\r
36             result = buf2;\r
37             curPos = 0;\r
38             std::fill(buf1, buf1 + sizeof(buf1), 0);\r
39         }\r
40 \r
41         void Finalize(unsigned char hash[32])\r
42         {\r
43             if (curPos)\r
44             {\r
45                 std::fill(curBuf + 32 + curPos, curBuf + 64, 0);\r
46                 haraka512(hash, curBuf);\r
47             }\r
48             else\r
49                 std::memcpy(hash, curBuf, 32);\r
50         }\r
51 \r
52     private:\r
53         // only buf1, the first source, needs to be zero initialized\r
54         unsigned char buf1[64] = {0}, buf2[64];\r
55         unsigned char *curBuf = buf1, *result = buf2;\r
56         size_t curPos = 0;\r
57 };\r
58 \r
59 class CVerusHashPortable\r
60 {\r
61     public:\r
62         static void Hash(void *result, const void *data, size_t len);\r
63 \r
64         CVerusHashPortable() {}\r
65 \r
66         CVerusHashPortable &Write(const unsigned char *data, size_t len);\r
67 \r
68         CVerusHashPortable &Reset()\r
69         {\r
70             curBuf = buf1;\r
71             result = buf2;\r
72             curPos = 0;\r
73             std::fill(buf1, buf1 + sizeof(buf1), 0);\r
74         }\r
75 \r
76         void Finalize(unsigned char hash[32])\r
77         {\r
78             if (curPos)\r
79             {\r
80                 std::fill(curBuf + 32 + curPos, curBuf + 64, 0);\r
81                 haraka512_port(hash, curBuf);\r
82             }\r
83             else\r
84                 std::memcpy(hash, curBuf, 32);\r
85         }\r
86 \r
87     private:\r
88         // only buf1, the first source, needs to be zero initialized\r
89         unsigned char buf1[64] = {0}, buf2[64];\r
90         unsigned char *curBuf = buf1, *result = buf2;\r
91         size_t curPos = 0;\r
92 };\r
93 \r
94 extern void verus_hash(void *result, const void *data, size_t len);\r
95 \r
96 inline bool IsCPUVerusOptimized()\r
97 {\r
98     unsigned int eax,ebx,ecx,edx;\r
99 #ifdef _WIN32\r
100     int CPUInfo[4];\r
101     CPUInfo[0] = &eax;\r
102     CPUInfo[1] = &ebx;\r
103     CPUInfo[2] = &ecx;\r
104     CPUInfo[3] = &edx;\r
105     if (!__get_cpuid(CPUInfo, 1))\r
106 #else\r
107     if (!__get_cpuid(1,&eax,&ebx,&ecx,&edx))\r
108 #endif\r
109     {\r
110         return false;\r
111     }\r
112     return ((ecx & (bit_AVX | bit_AES)) == (bit_AVX | bit_AES));\r
113 };\r
114 \r
115 #endif\r
This page took 0.030841 seconds and 4 git commands to generate.