work on flood fill network
This commit is contained in:
		
							parent
							
								
									b5fe4453ed
								
							
						
					
					
						commit
						299980f126
					
				
					 4 changed files with 90 additions and 0 deletions
				
			
		
							
								
								
									
										1
									
								
								src/streamfill/__init__.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								src/streamfill/__init__.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
from .extracted25519 import extract_ed25519_from_onion_address
 | 
			
		||||
							
								
								
									
										14
									
								
								src/streamfill/extracted25519.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								src/streamfill/extracted25519.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,14 @@
 | 
			
		|||
from base64 import b32decode
 | 
			
		||||
from typing import TYPE_CHECKING
 | 
			
		||||
 | 
			
		||||
from onionrutils.bytesconverter import str_to_bytes
 | 
			
		||||
 | 
			
		||||
if TYPE_CHECKING:
 | 
			
		||||
    from onionrtypes import Ed25519PublicKeyBytes, OnionAddressString
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def extract_ed25519_from_onion_address(
 | 
			
		||||
        address: OnionAddressString) -> Ed25519PublicKeyBytes:
 | 
			
		||||
    address = str_to_bytes(address).replace(b'.onion', b'').upper()
 | 
			
		||||
    ed25519 = b32decode(address)[:-3]
 | 
			
		||||
    return ed25519
 | 
			
		||||
							
								
								
									
										22
									
								
								src/streamfill/neighbors.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								src/streamfill/neighbors.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,22 @@
 | 
			
		|||
from onionrtypes import OnionAddressString
 | 
			
		||||
from typing import Iterable
 | 
			
		||||
from .extracted25519 import extract_ed25519_from_onion_address
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def identify_neighbors(
 | 
			
		||||
        address: OnionAddressString,
 | 
			
		||||
        peers: Iterable[OnionAddressString],
 | 
			
		||||
        closest_n: int) -> OnionAddressString:
 | 
			
		||||
 | 
			
		||||
    address = extract_ed25519_from_onion_address(address)
 | 
			
		||||
    address_int = int.from_bytes(address, "big")
 | 
			
		||||
 | 
			
		||||
    def _calc_closeness(y):
 | 
			
		||||
        return abs(address_int - int.from_bytes(y, "big"))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    peer_ed_keys = list(map(extract_ed25519_from_onion_address, peers))
 | 
			
		||||
    differences = list(map(_calc_closeness, peer_ed_keys))
 | 
			
		||||
 | 
			
		||||
    return sorted(differences)[:closest_n]
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										53
									
								
								tests/test_streamfill_extract_ed25519.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								tests/test_streamfill_extract_ed25519.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,53 @@
 | 
			
		|||
#!/usr/bin/env python3
 | 
			
		||||
import sys, os
 | 
			
		||||
sys.path.append(".")
 | 
			
		||||
sys.path.append("src/")
 | 
			
		||||
import uuid
 | 
			
		||||
import binascii
 | 
			
		||||
from base64 import b32decode
 | 
			
		||||
TEST_DIR = 'testdata/%s-%s' % (uuid.uuid4(), os.path.basename(__file__)) + '/'
 | 
			
		||||
print("Test directory:", TEST_DIR)
 | 
			
		||||
os.environ["ONIONR_HOME"] = TEST_DIR
 | 
			
		||||
import unittest
 | 
			
		||||
 | 
			
		||||
from streamfill import extract_ed25519_from_onion_address
 | 
			
		||||
 | 
			
		||||
class TestStreamfillExtractEd25519(unittest.TestCase):
 | 
			
		||||
    def test_extract_normal_onion(self):
 | 
			
		||||
        hardcodedCorrect = b'y\xbc\xc6%\x18K\x05\x19Iu\xc2\x8bf\xb6k\x04i\xf7\xf6Uo\xb1\xac1\x89\xa7\x9b@\xdd\xa3/\x1f'
 | 
			
		||||
        correct = b32decode(b'pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd'.upper())[:-3]
 | 
			
		||||
        self.assertEqual(correct, hardcodedCorrect)
 | 
			
		||||
        self.assertEqual(correct, extract_ed25519_from_onion_address('pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion'))
 | 
			
		||||
    def test_extract_normal_onion_bytes(self):
 | 
			
		||||
        hardcodedCorrect = b'y\xbc\xc6%\x18K\x05\x19Iu\xc2\x8bf\xb6k\x04i\xf7\xf6Uo\xb1\xac1\x89\xa7\x9b@\xdd\xa3/\x1f'
 | 
			
		||||
        correct = b32decode(b'pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd'.upper())[:-3]
 | 
			
		||||
        self.assertEqual(correct, hardcodedCorrect)
 | 
			
		||||
        self.assertEqual(correct, extract_ed25519_from_onion_address(b'pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion'))
 | 
			
		||||
    def test_extract_no_ext(self):
 | 
			
		||||
        hardcodedCorrect = b'y\xbc\xc6%\x18K\x05\x19Iu\xc2\x8bf\xb6k\x04i\xf7\xf6Uo\xb1\xac1\x89\xa7\x9b@\xdd\xa3/\x1f'
 | 
			
		||||
        correct = b32decode(b'pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd'.upper())[:-3]
 | 
			
		||||
        self.assertEqual(correct, hardcodedCorrect)
 | 
			
		||||
        self.assertEqual(correct, extract_ed25519_from_onion_address('pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd'))
 | 
			
		||||
    def test_extract_no_ext_bytes(self):
 | 
			
		||||
        hardcodedCorrect = b'y\xbc\xc6%\x18K\x05\x19Iu\xc2\x8bf\xb6k\x04i\xf7\xf6Uo\xb1\xac1\x89\xa7\x9b@\xdd\xa3/\x1f'
 | 
			
		||||
        correct = b32decode(b'pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd'.upper())[:-3]
 | 
			
		||||
        self.assertEqual(correct, hardcodedCorrect)
 | 
			
		||||
        self.assertEqual(correct, extract_ed25519_from_onion_address(b'pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd'))
 | 
			
		||||
    def test_fail_length(self):
 | 
			
		||||
        hardcodedCorrect = b'y\xbc\xc6%\x18K\x05\x19Iu\xc2\x8bf\xb6k\x04i\xf7\xf6Uo\xb1\xac1\x89\xa7\x9b@\xdd\xa3/\x1f'
 | 
			
		||||
        correct = b32decode(b'pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd'.upper())[:-3]
 | 
			
		||||
        self.assertEqual(correct, hardcodedCorrect)
 | 
			
		||||
        try:
 | 
			
		||||
            extract_ed25519_from_onion_address(b'pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscry')
 | 
			
		||||
        except binascii.Error:
 | 
			
		||||
            pass
 | 
			
		||||
    def test_fail_length_onion(self):
 | 
			
		||||
        hardcodedCorrect = b'y\xbc\xc6%\x18K\x05\x19Iu\xc2\x8bf\xb6k\x04i\xf7\xf6Uo\xb1\xac1\x89\xa7\x9b@\xdd\xa3/\x1f'
 | 
			
		||||
        correct = b32decode(b'pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd'.upper())[:-3]
 | 
			
		||||
        self.assertEqual(correct, hardcodedCorrect)
 | 
			
		||||
        try:
 | 
			
		||||
            extract_ed25519_from_onion_address(b'pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscry.onion')
 | 
			
		||||
        except binascii.Error:
 | 
			
		||||
            pass
 | 
			
		||||
 | 
			
		||||
unittest.main()
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue