import hmac import hashlib import struct import time def calcola_hmac(passphrase: str, dati: bytes) -> bytes: """Calcola la firma HMAC-SHA1 richiesta dalle reti FreeDMR/HBLink.""" return hmac.new(passphrase.encode('utf-8'), dati, hashlib.sha1).digest() def crea_pacchetto_ping(peer_id: int, passphrase: str) -> bytes: """ Crea un pacchetto PING OpenBridge formattato con autenticazione HMAC. """ # Header OpenBridge tipico: Magic 'OPB' (3 byte) + Tipo 0x01 (Ping) + PeerID (4 byte) + Timestamp (4 byte) timestamp = int(time.time()) payload_base = struct.pack("!3sBI I", b"OPB", 0x01, peer_id, timestamp) # Calcoliamo la firma HMAC-SHA1 della password sul payload base firma_hmac = calcola_hmac(passphrase, payload_base) # Restituiamo il pacchetto completo (Payload + HMAC) return payload_base + firma_hmac def crea_superheader_chiamata(peer_id: int, passphrase: str, src_id: int, dst_tg: int, slot: int, stream_id: bytes) -> bytes: """ Crea l'intestazione di inizio trasmissione (Call Start / SuperHeader) per HBLink. """ # Header: Magic 'OPB' + Tipo 0x80 (Start Call) + PeerID + StreamID + Slot + SrcID + DstTG # (Formato compatibile con le specifiche OpenBridge/HomeBrew) flags = (slot & 0x01) << 7 payload_base = struct.pack("!3sB I 4s B I I", b"OPB", 0x80, peer_id, stream_id[:4], flags, src_id, dst_tg) firma_hmac = calcola_hmac(passphrase, payload_base) return payload_base + firma_hmac