import sys
import binascii

# Fonction pour extraire le MCUID à partir d'une position donnée dans le fichier
def extract_mcuid_at_position(file_path, position, mcuid_length=16):
    with open(file_path, 'rb') as file:
        file.seek(position)
        mcuid_bytes = file.read(mcuid_length)
    mcuid_hex = binascii.hexlify(mcuid_bytes).decode('utf-8').lower()
    return mcuid_hex

# Fonction pour calculer le MCUID final basé sur les transformations XOR
def calculate_final_mcuid(mcuid_hex):
    mcuid_bytes = bytearray(bytes.fromhex(mcuid_hex))
    xor_values = [0xa7, 0x89, 0xf5, 0x8f]  # Valeurs XOR identifiées
    for i in range(4):
        mcuid_bytes[12 + i] ^= xor_values[i]
    return binascii.hexlify(mcuid_bytes).decode('utf-8').lower()

if __name__ == "__main__":
    if len(sys.argv) != 4:
        print("Usage: python3 transform_mcuid.py <input_file> <position> <output_file>")
        sys.exit(1)
    
    input_file = sys.argv[1]
    position = int(sys.argv[2])
    output_file = sys.argv[3]

    # Extraire le MCUID
    mcuid_hex = extract_mcuid_at_position(input_file, position)
    print(f"MCUID initial: {mcuid_hex}")

    # Calculer le MCUID final
    mcuid_final = calculate_final_mcuid(mcuid_hex)
    print(f"MCUID transformé: {mcuid_final}")

    # Écrire le MCUID transformé dans le fichier de sortie
    with open(output_file, 'w') as file:
        file.write(mcuid_final + '\n')
    
    print(f"MCUID transformé enregistré dans {output_file}")
