From 1858b2c2c315070ad91088fdec18e81a3cb5c7fe Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 16 Jan 2022 01:44:51 +0000 Subject: [PATCH] initial --- const.py | 4 ++++ hblink.py | 49 ++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 46 insertions(+), 7 deletions(-) diff --git a/const.py b/const.py index 1218ece..c20ebdd 100755 --- a/const.py +++ b/const.py @@ -74,6 +74,10 @@ BC = b'BC' BCKA = b'BCKA' BCSQ = b'BCSQ' BCST = b'BCST' +BCVE = b'BCVE' + +#Protocol version +VER = 2 # Higheset peer ID permitted by HBP PEER_MAX = 4294967295 diff --git a/hblink.py b/hblink.py index 24ac400..01cfb07 100755 --- a/hblink.py +++ b/hblink.py @@ -126,6 +126,13 @@ class OPENBRIDGE(DatagramProtocol): self._bcka_task = task.LoopingCall(self.send_bcka) self._bcka = self._bcka_task.start(10) self._bcka.addErrback(self.loopingErrHandle) + + logger.debug('(%s) *BridgeControl* starting Version timer',self._system) + self._bcve_task = task.LoopingCall(self.send_bcve) + self._bcve = self._bcve_task.start(60) + self._bcve.addErrback(self.loopingErrHandle) + + def dereg(self): logger.info('(%s) is mode OPENBRIDGE. No De-Registration required, continuing shutdown', self._system) @@ -136,13 +143,17 @@ class OPENBRIDGE(DatagramProtocol): logger.info('(%s) Bridge STUNned, discarding', self._system) return if _packet[:4] == DMRD and self._config['TARGET_IP']: - #_packet = _packet[:11] + self._config['NETWORK_ID'] + _packet[15:] - _packet = b''.join([_packet[:11], self._CONFIG['GLOBAL']['SERVER_ID'], _packet[15:]]) - #_packet += hmac_new(self._config['PASSPHRASE'],_packet,sha1).digest() - _packet = b''.join([_packet, (hmac_new(self._config['PASSPHRASE'],_packet,sha1).digest())]) - self.transport.write(_packet, (self._config['TARGET_IP'], self._config['TARGET_PORT'])) - # KEEP THE FOLLOWING COMMENTED OUT UNLESS YOU'RE DEBUGGING DEEPLY!!!! - #logger.debug('(%s) TX Packet to OpenBridge %s:%s -- %s', self._system, self._config['TARGET_IP'], self._config['TARGET_PORT'], ahex(_packet)) + if self.config['VER'] = > 1: + _packet = b''.join([_packet[:11], self._CONFIG['GLOBAL']['SERVER_ID'], _packet[15:]]) + _packet = b''.join([_packet, (hmac_new(self._config['PASSPHRASE'],_packet,sha1).digest())]) + self.transport.write(_packet, (self._config['TARGET_IP'], self._config['TARGET_PORT'])) + # KEEP THE FOLLOWING COMMENTED OUT UNLESS YOU'RE DEBUGGING DEEPLY!!!! + #logger.debug('(%s) TX Packet to OpenBridge %s:%s -- %s', self._system, self._config['TARGET_IP'], self._config['TARGET_PORT'], ahex(_packet)) + else: + _packet = b''.join([_packet[:11], self._CONFIG['GLOBAL']['SERVER_ID'], _packet[15:]]) + _packet = b''.join([_packet, (hmac_new(self._config['PASSPHRASE'],_packet,sha1).digest())]) + self.transport.write(_packet, (self._config['TARGET_IP'], self._config['TARGET_PORT'])) + else: if not self._config['TARGET_IP']: @@ -168,6 +179,16 @@ class OPENBRIDGE(DatagramProtocol): logger.debug('(%s) *BridgeControl* sent BCSQ Source Quench, TG: %s, Stream ID: %s',self._system,int_id(_tgid), int_id(_stream_id)) else: logger.debug('(%s) *BridgeControl* Not sent BCSQ Source Quench TARGET_IP not known , TG: %s, Stream ID: %s',self._system,int_id(_tgid)) + + def send_bcve(self): + if self._config['ENHANCED_OBP'] and self._config['TARGET_IP']: + _packet = BCVE + VER.to_bytes(1,'big') + _packet = b''.join([_packet, (hmac_new(self._config['PASSPHRASE'],_packet[4:5],sha1).digest())]) + self.transport.write(_packet, (self._config['TARGET_IP'], self._config['TARGET_PORT'])) + logger.debug('(%s) *BridgeControl* sent BCVE. Ver: %s',self._system,VER) + else: + logger.debug('(%s) *BridgeControl* not sending BCVE, TARGET_IP currently not known',self._system) + def dmrd_received(self, _peer_id, _rf_src, _dst_id, _seq, _slot, _call_type, _frame_type, _dtype_vseq, _stream_id, _data,_hash): @@ -311,6 +332,20 @@ class OPENBRIDGE(DatagramProtocol): else: h,p = _sockaddr logger.warning('(%s) *BridgeControl* BCST invalid STUN, packet discarded - OPCODE: %s DATA: %s HMAC LENGTH: %s HMAC: %s SRC IP: %s SRC PORT: %s', self._system, _packet[:4], repr(_packet[:53]), len(_packet[53:]), repr(_packet[53:]),h,p) + #Version + if _packet[:4] == BCVE: + #_data = _packet[:11] + _ver = int.from_bytes(_packet[4:5],'big') + _hash = _packet[5:] + _ckhs = hmac_new(self._config['PASSPHRASE'],_packet[4:5],sha1).digest() + if compare_digest(_hash, _ckhs): + logger.debug('(%s) *BridgeControl* BCVE Version received, Ver: %s',self._system,_ver) + self._config['VER'] = _ver + else: + h,p = _sockaddr + logger.warning('(%s) *BridgeControl* BCVE invalid, packet discarded - OPCODE: %s DATA: %s HMAC LENGTH: %s HMAC: %s SRC IP: %s SRC PORT: %s', self._system, _packet[:4], repr(_packet[:53]), len(_packet[53:]), repr(_packet[53:]),h,p) + +