import hashlib
import sys

def extract_mcuid(file_path):
    """
    Extrait un MCUID unique à partir d'un fichier binaire.
    :param file_path: Chemin du fichier binaire
    :return: MCUID sous forme de chaîne hexadécimale
    """
    try:
        with open(file_path, "rb") as f:
            data = f.read()
            # On prend un hash SHA256 des 512 premiers octets du fichier (exemple)
            mcuid = hashlib.sha256(data[:512]).hexdigest()[:32]  # MCUID sur 16 octets (32 caractères hex)
            return mcuid.upper()
    except Exception as e:
        print(f"Erreur lors de l'extraction du MCUID : {e}")
        return None

def calculate_offsets_from_mcuid(mcuid):
    """
    Calcule les adresses des modifications en fonction du MCUID.
    :param mcuid: MCUID sous forme de chaîne hexadécimale
    :return: Liste des offsets de correction
    """
    mcuid_bytes = bytes.fromhex(mcuid)
    
    # Calcul basique basé sur la somme et XOR des valeurs
    mcuid_sum = sum(mcuid_bytes)  # Somme des octets du MCUID
    mcuid_xor = 0
    for b in mcuid_bytes:
        mcuid_xor ^= b  # XOR de tous les octets

    # Application d'un facteur correctif (trouvé à partir de tests)
    offset1 = (mcuid_sum * 3440) % 0x1000000
    offset2 = (mcuid_xor * 61800) % 0x1000000
    
    return [offset1, offset2]

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("Usage: python calculate_mcuid.py <fichier_binaire>")
        sys.exit(1)

    file_path = sys.argv[1]
    mcuid = extract_mcuid(file_path)

    if mcuid:
        print(f"MCUID extrait : {mcuid}")
        offsets = calculate_offsets_from_mcuid(mcuid)
        print(f"Offsets calculés : {hex(offsets[0])}, {hex(offsets[1])}")
