2016-12-28 3 views
1

Ich teste ein ACR35 und ich habe dieses Problem mit dem bereitgestellten SDK.ACR35: APDU Befehl Datei auswählen gibt Status 6A 82 (Datei nicht gefunden)

Ich habe eine DESFire EV1-Karte, die die folgende Dateistruktur hat:

[ Master File ] 
     | 
     |___ [ AID - F222222222 (Dedicated file) ] 
        | 
        |___ [ File id - 0001 (Elementary File) ] 

ich überprüft haben, dass diese Dateistruktur wirklich mit einem anderen Leser (Android-Gerät mit integriertem NFC-Lesegerät) auf der Karte vorhanden ist.

ich die DF bin Auswahl (durch seine AID) mit diesem Code:

public void powerOn(){ 
    if (mReader.piccPowerOn(timeout, cardType)) { 
     Log.i(TAG, "poweron true"); 
     byte[] test = ApduCommand.HexStringToByteArray("00A4040005F222222222"); 
     /*Transmit the command to the reader with timeout: 5 sec*/ 
     mReader.piccTransmit(timeout, test); 
    }else{ 
     Log.i(TAG, "poweron false"); 
     powerOn(); 
    } 
} 

Und ich für die Antwort warte hier:

/* Set the PICC response APDU callback. */ 
mReader.setOnPiccResponseApduAvailableListener(new AudioJackReader.OnPiccResponseApduAvailableListener() { 
    @Override 
    public void onPiccResponseApduAvailable(AudioJackReader reader, byte[] responseApdu) { 
     String resultHex = ApduCommand.ByteArrayToHexString(responseApdu); 
     Log.i(TAG, "APDU response ("+current_status+")" + resultHex); 

     if(resultHex.equals("9000")) { 
      if (current_status == STATUS_SELECT_AID) { 
       if (mReader.piccPowerOn(timeout, cardType)) { 
        Log.i(TAG, "selecting file"); 
        byte[] selFile = ApduCommand.HexStringToByteArray("00A40200020001"); 
        current_status = STATUS_SELECT_FILE; 
        mReader.piccTransmit(timeout, selFile); 
       } else { 
        Log.i(TAG, "timed out.."); 
       } 
      }else if(current_status == STATUS_SELECT_FILE) { 
       if (mReader.piccPowerOn(timeout, cardType)) { 
        Log.i(TAG, "reading binary data"); 
        byte[] readBinary = ApduCommand.HexStringToByteArray("00B0000000"); 
        current_status = STATUS_READ_DATA; 
        mReader.piccTransmit(timeout, readBinary); 
       } else { 
        Log.i(TAG, "timed out.."); 
       } 
      } 
     } 
    } 
}); 

Hier bekomme ich einen Erfolgsstatus (90 00) bei der Auswahl der DF, aber ich bekomme einen Datei nicht gefundenen Status (6A 82) während der Auswahl der Datei.

Log sind wie folgt:

12-28 18:17:02.752 27298-28923/com.example.m1alesis.smartcardreader I/acrx: APDU response (0)9000 
12-28 18:17:02.752 27298-28923/com.example.m1alesis.smartcardreader I/acrx: selecting file 
12-28 18:17:03.412 27298-28949/com.example.m1alesis.smartcardreader I/acrx: APDU response (1)6A82 

Unter Verwendung der gleichen Karte und exakt die gleichen APDU-Befehle auf Android NFC-Reader-Modus funktioniert gut und ich bin in der Lage, die Datei zu wählen, aber ACR35 scheint nicht mehrfach zu mögen sequentielle APDU-Befehle.

Github-Projekt: https://github.com/rthapa/smartcardreader

+0

Gibt es einen Grund, warum Sie 'piccPowerOn()' aufrufen, bevor Sie versuchen, die Datei auszuwählen? Ich bin mir nicht ganz sicher, was diese Methode macht, aber wenn sie die Stromversorgung deaktiviert und wieder aktiviert, wird die DESFire-Anwendung möglicherweise nicht mehr ausgewählt. –

+1

@MichaelRoland Das war es !!! Es macht jetzt vollkommen Sinn. Wow, ich habe diese Codes 100 Mal durchgegangen und konnte nicht herausfinden. Danke, wenn du dies als Antwort postest, werde ich es akzeptieren. Es könnte in Zukunft für jemand anderen nützlich sein. – unknown

Antwort

0

Rufen Sie nicht mReader.piccPowerOn(timeout, cardType) zwischen APDUs senden. Die Methode piccPowerOn() veranlasst den Leser, die DESFire-Karte zurückzusetzen. Folglich wird die Anwendung F222222222 nicht mehr ausgewählt, wenn Sie den SELECT (by FID) -Befehl 00 A4 0200 02 0001 ausführen.