ACR35:APDU命令选择文件返回状态6A 82(未找到文件)

时间:2016-12-28 18:41:17

标签: android nfc mifare apdu contactless-smartcard

我正在测试ACR35,我在提供的SDK中遇到了这个问题。

我有一张DESFire EV1卡,它具有以下文件结构:

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

我已经验证了这个文件结构确实存在于另一个读卡器的卡上(带有集成NFC读卡器的Android设备)。

我正在使用以下代码选择DF(通过其AID):

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();
    }
}

我在等待这里的回复:

/* 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..");
                }
            }
        }
    }
});

在这里,我在选择DF时获得了成功状态(90 00),但在选择文件时我得到了一个未找到文件状态(6A 82)。

日志如下:

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

在Android NFC阅读器模式下使用相同的卡和完全相同的APDU命令工作正常,我可以选择文件,但ACR35似乎不喜欢多个连续的APDU命令。

Github项目:https://github.com/rthapa/smartcardreader

1 个答案:

答案 0 :(得分:0)

请勿在发送APDU之间呼叫mReader.piccPowerOn(timeout, cardType)。方法piccPowerOn()将使读者重置DESFire卡。因此,当您执行SELECT(通过FID)命令F222222222时,将不再选择应用程序00 A4 0200 02 0001