Skip to content

Commit 6cb9858

Browse files
Cherry picked commit 'Add a missing function to calculate a batch of hashes' from tevador/RandomX@01381cc
1 parent d93942b commit 6cb9858

File tree

3 files changed

+38
-6
lines changed

3 files changed

+38
-6
lines changed

src/crypto/randomx/randomx.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -524,4 +524,14 @@ extern "C" {
524524
blake2b(machine->tempHash, sizeof(machine->tempHash), nextInput, nextInputSize, nullptr, 0);
525525
machine->hashAndFill(output, RANDOMX_HASH_SIZE, machine->tempHash);
526526
}
527+
528+
void randomx_calculate_hash_last(randomx_vm* machine, void* output) {
529+
machine->resetRoundingMode();
530+
for (int chain = 0; chain < RANDOMX_PROGRAM_COUNT - 1; ++chain) {
531+
machine->run(machine->tempHash);
532+
blake2b(machine->tempHash, sizeof(machine->tempHash), machine->getRegisterFile(), sizeof(randomx::RegisterFile), nullptr, 0);
533+
}
534+
machine->run(machine->tempHash);
535+
machine->getFinalResult(output, RANDOMX_HASH_SIZE);
536+
}
527537
}

src/crypto/randomx/randomx.h

+6-3
Original file line numberDiff line numberDiff line change
@@ -239,9 +239,11 @@ RANDOMX_EXPORT void randomx_destroy_vm(randomx_vm *machine);
239239
RANDOMX_EXPORT void randomx_calculate_hash(randomx_vm *machine, const void *input, size_t inputSize, void *output);
240240

241241
/**
242-
* Paired functions used to calculate multiple RandomX hashes more efficiently.
243-
* randomx_calculate_hash_first is called for the first input value.
244-
* randomx_calculate_hash_next will output the hash value of the previous input.
242+
* Set of functions used to calculate multiple RandomX hashes more efficiently.
243+
* randomx_calculate_hash_first will begin a hash calculation.
244+
* randomx_calculate_hash_next will output the hash value of the previous input
245+
* and begin the calculation of the next hash.
246+
* randomx_calculate_hash_last will output the hash value of the previous input.
245247
*
246248
* @param machine is a pointer to a randomx_vm structure. Must not be NULL.
247249
* @param tempHash an array of 8 64-bit values used to store intermediate data between calls to randomx_calculate_hash_first and randomx_calculate_hash_next.
@@ -254,6 +256,7 @@ RANDOMX_EXPORT void randomx_calculate_hash(randomx_vm *machine, const void *inpu
254256
*/
255257
RANDOMX_EXPORT void randomx_calculate_hash_first(randomx_vm* machine, const void* input, size_t inputSize);
256258
RANDOMX_EXPORT void randomx_calculate_hash_next(randomx_vm* machine, const void* nextInput, size_t nextInputSize, void* output);
259+
RANDOMX_EXPORT void randomx_calculate_hash_last(randomx_vm* machine, void* output);
257260

258261
#if defined(__cplusplus)
259262
}

src/test/randomx_tests.cpp

+22-3
Original file line numberDiff line numberDiff line change
@@ -1141,9 +1141,6 @@ BOOST_AUTO_TEST_CASE(randomx_run_tests)
11411141

11421142
runTest("Hash test 2e (compiler)", RANDOMX_HAVE_COMPILER && stringsEqual(RANDOMX_ARGON_SALT, "RandomX\x03"), test_e);
11431143

1144-
randomx_destroy_vm(vm);
1145-
vm = nullptr;
1146-
11471144
randomx_release_cache(cache);
11481145
cache = randomx_alloc_cache(RANDOMX_FLAG_ARGON2_SSSE3);
11491146

@@ -1167,6 +1164,28 @@ BOOST_AUTO_TEST_CASE(randomx_run_tests)
11671164
assert(cacheMemory[33554431] == 0x1f47f056d05cd99b);
11681165
});
11691166

1167+
runTest("Hash batch test", RANDOMX_HAVE_COMPILER && stringsEqual(RANDOMX_ARGON_SALT, "RandomX\x03"), []() {
1168+
char hash1[RANDOMX_HASH_SIZE];
1169+
char hash2[RANDOMX_HASH_SIZE];
1170+
char hash3[RANDOMX_HASH_SIZE];
1171+
initCache("test key 000");
1172+
char input1[] = "This is a test";
1173+
char input2[] = "Lorem ipsum dolor sit amet";
1174+
char input3[] = "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua";
1175+
1176+
randomx_calculate_hash_first(vm, input1, sizeof(input1) - 1);
1177+
randomx_calculate_hash_next(vm, input2, sizeof(input2) - 1, &hash1);
1178+
randomx_calculate_hash_next(vm, input3, sizeof(input3) - 1, &hash2);
1179+
randomx_calculate_hash_last(vm, &hash3);
1180+
1181+
assert(equalsHex(hash1, "639183aae1bf4c9a35884cb46b09cad9175f04efd7684e7262a0ac1c2f0b4e3f"));
1182+
assert(equalsHex(hash2, "300a0adb47603dedb42228ccb2b211104f4da45af709cd7547cd049e9489c969"));
1183+
assert(equalsHex(hash3, "c36d4ed4191e617309867ed66a443be4075014e2b061bcdaf9ce7b721d2b77a8"));
1184+
});
1185+
1186+
randomx_destroy_vm(vm);
1187+
vm = nullptr;
1188+
11701189
if (cache != nullptr)
11711190
randomx_release_cache(cache);
11721191

0 commit comments

Comments
 (0)