ACR35:APDU 命令 select 文件 returns 状态 6A 82(未找到文件)
ACR35: APDU command select file returns status 6A 82 (file not found)
我正在测试 ACR35,我在使用提供的 SDK 时遇到了这个问题。
我有一张 DESFire EV1 卡,其文件结构如下:
[ Master File ]
|
|___ [ AID - F222222222 (Dedicated file) ]
|
|___ [ File id - 0001 (Elementary File) ]
我已经用另一个 reader(Android 集成 NFC reader 的设备)验证了这个文件结构确实存在于卡上。
我正在 select 使用此代码访问 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..");
}
}
}
}
});
在这里,我在 selecting DF 时获得成功状态 (90 00
),但在 selecting 时我获得文件未找到状态 (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 reader 模式下使用相同的卡和完全相同的 APDU 命令工作正常,我能够 select 文件,但 ACR35 似乎不喜欢多个连续的 APDU 命令。
不要在发送 APDU 之间调用 mReader.piccPowerOn(timeout, cardType)
。 piccPowerOn()
方法将导致 reader 重置 DESFire 卡。因此,当您执行 SELECT(通过 FID)命令 00 A4 0200 02 0001
.
时,将不再选择应用程序 F222222222
我正在测试 ACR35,我在使用提供的 SDK 时遇到了这个问题。
我有一张 DESFire EV1 卡,其文件结构如下:
[ Master File ]
|
|___ [ AID - F222222222 (Dedicated file) ]
|
|___ [ File id - 0001 (Elementary File) ]
我已经用另一个 reader(Android 集成 NFC reader 的设备)验证了这个文件结构确实存在于卡上。
我正在 select 使用此代码访问 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..");
}
}
}
}
});
在这里,我在 selecting DF 时获得成功状态 (90 00
),但在 selecting 时我获得文件未找到状态 (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 reader 模式下使用相同的卡和完全相同的 APDU 命令工作正常,我能够 select 文件,但 ACR35 似乎不喜欢多个连续的 APDU 命令。
不要在发送 APDU 之间调用 mReader.piccPowerOn(timeout, cardType)
。 piccPowerOn()
方法将导致 reader 重置 DESFire 卡。因此,当您执行 SELECT(通过 FID)命令 00 A4 0200 02 0001
.
F222222222