Forum

Calcolo del checksum su centralina EDC15P+
MTX Electronics » Forum » Generale » Discussioni Generiche
 
Moderatori: mtx-electronics
Autore Messaggio
salvo
gio gen 20 2011, 02:51
messaggi: 19
Per iniziare vediamo rispondere a due semplici domande in modo che tutti capiscono di cosa stiamo parlando.

- Cosa è un checksum?

Un checksum è un valore computato da un blocco di dati digitali con l'intento di essere utilizzato per validare la correttezza di questi dati. L'integrità dei dati può essere verificata in qualsiasi momento generando nuovamente il checksum del blocco di dati è confrontandolo con il valore precedentemente memorizzato.

Quando si parla di algoritmo di checksum si sta indicando una funzione software che tramite varie operazioni di spostamento dei bit e calcoli matematici è in grado di generare un checksum.

- Come viene usato nelle centraline dell'auto è perché?

I checksum nelle centraline ha un importanza rilevante perché permette alla centralina stessa di effettuare dei controlli di sicurezza in modo che in caso che i dati al suo interno vengono danneggiati e/o modificati esternamente questa può prendere azione onde evitare eventuali gravi danni dovuti ad un errato funzionamento. In genere esistono più checksum nella stessa centralina per proteggere sia le zone del programma che le zone dove sono memorizzate le mappature.

Di seguito descriverò brevemente il checksum utilizzato dalla centralina della mia auto per proteggere i dati della mia Seat Cordoba 1.9TDI 101cv con centralina EDC15P+.

Iniziamo elencando i 10 blocchi di memoria protetti da checksum è i relativi indirizzi dove sono memorizzati i risultati dei checksum calcolati:

1) 0x14000 - 0x4bffe checksum usato come seed (non memorizzato)
2) 0x00000 - 0x07ffe checksum usato come seed (non memorizzato)
3) 0x08000 - 0x0fffb checksum memorizzato all'indirizzo 0x0fffc
4) 0x01000 - 0x13ffb checksum memorizzato all'indirizzo 0x13ffc
5) 0x4c000 - 0x4fffb checksum memorizzato all'indirizzo 0x4fffc
6) 0x50000 - 0x50b7b checksum memorizzato all'indirizzo 0x50b7c
7) 0x50b80 - 0x5bffb checksum memorizzato all'indirizzo 0x5bffc
8) 0x6c000 - 0x6fffb checksum memorizzato all'indirizzo 0x6fffc
9) 0x70000 - 0x70b7b checksum memorizzato all'indirizzo 0x70b7c
10) 0x70b80 - 0x7bffb checksum memorizzato all'indirizzo 0x7bffc

Come avete notato i primi due checksum non sono memorizzati in memoria non volatile (EEPROM) perché vengono utilizzati dall'algoritmo di checksum come chiavi (seed) per calcolare alcuni dei successivi checksum, in questo modo se uno o più dei primi due blocchi di dati cambia contenuto molti altri checksum verranno modificati di conseguenza.

Vediamo più da vicino quali checksum vengono influenzati da questi primi due:

Il checksum numero 1 viene utilizzato come seed nel calcolo del numero 5,6,7,8,9 e 10;
Invece il checksum del numero 2 viene utilizzato come seed nel calcolo del numero 3.

Ora vediamo di parlare dell'algoritmo utilizzato nel calcolo del checksum, in pratica c'è una funzione che con delle operazioni logiche (XOR, AND) e matematiche effettua delle operazioni sui dati per arrivare al risultato finale. Inoltre per assicurarsi di complicare un'altro po le cose ci sono delle costanti in memoria che sono utilizzate come seed, queste sono diverse per ogni blocco di dati.

Il seguente è un piccolo pezzo del codice che ho convertito in C dal originale decompilato in linguaggio assembler, ho fatto delle piccole omissioni in modo che sia più chiaro il suo funzionamento per questa dimostrazione (non è lo scopo di questo testo andare nei dettagli molto complessi dell'algoritmo utilizzato):

// Definiamo alcune variabili utilizzate
uint16 var1=0x8631;  // Seed letto da una tabella
uint16 var2=0xefcd;  // Seed letto da una tabella
uint16 var3;
uint16 var4;
uint16 var5;
uint16 var6;
uint16 var7;

// Indirizzo dove inizia il blocco checksum da calcolare
uint32 var8=0x14000;

// Indirizzo dove finisce il blocco checksum da calcolare
uint32 var9=0x4bffe;

// Buffer che fa riferimento alla memoria EEPROM
uchar8 buffer[0x80000];

// Recupera dalla EEPROM 16bit di dati alla posizione attuale e 
// fai un OR logico con i dati nella variabile (var1)
var1 ^= ((uint16)buffer[var8] << 8) + (uint16)buffer[var8];

// Fai un AND logico con 0x0f della variabile (var2)
var3 = var2 & 0x0f;

// Sposta il puntatore della posizione EEPROM di 16bit 
var8 += 2;

// Inizializza (var4) con il valore 0
var4 = 0;

// Se (var2) contiene dei bit a 1 nel suo nibble basso continua
if (var2 & 0x0f)
{
  // Fai un loop finché (var3) non è uguale a 0
  while (var3)
  {
    // Sposta di 15 bit a destra (var1) e metti il risultato in (var4)
    var4 = var1 >> 15;
    
    // Moltiplica (var1) per 2
    var1 *= 2;

    // Somma 22 a (var1)
    var1 += 22;

    // Decrementa 1 da (var3)
    var3--;
  }
}

// Leggi i prossimi 16 bit dalla memoria EEPROM
var5 = (uint16)buffer[var8];
var6 = (uint16)buffer[var8] << 8;

// Sposta il puntatore della posizione EEPROM di 16bit 
var8 += 2;

// Effetua un OR logico tra (var7) e (var1) mettendo il risultato in (var7)
var7 ^= var1;


... continua per altre circa 60 righe di codice ...

Questo codice viene eseguito in modo sequenziale per calcolare tutti i 10 checksum è se solo uno dei checksum non risulta esatto la centralina segnalerà l'errore e molto probabilmente l'auto non si avvierà.

Quando un preparatore effettua una rimappatura della vostra auto il software che utilizza deve necessariamente effettuare questi calcoli prima di procedere al invio della nuova mappa alla centralina tramite presa OBD o programmazione del EEPROM.

[ Modificato gio gen 20 2011, 07:34 ]
Torna ad inizio pagina
salvo
mar ago 14 2012, 03:47
messaggi: 19
E' stato svillupato VAG Checksum Fix, un software opensource per il calcolo dei checksum sulle vetture VAG che montano centralina EDC15P. Trovate il programma pronto all'uso è il codice sorgente completo nella sezione download.

Link diretto: VAG Checksum Fix
Torna ad inizio pagina
 

Salta:     Torna ad inizio pagina

RSS discussione: rss 0.92 RSS discussione: rss 2.0 RSS discussione: RDF