Implemented progress on resource initiator side. Made MDUs more obvious.

This commit is contained in:
Mark Qvist 2020-04-28 20:50:57 +02:00
parent a9c4d0e78d
commit c9d1c938ff
7 changed files with 34 additions and 15 deletions

View File

@ -89,7 +89,7 @@ def client_connected(link):
data = umsgpack.packb(list_files()) data = umsgpack.packb(list_files())
# Check the size of the packed data # Check the size of the packed data
if len(data) <= RNS.Reticulum.LINK_MDU: if len(data) <= RNS.Link.MDU:
# If it fits in one packet, we will just # If it fits in one packet, we will just
# send it as a single packet over the link. # send it as a single packet over the link.
list_packet = RNS.Packet(link, data) list_packet = RNS.Packet(link, data)

View File

@ -23,6 +23,9 @@ class Identity:
HASHLENGTH = 256 # In bits HASHLENGTH = 256 # In bits
SIGLENGTH = KEYSIZE SIGLENGTH = KEYSIZE
ENCRYPT_CHUNKSIZE = (KEYSIZE-PADDINGSIZE)//8
DECRYPT_CHUNKSIZE = KEYSIZE//8
TRUNCATED_HASHLENGTH = 80 # In bits TRUNCATED_HASHLENGTH = 80 # In bits
# Storage # Storage
@ -222,7 +225,7 @@ class Identity:
def encrypt(self, plaintext): def encrypt(self, plaintext):
if self.pub != None: if self.pub != None:
chunksize = (Identity.KEYSIZE-Identity.PADDINGSIZE)//8 chunksize = Identity.ENCRYPT_CHUNKSIZE
chunks = int(math.ceil(len(plaintext)/(float(chunksize)))) chunks = int(math.ceil(len(plaintext)/(float(chunksize))))
ciphertext = b""; ciphertext = b"";
@ -249,7 +252,7 @@ class Identity:
if self.prv != None: if self.prv != None:
plaintext = None plaintext = None
try: try:
chunksize = (Identity.KEYSIZE)//8 chunksize = Identity.DECRYPT_CHUNKSIZE
chunks = int(math.ceil(len(ciphertext)/(float(chunksize)))) chunks = int(math.ceil(len(ciphertext)/(float(chunksize))))
plaintext = b""; plaintext = b"";

View File

@ -8,6 +8,7 @@ from time import sleep
from .vendor import umsgpack as umsgpack from .vendor import umsgpack as umsgpack
import threading import threading
import base64 import base64
import math
import time import time
import RNS import RNS
@ -25,6 +26,8 @@ class Link:
CURVE = ec.SECP256R1() CURVE = ec.SECP256R1()
ECPUBSIZE = 91 ECPUBSIZE = 91
BLOCKSIZE = 16 BLOCKSIZE = 16
AES_HMAC_OVERHEAD = 58
MDU = math.floor((RNS.Reticulum.MDU-AES_HMAC_OVERHEAD)/BLOCKSIZE)*BLOCKSIZE - 1
# TODO: This should not be hardcoded, # TODO: This should not be hardcoded,
# but calculated from something like # but calculated from something like
@ -69,7 +72,7 @@ class Link:
#if self.owner.callbacks.link_established != None: #if self.owner.callbacks.link_established != None:
# self.owner.callbacks.link_established(link) # self.owner.callbacks.link_established(link)
RNS.log("Incoming link request "+str(link)+" accepted, waiting for RTT packet", RNS.LOG_VERBOSE) RNS.log("Incoming link request "+str(link)+" accepted", RNS.LOG_VERBOSE)
return link return link
except Exception as e: except Exception as e:

View File

@ -1,4 +1,5 @@
import struct import struct
import math
import time import time
import RNS import RNS
@ -40,11 +41,17 @@ class Packet:
# This is used to calculate allowable # This is used to calculate allowable
# payload sizes # payload sizes
HEADER_MAXSIZE = RNS.Reticulum.HEADER_MAXSIZE HEADER_MAXSIZE = 23
MDU = RNS.Reticulum.MDU
# With an MTU of 500, the maximum RSA-encrypted
# amount of data we can send in a single packet
# is given by the below calculation; 258 bytes.
RSA_MDU = math.floor(MDU/RNS.Identity.DECRYPT_CHUNKSIZE)*RNS.Identity.ENCRYPT_CHUNKSIZE
PLAIN_MDU = MDU
# TODO: This should be calculated # TODO: This should be calculated
# more intelligently # more intelligently
# Default packet timeout # Default packet timeout
TIMEOUT = 60 TIMEOUT = 60

View File

@ -11,7 +11,7 @@ class Resource:
WINDOW_MAX = 7 WINDOW_MAX = 7
WINDOW = 4 WINDOW = 4
MAPHASH_LEN = 4 MAPHASH_LEN = 4
SDU = RNS.Reticulum.MTU - RNS.Packet.HEADER_MAXSIZE SDU = RNS.Packet.MDU
RANDOM_HASH_SIZE = 4 RANDOM_HASH_SIZE = 4
# TODO: Should be allocated more # TODO: Should be allocated more
@ -89,6 +89,7 @@ class Resource:
self.hmu_retry_ok = False self.hmu_retry_ok = False
self.watchdog_lock = False self.watchdog_lock = False
self.__watchdog_job_id = 0 self.__watchdog_job_id = 0
self.__progress_callback = progress_callback
self.rtt = None self.rtt = None
if data != None: if data != None:
@ -96,7 +97,8 @@ class Resource:
while not hashmap_ok: while not hashmap_ok:
self.initiator = True self.initiator = True
self.callback = callback self.callback = callback
self.progress_callback = progress_callback # TODO: Remove
#self.progress_callback = progress_callback
self.random_hash = RNS.Identity.getRandomHash()[:Resource.RANDOM_HASH_SIZE] self.random_hash = RNS.Identity.getRandomHash()[:Resource.RANDOM_HASH_SIZE]
self.uncompressed_data = data self.uncompressed_data = data
self.compressed_data = bz2.compress(self.uncompressed_data) self.compressed_data = bz2.compress(self.uncompressed_data)
@ -478,6 +480,9 @@ class Resource:
if self.sent_parts == len(self.parts): if self.sent_parts == len(self.parts):
self.status = Resource.AWAITING_PROOF self.status = Resource.AWAITING_PROOF
if self.__progress_callback != None:
self.__progress_callback(self)
def cancel(self): def cancel(self):
if self.status < Resource.COMPLETE: if self.status < Resource.COMPLETE:
self.status = Resource.FAILED self.status = Resource.FAILED
@ -497,6 +502,9 @@ class Resource:
self.__progress_callback = callback self.__progress_callback = callback
def progress(self): def progress(self):
if self.initiator:
progress = self.sent_parts / len(self.parts)
else:
progress = self.received_count / float(self.total_parts) progress = self.received_count / float(self.total_parts)
return progress return progress

View File

@ -14,10 +14,8 @@ import RNS
class Reticulum: class Reticulum:
MTU = 500 MTU = 500
HEADER_MAXSIZE = 23 HEADER_MAXSIZE = 23
PAD_AES_HMAC = 64
MDU = MTU - HEADER_MAXSIZE MDU = MTU - HEADER_MAXSIZE
LINK_MDU = MDU - PAD_AES_HMAC
router = None router = None
config = None config = None

View File

@ -77,7 +77,7 @@ def hexrep(data, delimit=True):
delimiter = ":" delimiter = ":"
if not delimit: if not delimit:
delimiter = "" delimiter = ""
hexrep = delimiter.join("{:02x}".format(ord(c)) for c in data) hexrep = delimiter.join("{:02x}".format(c) for c in data)
return hexrep return hexrep
def prettyhexrep(data): def prettyhexrep(data):