Analysis of magnetic stripe tickets used for public transport in Lombardy, Italy

January 04, 2022Only available in Italian 🇮🇹

Una banda magnetica su un biglietto usa e getta potrebbe sembrare una cosa piuttosto noiosa e poco degna di essere studiata. Ogni tanto però la curiosità prevale, una scoperta tira l’altra e in men che non si dica ci si trova a viaggiare non per lavoro o per diletto, ma per accumulare biglietti da analizzare. Ecco tutto ciò che ho scoperto sul mondo che c’è dietro.

Il Sistema di Bigliettazione Magnetica ed Elettronica

Il SBME nasce a fine anni ‘90 da un accordo firmato tra ATM, Trenitalia e FNMT (queste ultime due ora fuse in Trenord) con l’obiettivo di sostituire i biglietti cartacei in uso all’epoca per il trasporto pubblico locale di Milano e per le ferrovie lombarde. Viene realizzato da Elsag (ora AEP), Ascom (ora Conduent) e Firema1, ed entra a pieno regime nel 2006. Da allora rimane sostanzialmente invariato sul piano tecnologico.

Il sistema prevede due nuovi supporti per i titoli di viaggio. Per le tariffe a breve termine vengono introdotti i biglietti magnetici, formalmente chiamati documenti magnetici (DM). Per gli abbonamenti vengono introdotti due tipi di tessere elettroniche senza contatti (TSC): MIFARE Classic, sviluppato da NXP e parzialmente basato sullo standard ISO 14443, e Calypso 1.0 (CD97)2, sviluppato dalla società francese Innovatron e basato su una tecnologia proprietaria. Le TSC meritano senza dubbio un post a parte che rimando a una data futura; qui mi occuperò esclusivamente dei DM.

Tutto l’hardware che gira attorno al SBME è stato realizzato dall’azienda svizzera Ascom, anche se alcuni dispositivi riportano loghi di altre aziende. Il motivo è che nel 2005 la divisione trasporti di Ascom è stata acquisita da ACS; nel 2009 ACS è stata a sua volta inglobata da Xerox, ma nel 2017 si è nuovamente separata costituendo l’attuale Conduent. L’hardware comprende i distributori automatici di biglietti (DAB), i cosiddetti “distributori semiautomatici di documenti” (DSD)3 usati dalle biglietterie, e naturalmente le convalidatrici (CNV). Fin dalla nascita del SBME le convalidatrici usate sono i modelli VPE 412, CAS 412 (versione da incasso per i tornelli della metro)4 e VPE 413 (modello “slim” solo tessere)5. Nelle stazioni della metro sono anche presenti VPE 4206 usate come totem per la ricarica degli abbonamenti.

Uno sguardo al futuro del SBME

Nel 2014 la Regione Lombardia ha pubblicato un bando per lo sviluppo di un nuovo sistema di bigliettazione, esclusivamente elettronica, interoperabile tra tutti gli operatori di trasporto della Regione7. Il bando prevede l’uso di tecnologie più moderne che andranno a soppiantare quelle attualmente in uso dal SBME: le tessere elettroniche saranno “aggiornate” a Calypso 3.1, che è interamente conforme allo standard ISO 14443; i DM saranno sostituiti da biglietti contactless chip on paper (COP) di tipo MIFARE Ultralight.

Tra una proroga e l’altra lo sviluppo procede a rilento, ma è ragionevole pensare che ai DM rimanga solo qualche anno di vita; è anche per questo che ho deciso di studiarli prima che spariscano dalla circolazione. Nel 2019 Trenord ha già tentato di accostare ai DM un tipo sperimentale di biglietto COP8 basato su MIFARE Classic invece che su MIFARE Ultralight, ma ha interrotto la sperimentazione nel giro di pochi mesi.

DM e banda magnetica

La banda magnetica è un sistema di memorizzazione dei dati molto semplice ed economico. Il suo uso più popolare è sicuramente quello legato alle carte di pagamento, ma le si trova come chiavi per le camere degli hotel, per il controllo degli accessi in palestre e piscine, e naturalmente nei supporti per i titoli di viaggio.

Caratteristiche fisiche

Fisicamente la banda magnetica è costituita da sottile strato di materiale in cui sono disperse microscopiche particelle di ossido metallico che possono essere magnetizzate con due orientamenti, nord e sud. A seconda dei materiali usati, la banda può essere più o meno facile da magnetizzare. Una banda che si magnetizza facilmente si dice a bassa coercitività; è economica, richiede apparecchiature economiche, ma tende anche a smagnetizzarsi più facilmente e quindi ha una durata limitata. Viceversa, una banda magnetica ad alta coercitività richiede più energia per essere magnetizzata e implica costi maggiori, ma resiste anche meglio alla smagnetizzazione accidentale. Per questo motivo i DM usano una banda magnetica ad alta coercitività9, così come le carte di pagamento e tutte le tessere fatte per durare nel tempo.

Per le bande magnetiche applicate a biglietti cartacei si può fare un’ulteriore distinzione di tipo fisico: la banda può essere un nastro di materiale plastico che viene fuso ad alta temperatura sul cartoncino (banda magnetica di tipo tape), oppure può essere costituita da una sospensione liquida di particelle magnetiche che viene essiccata sul cartoncino (banda magnetica di tipo slurry)10. Nel primo caso la banda appare lucida e uniforme, nel secondo caso opaca e irregolare. Il SBME usa bande magnetiche di entrambi i tipi.

Confronto tra biglietto con banda magnetica di tipo tape (a sinistra) e uno con banda magnetica di tipo slurry (a destra).

Codifica dei dati

La banda magnetica può essere vista come una lunga fila di piccole calamite che possono essere orientate in due modi: N    S e S    N. Una banda magnetica “vuota”, o non codificata, è composta da particelle magnetiche tutte con lo stesso orientamento, ad esempio N    SN    SN    SN    S. L’atto di codificare (scrivere dati) sulla banda magnetica consiste nell’invertire l’orientamento di alcune “calamite”, così da creare dei punti in cui due poli nord o due poli sud si toccano: N    SN    SS    NN    S. Nel momento in cui la banda magnetica striscia sulla testina di un lettore, questi punti inducono dei picchi di corrente; la distanza tra questi picchi determina la lettura di un bit 0 o di un bit 1.

Assumendo che la velocità con cui la banda striscia sulla testina sia approssimativamente costante, possiamo definire periodo la distanza “standard” tra due picchi di corrente. La presenza di picco di corrente aggiuntivo all’interno di questo periodo codifica un bit 1; un’assenza di ulteriori picchi codifica un bit 0.

Il tipo di codifica che ho appena descritto è quello utilizzato quasi universalmente per le bande magnetiche, e si chiama Biphase Mark Code; talvolta viene chiamato anche F2F (frequenza/doppia frequenza) o Aiken Biphase. Si tratta di una codifica self-clocking: la velocità con cui il segnale viene trasmesso può essere desunta dal segnale stesso. Nella pratica questo significa che la velocità con cui si striscia la banda magnetica non importa (purché rimanga più o meno costante).

La teoria è affascinante, ma ogni tanto è utile anche sporcarsi le mani e vedere le cose con i propri occhi. È per questo motivo che mi sono procurato della polvere di ferro finissima e ci ho cosparso la banda magnetica di un DM, nel tentativo di visualizzare i picchi di flusso magnetico che in un lettore si traducono in picchi di corrente. Il risultato è piuttosto soddisfacente:

Documento magnetico con polvere di ferro sulla banda magnetica

Tenendo conto del funzionamento della codifica F2F e armandosi di tanta pazienza, in questo modo è possibile leggere a occhio nudo i dati scritti su un biglietto, cosa che qui ho fatto parzialmente:

Decodifica "a occhio nudo" dei dati scritti su un biglietto

È interessante notare che l’immagine sopra è stata capovolta prima della decodifica, perché i dati sono scritti da destra verso sinistra. Inoltre, alle due estremità della banda magnetica (in foto se ne vede solo una, a sinistra) si trovano una serie di zeri. Si tratta di bit di sincronizzazione, che servono al lettore per stabilire la dimensione di un periodo.

DM vs. carte di pagamento

Possiamo approfittare del metodo della polvere di ferro per visualizzare la banda magnetica di una carta di pagamento e confrontarla con quella di un DM.

Confronto tra la banda magnetica di una carta di credito e quella di un DM.

La differenza più prominente è che la carta di pagamento ha una banda magnetica più larga, ma i dati sembrano essere codificati solo in due “strisce” che non occupano tutto lo spazio disponibile. Il testo dello standard ISO/IEC 7813, che definisce le caratteristiche delle carte di pagamento, fornisce una spiegazione. La banda magnetica delle carte di pagamento è composta da 3 tracce separate, ognuna contenente informazioni diverse; la terza traccia è opzionale, ed evidentemente nella carta che ho mostrato non è presente. Se osserviamo la banda magnetica del DM notiamo invece che essa è composta da un’unica traccia più larga, che occupa tutto lo spazio disponibile. Notiamo anche la traccia si trova nella stessa posizione della seconda traccia di una carta di pagamento.

Un’altra cosa che si nota immediatamente è che le due tracce presenti nella carta di pagamento appaiono diverse tra loro. Una spiegazione per questo arriva dal testo dello standard ISO/IEC 7811, che definisce le tecniche di scrittura dei dati sulle tessere di identificazione: la traccia 1 ha una densità di 210 bpi (bit per pollice), mentre la traccia 2 ha una densità di soli 75 bpi; ecco infatti che le linee verticali formate dalla polvere di ferro sono più distanziate tra loro. Se torniamo a osservare il DM notiamo che la distanza tra due linee verticali è una via di mezzo tra quella delle due tracce della carta di pagamento: qui abbiamo una densità ancora diversa, di 150 bpi11.

Vale la pena di notare, infine, che le dimensioni fisiche sono le stesse; sono quelle di una tessera standard, definite dall’ISO/IEC 7810 con il nome ID-1. La maggior parte dei DM in circolazione è prodotta a partire da rotoli continui di cartoncino per stampanti termiche e non presenta quindi gli angoli arrotondati. Alcuni dei biglietti venduti nelle rivendite, prodotti nei centri massivi di codifica documenti di AEP1, sono invece stampati su cartoncino tradizionale e hanno la forma classica con gli angoli arrotondati.

Metodi di lettura

Abbiamo già visto che, in teoria, per leggere il contenuto di una banda magnetica “basta” usare della polvere di ferro. Senza dubbio non si tratta però del metodo più comodo.

Un’alternativa che ritengo molto creativa ed interessante è quella di costruirsi un lettore usando la testina di un riproduttore di audiocassette. L’idea è stata descritta in dettaglio in un post disponibile qui (tramite The Wayback Machine) ed è sorprendentemente semplice da realizzare. Si basa sul fatto che il nastro magnetico di un’audiocassetta e una banda magnetica sono in realtà due cose molto simili; tant’è vero che il primo prototipo di tessera a banda magnetica è stato realizzato da un ingegnere dell’IBM incollando un pezzo di nastro su una tessera di plastica.

Esiste infine il metodo per gli scansafatiche, che consiste nel comprare un lettore di tessere magnetiche. Per i DM basta tener conto dei dati letti dalla traccia 2 e ignorare il resto; la densità di bit non standard non crea problemi perché rientra nel range 75-210 bpi usato dalle carte di pagamento e che quindi è supportato dai lettori. Attenzione però: molti lettori di tessere magnetiche economici sono compatibili solo con bande magnetiche che contengono dati nel formato definito dallo standard ISO/IEC 7811. Come vedremo, i dati contenuti nei DM non sono in quel formato. È quindi necessario trovare un lettore in grado di restituire il contenuto della banda magnetica bit per bit, senza tentare di “interpretarlo”.

Analisi del contenuto

Prima di addentrarsi nel reverse engineering del contenuto della banda magnetica, è utile ripassare brevemente il funzionamento del vecchio sistema tariffario di Milano attorno cui i DM di ATM sono stati progettati, per poi descrivere i vari tipi di biglietti esistenti.

Il Sistema Integrato Tariffario Area Milanese

Il SITAM è stato il sistema tariffario in vigore nell’area di Milano dal 1989 al 2019. Prevedeva la suddivisione del territorio in anelli centrati su Piazza del Duomo, a loro volta suddivisi in unità più piccole, risultando in una caratteristica forma a “bersaglio”. Eccone una rappresentazione semplificata.

Ogni unità di area delimitata da una linea corrisponde a una semizona, cioè a “mezza zona tariffaria”; due semizone costituiscono una zona. Le semizone sono l’unità elementare che determina la tariffa del biglietto per spostarsi da un punto all’altro. L’area urbana è costituita da due sole semizone, una interna e una esterna al percorso della linea circolare 90/91.

A titolo di esempio, uno spostamento lungo il percorso tratteggiato in rosso comprende 5 semizone, di cui 3 fuori dall’area urbana. Equivalentemente, si può dire che il percorso comprende la zona urbana e 1½ zone interurbane. Per questo spostamento si sarebbe usato un biglietto “cumulativo”, che comprendeva la zona urbana e un numero variabile di semizone interurbane.

Purtroppo non tutto è così semplice. Una “complicazione” degna di nota, che vedremo riflessa nei dati presenti sulla banda magnetica, riguarda la durata dei titoli di viaggio cumulativi. Riprendendo l’esempio, un biglietto cumulativo da 1½ zone interurbane aveva una validità di 120 minuti dalla convalida. La validità in zona urbana era però limitata a 75 minuti per gli spostamenti dalla città verso l’esterno, oppure a 60 minuti per gli spostamenti nella direzione opposta.

Un’altra caratteristica interessante riguarda i biglietti esclusivamente interurbani, che di regola non erano utilizzabili in zona urbana. In alcuni casi, tuttavia, era concesso utilizzarli nella semizona esterna dell’area urbana per arrivare fino alla linea 90/91. Infine, nonostante i titoli di viaggio fossero utilizzabili su tutta la rete consentendo un numero illimitato di cambi, esistevano una serie di restrizioni che ne forzavano l’utilizzo come “biglietti di sola andata”; per esempio erano concessi un solo accesso alla metropolitana e al passante ferroviario.

In generale, il SITAM era ricco di particolarità e di eccezioni su cui evito di dilungarmi per non andare eccessivamente fuori tema. Le poche informazioni che ho presentato qui sono però essenziali per dare un senso e apprezzare meglio la parte che segue.

A seguito di una legge regionale del 201412, nel 2019 il SITAM è stato sostituito da un nuovo sistema tariffario integrato, chiamato STIBM, che ha portato grandi semplificazioni tra cui l’eliminazione delle semizone; ciononostante la struttura dei dati contenuti nei DM (e nelle TSC) è rimasta invariata e continua a basarsi sui concetti del sistema precedente. Inoltre il SITAM non è completamente scomparso: gli abbonamenti urbani e le relative estensioni interurbane sono rimaste in uso13.

Tipi di DM

Ad oggi esistono 4 tipi di DM.

  1. Trasporti milanesi (epoca SITAM). Usato per tutti i titoli di viaggio ATM fino a luglio 2019. Oggi non sono più venduti e quelli esistenti non sono più utilizzabili. Sebbene i DM di questo tipo fossero usati anche per alcune tariffe speciali non SITAM (per esempio per la metro leggera per l’ospedale San Raffaele), per semplicità nel seguito mi riferirò a questo tipo di DM come “tipo SITAM”.
  2. Solo uscita dalla metro. Utilizzabile per uscire dai tornelli da chi si dovesse trovare all’interno di una stazione della metropolitana senza un titolo di viaggio valido. Consente solo l’uscita dalla stessa stazione in cui è stato acquistato entro 10 minuti dall’acquisto. È venduto dai distributori situati all’interno dell’“area paganti”, che formalmente prendono il nome di Macchine Addizionatrici di Tariffa (MAT)14. Dato l’utilizzo estremamente limitato che si può fare di questo tipo di DM, non ho avuto modo di studiarne i dettagli del contenuto e perciò non lo tratterò nel seguito.
  3. Ferroviario. Venduto da Trenord (precedentemente da LeNord) e tipicamente valido per un singolo itinerario tra due stazioni della rete ferroviaria regionale.
  4. Trasporti milanesi (epoca STIBM). Introdotti nel luglio 2019 con l’entrata in vigore del nuovo sistema tariffario, sostituiscono i biglietti SITAM mantenendone lo stesso modello dei dati. Come per i DM di tipo 1, mi riferirò in modo leggermente improprio a questo tipo di DM come “tipo STIBM”.

Reverse engineering dei dati

La prima cosa fondamentale per un reverse engineering completo di dati sconosciuti è avere una grande quantità di “esemplari”, possibilmente non tutti uguali, in modo da poter fare deduzioni confrontandoli. Per questo motivo durante l’estate scorsa ho deciso di mettere da parte i miei fedeli abbonamenti e di cominciare ad acquistare DM per ogni mio spostamento.

Alcuni dei biglietti che ho acquistato e utilizzato per le mie analisi.

La lettura della banda magnetica di un DM, a prescindere dal metodo che si usa, risulta in dati di questo tipo (qui rappresentati in esadecimale):

B40BE7803396F26B048008B3E0C0027FC5167D10620000635804EC97FCD8C000000020DDF

Si tratta di 36 byte e mezzo, o 292 bit. Il primo nibble (0xB) e l’ultimo (0xF) risultano immediatamente familiari per chi conosce lo standard ISO/IEC 7811: si tratta di due caratteri di controllo, rispettivamente Start Sentinel e End Sentinel, che segnalano l’inizio e la fine del contenuto delle tracce 2 e 3 della banda magnetica di una tessera di identificazione. Questo potrebbe essere visto come un’indicazione che tutti i dati siano codificati secondo lo stesso standard, ma una rapida prova porta a un risultato senza senso e stronca questa speranza sul nascere:

;40;>7803396?26;048008;3>0<0027?<5167=10620000635804><97?<=8<000000020==?

Quasi sicuramente il motivo per cui si è scelti di andare fuori standard è legato all’efficienza: per ogni singola informazione è stato usato il numero minore possibile di bit, in modo da “risparmiare spazio”. D’altronde quando si hanno a disposizione solo 292 bit, si fa tutto il possibile per sfruttarli al meglio. Conviene quindi proseguire l’analisi osservando gli stessi dati come una sequenza di bit:

1011010000001011111001111000000000110011100101101111001001101011000001001000000000001000101100111110000011000000000000100111111111000101000101100111110100010000011000100000000000000000011000110101100000000100111011001001011111111100110110001100000000000000000000000000000000100000110111011111

Un buon punto di partenza per dare significato alle varie porzioni di bit è quello di osservare i vari numeri stampati sul biglietto in questione, convertirli in binario e cercare una corrispondenza in mezzo a quella lunga sequenza. Cominciamo dal fronte del biglietto.

Lato frontale di un DM

I numeri in basso a sinistra, 00103 e 0769971721, convertiti in binario diventano rispettivamente 1100111 e 101101111001001101011000001001 e si individuano immediatamente nella parte iniziale dei dati. Il confronto con altri biglietti permette di capire che il primo numero identifica la macchina che ha venduto il biglietto, mentre il secondo è un numero di serie. Il numero in basso a destra, 7609.5, varia a seconda della tariffa ma non è direttamente presente tra i dati della banda magnetica. È invece presente il numero 6095, 1011111001111, che in qualche modo gli assomiglia e che allo stesso modo varia a seconda della tariffa.

Queste corrispondenze tra numeri e porzioni di bit ci rivelano implicitamente anche l’ordine dei bit usato per i dati, che è quello naturale: il bit meno significativo a destra.

Lato posteriore di un DM

Nessuno dei numeri scritti in grande sotto la banda magnetica è presente tra i dati. In realtà la cosa è comprensibile dato che quei numeri sono pre-stampati sulla carta e molto probabilmente identificano il produttore, il lotto e il numero del biglietto inteso come supporto fisico di cartoncino piuttosto che come titolo di viaggio.

Volgendo l’attenzione al timbro notiamo che esso è composto da più lettere e numeri:

  • Una lettera che varia a seconda del gestore della rete. In questo caso A = ATM; le altre possibilità sono T = Trenitalia e F = FNMT, nonostante oggi queste ultime due siano fuse in Trenord.
  • Una parte alfanumerica di 4 caratteri, in questo caso 0943, che varia a seconda della convalidatrice utilizzata.
  • Una lettera che varia a seconda del mezzo utilizzato. In questo caso M = metropolitana; le altre possibilità sono T = treno, P = passante, B = bus (o altri mezzi di superficie).
  • Un numero di 4 cifre, in questo caso 0867, che varia a seconda della località di convalida. 867 è il codice di PIOLA M2.
  • Un numero di 5 cifre, in questo caso 26051, che rappresenta la data della convalida scritta come giorno, mese e ultima cifra dell’anno. 26051 corrisponde al 26/05/2021.
  • Un numero di 4 cifre, in questo caso 1702, che rappresenta l’orario della convalida come ora e minuti.

Trovare una corrispondenza tra queste informazioni e i dati scritti sulla banda magnetica è meno banale, dato che è necessario prima di tutto capire come sono codificati. Cercando i numeri così come sono riportati, l’unico che si trova è il codice della località di convalida. Vedremo in seguito dove si trovano gli altri e come sono scritti.

Credo però di aver chiarito il concetto alla base della mia metodologia: partire da un’informazione nota e cercare se e dove la si può trovare all’interno della sequenza di bit. Si può fare anche il contrario: prendere una porzione di bit, osservare come cambia tra due biglietti diversi, e dedurne il significato. Per esempio, prendiamo i primi 4 bit dopo la Start Sentinel di 10 biglietti a caso della mia collezione:

  1. (biglietto STIBM), 0100
  2. (biglietto ferroviario), 0011
  3. (biglietto STIBM), 0100
  4. (biglietto SITAM), 0001
  5. (biglietto di uscita dalla metro), 0010
  6. (biglietto SITAM), 0001
  7. (biglietto STIBM), 0100
  8. (biglietto ferroviario), 0011
  9. (biglietto ferroviario), 0011
  10. (biglietto STIBM), 0100

Notiamo che in tutti i biglietti SITAM quei 4 bit valgono 0001. In un biglietto di uscita dalla metro valgono 0010. In tutti i biglietti ferroviari valgono 0011. In tutti i biglietti STIBM valgono 0100. Si deduce che quei 4 bit probabilmente identificano il tipo di biglietto, e l’ordine dei valori ha senso se si considera l’ordine con cui ogni tipo di biglietto è stato introdotto dalle società di trasporto.

Continuando in questo modo con costanza e molta pazienza, ho determinato il significato di quasi ogni singola porzione di bit. Ce ne sono alcune di cui purtroppo non riesco ad avere la certezza sui dati che rappresentano, perché – per un motivo o per l’altro – non sono riuscito a fare un numero di prove sufficientemente grande. C’è anche qualche gruppo di bit a 0 che non ho mai visto cambiare; il massimo che ho potuto fare in questi casi è stata un’ipotesi ragionata, ma non sempre ci sono riuscito.

Nel seguito userò le seguenti notazioni per i valori numerici:

  • suffisso "b" per i valori in binario (base 2), per esempio 1111011b;
  • prefisso "0x" per i valori in esadecimale (base 16), per esempio 0x7b;
  • nessun suffisso o prefisso per i valori in decimale (base 10), per esempio 123.

Dove non diversamente indicato, quando un valore non è presente viene rappresentato con tutti zeri.

Indice Lunghezza Tipo di dato Descrizione
0 4 - Start Sentinel, valore fisso: 1011b. Segnala l’inizio dei dati.
4 4 Numero Indica il tipo di documento.
  • 1: biglietto SITAM
  • 2: biglietto di sola uscita dalla metro
  • 3: biglietto ferroviario
  • 4: biglietto STIBM
8 1 Booleano Indica se si tratta di un documento di test (usato per verificare il funzionamento delle convalidatrici).
9 16 Numero Identificativo della tariffa. Non corrisponde direttamente al codice stampato sul fronte del biglietto, ma i due valori sono in relazione 1:1.
25 16 Numero Identificativo della macchina di vendita. Corrisponde al numero di 5 cifre stampato sul fronte del biglietto, prima del numero di serie.
41 32 Numero Numero di serie. Corrisponde al numero di 10 cifre stampato sul fronte del biglietto.
73 1 Booleano Indica se il documento è stato invalidato, probabilmente perché il numero seriale è stato inserito in una blacklist.
74 10 Numero Numero di viaggi residui. Posto al valore fittizio 1111111111b (1023) per i titoli di viaggio che consentono un numero illimitato di viaggi.
84 14 Data Data della prima convalida*.
98 11 Ora Ora dell’ultima convalida.
109 6 Numero Codice dell’eventuale errore verificatosi durante l’ultima convalida.
115 4 Numero Tipologia dell’ultimo mezzo utilizzato (treno, metro, mezzi di superficie, ecc).
119 1 Booleano Indica se l’ultima convalida è avvenuta in modalità simulata/degradata.
Vedi paragrafo “convalida simulata/degradata”
120 11 Ora Ora della prima convalida*.
131 4 Numero Contatore convalide. Riparte da zero quando supera il valore massimo di 1111b (15).
135 14 Data Data di inizio validità.
Vedi paragrafo “validità e scadenza dei DM non ancora utilizzati”
149 14 Data Data di scadenza oppure data limite di utilizzo.
Vedi paragrafo “validità e scadenza dei DM non ancora utilizzati”
163 4 Numero Identificativo dell’azienda di vendita (ATM, ex Trenitalia, ex FNMT).
167 109 - Dati variabili a seconda del tipo di biglietto (vedi paragrafi successivi)
276 4 - Separatore, valore fisso: 0000b.
280 8 - Checksum.
Vedi paragrafo “checksum”
288 4 - End Sentinel, valore fisso: 1111b. Segnala la fine dei dati.

*Con “prima convalida”, qui e nel seguito, si intende la prima convalida del viaggio in corso e non il primo utilizzo del biglietto. Per esempio, nel caso di un carnet da 10 viaggi, ognuna delle convalide che dà inizio a uno dei 10 viaggi è da considerarsi una “prima convalida”. In altre parole, una convalida è una “prima convalida” se viene aggiunto un nuovo timbro sul retro del biglietto.

Biglietti SITAM e STIBM (tipi 1 e 4)

Indice Lunghezza Tipo di dato Descrizione
167 8 Numero Numero di semizone autorizzate fuori dall’area urbana. Usato nei biglietti SITAM interurbani e cumulativi.
175 6 Numero Numero di viaggi effettuati nel periodo corrente. Usato per le tariffe SITAM “2x6”, che consentivano un massimo di due viaggi al giorno per 6 giorni della stessa settimana.
181 6 Numero Identificativo dell’ultima operazione (entrata, coincidenza, uscita, ecc).
187 10 Numero Identificativo dell’ultima linea utilizzata. Per i mezzi di superficie solitamente (ma non sempre) coincide con il numero della linea.
197 8 (misto) Semizone attraversate all’interno e all’esterno dell’area urbana. Usato nei biglietti SITAM interurbani e cumulativi.
Vedi paragrafo “codifica delle semizone visitate”
205 1 Booleano Indica se dalla prima convalida è stata utilizzata la metropolitana almeno una volta. Usato nei biglietti SITAM per applicare il vincolo di un solo accesso in metropolitana.
206 1 Booleano Indica se dalla prima convalida è stato utilizzato il treno almeno una volta. Usato nei biglietti SIAM per applicare il vincolo di un solo accesso alle ferrovie.
207 11 Numero Identificativo della località dell’ultima convalida.
218 2 Numero Forse: semizona di riferimento della località dell’ultima convalida, utile specialmente per determinare la semizona considerata nel caso di località poste sul confine tra due semizone.
220 11 Ora Ora della prima convalida all’interno dell’area urbana. Usato nei biglietti SITAM cumulativi per limitare la durata del titolo di viaggio in zona urbana.
231 11 Numero Identificativo della località della prima convalida.
242 2 Numero Forse: semizona di riferimento della località della prima convalida, utile specialmente per determinare la semizona considerata nel caso di località poste sul confine tra due semizone.
244 10 Numero Forse: identificativo della corsa del veicolo su cui è stata effettuata l’ultima convalida. Nel corso dei test effettuati questo gruppo di bit non è mai stato valorizzato.
254 16 Numero Identificativo del veicolo su cui è stata effettuata l’ultima convalida. I 13 bit meno significativi corrispondono al numero, tipicamente di 4 cifre, ben visibile sulla livrea e all’interno dei mezzi di superficie.
270 1 Booleano Indica se dalla prima convalida è stato utilizzato l’autobus almeno una volta.
271 4 Numero Numero di passeggeri autorizzati. In caso di accesso tramite tornelli, una singola convalida consente il passaggio consecutivo di questo numero di persone.
275 1 - Forse: inutilizzato.

Biglietto ferroviario (tipo 3)

Indice Lunghezza Tipo di dato Descrizione
167 2 Numero Classe viaggiatori.
169 6 Numero Numero di viaggi effettuati nel periodo corrente.
175 6 Numero Identificativo dell’ultima operazione (entrata, coincidenza, uscita, ecc).
181 10 Numero Identificativo dell’ultima linea utilizzata. Solitamente posto al valore 1000, che rappresenta le linee ferroviarie in generale.
191 11 Numero Identificativo della località dell’ultima convalida.
202 11 Numero Identificativo della località della prima convalida.
213 4 Numero Numero di passeggeri autorizzati. In caso di accesso tramite tornelli, una singola convalida consente il passaggio consecutivo di questo numero di persone.
217 11 Numero Identificativo della località di origine.
228 11 Numero Identificativo della località di destinazione.
239 11 Numero Identificativo della prima località di transito intermedia.
250 11 Numero Identificativo della seconda località di transito intermedia.
261 11 Numero Distanza chilometrica autorizzata.
272 2 Numero Forse: direzione dell’ultimo viaggio per i biglietti di andata e ritorno.
274 1 - Sconosciuto.
275 1 - Forse: inutilizzato.

Approfondimento di alcuni aspetti

Codifica di data e ora

La codifica di date e orari è conforme allo standard EN 1545 (tipi di dato elementari DateStamp e TimeStamp). Le date sono codificate in 14 bit come numero di giorni trascorsi dal 1° gennaio 1997. Gli orari sono codificati in 11 bit come numero di minuti trascorsi da mezzanotte.

Siccome per gli orari il valore 00000000000b è significativo (rappresenta, appunto, mezzanotte), quando è necessario lasciare un dato di tipo ora non valorizzato si usa il valore fittizio 11111111111b (2047) per evitare ambiguità. Si noti infatti che il numero massimo di minuti trascorsi da mezzanotte è 1439 (alle 23:59), e i valori più alti sono inutilizzati. Un caso di questo genere si verifica con l’ora della prima convalida all’interno dell’area urbana nei biglietti SITAM e STIBM, se il documento è stato convalidato solo fuori dall’area urbana.

Convalida simulata/degradata

Per poter applicare correttamente i vincoli del sistema tariffario, è ovvio che le convalidatrici devono sapere dove si trovano geograficamente. Per quelle fisse installate nelle stazioni non c’è problema; sui mezzi di superficie, costantemente in movimento, la questione è un po’ più complessa. Le convalidatrici di autobus e tram sono connesse al sistema informativo di bordo, che comprende un impianto GPS per localizzare il mezzo in ogni momento. Il sistema di bordo determina la zona tariffaria corretta a seconda della posizione attuale, e la configura “in tempo reale” sulle convalidatrici.

Quando tutto funziona correttamente, la prima linea del display delle convalidatrici riporta l’ultima località impostata dal sistema di bordo. In alcuni casi tuttavia – solitamente per via di malfunzionamenti – il sistema di bordo potrebbe non essere in grado di determinare la propria posizione, oppure potrebbe non essere in grado di comunicarla alle convalidatrici. Trascorso un certo periodo di tempo senza ricevere aggiornamenti, le convalidatrici entrano in modalità di funzionamento “degradato”: continuano a essere utilizzabili dai viaggiatori ma, non essendo più in grado di stabilire dove si trovano, non effettuano i controlli di validità spaziale dei titoli di viaggio. Inoltre, un biglietto convalidato in modalità degradata non riporta la località di convalida tra i dati nella banda magnetica e sul timbro15.

Convalidatrice in modalità di funzionamento degradato. Foto di Giovanni Dall'Orto (ritagliata), licenza CC BY-SA.

Una convalida può avvenire in modalità degradata anche per via di alcune circostanze particolari non dovute a un malfunzionamento, per esempio:

  • Nel caso di biglietti acquistati e convalidati tramite app o SMS, e successivamente stampati presso un distributore automatico. In questo caso il biglietto viene stampato già convalidato e riporta sul fronte la data e l’ora della convalida, in sostituzione del timbro.
  • Nei mezzi di superficie in uso per corse straordinarie, in cui sistema di bordo potrebbe non conoscere la linea e l’itinerario.
  • Nelle convalidatrici di prova o usate come “demo”, e quindi lasciate volutamente prive di configurazione, come quelle esposte durante il Porte Aperte 2019 di ATM16.

In questi casi altri dati che possono non essere presenti sono il numero della linea, l’identificativo del veicolo e il tipo di mezzo utilizzato.

Validità e scadenza dei DM non ancora utilizzati

Un biglietto non ancora utilizzato ha dei limiti di validità temporali che possono essere definiti in due modi differenti, a seconda della tariffa.

Nelle tariffe con validità fissa i due valori alle posizioni 135 e 149 (vedi tabella) sono entrambi presenti fin dal momento dell’acquisto e indicano rispettivamente la data di inizio validità (che per i biglietti semplici coincide con la data di acquisto) e la data di scadenza, che varia a seconda della tariffa e dell’azienda che ha venduto il biglietto. Per chiarezza, specifico che un biglietto scaduto è un biglietto “da buttare”; anche nel caso, per esempio, di un carnet con ancora viaggi residui.

Nelle tariffe con validità fluttuante15 la data di inizio validità non è presente al momento dell’acquisto; viene valorizzata solo al primo utilizzo. Il valore che prima indicava la data di scadenza, qui assume invece il significato di “data limite di utilizzo”, ovvero di data entro cui il biglietto deve essere utilizzato per la prima volta; dopo il primo utilizzo lo si può continuare ad usare anche oltre tale data. Questo non significa che il biglietto non scada: una scadenza c’è, ma anzi che essere scritta esplicitamente, essa viene calcolata dal tempo trascorso dalla data di inizio validità. Per esempio, i carnet STIBM venduti da ATM devono essere utilizzati per la prima volta entro 2 anni dalla data di acquisto, e scadono dopo altri 2 anni dal primo utilizzo. Tutte le tariffe STIBM che ho analizzato usano questo tipo di validità temporale.

È curioso il fatto che, in contrasto con quanto emerge qui, sia Trenord17 sia ATM18 dichiarino che i biglietti non abbiano alcuna scadenza prima della convalida. D’altra parte io ho potuto verificare con certezza che i vincoli di validità vengono controllati dalle convalidatrici, che restituiscono gli errori DOCUMENTO SCADUTO (codice 28) in caso di data di scadenza superata e NON PIU UTILIZZABILE (codice 44) in caso di data limite di utilizzo superata. È possibile che il motivo di questa discrepanza sia da cercare nel fatto che i DM sono pensati per un uso a breve termine, e che difficilmente qualcuno comprerà un biglietto da usare a diversi anni di distanza, anche perché il cartoncino termico su cui sono stampati ha una durevolezza limitata. Inoltre è possibile che, se ci si trovi davvero con un DM scaduto o non più utilizzabile, ne si possa chiedere la sostituzione.

Codifica delle semizone visitate

La codifica di questa informazione è stata uno degli aspetti che mi ha creato maggiore difficoltà, principalmente perché non è più utilizzata negli attuali biglietti STIBM. Questo significa che non ho potuto applicare la solita metodologia di acquistare biglietti, usarli in circostanze diverse e studiare come cambia il contenuto; ho dovuto invece affidarmi esclusivamente a vecchi biglietti SITAM già usati di cui ho dovuto ricostruire la “storia”. La complessità del sistema tariffario di riferimento certamente non è stata d’aiuto; per questo motivo non ho potuto verificare con ragionevole certezza che l’ipotesi che sto per descrivere sia esatta in ogni suo dettaglio.

Gli 8 bit che costituiscono questo dato sono suddivisi in due parti. I 3 bit più significativi sono da interpretare come una bitmap e indicano quali semizone interne dell’area urbana sono state visitate. In particolare, i 3 bit indicano (dal più al meno significativo):

  1. se è stata attraversata la semizona interna dell’area urbana;
  2. se è stata attraversata la semizona esterna dell’area urbana nel contesto di un biglietto cumulativo, oppure nel contesto di un biglietto interurbano la cui prima convalida è avvenuta nella stessa semizona;
  3. se è stata attraversata la semizona esterna dell’area urbana nel contesto di un biglietto interurbano la cui prima convalida è avvenuta fuori dall’area urbana.

I 5 bit rimanenti sono invece da interpretare come intero e indicano il numero complessivo di semizone attraversate fuori dall’area urbana.

È interessante notare che, ad ogni convalida, la convalidatrice non si limita ad aggiornare questo dato in base alla semizona in cui ci si trova, ma considera anche tutte le semizone che devono esser state attraversate per arrivarci partendo dalla località della convalida precedente. Questo significa che, plausibilmente, la memoria delle convalidatrici contiene la distanza (in termini di semizone) tra ogni possibile coppia di località.

Checksum

Il checksum è usato dai dispositivi che leggono e scrivono DM per verificare l’integrità dei dati. Siccome la banda magnetica è un sistema di memorizzazione particolarmente suscettibile a interferenze esterne, è fondamentale accertarsi che i dati memorizzati non si siano corrotti e che siano stati letti o scritti correttamente.

Il checksum usato per i DM si calcola eseguendo lo xor a gruppi di 8 bit dei dati memorizzati dopo la Start Sentinel e prima del separatore fisso 0000b (ovvero dei bit compresi tra gli indici 4 e 275, estremi inclusi: 35 byte in totale); infine il risultato va messo in xor con il valore costante 0x7b (123).

Conclusioni e ringraziamenti

Sebbene io sia convinto di aver fatto tutto il possibile per raccogliere e riportare informazioni complete e accurate, sono consapevole che ciò che ho presentato non rappresenta minimamente una spiegazione esaustiva del funzionamento del SBME – o anche solo della parte relativa ai biglietti magnetici. Si tratta di un sistema complicato ma che nasconde efficacemente la propria complessità, e questo rende la vita difficile a un outsider curioso di scoprire come funzionano le cose. A tal proposito, nell’improbabile caso in cui una delle persone che ha lavorato alla progettazione del SBME stia leggendo questo post, sarebbe per me un immenso piacere poter fare una chiacchierata: ci sono ancora tante curiosità a cui da solo non sono riuscito a trovare risposta.

Spero di essere riuscito a trasmettere qualche informazione interessante alla nicchia di persone che ha avuto la pazienza di arrivare fino a qui e, come sempre, mi auguro che il mio lavoro possa essere di ispirazione a chi abbia in mente di fare qualcosa di simile – magari per i biglietti dei trasporti di un’altra città o regione.

Questo post non sarebbe potuto essere così dettagliato senza il prezioso contributo di alcune persone, che tengo a ringraziare qui.

  • S. B., per avermi aiutato durante tutto lo svolgimento delle mie ricerche ad acquistare biglietti e a usarli in giro per Milano e per la Lombardia.
  • Heavy Crowd, per aver messo a mia disposizione un’enorme collezione di vecchi biglietti SITAM.
  • Lo staff del sito TPLITALIA12, per avermi illustrato in modo particolarmente approfondito il regolamento del SITAM.
  • bebora, per avermi prestato un biglietto da analizzare.

  1. https://www.aep-italia.it/wp-content/uploads/2016/06/2016.06.22-I-sistemi-AEP-che-ancora-non-conoscete.pdf ↩︎

  2. https://www.atm.it/it/ImpreseEFornitori/SistemiDiQualificazione/Modifiche/SPECIFICA%20TECNICA_468.pdf ↩︎

  3. https://www.comune.cusano-milanino.mi.it/wp-content/uploads/2012/10/pdf_R09Db008IMR0_ImpSpecialiTLC.pdf ↩︎

  4. https://www.tisseo-collectivites.fr/sites/default/files/D.2020.02.05.8.11.pdf ↩︎

  5. https://www.ebay.it/itm/ASCOM-PROXIBUS-MIFARE-BUS-TRAIN-FARE-TICKET-VALIDATOR-RANGE-VPE-413/153785769735 ↩︎

  6. https://web.archive.org/web/20210925123840/https://www.xerox.com/downloads/europe/events/transport-publics/VP420-EN.pdf ↩︎

  7. https://www.bandi.regione.lombardia.it/procedimenti/new/bandi/bandi/trasporti-infrastrutture/mobilita-trasporti-sostenibili/bando-sviluppo-sistemi-bigliettazione-elettronica-interoperabili-RLAD2020012590 ↩︎

  8. https://web.archive.org/web/20201001045317/https://www.trenord.it/it/media-news/notizie/cop.aspx ↩︎

  9. https://www.atm.it/it/ImpreseEFornitori/SistemiDiQualificazione/Disciplinare/DISCIPLINARE_472.pdf ↩︎

  10. https://www.q-card.com/about-us/magnetic-stripe-glossary/page.aspx?id=1456 ↩︎

  11. https://www.atm.it/it/ImpreseEFornitori/SistemiDiQualificazione/Modifiche/CHIARIMENTI_I_705.pdf ↩︎

  12. https://normelombardia.consiglio.regione.lombardia.it/NormeLombardia/Accessibile/main.aspx?iddoc=rr002014061000004&view=showsum ↩︎

  13. https://www.atm.it/it/ViaggiaConNoi/Documents/stibm%20brochure.pdf ↩︎

  14. https://files.comune.monza.it/M5/08%20Impianti/9%20impianti%20speciali/DM-0237_03%20Schema%20rettificato%20linea%20controllo%20viaggiatori%20distribuzione%20apparati.pdf ↩︎

  15. https://www.ctpi.it/img/upload/allegati/4.All.A_CardDataModel.pdf ↩︎

  16. https://www.atm.it/it/AtmNews/AtmInforma/Pagine/porteaperte2019.aspx ↩︎

  17. https://web.archive.org/web/20210929135657/https://www.trenord.it/biglietti/titoli-di-viaggio/biglietti/ ↩︎

  18. https://web.archive.org/web/20200630145305/https://twitter.com/atm_informa/status/1277974721259167744 ↩︎

reverse engineeringaccess controlatmmilano
Share this post:

SPID and Google Authenticator: When Interoperability Is Intentionally Impeded