Skip to content

Commit bd24b14

Browse files
committed
add hash_extra_jh_r rust function and unit test
1 parent 6a08426 commit bd24b14

File tree

3 files changed

+34
-0
lines changed

3 files changed

+34
-0
lines changed

consensus/cryptonight-rs/ext/hash-ops.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,5 +49,11 @@ void cn_slow_hash(const void *data, size_t length, char *hash, int variant, int
4949

5050
void hash_extra_blake(const void *data, size_t length, char *hash);
5151
void hash_extra_groestl(const void *data, size_t length, char *hash);
52+
#ifdef __cplusplus
53+
extern "C" {
54+
#endif
5255
void hash_extra_jh(const void *data, size_t length, char *hash);
56+
#ifdef __cplusplus
57+
}
58+
#endif
5359
void hash_extra_skein(const void *data, size_t length, char *hash);

consensus/cryptonight-rs/src/lib.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ extern "C" {
1111
) -> c_void;
1212
}
1313

14+
#[link(name = "cryptonight", kind = "static")]
15+
extern "C" {
16+
fn hash_extra_jh(data: *const c_char, length: size_t, hash: *const c_char) -> c_void;
17+
}
1418
const VARIANT: i32 = 4;
1519
const HEIGHT: u64 = 0;
1620

@@ -27,5 +31,18 @@ pub fn cryptonight_r(data: &[u8], size: usize) -> Vec<u8> {
2731
hash
2832
}
2933

34+
#[allow(clippy::unsound_collection_transmute)]
35+
pub fn hash_extra_jh_r(data: &[u8], size: usize) -> Vec<u8> {
36+
let hash: Vec<i8> = vec![0i8; 32];
37+
let data_ptr: *const c_char = data.as_ptr() as *const c_char;
38+
let hash_ptr: *const c_char = hash.as_ptr() as *const c_char;
39+
let mut hash = unsafe {
40+
hash_extra_jh(data_ptr, size, hash_ptr);
41+
std::mem::transmute::<Vec<i8>, Vec<u8>>(hash)
42+
};
43+
hash.reverse();
44+
hash
45+
}
46+
3047
#[cfg(test)]
3148
mod tests;

consensus/cryptonight-rs/src/tests.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,17 @@ fn test_amd_ryzen() {
3232
assert_eq!(hash, data.output);
3333
}
3434

35+
// this test is same test_amd_ryzen, trace the inner produce can get this data
36+
#[test]
37+
fn test_main_block2_jh_on_ubuntu22() {
38+
let data = TestCase {
39+
input: "d6a11a431fd56dc29c5927328e83eef11590362b70aef492f12c449bde657b4e3ac4e15816314613ca7339d152294b185ed86709acc1266259580d4aba729d37c733a89eb15ea91b28bbe49bd151cb1b947bb239c4ff10cfe24aa05f31a8cdb8e71345ea45cffeff6bbf9d2c7fe58f13f190b2921a531fb65841221d3e3e8483830a9b4a9c2e2843e74db1792c739d3ee27a973b61c838f300a54951cf8ac5fe99c2ced05d8b4cffa20a24f84dba4a4528b2b2cf035ae5b06b49f12364fcb5776db3692bfb6f029d".from_hex().unwrap(),
40+
output: "0000008e67af69c3c670dab325e8fc3a9dc045c6e339aa35f43b415604513742".from_hex().unwrap(),
41+
};
42+
let hash = hash_extra_jh_r(&data.input[..], data.input.len());
43+
assert_eq!(hash, data.output);
44+
}
45+
3546
// add a test for ubuntu22
3647
// add -Ofast in build.rs, this test will failed on unbuntu22
3748
// the data is gen from verify_header_test_barnard_block3_ubuntu22

0 commit comments

Comments
 (0)