Smartcard APDU命令错误-响应6C6B
我正在尝试使用Objective-C中的PCSC命令读取智能卡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
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,它确实帮助我了解您的详细回复。我将和勒菲尔德一起尝试。