started c# pow implementation
This commit is contained in:
		
							parent
							
								
									fd0f13cf63
								
							
						
					
					
						commit
						60c1ec07e9
					
				
					 6 changed files with 108 additions and 36 deletions
				
			
		|  | @ -205,6 +205,7 @@ def insert_block(data: Union[str, bytes], header: str = 'txt', | |||
| 
 | ||||
|     # send block data (and metadata) to POW module to get tokenized block data | ||||
|     payload = subprocesspow.SubprocessPOW(data, metadata).start() | ||||
|     print(payload) | ||||
|     if payload != False:  # noqa | ||||
|         try: | ||||
|             retData = onionrstorage.set_data(payload) | ||||
|  |  | |||
|  | @ -1,6 +1,28 @@ | |||
| """Onionr - Private P2P Communication. | ||||
| 
 | ||||
| generate a public ed25519 key from a private one | ||||
| """ | ||||
| from nacl import signing, encoding | ||||
| 
 | ||||
| from onionrtypes import UserID, UserIDSecretKey | ||||
| """ | ||||
|     This program is free software: you can redistribute it and/or modify | ||||
|     it under the terms of the GNU General Public License as published by | ||||
|     the Free Software Foundation, either version 3 of the License, or | ||||
|     (at your option) any later version. | ||||
| 
 | ||||
| def get_pub_key_from_priv(priv_key: UserIDSecretKey, raw_encoding:bool=False)->UserID: | ||||
|     return signing.SigningKey(priv_key, encoder=encoding.Base32Encoder).verify_key.encode(encoding.Base32Encoder) | ||||
|     This program is distributed in the hope that it will be useful, | ||||
|     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|     GNU General Public License for more details. | ||||
| 
 | ||||
|     You should have received a copy of the GNU General Public License | ||||
|     along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
| """ | ||||
| 
 | ||||
| 
 | ||||
| def get_pub_key_from_priv(priv_key: UserIDSecretKey, | ||||
|                           raw_encoding: bool = False) -> UserID: | ||||
|     return signing.SigningKey( | ||||
|         priv_key, encoder=encoding.Base32Encoder).verify_key.encode( | ||||
|             encoding.Base32Encoder) | ||||
|  |  | |||
|  | @ -1,27 +1,65 @@ | |||
| import nacl.signing, nacl.encoding, nacl.pwhash | ||||
| """Onionr - Private P2P Communication. | ||||
| 
 | ||||
| functions to generate ed25519 key pairs | ||||
| """ | ||||
| import nacl.signing | ||||
| import nacl.encoding | ||||
| import nacl.pwhash | ||||
| 
 | ||||
| import onionrexceptions | ||||
| from onionrutils import bytesconverter | ||||
| from etc import onionrvalues | ||||
| """ | ||||
|     This program is free software: you can redistribute it and/or modify | ||||
|     it under the terms of the GNU General Public License as published by | ||||
|     the Free Software Foundation, either version 3 of the License, or | ||||
|     (at your option) any later version. | ||||
| 
 | ||||
|     This program is distributed in the hope that it will be useful, | ||||
|     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|     GNU General Public License for more details. | ||||
| 
 | ||||
|     You should have received a copy of the GNU General Public License | ||||
|     along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
| """ | ||||
| 
 | ||||
| 
 | ||||
| def generate_pub_key(): | ||||
|     '''Generate a Ed25519 public key pair, return tuple of base32encoded pubkey, privkey''' | ||||
|     """Generate a Ed25519 public key pair. | ||||
| 
 | ||||
|     return tuple of base32encoded pubkey, privkey | ||||
|     """ | ||||
|     private_key = nacl.signing.SigningKey.generate() | ||||
|     public_key = private_key.verify_key.encode(encoder=nacl.encoding.Base32Encoder()) | ||||
|     return (public_key.decode(), private_key.encode(encoder=nacl.encoding.Base32Encoder()).decode()) | ||||
|     public_key = private_key.verify_key.encode( | ||||
|         encoder=nacl.encoding.Base32Encoder()) | ||||
|     return (public_key.decode(), private_key.encode( | ||||
|         encoder=nacl.encoding.Base32Encoder()).decode()) | ||||
| 
 | ||||
| 
 | ||||
| def generate_deterministic(passphrase, bypassCheck=False): | ||||
|     '''Generate a Ed25519 public key pair from a phase, not intended for human-generated key''' | ||||
|     """Generate a Ed25519 public key pair from a phase. | ||||
| 
 | ||||
|     not intended for human-generated key | ||||
|     """ | ||||
|     passStrength = onionrvalues.PASSWORD_LENGTH | ||||
|     passphrase = bytesconverter.str_to_bytes(passphrase) # Convert to bytes if not already | ||||
|     # Convert to bytes if not already | ||||
|     passphrase = bytesconverter.str_to_bytes(passphrase) | ||||
|     # Validate passphrase length | ||||
|     if not bypassCheck: | ||||
|         if len(passphrase) < passStrength: | ||||
|             raise onionrexceptions.PasswordStrengthError("Passphase must be at least %s characters" % (passStrength,)) | ||||
|             raise onionrexceptions.PasswordStrengthError( | ||||
|                 "Passphase must be at least %s characters" % (passStrength,)) | ||||
|     # KDF values | ||||
|     kdf = nacl.pwhash.argon2id.kdf | ||||
|     salt = b"U81Q7llrQcdTP0Ux" # Does not need to be secret, but must be 16 bytes | ||||
|     # Does not need to be secret, but must be 16 bytes | ||||
|     salt = b"U81Q7llrQcdTP0Ux" | ||||
|     ops = nacl.pwhash.argon2id.OPSLIMIT_SENSITIVE | ||||
|     mem = nacl.pwhash.argon2id.MEMLIMIT_SENSITIVE | ||||
| 
 | ||||
|     key = kdf(32, passphrase, salt, opslimit=ops, memlimit=mem) # Generate seed for ed25519 key | ||||
|     # Generate seed for ed25519 key | ||||
|     key = kdf(32, passphrase, salt, opslimit=ops, memlimit=mem) | ||||
|     key = nacl.signing.SigningKey(key) | ||||
|     return (key.verify_key.encode(nacl.encoding.Base32Encoder).decode(), key.encode(nacl.encoding.Base32Encoder).decode()) | ||||
|     return ( | ||||
|         key.verify_key.encode(nacl.encoding.Base32Encoder).decode(), | ||||
|         key.encode(nacl.encoding.Base32Encoder).decode()) | ||||
|  |  | |||
							
								
								
									
										0
									
								
								src/onionrproofs/shellpow.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								src/onionrproofs/shellpow.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -8,13 +8,15 @@ import os | |||
| from multiprocessing import Pipe, Process | ||||
| import threading | ||||
| import time | ||||
| import secrets | ||||
| 
 | ||||
| import onionrproofs | ||||
| 
 | ||||
| import ujson as json | ||||
| 
 | ||||
| import logger | ||||
| import onionrcrypto as crypto | ||||
| from onionrutils import bytesconverter | ||||
| from onionrcrypto.hashers import sha3_hash | ||||
| 
 | ||||
| """ | ||||
|     This program is free software: you can redistribute it and/or modify | ||||
|  | @ -111,6 +113,7 @@ class SubprocessPOW: | |||
|         nonce = 0 | ||||
|         data = self.data | ||||
|         metadata = self.metadata | ||||
|         metadata['nonce'] = secrets.randbits(16) | ||||
|         puzzle = self.puzzle | ||||
|         difficulty = self.difficulty | ||||
| 
 | ||||
|  | @ -127,7 +130,7 @@ class SubprocessPOW: | |||
|             payload = json.dumps(metadata).encode() + b'\n' + data | ||||
|             # Check sha3_256 hash of block, compare to puzzle | ||||
|             # Send payload if puzzle finished | ||||
|             token = crypto.hashers.sha3_hash(payload) | ||||
|             token = sha3_hash(payload) | ||||
|             # ensure token is string | ||||
|             token = bytesconverter.bytes_to_str(token) | ||||
|             if puzzle == token[0:difficulty]: | ||||
|  |  | |||
|  | @ -1,9 +1,16 @@ | |||
| ''' | ||||
|     Onionr - Private P2P Communication | ||||
| """Onionr - Private P2P Communication. | ||||
| 
 | ||||
|     import new blocks from disk, providing transport agnosticism | ||||
| ''' | ||||
| ''' | ||||
| import new blocks from disk, providing transport agnosticism | ||||
| """ | ||||
| import glob | ||||
| 
 | ||||
| import logger | ||||
| from onionrutils import blockmetadata | ||||
| from coredb import blockmetadb | ||||
| import filepaths | ||||
| import onionrcrypto as crypto | ||||
| from etc.onionrvalues import BLOCK_EXPORT_FILE_EXT | ||||
| """ | ||||
|     This program is free software: you can redistribute it and/or modify | ||||
|     it under the terms of the GNU General Public License as published by | ||||
|     the Free Software Foundation, either version 3 of the License, or | ||||
|  | @ -16,18 +23,11 @@ | |||
| 
 | ||||
|     You should have received a copy of the GNU General Public License | ||||
|     along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
| ''' | ||||
| import glob | ||||
| import logger | ||||
| from onionrutils import blockmetadata | ||||
| from coredb import blockmetadb | ||||
| import filepaths | ||||
| import onionrcrypto as crypto | ||||
| from etc.onionrvalues import BLOCK_EXPORT_FILE_EXT | ||||
| """ | ||||
| 
 | ||||
| 
 | ||||
| def import_new_blocks(scanDir=''): | ||||
|     ''' | ||||
|         This function is intended to scan for new blocks ON THE DISK and import them | ||||
|     ''' | ||||
|     """Scan for new blocks ON THE DISK and import them""" | ||||
|     blockList = blockmetadb.get_block_list() | ||||
|     exist = False | ||||
|     if scanDir == '': | ||||
|  | @ -35,18 +35,26 @@ def import_new_blocks(scanDir=''): | |||
|     if not scanDir.endswith('/'): | ||||
|         scanDir += '/' | ||||
|     for block in glob.glob(scanDir + "*%s" % (BLOCK_EXPORT_FILE_EXT,)): | ||||
|         if block.replace(scanDir, '').replace(BLOCK_EXPORT_FILE_EXT, '') not in blockList: | ||||
|         if block.replace(scanDir, '').replace(BLOCK_EXPORT_FILE_EXT, '') \ | ||||
|                 not in blockList: | ||||
|             exist = True | ||||
|             logger.info('Found new block on dist %s' % block, terminal=True) | ||||
|             with open(block, 'rb') as newBlock: | ||||
|                 block = block.replace(scanDir, '').replace(BLOCK_EXPORT_FILE_EXT, '') | ||||
|                 if crypto.hashers.sha3_hash(newBlock.read()) == block.replace(BLOCK_EXPORT_FILE_EXT, ''): | ||||
|                     blockmetadb.add_to_block_DB(block.replace(BLOCK_EXPORT_FILE_EXT, ''), dataSaved=True) | ||||
|                 block = block.replace(scanDir, '').replace( | ||||
|                     BLOCK_EXPORT_FILE_EXT, '') | ||||
|                 if crypto.hashers.sha3_hash(newBlock.read()) == block.replace( | ||||
|                         BLOCK_EXPORT_FILE_EXT, ''): | ||||
|                     blockmetadb.add_to_block_DB(block.replace( | ||||
|                         BLOCK_EXPORT_FILE_EXT, ''), dataSaved=True) | ||||
|                     logger.info('Imported block %s' % block, terminal=True) | ||||
|                     blockmetadata.process_block_metadata(block) | ||||
|                 else: | ||||
|                     logger.warn('Failed to verify hash for %s' % block, terminal=True) | ||||
|                     logger.warn('Failed to verify hash for %s' % block, | ||||
|                                 terminal=True) | ||||
|     if not exist: | ||||
|         logger.info('No blocks found to import', terminal=True) | ||||
| 
 | ||||
| import_new_blocks.onionr_help = f"Scans the Onionr data directory under {filepaths.block_data_location} for new block files (.db not supported) to import" | ||||
| 
 | ||||
| import_new_blocks.onionr_help = \ | ||||
|     f"Scan the Onionr data directory under {filepaths.block_data_location}" + \ | ||||
|     "for new block files (.db not supported) to import" | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue