Smartcard APDU命令错误-响应6C6B

Smartcard APDU命令错误-响应6C6B,smartcard,apdu,Smartcard,Apdu,我正在尝试使用Objective-C中的PCSC命令读取智能卡 int count = 17; unsigned char *get_cplc_command = (unsigned char *)calloc(count, sizeof(unsigned char)); get_cplc_command[1]=-92; get_cplc_command[2]=4; get_cplc_command[4]=12; get_cplc_command[5]=-96; get_cplc_comma

我正在尝试使用Objective-C中的PCSC命令读取智能卡

  int count = 17;
unsigned char *get_cplc_command = (unsigned char *)calloc(count, sizeof(unsigned char));
get_cplc_command[1]=-92;
get_cplc_command[2]=4;
get_cplc_command[4]=12;
get_cplc_command[5]=-96;
get_cplc_command[8]=2;
get_cplc_command[9]=67;
get_cplc_command[11]=19;
get_cplc_command[15]=1;
get_cplc_command[16]=1;

receive_length = sizeof(receive_buffer);

ret = SCardTransmit(card, 
                    &sendPCI,
                    get_cplc_command, 
                    sizeof(get_cplc_command),
                    NULL,
                    receive_buffer,
                    &receive_length);

LOG(@"SCardTransmit 0x%08x", ret);

当我执行上述命令时,我得到6C6B响应。您能帮我解决这个问题吗。

状态词
6CXX
表示命令APDU的
Le
字段错误

引用ISO 7816-3,表14:

由于错误的Le字段(SW2编码Na,即 可用数据字节的确切数目)。在案例1和案例3中,卡 不应该使用这样的值。在情况2和4中,卡应准备就绪 接收与P3=SW2相同的命令

和ISO 7816-4第5.1.3节:

如果将SW1设置为“6C”,则该过程将中止,并且 在发出任何其他命令之前,请执行相同的命令 可以使用SW2(可用数据字节的确切数量)作为短Le字段重新发出命令


(虽然不熟悉Objective-C)我打赌
SCardTransmit
(即
sizeof(get\u cplc\u命令)
)的第四个参数应该是
count
,因为
sizeof
操作符没有给出分配数组的大小,而是给出指向它的指针的大小

[假定32位体系结构和
sizeof(unsigned char*)
等于
4
]:发送的命令不是
00A404000CA00000024300130000000101
,而是
00A40400
,被解释为案例1命令(命令APDU案例描述见ISO 7816-3第12.1.2节)

祝你好运


PS:请考虑检查您的<代码>收件人长度> /代码>变量以解决相同的问题。


编辑>关于
61XX
状态:

正如@guidot所写的,您需要发出一个GET响应(另一个命令),以便在收到这个状态字后立即获取响应数据

引用ISO 7816-4:

如果SW1设置为“61”,则流程将在之前完成 发出任何其他命令时,可能会发出带有 使用相同的CLA并使用SW2(仍然可用的数据字节数)作为 短乐菲尔德

上述
GET RESPONSE
命令也记录在ISO 7816-4中(参见示例)

在您的情况下,APDU交换可能如下所示:

> 00A404000CA00000024300130000000101 // SELECT command
< 6121 // SELECT response -- 33 bytes still available
> 00C0000021 // GET RESPONSE command
< XXXX...XX9000 // GET RESPONSE response (33 bytes and a status word)
>00A404000CA00000024300130000000101//选择命令
<6121//选择响应--仍有33个字节可用
>00C0000021//获取响应命令
(您必须调用
SCardTransmit
两次,一次调用
00A404000C…
,然后调用
00c000021…
。如果重复使用,请记住重置
receive\u length
变量)



注意:您可能希望尝试发送
00A404000CA000000243001300000010100
命令APDU(存在Le字段并设置为0x00的同一命令,这意味着您希望响应数据中最多包含256个字节)。

@vip,感谢您的回复。现在我已经以无符号字符get_cplc_command[]的形式发送了命令,{0x00,0xA4,0x04,0x00,0x0C,0xA0,0x00,0x00,0x02,0x43,0x00,0x13,0x00,0x00,0x00,0x01,0x01};现在回复是6121。我试图更改第四个参数的sizeof,它给了我兼容性错误。如果回答代码是6121,请告诉我如何更正。@SaiKiran:这应该是一个单独的问题。简短回答:命令工作正常,您有一张T=0卡,需要发送GET响应来检索答案。我建议您熟悉ISO 7816-3和ISO 7816-4。@SaiKiran我更新了答案。兼容性错误很奇怪,应该可以将
int
转换为
DWORD
而不会出现问题……可能有点像Objective-C专业。祝你好运@谢谢你的回复。我也在查阅ISO参考资料。@vip,它确实帮助我了解您的详细回复。我将和勒菲尔德一起尝试。