Replace xxHash with blake2b (#1919)
* Replace xxHash with blake2b * Delete xxhash submodule & folder * Update random_64 initialization * Using ledger constants to generate random 128 bit union * Protect random_128 () with mutex * Don't call random_128 () twice * Use static mutex for random_128 * Update endpoint_hash_raw functions * Naming * Functions order & static random_constants
This commit is contained in:
		
					parent
					
						
							
								06a93517d1
							
						
					
				
			
			
				commit
				
					
						8ce0b7c426
					
				
			
		
					 9 changed files with 23 additions and 43 deletions
				
			
		
							
								
								
									
										3
									
								
								.gitmodules
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitmodules
									
										
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -11,9 +11,6 @@
 | 
			
		|||
[submodule "crypto/phc-winner-argon2"]
 | 
			
		||||
	path = crypto/phc-winner-argon2
 | 
			
		||||
	url = https://github.com/nanocurrency/phc-winner-argon2.git
 | 
			
		||||
[submodule "crypto/xxhash"]
 | 
			
		||||
	path = crypto/xxhash
 | 
			
		||||
	url = https://github.com/Cyan4973/xxHash.git
 | 
			
		||||
[submodule "gtest"]
 | 
			
		||||
	path = gtest
 | 
			
		||||
	url = https://github.com/google/googletest.git
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -264,10 +264,6 @@ target_include_directories(argon2 PUBLIC crypto/phc-winner-argon2/include)
 | 
			
		|||
target_include_directories(argon2 PUBLIC crypto/phc-winner-argon2/src)
 | 
			
		||||
target_include_directories(argon2 PUBLIC crypto/blake2)
 | 
			
		||||
 | 
			
		||||
add_library (xxhash
 | 
			
		||||
	crypto/xxhash/xxhash.c
 | 
			
		||||
	crypto/xxhash/xxhash.h)
 | 
			
		||||
 | 
			
		||||
add_library (lmdb
 | 
			
		||||
	lmdb/libraries/liblmdb/lmdb.h
 | 
			
		||||
	lmdb/libraries/liblmdb/mdb.c
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1 +0,0 @@
 | 
			
		|||
Subproject commit 0f2dd4a1cb103e3fc8c55c855b821eb24c6d82c3
 | 
			
		||||
| 
						 | 
				
			
			@ -42,7 +42,6 @@ add_library (nano_lib
 | 
			
		|||
	work.cpp)
 | 
			
		||||
 | 
			
		||||
target_link_libraries (nano_lib
 | 
			
		||||
	xxhash
 | 
			
		||||
	ed25519
 | 
			
		||||
	crypto_lib
 | 
			
		||||
	blake2
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,8 +5,6 @@
 | 
			
		|||
 | 
			
		||||
#include <boost/endian/conversion.hpp>
 | 
			
		||||
 | 
			
		||||
#include <crypto/xxhash/xxhash.h>
 | 
			
		||||
 | 
			
		||||
/** Compare blocks, first by type, then content. This is an optimization over dynamic_cast, which is very slow on some platforms. */
 | 
			
		||||
namespace
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,5 @@
 | 
			
		|||
#include <nano/lib/interface.h>
 | 
			
		||||
 | 
			
		||||
#include <crypto/xxhash/xxhash.h>
 | 
			
		||||
 | 
			
		||||
#include <crypto/ed25519-donna/ed25519.h>
 | 
			
		||||
 | 
			
		||||
#include <boost/property_tree/json_parser.hpp>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,6 @@
 | 
			
		|||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <nano/crypto_lib/random_pool.hpp>
 | 
			
		||||
#include <nano/lib/config.hpp>
 | 
			
		||||
#include <nano/lib/interface.h>
 | 
			
		||||
#include <nano/secure/common.hpp>
 | 
			
		||||
| 
						 | 
				
			
			@ -8,8 +9,6 @@
 | 
			
		|||
 | 
			
		||||
#include <bitset>
 | 
			
		||||
 | 
			
		||||
#include <crypto/xxhash/xxhash.h>
 | 
			
		||||
 | 
			
		||||
namespace nano
 | 
			
		||||
{
 | 
			
		||||
using endpoint = boost::asio::ip::udp::endpoint;
 | 
			
		||||
| 
						 | 
				
			
			@ -22,40 +21,32 @@ bool parse_tcp_endpoint (std::string const &, nano::tcp_endpoint &);
 | 
			
		|||
 | 
			
		||||
namespace
 | 
			
		||||
{
 | 
			
		||||
uint64_t ip_address_hash_raw (boost::asio::ip::address const & ip_a, uint16_t port = 0)
 | 
			
		||||
{
 | 
			
		||||
	static nano::random_constants constants;
 | 
			
		||||
	assert (ip_a.is_v6 ());
 | 
			
		||||
	uint64_t result;
 | 
			
		||||
	nano::uint128_union address;
 | 
			
		||||
	address.bytes = ip_a.to_v6 ().to_bytes ();
 | 
			
		||||
	blake2b_state state;
 | 
			
		||||
	blake2b_init (&state, sizeof (result));
 | 
			
		||||
	blake2b_update (&state, constants.random_128.bytes.data (), constants.random_128.bytes.size ());
 | 
			
		||||
	if (port != 0)
 | 
			
		||||
	{
 | 
			
		||||
		blake2b_update (&state, &port, sizeof (port));
 | 
			
		||||
	}
 | 
			
		||||
	blake2b_update (&state, address.bytes.data (), address.bytes.size ());
 | 
			
		||||
	blake2b_final (&state, &result, sizeof (result));
 | 
			
		||||
	return result;
 | 
			
		||||
}
 | 
			
		||||
uint64_t endpoint_hash_raw (nano::endpoint const & endpoint_a)
 | 
			
		||||
{
 | 
			
		||||
	assert (endpoint_a.address ().is_v6 ());
 | 
			
		||||
	nano::uint128_union address;
 | 
			
		||||
	address.bytes = endpoint_a.address ().to_v6 ().to_bytes ();
 | 
			
		||||
	XXH64_state_t * const state = XXH64_createState ();
 | 
			
		||||
	XXH64_reset (state, 0);
 | 
			
		||||
	XXH64_update (state, address.bytes.data (), address.bytes.size ());
 | 
			
		||||
	auto port (endpoint_a.port ());
 | 
			
		||||
	XXH64_update (state, &port, sizeof (port));
 | 
			
		||||
	auto result (XXH64_digest (state));
 | 
			
		||||
	XXH64_freeState (state);
 | 
			
		||||
	uint64_t result (ip_address_hash_raw (endpoint_a.address (), endpoint_a.port ()));
 | 
			
		||||
	return result;
 | 
			
		||||
}
 | 
			
		||||
uint64_t endpoint_hash_raw (nano::tcp_endpoint const & endpoint_a)
 | 
			
		||||
{
 | 
			
		||||
	assert (endpoint_a.address ().is_v6 ());
 | 
			
		||||
	nano::uint128_union address;
 | 
			
		||||
	address.bytes = endpoint_a.address ().to_v6 ().to_bytes ();
 | 
			
		||||
	XXH64_state_t * const state = XXH64_createState ();
 | 
			
		||||
	XXH64_reset (state, 0);
 | 
			
		||||
	XXH64_update (state, address.bytes.data (), address.bytes.size ());
 | 
			
		||||
	auto port (endpoint_a.port ());
 | 
			
		||||
	XXH64_update (state, &port, sizeof (port));
 | 
			
		||||
	auto result (XXH64_digest (state));
 | 
			
		||||
	XXH64_freeState (state);
 | 
			
		||||
	return result;
 | 
			
		||||
}
 | 
			
		||||
uint64_t ip_address_hash_raw (boost::asio::ip::address const & ip_a)
 | 
			
		||||
{
 | 
			
		||||
	assert (ip_a.is_v6 ());
 | 
			
		||||
	nano::uint128_union bytes;
 | 
			
		||||
	bytes.bytes = ip_a.to_v6 ().to_bytes ();
 | 
			
		||||
	auto result (XXH64 (bytes.bytes.data (), bytes.bytes.size (), 0));
 | 
			
		||||
	uint64_t result (ip_address_hash_raw (endpoint_a.address (), endpoint_a.port ()));
 | 
			
		||||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -99,6 +99,7 @@ burn_account (0)
 | 
			
		|||
nano::random_constants::random_constants ()
 | 
			
		||||
{
 | 
			
		||||
	nano::random_pool::generate_block (not_an_account.bytes.data (), not_an_account.bytes.size ());
 | 
			
		||||
	nano::random_pool::generate_block (random_128.bytes.data (), random_128.bytes.size ());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::node_constants::node_constants (nano::network_constants & network_constants)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -339,6 +339,7 @@ class random_constants
 | 
			
		|||
public:
 | 
			
		||||
	random_constants ();
 | 
			
		||||
	nano::account not_an_account;
 | 
			
		||||
	nano::uint128_union random_128;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/** Node related constants whose value depends on the active network */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue