Vai al contenuto
Lingua: IT

Che cos'è un'APDU, e quando serve al tuo codice?

Un'APDU è l'unità di comando e risposta della ISO/IEC 7816-4. Un comando porta quattro byte di intestazione, CLA, INS, P1 e P2, poi dati facoltativi e una lunghezza attesa; la risposta porta dati e due byte di stato. Al codice serve per i tag di tipo 4 e per le schede, tramite IsoDep su Android o NFCISO7816Tag su iOS.

Comando e risposta

Un'APDU di comando comincia con quattro byte. CLA dà la classe dell'istruzione, INS l'istruzione stessa, P1 e P2 i suoi parametri. I dati seguono quando il comando ne invia, preceduti dalla loro lunghezza, Lc, e il comando può finire con Le, la lunghezza della risposta che si aspetta. L'inizializzatore di NFCISO7816APDU di Apple ne costruisce una esattamente da questi campi.

Le lunghezze hanno due misure. Un'APDU normale porta al massimo 255 byte di dati, 261 byte in tutto, e una estesa fino a 65535, secondo il riferimento di IsoDep, e certi controller Android rifiutano la forma estesa, come spiega la pagina dei limiti del controller. L'inizializzatore di Apple codifica Le da un numero: 256 invia 00 nella forma corta, 65536 invia 0000 nella forma estesa, e -1 dichiara che non si aspetta alcun dato di risposta.

La risposta è fatta di dati seguiti da due byte di stato, SW1 e SW2. I dati possono essere vuoti, e Apple nota che possono esserlo anche quando il comando è riuscito.

Quando serve al codice

Ogni volta che il tag parla ISO/IEC 7816-4: i tag di tipo 4, che conservano il NDEF in file raggiunti da APDU, e le schede costruite su ISO/IEC 14443-4, che Android espone tramite IsoDep. Un tag di tipo 2 no; risponde ai comandi NFC-A descritti nella pagina della memoria di tipo 2.

Su Android, IsoDep.transceive() invia l'APDU e rende la risposta con i suoi due byte di stato in fondo. Su iOS, una sessione di tag consegna NFCISO7816Tag e il suo sendCommand(apdu:); per i tag MIFARE Plus e DESFire consegnati come NFCMiFareTag, Apple fornisce sendMiFareISO7816Command per lo stesso scopo.

Leggere o scrivere NDEF su un tag di tipo 4 non chiede alcuna APDU costruita a mano: la classe Ndef di Android e le chiamate NDEF di Core NFC lo fanno. Il codice costruisce APDU per quello che il NDEF non copre, come un file diverso dal file NDEF, una condizione di accesso, o un'applicazione propria. La pagina del file NDEF di tipo 4 segue la sequenza che le piattaforme eseguono.

La selezione viene per prima

Una scheda ISO/IEC 7816-4 porta applicazioni e file, e un comando agisce su quello che è selezionato al momento. SELECT, istruzione 0xA4, sceglie per nome quando P1 è 0x04, dove il nome è un identificatore di applicazione, e per identificatore di file quando P1 è 0x00. Sono i valori che la pila NFC libera di Android usa per raggiungere il NDEF su un tag di tipo 4.

iOS restringe il primo genere. Una SELECT con P1 a 0x04 deve nominare un'applicazione elencata nell'Info.plist dell'applicazione, altrimenti la chiamata fallisce con readerErrorSecurityViolation, secondo il riferimento di sendCommand. La sessione seleziona anche una delle applicazioni elencate quando rileva il tag, e segnala quale in initialSelectedAID; la pagina delle dichiarazioni copre l'elenco.

Una selezione non dura più dell'alimentazione del tag. Un tag che lascia il campo perde tutt'e due, quindi il codice che si riconnette seleziona di nuovo l'applicazione prima del comando successivo.

Leggere i byte di stato

90 00 vuol dire che il comando è andato a termine. Gli altri valori vengono dalla ISO/IEC 7816-4 o dall'applicazione della scheda, e la pila di Android nomina quelli che un lettore di tag di tipo 4 incontra più spesso:

Byte di stato nominati nella pila NFC di Android
SW1 SW2Significato
90 00Comando andato a termine
6A 82File o applicazione non trovati
67 00Lunghezza sbagliata
69 86Comando non consentito
6B 00Parametri sbagliati
6D 00Istruzione non sostenuta
6E 00Classe non sostenuta

Ciascuna piattaforma li nasconde a modo suo. Su Android sono gli ultimi due byte dell'array che transceive() rende, e il codice che tratta tutto l'array come dati li scambia per contenuto. Su iOS l'errore copre la sola comunicazione, e un'applicazione che guarda l'errore e non sw1 e sw2 prende un rifiuto per un successo.

Domande frequenti

Un tag di tipo 2 usa le APDU?

No. Risponde a comandi NFC-A come READ e WRITE; le APDU appartengono ai tag di tipo 4 e alle schede costruite su ISO/IEC 14443-4.

Perché iOS rifiuta il mio comando SELECT?

Una SELECT per identificatore di applicazione deve nominare un identificatore elencato in Info.plist. Altrimenti Core NFC fa fallire la chiamata con readerErrorSecurityViolation.

Che cosa vuol dire 6A 82?

Che il file o l'applicazione nominati nel comando non sono stati trovati. Dopo una SELECT dell'applicazione NDEF, vuol dire che il tag non ne ha una.

Un'APDU è cifrata?

Non dal suo formato. La protezione, dove una scheda ne ha una, è definita dall'applicazione della scheda e descritta nella scheda tecnica del chip.