36 lines
1.5 KiB
Python
36 lines
1.5 KiB
Python
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
|