2015-05-19 33 views
8

ero già lavorato con le smart card e io sono familiarità con i comandi APDU (che sono definiti in ISO/IEC 7816 e piattaforma globale specifiche).inviare comandi APDU alla carta USIM/SIM in Android

Ora voglio sapere se esiste un modo per inviare un comando APDU alla mia carta USIM/SIM inserita nel mio cellulare? (Samsung A3 con v4.4.4 Android KitKat installato.)

ho già cercato in Google e ho trovato alcuni argomenti correlati e strumenti denominati SIM Application Toolkit e Seek per Android. Ma non capisco davvero cosa sono questi? Sono questi elementi due applicazioni che devo installare sul mio cellulare? o sono quei due strumenti che sono stati già installati sulla carta USIM/SIM e ricevono comandi dal telefono cellulare?

Qual è la differenza tra Proactive comandi, i comandi APDU e comandi AT ?

Devo imparare ad Android a sviluppare applicazioni per schede SIM o ho solo bisogno delle specifiche della scheda Java e degli standard ETSI?

Grazie in anticipo.

risposta

11

Sulla scheda SIM possono essere presenti due diversi tipi di applet.

applet comuni

applet comuni scritti in JavaCard pianura. Questo è il tipo di applet a cui sei abituato dal mondo delle comuni smart card. Ha il metodo process e la smart card è il soggetto passivo nella comunicazione: la tua app invia comandi APDU e le risposte della carta.

È possibile comunicare con queste applet utilizzando un set speciale di librerie Android chiamato SEEK per Android. Dai un'occhiata a questo tutorial per imparare come creare un'applicazione del genere.

A partire dal livello API 21 esiste anche un modo per comunicare con la SIM utilizzando Telephony Manager. Tuttavia, c'è un enorme ostacolo: la tua app necessita dell'autorizzazione MODIFY_PHONE_STATE, che può essere concessa solo alle app di sistema. Un'app reqular, non di sistema, non è autorizzata a usarlo.

SIM Toolkit applet

carta

Una SIM è molto più di una semplice smart card comune e la scrittura di un applet per una scheda SIM può essere molto più complicato di una smart card comune se si desidera utilizzare tutte le le possibilità offerte dalla carta SIM. Vi consiglio di leggere this paper - è una tesi di laurea di qualcuno, ma è la migliore panoramica per un principiante che ho trovato su Internet. Raccomando anche this video from the DefConn conference.

Il ruolo dell'applet caricata sulla scheda SIM è diverso: l'applet non è più un'entità passiva. Il telefono chiede regolarmente all'applet: "C'è qualcosa di nuovo che posso fare per te?" e l'applet può rispondere: "Sì, invia questo SMS, per favore" o "Dimmi che ora è" ecc. Inoltre, l'applet può diventare un ascoltatore di alcuni eventi: chiamata in arrivo, SMS ricevuti, intervallo di tempo trascorso ecc.Sì, la SIM card sembra essere passiva dal punto di vista tecnico, ma il suo ruolo è infatti attivo: è la carta SIM che invia comandi al telefono.

Questi comandi sono denominati "comandi proattivi" o comandi di SIM Application Toolkit. La struttura è la stessa - CLA INS P1 P2 LC data LE; il significato è diverso.

È possibile inviarli dall'applet utilizzando le classi in uno speciale pacchetto JavaCard denominato sim.toolkit.

(SIM Application Toolkit è uno standard che specifica i comandi proattivi nello stesso modo piattaforma globale specifica ciclo di vita del applet.)

Esempio di SIM applet Toolkit:

import sim.toolkit.ToolkitInterface; 
import sim.toolkit.ToolkitRegistry; 
... 
import javacard.framework.ISOException; 

public class STKTest extends Applet implements ToolkitInterface { 

public static void install(byte[] bArray, short bOffset, byte bLength) { 
    // GP-compliant JavaCard applet registration 
    new STKTest().register(bArray, (short) (bOffset + 1), bArray[bOffset]); 
} 
//this method handles standard APDU commands 
public void process(APDU apdu) { 
    // Good practice: Return 9000 on SELECT 
    if (selectingApplet()) { 
     return; 
    } 

    apdu.setIncomingAndReceive(); 
    final byte[] buf = apdu.getBuffer(); 
    switch (buf[ISO7816.OFFSET_INS]) { 
    case (byte) 0x00: 
     //do something 
     break; 
    } 
} 
//this method handles the SIM Toolkit commands 
public void processToolkit(byte event) throws ToolkitException { 
    switch (event) { 

    case ToolkitConstants.EVENT_TIMER_EXPIRATION: 
     //do something 
     break; 
    } 
} 

} 

Sì, si dovrebbe imparare Android: ne avrai bisogno per utilizzare la libreria SEEK. La tua domanda è molto ampia, ti prego di chiedermi qualsiasi dettaglio, se vuoi.

+0

Grazie caro vojta. ** 1 - ** Quindi, _SEEK per Android_ è una libreria che uso per scrivere applet per il mio set mobile (e non per SIM/USIM) per comunicare con le applet su USIM/SIM, giusto? ** 2 - ** Hai idea di cosa sia _SIM Toolkit Applicatin_ (aka STK)? – Jean

+0

I comandi Proactive sono simili ai normali comandi APDU? Voglio dire che hanno un'intestazione obbligatoria di 4 byte contenente CLA, INS, P1 e P2? o sono totalmente diversi? – Jean

+0

Nella sezione 1 hai sottolineato che le comuni smart card sono un ruolo passivo nella comunicazione. giusto. ma questo significa che le USIM/schede SIM possono avere un ruolo attivo nella comunicazione con il telefono o che aspettano sempre i comandi e non possono avviare una comunicazione? hai detto che il telefono chiede regolarmente all'applet "C'è qualcosa di nuovo che posso fare per te?" (** la stessa applicazione scritta usando SEEK per la libreria di Android? **) e l'applet della SIM risponde ad essa. quindi la SIM è ancora passiva. non è? – Jean

4

A partire dal livello API 22 (Android 5.1) è disponibile un'altra opzione denominata "Carrier Privileges". Consente alle app non di sistema di inviare APDU alla scheda SIM utilizzando Android TelephonyManager. Vedi: https://developer.android.com/reference/android/telephony/TelephonyManager.html#hasCarrierPrivileges()

Ad esempio, le app di rete mobile (MNO) distribuite su Google Play possono utilizzare questo. Ma di nuovo non è aperto a tutti. In questo caso è necessario ottenere l'accesso tramite la SIM. Le Regole di accesso sulla SIM sono gestite dal MNO che l'ha emessa. Vedi anche: http://source.android.com/devices/tech/config/uicc.html