2015-05-19 24 views
8

ich schon mit Smartcards gearbeitet wurde und ich bin vertraut mit APDU-Befehle (die in ISO/IEC 7816 und Global Platform Spezifikationen definiert sind).senden APDU-Befehle an USIM/SIM-Karte in android

Jetzt möchte ich wissen, ob es eine Möglichkeit gibt, einen APDU-Befehl an meine USIM/SIM-Karte zu senden, die auf meinem Mobiltelefon eingefügt ist? (Samsung A3 mit Android v4.4.4 kitkat installiert.)

ich bereits in der Google gesucht und ich fand einige relevante Themen und Tools namens SIM Toolkit Anwendung und für Android suchen. Aber ich verstehe nicht wirklich was sind diese? Sind diese Artikel zwei Anwendungen, die ich auf meinem Mobiltelefon installieren muss? Oder sind diese beiden Tools bereits auf der USIM/SIM-Karte installiert und empfangen Befehle vom Mobiltelefon?

Was ist der Unterschied zwischen Proactive Befehlen APDU-Befehle und AT-Befehle?

Sollte ich lernen, Android SIM-Karten-Anwendungen zu entwickeln, oder ich brauche nur Java Card-Spezifikationen und ETSI-Standards?

Vielen Dank im Voraus.

Antwort

11

Auf Ihrer SIM-Karte können zwei verschiedene Arten von Applets vorhanden sein.

Gemeinsame Applets

Gemeinsame Applets im Klarjavacard geschrieben. Dies ist die Art von Applet, die Sie aus der Welt der gängigen Smartcards kennen. Es hat die process Methode und Smartcard ist das passive Thema in der Kommunikation: Ihre App sendet APDU-Befehle und die Kartenantworten.

Sie können mit diesen Applets mit einem speziellen Satz von Android-Bibliotheken namens SEEK für Android kommunizieren. Sehen Sie sich tutorial an, um zu erfahren, wie Sie eine solche Telefonanwendung erstellen können.

Ab API-Ebene 21 gibt es auch eine Möglichkeit zur Kommunikation mit SIM unter Verwendung von Telephony Manager. Allerdings gibt es ein großes Hindernis: Ihre App benötigt die Berechtigung MODIFY_PHONE_STATE, die nur System-Apps gewährt werden kann. Eine reqular, Nicht-System-App ist nicht erlaubt, es zu benutzen.

SIM-Toolkit-Applets

Eine SIM-Karte viel mehr als nur eine gemeinsame Smart-Card ist und für eine SIM-Karte ein Applet schreiben kann viel komplizierter sein als für eine gemeinsame Karte klug, wenn Sie alle verwenden möchten die Möglichkeiten, die die SIM-Karte bietet. Ich empfehle Ihnen, this paper zu lesen - es ist jemandes Bachelorarbeit, aber es ist der beste Überblick für einen Anfänger, den ich über das Internet gefunden habe. Ich empfehle auch this video from the DefConn conference.

Die Rolle des auf der SIM-Karte geladenen Applets ist anders: Das Applet ist keine passive Entität mehr. Das Telefon fragt regelmäßig nach deinem Applet: "Gibt es etwas Neues, das ich für dich tun kann?" und Ihr Applet kann antworten: "Ja, senden Sie diese SMS, bitte" oder "Sagen Sie mir, wie spät es ist" usw. Darüber hinaus kann Ihr Applet ein Listener einiger Ereignisse werden: eingehender Anruf, empfangene SMS, vergangenes Zeitintervall usw.Ja, die SIM-Karte scheint aus technischer Sicht passiv zu sein, aber ihre Rolle ist tatsächlich eine aktive: Es ist die SIM-Karte, die Befehle an das Telefon sendet.

Diese Befehle werden "proaktive Befehle" oder SIM-Anwendungstoolkit-Befehle genannt. Struktur ist gleich - CLA INS P1 P2 LC Daten LE; die Bedeutung ist anders.

Sie können sie mit Klassen in einem speziellen JavaCard-Paket mit dem Namen sim.toolkit aus Ihrem Applet senden.

(SIM Application Toolkit ist ein Standard, der die proaktive Befehle in der gleichen Art und Weise gibt Global Platform Lebenszyklus des Applets angibt.)

Beispiel Applet SIM 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; 
    } 
} 

} 

Ja, Sie sollten lernen Android - Sie benötigen es, um die SEEK-Bibliothek zu verwenden. Ihre Frage ist sehr breit, bitte fragen Sie mich nach Details, wenn Sie möchten.

+0

Danke lieber vojta. ** 1 - ** Also, _SEEK für Android_ ist eine Bibliothek, mit der ich Applet für mein Handy (und nicht für SIM/USIM) schreibe, um mit den Applets auf der USIM/SIM zu kommunizieren, oder? ** 2 - ** Haben Sie eine Idee was ist _SIM Toolkit Applicatin_ (aka STK)? – Jean

+0

Sind Proactive-Befehle mit regulären APDU-Befehlen vergleichbar? Ich meine, haben sie einen obligatorischen Header von 4 Byte, der CLA, INS, P1 und P2 enthält? oder sie sind total anders? – Jean

+0

Im Abschnitt 1 haben Sie betont, dass gängige Smartcards passive Rolle in der Kommunikation spielen. Stimmt. Bedeutet das aber, dass USIM/SIM-Karten eine aktive Rolle bei der Kommunikation mit dem Telefon spielen können oder auch immer auf Befehle warten und sie keine Kommunikation starten können? Du hast gesagt, dass das Telefon das Applet regelmäßig fragt: "Gibt es etwas neues, was ich für dich tun kann?" (** dieselbe Anwendung, die mit SEEK für Android-Bibliothek geschrieben wurde? **) und das Applet auf der SIM antwortet darauf. also ist die SIM noch passiv. nicht wahr? – Jean

4

Ab API-Stufe 22 (Android 5.1) gibt es eine weitere Option namens "Carrier Privileges". Es ermöglicht Nicht-System-Apps, APDUs mit Android TelephonyManager an die SIM-Karte zu senden. Siehe: https://developer.android.com/reference/android/telephony/TelephonyManager.html#hasCarrierPrivileges()

Zum Beispiel Mobilfunknetzbetreiber (MNO) Apps, die bei Google Play vertrieben werden, können dies verwenden. Aber wieder ist es nicht für jeden offen. In diesem Fall müssen Sie Zugang von der SIM erhalten. Die Zugriffsregeln auf der SIM werden vom MNO verwaltet, der sie ausgestellt hat. Siehe auch: http://source.android.com/devices/tech/config/uicc.html