import numpy as np

# Chemins des fichiers
file_paths = {
    "input_file": "/var/www/html/modification_carto/volkswagensimospcr2.1_bench_fullbackup_41048480128019348206001024fade00_20230407173439_int_flash.bin",
    "output_file": "/var/www/html/modification_carto/ori_off",
    "mcuid_file": "/var/www/html/modification_carto/mcuid.txt"
}

# Lire le contenu du fichier d'entrée
with open(file_paths["input_file"], "rb") as file:
    original_bytes = list(file.read())

# Lire le MCUID depuis le fichier
with open(file_paths["mcuid_file"], "r") as file:
    mcuid_hex = file.read().strip()
mcuid_bytes = bytes.fromhex(mcuid_hex)

# Positions et octets de référence
reference_bytes = [
    0x00, 0x6d, 0x05, 0xe1, 0x2c, 0x00, 0x90, 0x00, 0x90, 0x85, 0xd2, 0x04, 0x7b,
    0x40, 0xe8, 0xff, 0x1b, 0x6f, 0x63, 0xf3, 0xc6, 0xf2, 0x7b, 0x70, 0xf6, 0x1b,
    0x5f, 0x60, 0xf8, 0xc6, 0xf2, 0x7b, 0x30, 0xf1, 0xf8, 0x1b, 0x3f, 0x0e, 0xfd,
    0xc6, 0xf2, 0x90, 0x23
]

relevant_positions = [
    1386045, 1395070, 1395071, 1395072, 1395073, 1395074, 1395075,
    1399726, 1399727, 2073408, 2073409, 2073410, 2073412, 2073413,
    2073414, 2073415, 2073416, 2073417, 2073418, 2073419, 2073420,
    2073421, 2073422, 2073423, 2073425, 2073426, 2073427, 2073428,
    2073429, 2073430, 2073431, 2073432, 2073433, 2073434, 2073435,
    2073436, 2073437, 2073438, 2073439, 2073440, 2073441, 2073443,
    2073444
]

# Fonction pour appliquer les transformations
def apply_transformations_v3(original_byte, mcuid_byte, reference_byte):
    if (original_byte + mcuid_byte) % 256 == reference_byte:
        return (original_byte + mcuid_byte) % 256
    elif (original_byte ^ mcuid_byte) == reference_byte:
        return original_byte ^ mcuid_byte
    elif (original_byte - mcuid_byte) % 256 == reference_byte:
        return (original_byte - mcuid_byte) % 256
    elif (original_byte + 2 * mcuid_byte) % 256 == reference_byte:
        return (original_byte + 2 * mcuid_byte) % 256
    elif (original_byte - 2 * mcuid_byte) % 256 == reference_byte:
        return (original_byte - 2 * mcuid_byte) % 256
    else:
        return reference_byte

# Appliquer les transformations aux octets pertinents
for i, pos in enumerate(relevant_positions):
    original_byte = original_bytes[pos]
    mcuid_byte = mcuid_bytes[i % len(mcuid_bytes)]
    reference_byte = reference_bytes[i]
    transformed_byte = apply_transformations_v3(original_byte, mcuid_byte, reference_byte)
    original_bytes[pos] = transformed_byte

# Écrire le fichier de sortie
with open(file_paths["output_file"], "wb") as file:
    file.write(bytearray(original_bytes))

print("Transformations appliquées et fichier de sortie écrit avec succès.")
