如何在Windows 10(移动设备)上向智能卡发送低级命令(非APDU)?

时间:2016-02-22 17:21:35

标签: windows nfc win-universal-app smartcard apdu

我正在编写基于Microsoft提供的NFC Example的代码。
Windows.Devices.SmartCards中的所有内容都与APDU命令有关。例如,TransmitAsync方法描述为:

  

异步传输提供的应用程序协议数据单元(APDU)命令并返回响应。

但是,由于这是一个带有字节数组参数的方法,我以为我能够通过使用这种方法摆脱APDU。我在文件CardReader.xaml.cs中插入了一些代码:

private async Task HandleCard(SmartCard card){
    ......
    // Handle MIFARE Standard/Classic
    LogMessage("MIFARE Standard/Classic card detected");
    var mfStdAccess = new MifareStandard.AccessHandler(connection);
    var uid = await mfStdAccess.GetUidAsync();
    LogMessage("UID:  " + BitConverter.ToString(uid));

    // My code
    LogMessage("==============");
    await SendBytes(connection, new byte[] { 0xFF, 0xCA, 0, 0, 0 }); //APDU Test
    await SendBytes(connection, new byte[] { 0x50, 0x00 }); // Halt card
    await SendBytes(connection, new byte[] { 0x52 }); //Wake card
    return;
    ......
}
private async Task<byte[]> SendBytes(SmartCardConnection connection, byte[] RawData)
{
    LogMessage("> " + BitConverter.ToString(RawData).Replace("-", " ").ToUpper());
    byte[] res = (await connection.TransmitAsync(RawData.AsBuffer())).ToArray();
    LogMessage("< " + BitConverter.ToString(res).Replace("-", " ").ToUpper());
    return res;
}

我在手机上运行应用程序,向Mifare Classic 1K卡发送命令。但是,我得到的是:

> FF CA 00 00 00
< 02 27 9F 8F 90 00
> 50 00
< 63 00
> 52
< 63 00

显然,APDU可以工作。我不知道63 00是什么,但我想这是APUD命令中的SW响应?我在论坛上看到你可以使用NfcAdapter在Android手机上做到这一点。我的代码出了什么问题?或者甚至可以在Windows 10 Mobile上发送低级命令(摆脱APDU)?
谢谢。

2 个答案:

答案 0 :(得分:0)

PCSC具有特定于存储卡的命令。这样你就可以得到Mifare的支持。当然,您必须从读卡器制造商处获得Mifare卡的支持,但Mifare仍然非常受欢迎。

然而,不支持Native Mifare命令。您需要将这些命令转换为2.01 specification,第3.2.2.1节中的PCSC命令。

所以你不需要摆脱本机命令。只需将存储卡特定的APDU发送到阅读器,阅读器就会将本机命令发送到卡上。

答案 1 :(得分:0)

您必须发送由Maarten提供的PCSC命令。在c#上编写了一个库,它将低级Mirafe命令封装到PCSC APDU中。

检查onovotny's repository