首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >javax.smartcardio案例4 APDU消失- 6700响应-警告

javax.smartcardio案例4 APDU消失- 6700响应-警告
EN

Stack Overflow用户
提问于 2015-06-25 13:49:57
回答 1查看 1K关注 0票数 3

使用javax.smartcardio类进行智能卡编程时,我遇到了一个持久错误--当代码看起来很好时,从卡片中取回6700 (无效长度)和类似的错误代码。示例代码:

代码语言:javascript
复制
    req = new CommandAPDU(0x00, 0xA4, 0x04, 0x00, aid, 0x00);

这是为了构造一个案例4 APDU。为什么卡片的反应好像我漏掉了什么东西?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-29 20:28:10

req = new CommandAPDU(0x00, 0xA4, 0x04, 0x00, aid, 0x00); 这是用来构造一个案例4 APDU的。为什么卡片的反应好像我漏掉了什么东西?

简短回答

使用aid, 0x100而不是aid, 0x00

长篇大论(最好喝点咖啡):

这是因为NeLe之间的混淆。Ne是可以返回到终端的最大字节数。Ne是一个没有特定表示形式的数字。然而,Le是以字节为单位的Ne编码或表示。

现在,对于ISO /IEC7816-4,有一个小窍门:在没有响应数据的情况下,Le不存在(没有字节)。因此,将Le = 00定义为“无响应数据”是虚假的。相反,7816-4使用Le = 00来表示Ne = 256。同样,Le = 0000 (或Le = 000000)是指Ne = 65536,即2^16。双字节和三字节编码仅用于扩展长度的APDU。

但是,正如您在构造函数中看到的那样,您必须指定Ne,而不是Le。因此,您指定的内容与表示没有响应数据相同。因此,APDU不会被正确地解释为ISO 4,并且命令将失败(在本例中,正确地说,6700正是您所期望的)。

因此,只需指定您期望的字节数。如果值大于256,则需要一个扩展长度的APDU (或命令链,但这本身就是一个主题)。当然不支持Ne < 0Ne > 64Ki

请注意,包括Java在内的许多协议描述都错误地区分了NeLe (顺便说一下,这在Java Card API v3.0.5中得到了修正)。这有点奇怪,因为在7816-4中有许多--许多问题,但这不是其中之一。写得很清楚。

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

https://stackoverflow.com/questions/31052297

复制
相关文章

相似问题

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