首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaCard和T=1协议:区分APDU病例

JavaCard和T=1协议:区分APDU病例
EN

Stack Overflow用户
提问于 2017-05-06 16:49:45
回答 1查看 1K关注 0票数 3

在T=0协议中,case 1& case 2 APDU与case 3和case 4 APDU的TPDU是相同的,因此,对于智能卡端的T=0协议,无法区分case 1&2和案例3&4 APDU。事实上,除非智能卡试图读取数据字节,否则甚至无法区分case 2和3 APDU,如果终端发送的实际APDU是例2 APDU,则会导致失败。

但是,由于在T=1协议中,TPDU对应于APDU,所以卡片知道APDU接收到的是哪种情况。

问题是,Java是否为T=1协议提供了任何方法:

  1. 知道接收到的APDU是否是数据APDU,因此可以安全地调用setIncomingAndReceive();
  2. 读取案例4中的Le字节APDU;
  3. 了解实际是否从终端接收到Le字节(在APDU缓冲区中的P3为0x00的模糊情况下)。
EN

回答 1

Stack Overflow用户

发布于 2017-05-07 02:26:19

1.知道接收到的APDU是否是数据APDU,因此可以安全地调用setIncomingAndReceive()

现在,这是一个有趣的问题;似乎可以使用getIncomingLength

APDU头中由Lc字段指示的传入字节长度。如果没有传入数据,则返回0(案例1)

但它在特例描述中说:

如果APDUException.ILLEGAL_USE没有调用setIncomingAndReceive(),或者以前调用了setOutgoing()setOutgoingNoChaining(),则为setOutgoing()

对于setIncomingAndReceive(),您可以读到:

此方法只应在case 3或case 4命令上调用,否则可能会导致错误行为。

这里似乎有一个陷阱;我将询问我的一个资源,关于如何处理这个问题。同时,setIncomingAndReceivegetIncomingLength不太可能(但不是不可能)为1或2个APDU抛出异常。

2.从例4中读取的Le字节

好的,是的,通过读取Nc值,然后在接收到的字节中前进,以到达命令后面的Le字节。但是通常情况下,通过调用setOutgoing (返回)更容易使用Ne (实际长度而不是长度的编码):

Ne,预期响应长度

3.知道实际是否从终端接收到Le字节(在APDU缓冲区中的P3为0x00的模糊情况下)

如果P3 = 0x00,那么据我所知,P3 就是的Le字节。我不认为这是模棱两可的。Lc被禁止具有此价值。

备注:

  • 大多数APDU命令都有预先描述的格式,因此您可以预先知道(在使用process方法处理APDU期间)是否应该得到一个特定的情况--您可以抛出不需要的异常;
  • 我之所以引用Java 3.0.5,是因为它可以在线使用,也因为它正确地区分了Nc、Lc、Ne和Le --但是它的界面与早期版本并没有什么不同。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43823009

复制
相关文章

相似问题

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