所以,当我继续前进的时候,没有得到应该是相对简单的任务。我在用Gemalto智能卡读卡器。我正在使用C#,Xamarin正在开发一个安卓系统。
我有正确的识别设备,卡,并启动电源,获得ATR,设置配置等,所有回来作为成功的过程。
因此,我正在尝试执行一个UsbConnection.BulkTransfer来发送一个请求,从给定的智能卡中选择MasterFile (根)。通过阅读许多帖子,我找到了APDU命令,找到了许多选项,并尝试了所有这些选项。他们都给了我一个结果SW1/SW2的0x01 0x00,这显然是错误的,我一直在阅读。
下面是我一直在发送的以下字节尝试,每个字节都返回相同的响应。
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的相同组合,这与其他文档发现中的相同。下面是一个简短的代码存根,它特定于我发送字节并返回字节。每个字节数组都基于上述。
返回的字节响应与
00 00 00 00 00 63 00 65 01 00下面是代码片段
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;
}发布于 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"):
-----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的卡片响应被编辑)
https://stackoverflow.com/questions/74060939
复制相似问题