首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SmartCard选择文件

SmartCard选择文件
EN

Stack Overflow用户
提问于 2022-10-13 19:35:50
回答 1查看 45关注 0票数 0

所以,当我继续前进的时候,没有得到应该是相对简单的任务。我在用Gemalto智能卡读卡器。我正在使用C#,Xamarin正在开发一个安卓系统。

我有正确的识别设备,卡,并启动电源,获得ATR,设置配置等,所有回来作为成功的过程。

因此,我正在尝试执行一个UsbConnection.BulkTransfer来发送一个请求,从给定的智能卡中选择MasterFile (根)。通过阅读许多帖子,我找到了APDU命令,找到了许多选项,并尝试了所有这些选项。他们都给了我一个结果SW1/SW2的0x01 0x00,这显然是错误的,我一直在阅读。

下面是我一直在发送的以下字节尝试,每个字节都返回相同的响应。

代码语言:javascript
复制
CLA INS P1 P2 Lc Data  Le
00  a4  00 00 02 3f 00 00
00  a4  00 00 02 3f 00
00  a4  00 00 02 00 00 00
00  a4  00 00 02 00 00
00  a4  00 00 00
00  a4  00 00 
00  a4  

据我所读,如果您不发布P1/P2或数据,它应该默认为卡上的第一个文件(主记录),因此我尝试从所有字节一直到00 a4

然后,我尝试了将类从00更改为A0的相同组合,这与其他文档发现中的相同。下面是一个简短的代码存根,它特定于我发送字节并返回字节。每个字节数组都基于上述。

返回的字节响应与

代码语言:javascript
复制
00 00 00 00 00 63 00 65 01 00

下面是代码片段

代码语言:javascript
复制
public byte[] TrySelectFile(byte[] outByteBuffer)
{
    var bufferLen = outByteBuffer.Length;
    var howManyBytesSent = _myUsbDeviceConnection.BulkTransfer(_myOutEndpoint, outByteBuffer, bufferLen, READER_TIMEOUT);

    var inByteBuffer = new byte[_myInEndpoint.MaxPacketSize];
    var howManyBytesBack = _myUsbDeviceConnection.BulkTransfer(_myInEndpoint, inByteBuffer, inByteBuffer.Length, READER_TIMEOUT);

    return inByteBuffer;
}
EN

回答 1

Stack Overflow用户

发布于 2022-10-14 01:11:22

不能将APDU直接发送到阅读器。您需要使用CCID协议。看看我的先前的回答

例如(使用正确的序列号,这些只是说明性的):

发送PC_to_RDR_IccPowerOn (消息0x62):

-> 62000000000008010000

并使用ATR接收RDR_to_PC_DataBlock (消息0x80):

<- 801200000000080000003bfb1300ff10800031c164089862290f9000

用T=0设置PC_to_RDR_SetParameters协议的参数(消息0x61):

-> 6105000000000900001300020a00

并接收RDR_to_PC_Parameters (消息0x82):

<- 8205000000000900001300020a00

然后可以使用SELECT (消息0x6f)发送PC_to_RDR_XfrBlock APDU (粗体)。

-> 6f05000000000a00000000a4040000

并在RDR_to_PC_DataBlock (消息0x80)中接收响应APDU (状态词仅为粗体):

<- 8002000000000a0000006c3f

然后,您需要按照T=0协议:00a404003f的需要,重新发送带有正确Le的APDU。看下面的全部痕迹..。

下面是一个基-64编码的Wireshark跟踪,在SELECT trace中的T=0卡上执行GemPC APDU命令(将其解码为二进制文件并在wireshark中打开它,然后右击任意数据包并选择"Decode As.“,切换到"USBCCID”选项卡,选择“USBCCID”协议并单击"OK"):

代码语言:javascript
复制
-----BEGIN PCAP-NG CAPTURE FILE-----
H4sICIi1SGMAA2NjaWRfdDAucGNhcG5nAOPi5eWSYWBg8LXRlmIE0v+hACQG4usA8R0GEGBhYGJg
ZygtTsrNzzNg4ATKsjFAAEgNiJ0D5X96xcqw1XuKnReQDcIHxLoWnZn0/38wM5MCI4Muw5opHskg
dVtPsDH0Au3iArK5GHCDJDDJAXIO2A6QXTVIdp38NcUuBsiOQbLLmbkJxa6T5exg9TJQjAGYIFSD
ENguILb+LczwX6CBwfBgCseMJE3+CWA7QXYXINn9e91lO38gG4Qdqt+dOI3kzw1Qu38rcYL9yQ9k
8+PxZyIriOQEYmEGJi6IPej2eW9G2NdwZPpbZL/C7PNW5wSrx2kf1K9NRNgntIWw/4Q0iPNfPtg+
cEwvYWFA2IecbmrOXLbzAbJB2EEONS5h9tU4QPzHA8W4/NfABLMvxx6WbpD9dvEMwm8HhFHTKMyu
iw6k+I0b6jd7uN/WINlXpXbFrhvIBmEGSex+q5oF8Zs3FOP0myPMvnzbFo4FQJoZiJcazs/TMiAa
zE9l/D8B4kZWtHiIYPO1ZwTmFOf80ryS1KJihYKi/LLMlNQUhaRKhZTS3ILkxAImYD4BqT1z3MyO
GcoOAOpjAbJTmCFmsYLzEgKA7AAA5cD28HQEAAA=
-----END PCAP-NG CAPTURE FILE-----

(注:对select的卡片响应被编辑)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74060939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档