import binascii

def transform_byte(byte, transformations):
    addition_mod = transformations.get('addition_mod')
    xor = transformations.get('xor')
    subtraction_mod = transformations.get('subtraction_mod')
    
    # Apply the transformations in the given order
    byte_add = (byte + addition_mod) % 256
    byte_xor = byte ^ xor
    byte_sub = (byte - subtraction_mod) % 256
    
    return byte_add, byte_xor, byte_sub

# Chemin du fichier d'entrée
input_file = "/var/www/html/modification_carto/volkswagensimospcr2.1_bench_fullbackup_41048480128019348206001024fade00_20230407173439_int_flash.bin"

# Lire le fichier en mode binaire
with open(input_file, 'rb') as file:
    file_content = file.read()

# Afficher les 1000 premiers caractères pour analyse initiale
hex_content = binascii.hexlify(file_content).decode('utf-8')
print("First 1000 characters of the file in hex:")
print(hex_content[:1000])

# Segments correspondants trouvés précédemment avec leurs transformations
matching_segments = [
    (0, b'\x7b\x30\x00\xd0\x1b\r\x00\xd0\xa5\xfdx\x10<\x04\x00\x00', [
        {'addition_mod': 188, 'xor': 58, 'subtraction_mod': 58},
        {'addition_mod': 52, 'xor': 52, 'subtraction_mod': 44},
        {'addition_mod': 5, 'xor': 5, 'subtraction_mod': 251},
        {'addition_mod': 86, 'xor': 86, 'subtraction_mod': 74},
        {'addition_mod': 33, 'xor': 29, 'subtraction_mod': 21},
        {'addition_mod': 109, 'xor': 109, 'subtraction_mod': 173},
        {'addition_mod': 144, 'xor': 144, 'subtraction_mod': 112},
        {'addition_mod': 225, 'xor': 193, 'subtraction_mod': 191},
        {'addition_mod': 39, 'xor': 39, 'subtraction_mod': 35},
        {'addition_mod': 3, 'xor': 251, 'subtraction_mod': 247},
        {'addition_mod': 120, 'xor': 120, 'subtraction_mod': 120},
        {'addition_mod': 32, 'xor': 0, 'subtraction_mod': 0},
        {'addition_mod': 96, 'xor': 24, 'subtraction_mod': 24},
        {'addition_mod': 7, 'xor': 7, 'subtraction_mod': 1},
        {'addition_mod': 237, 'xor': 237, 'subtraction_mod': 19},
        {'addition_mod': 0, 'xor': 0, 'subtraction_mod': 0}
    ]),
    (1, b'\x7c\x94\x00\x00\x91\x00\x00(\xd9"\x82\xb3\x00\x00\xdc\x02', [
        {'addition_mod': 189, 'xor': 61, 'subtraction_mod': 59},
        {'addition_mod': 152, 'xor': 144, 'subtraction_mod': 144},
        {'addition_mod': 5, 'xor': 5, 'subtraction_mod': 251},
        {'addition_mod': 134, 'xor': 134, 'subtraction_mod': 122},
        {'addition_mod': 151, 'xor': 151, 'subtraction_mod': 139},
        {'addition_mod': 96, 'xor': 96, 'subtraction_mod': 160},
        {'addition_mod': 144, 'xor': 144, 'subtraction_mod': 112},
        {'addition_mod': 57, 'xor': 57, 'subtraction_mod': 23},
        {'addition_mod': 91, 'xor': 91, 'subtraction_mod': 87},
        {'addition_mod': 40, 'xor': 36, 'subtraction_mod': 28},
        {'addition_mod': 130, 'xor': 130, 'subtraction_mod': 130},
        {'addition_mod': 195, 'xor': 163, 'subtraction_mod': 163},
        {'addition_mod': 36, 'xor': 36, 'subtraction_mod': 220},
        {'addition_mod': 3, 'xor': 3, 'subtraction_mod': 253},
        {'addition_mod': 201, 'xor': 49, 'subtraction_mod': 239},
        {'addition_mod': 2, 'xor': 2, 'subtraction_mod': 2}
    ]),
    (32, b'\xa2y\x00\x80\xfe[\x00\x80*\x18\x00\x80\x00\x00\x00\x00', [
        {'addition_mod': 227, 'xor': 227, 'subtraction_mod': 97},
        {'addition_mod': 125, 'xor': 125, 'subtraction_mod': 117},
        {'addition_mod': 5, 'xor': 5, 'subtraction_mod': 251},
        {'addition_mod': 6, 'xor': 6, 'subtraction_mod': 250},
        {'addition_mod': 4, 'xor': 248, 'subtraction_mod': 248},
        {'addition_mod': 187, 'xor': 59, 'subtraction_mod': 251},
        {'addition_mod': 144, 'xor': 144, 'subtraction_mod': 112},
        {'addition_mod': 145, 'xor': 145, 'subtraction_mod': 111},
        {'addition_mod': 172, 'xor': 168, 'subtraction_mod': 168},
        {'addition_mod': 30, 'xor': 30, 'subtraction_mod': 18},
        {'addition_mod': 0, 'xor': 0, 'subtraction_mod': 0},
        {'addition_mod': 144, 'xor': 144, 'subtraction_mod': 112},
        {'addition_mod': 36, 'xor': 36, 'subtraction_mod': 220},
        {'addition_mod': 3, 'xor': 3, 'subtraction_mod': 253},
        {'addition_mod': 237, 'xor': 237, 'subtraction_mod': 19},
        {'addition_mod': 0, 'xor': 0, 'subtraction_mod': 0}
    ]),
    (49, b'\x0b\x02\x00\x80\x00\x12\x00\x80\xc3\xb2\x00\x80\x00\x00\x00\x00', [
        {'addition_mod': 76, 'xor': 74, 'subtraction_mod': 202},
        {'addition_mod': 6, 'xor': 6, 'subtraction_mod': 254},
        {'addition_mod': 5, 'xor': 5, 'subtraction_mod': 251},
        {'addition_mod': 6, 'xor': 6, 'subtraction_mod': 250},
        {'addition_mod': 6, 'xor': 6, 'subtraction_mod': 250},
        {'addition_mod': 114, 'xor': 114, 'subtraction_mod': 178},
        {'addition_mod': 144, 'xor': 144, 'subtraction_mod': 112},
        {'addition_mod': 145, 'xor': 145, 'subtraction_mod': 111},
        {'addition_mod': 69, 'xor': 65, 'subtraction_mod': 65},
        {'addition_mod': 184, 'xor': 180, 'subtraction_mod': 172},
        {'addition_mod': 0, 'xor': 0, 'subtraction_mod': 0},
        {'addition_mod': 144, 'xor': 144, 'subtraction_mod': 112},
        {'addition_mod': 36, 'xor': 36, 'subtraction_mod': 220},
        {'addition_mod': 3, 'xor': 3, 'subtraction_mod': 253},
        {'addition_mod': 237, 'xor': 237, 'subtraction_mod': 19},
        {'addition_mod': 0, 'xor': 0, 'subtraction_mod': 0}
    ]),
    (128, b'\x4e\x42\x30\x65\x00\x00\x53\x4d\x32\x33\x33\x2d\x36\x35\x30\x32', [
        {'addition_mod': 143, 'xor': 15, 'subtraction_mod': 13},
        {'addition_mod': 70, 'xor': 70, 'subtraction_mod': 62},
        {'addition_mod': 53, 'xor': 53, 'subtraction_mod': 43},
        {'addition_mod': 235, 'xor': 227, 'subtraction_mod': 223},
        {'addition_mod': 6, 'xor': 6, 'subtraction_mod': 250},
        {'addition_mod': 96, 'xor': 96, 'subtraction_mod': 160},
        {'addition_mod': 227, 'xor': 195, 'subtraction_mod': 195},
        {'addition_mod': 94, 'xor': 92, 'subtraction_mod': 60},
        {'addition_mod': 180, 'xor': 176, 'subtraction_mod': 176},
        {'addition_mod': 57, 'xor': 53, 'subtraction_mod': 45},
        {'addition_mod': 51, 'xor': 51, 'subtraction_mod': 51},
        {'addition_mod': 61, 'xor': 61, 'subtraction_mod': 29},
        {'addition_mod': 90, 'xor': 18, 'subtraction_mod': 18},
        {'addition_mod': 56, 'xor': 54, 'subtraction_mod': 50},
        {'addition_mod': 29, 'xor': 221, 'subtraction_mod': 67},
        {'addition_mod': 50, 'xor': 50, 'subtraction_mod': 50}
    ]),
    (129, b'\x30\x31\x35\x32\x30\x35\x2d\x2d\x2d\x2d\x2d\x2d\x00\x00\x00\x00', [
        {'addition_mod': 113, 'xor': 113, 'subtraction_mod': 239},
        {'addition_mod': 53, 'xor': 53, 'subtraction_mod': 45},
        {'addition_mod': 58, 'xor': 48, 'subtraction_mod': 48},
        {'addition_mod': 184, 'xor': 180, 'subtraction_mod': 172},
        {'addition_mod': 54, 'xor': 54, 'subtraction_mod': 42},
        {'addition_mod': 149, 'xor': 85, 'subtraction_mod': 213},
        {'addition_mod': 189, 'xor': 189, 'subtraction_mod': 157},
        {'addition_mod': 62, 'xor': 60, 'subtraction_mod': 28},
        {'addition_mod': 175, 'xor': 175, 'subtraction_mod': 171},
        {'addition_mod': 51, 'xor': 43, 'subtraction_mod': 39},
        {'addition_mod': 45, 'xor': 45, 'subtraction_mod': 45},
        {'addition_mod': 61, 'xor': 61, 'subtraction_mod': 29},
        {'addition_mod': 36, 'xor': 36, 'subtraction_mod': 220},
        {'addition_mod': 3, 'xor': 3, 'subtraction_mod': 253},
        {'addition_mod': 237, 'xor': 237, 'subtraction_mod': 19},
        {'addition_mod': 0, 'xor': 0, 'subtraction_mod': 0}
    ]),
    (302, b'\x02\xf4\x6d\x00\x63\x34\x00\x80\xdf\x14\x0a\x00\xdf\x24\x0a\x00', [
        {'addition_mod': 67, 'xor': 67, 'subtraction_mod': 193},
        {'addition_mod': 248, 'xor': 240, 'subtraction_mod': 240},
        {'addition_mod': 114, 'xor': 104, 'subtraction_mod': 104},
        {'addition_mod': 134, 'xor': 134, 'subtraction_mod': 122},
        {'addition_mod': 105, 'xor': 101, 'subtraction_mod': 93},
        {'addition_mod': 148, 'xor': 84, 'subtraction_mod': 212},
        {'addition_mod': 144, 'xor': 144, 'subtraction_mod': 112},
        {'addition_mod': 145, 'xor': 145, 'subtraction_mod': 111},
        {'addition_mod': 97, 'xor': 93, 'subtraction_mod': 93},
        {'addition_mod': 26, 'xor': 18, 'subtraction_mod': 14},
        {'addition_mod': 10, 'xor': 10, 'subtraction_mod': 10},
        {'addition_mod': 16, 'xor': 16, 'subtraction_mod': 240},
        {'addition_mod': 3, 'xor': 251, 'subtraction_mod': 187},
        {'addition_mod': 39, 'xor': 39, 'subtraction_mod': 33},
        {'addition_mod': 247, 'xor': 231, 'subtraction_mod': 29},
        {'addition_mod': 0, 'xor': 0, 'subtraction_mod': 0}
    ]),
    (303, b'\xda\x08\x3e\x49\x3b\x00\x40\xf0\x3e\x42\x3c\x08\x82\xf2\x00\x90', [
        {'addition_mod': 27, 'xor': 155, 'subtraction_mod': 153},
        {'addition_mod': 12, 'xor': 12, 'subtraction_mod': 4},
        {'addition_mod': 67, 'xor': 59, 'subtraction_mod': 57},
        {'addition_mod': 207, 'xor': 207, 'subtraction_mod': 195},
        {'addition_mod': 65, 'xor': 61, 'subtraction_mod': 53},
        {'addition_mod': 96, 'xor': 96, 'subtraction_mod': 160},
        {'addition_mod': 208, 'xor': 208, 'subtraction_mod': 176},
        {'addition_mod': 1, 'xor': 225, 'subtraction_mod': 223},
        {'addition_mod': 192, 'xor': 188, 'subtraction_mod': 188},
        {'addition_mod': 72, 'xor': 68, 'subtraction_mod': 60},
        {'addition_mod': 60, 'xor': 60, 'subtraction_mod': 60},
        {'addition_mod': 24, 'xor': 24, 'subtraction_mod': 248},
        {'addition_mod': 166, 'xor': 166, 'subtraction_mod': 94},
        {'addition_mod': 245, 'xor': 241, 'subtraction_mod': 239},
        {'addition_mod': 237, 'xor': 237, 'subtraction_mod': 19},
        {'addition_mod': 144, 'xor': 144, 'subtraction_mod': 144}
    ]),
    (304, b'\x82\x82\x00\x90\x3b\x50\xff\x2f\x00\x90\x3b\x20\xff\x2f\x00\x90', [
        {'addition_mod': 195, 'xor': 195, 'subtraction_mod': 65},
        {'addition_mod': 134, 'xor': 134, 'subtraction_mod': 126},
        {'addition_mod': 5, 'xor': 5, 'subtraction_mod': 251},
        {'addition_mod': 22, 'xor': 22, 'subtraction_mod': 10},
        {'addition_mod': 65, 'xor': 61, 'subtraction_mod': 53},
        {'addition_mod': 176, 'xor': 48, 'subtraction_mod': 240},
        {'addition_mod': 143, 'xor': 111, 'subtraction_mod': 111},
        {'addition_mod': 64, 'xor': 62, 'subtraction_mod': 30},
        {'addition_mod': 130, 'xor': 130, 'subtraction_mod': 126},
        {'addition_mod': 150, 'xor': 150, 'subtraction_mod': 138},
        {'addition_mod': 59, 'xor': 59, 'subtraction_mod': 59},
        {'addition_mod': 48, 'xor': 48, 'subtraction_mod': 16},
        {'addition_mod': 35, 'xor': 219, 'subtraction_mod': 219},
        {'addition_mod': 50, 'xor': 44, 'subtraction_mod': 44},
        {'addition_mod': 237, 'xor': 237, 'subtraction_mod': 19},
        {'addition_mod': 144, 'xor': 144, 'subtraction_mod': 144}
    ]),
    (305, b'\x02\x59\x40\x4c\x8f\x29\x00\xf1\x40\x5f\x8b\x0f\x20\xc2\x20\x18', [
        {'addition_mod': 67, 'xor': 67, 'subtraction_mod': 193},
        {'addition_mod': 93, 'xor': 93, 'subtraction_mod': 85},
        {'addition_mod': 69, 'xor': 69, 'subtraction_mod': 59},
        {'addition_mod': 210, 'xor': 202, 'subtraction_mod': 198},
        {'addition_mod': 149, 'xor': 137, 'subtraction_mod': 137},
        {'addition_mod': 137, 'xor': 73, 'subtraction_mod': 201},
        {'addition_mod': 144, 'xor': 144, 'subtraction_mod': 112},
        {'addition_mod': 2, 'xor': 224, 'subtraction_mod': 224},
        {'addition_mod': 194, 'xor': 194, 'subtraction_mod': 190},
        {'addition_mod': 101, 'xor': 89, 'subtraction_mod': 89},
        {'addition_mod': 139, 'xor': 139, 'subtraction_mod': 139},
        {'addition_mod': 31, 'xor': 31, 'subtraction_mod': 255},
        {'addition_mod': 68, 'xor': 4, 'subtraction_mod': 252},
        {'addition_mod': 197, 'xor': 193, 'subtraction_mod': 191},
        {'addition_mod': 13, 'xor': 205, 'subtraction_mod': 51},
        {'addition_mod': 24, 'xor': 24, 'subtraction_mod': 24}
    ])
]

# Transformation des segments et calcul du MCUID
mcuid_bytes = []
for index, (offset, segment, transformations) in enumerate(matching_segments):
    print(f"Index: {index}, Segment: {segment.hex()}")
    for byte_index, (byte, transform) in enumerate(zip(segment, transformations)):
        byte_add, byte_xor, byte_sub = transform_byte(byte, transform)
        deduced_byte = byte_add  # Ou choisir entre byte_xor ou byte_sub selon la logique spécifique
        mcuid_bytes.append(deduced_byte)
        print(f"  Byte {byte_index}: Original: {byte}, Transformations: {transform}, Deduced Byte: {deduced_byte}")

# Afficher le MCUID en hexadécimal
mcuid_hex = ''.join([format(byte, '02x') for byte in mcuid_bytes])
print("Deduced MCUID (bytes):")
print(mcuid_bytes)
print("Deduced MCUID (hex):")
print(mcuid_hex)
