import numpy as np

# Chemins des fichiers
file_paths = {
    "input_file": "/var/www/html/modification_carto/ori",
    "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)

# Fonction pour calculer les positions spécifiques par rapport au MCUID
def calculate_positions_from_mcuid(mcuid_bytes, data_length, step=100000):
    positions = []
    mcuid_length = len(mcuid_bytes)
    base_position = sum(mcuid_bytes)
    for i in range(mcuid_length):
        position = (base_position + i * step + mcuid_bytes[i % mcuid_length]) % data_length
        positions.append(position)
    return positions

data_length = len(original_bytes)

# Calculer toutes les positions spécifiques par rapport au MCUID
positions_from_mcuid = calculate_positions_from_mcuid(mcuid_bytes, data_length)

# Afficher les positions calculées dans le format souhaité
print("relevant_positions = [")
for i, pos in enumerate(positions_from_mcuid):
    if i % 10 == 0 and i != 0:
        print()
    print(f"    {pos},", end="")
print("\n]")

# 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
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
]

for i, pos in enumerate(positions_from_mcuid):
    original_byte = original_bytes[pos]
    mcuid_byte = mcuid_bytes[i % len(mcuid_bytes)]
    reference_byte = reference_bytes[i % len(reference_bytes)]
    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.")
