【问题标题】:How to send the APDU command to get a success response?如何发送 APDU 命令以获得成功响应?
【发布时间】:2016-02-05 16:41:23
【问题描述】:

我的 javacard 小程序中有这个方法:

 public void process(APDU apdu)  
{
  byte[] buf = apdu.getBuffer() ;  
  switch(buf[ISO7816.OFFSET_INS])  
   { 
   case 0x40: 
              Util.arrayCopy(hello,(byte)0,buf,ISO7816.OFFSET_CDATA,(byte)5); 
              apdu.setOutgoingAndSend(ISO7816.OFFSET_CDATA,(byte)5); 
              break; 

   default:  ISOException.throwIt(ISO7816.SW_WRONG_INS) ;  
   }
}

你好:

 private final static byte[] hello =  {0x48, 0x65, 0x6c, 0x6c, 0x6f }; 

我在脚本中发送命令如下:

 powerup;

// Select the installer applet
0x00 0xA4 0x04 0x00 0x09 0xa0 0x00 0x00 0x00 0x62 0x03 0x01 0x08 0x01 0x7F;

// create TestApplet applet
0x80 0xB8 0x00 0x00 0xd 0xb 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x00 0x00 0x00 0x7F;

//show hello message
0x40 0x00 0x00 0x00;  //this is the command mentioned in tutorial which gave error

powerdown;

前两个命令成功,但最后一个由于命令格式不正确而出错。

我也试过这个命令:

     0x00 0x40 0x00 0x00 0x00 0x7f; 

但它给了我回复6d00,这意味着不支持INS vlaue。

这是实际的响应:

CLA: 80, INS:40, P1:00,P2:00,Lc:00,Le:00,SW1:6d,SW2:00

预期的响应是获取 hello 值以及成功响应 9000

我在关注tutorial

发出 APDU 命令的正确方法是什么?

【问题讨论】:

    标签: javacard apdu


    【解决方案1】:

    正如@BzH 的回答中提到的,命令0x40 0x00 0x00 0x00 不正确。

    正确的命令是

    0x80 0x40 0x00 0x00 0x00.

    还有一个问题:状态字6D00不是你的小程序发送的,是卡管理器小程序发送的

    AID = A00000006203010801
    

    您在powerup 之后选择了。卡管理器小程序不知道INS = 0x40 指令,因此不知道状态码。您必须在发送任何命令之前选择您的小程序:

    00 A4 04 00 [Lc] [... AID of your applet instance...]
    80 40 00 00 00
    

    【讨论】:

    • 当我尝试这个时,它给了我遇到的解析异常“;”在第 11 行错误,期待 integer_literal、character_literal、string_literal 之一...
    【解决方案2】:

    卡的全球平台类字节是0x80。所以你应该发送:

     0x80 0x40 0x00 0x00 0x00
    

    您发送的第一个 APDU 0x40 0x00 0x00 0x00 是错误的,因为 0x40 被视为类字节,0x00 被视为指令。

    【讨论】:

    • 当我尝试这个时,它给了我遇到的解析异常“;”在第 11 行错误,期待 integer_literal、character_literal、string_literal 之一...
    【解决方案3】:

    最后这个命令对我有用。

    由于APDU命令应该以格式给出,

    向APDU发送命令时要遵循四种情况:

    Case    Command data    Expected response data
    1        No data            No data
    2        No data            Data
    3        Data              No data
    4        Data               Data
    
    • 情况1,长度Lc为空;因此 Lc 字段和数据字段为空。长度 Le 也为空;因此 Le 字段为空。因此,身体是空的。

    • 情况2,长度Lc为空;因此 Lc 字段和数据字段为空。 Le 的长度不为空;因此存在 Le 场。因此,身体由 Le 场组成。

    • 在情况 3 中,长度 Lc 不为空;因此存在 Lc 字段并且数据字段由 Lc 后续字节组成。长度 Le 为空;因此 Le 字段为空。因此,正文由 Lc 字段和后面的数据字段组成。

    • 在情况 4 中,长度 Lc 不为空;因此存在 Lc 字段并且数据字段由 Lc 后续字节组成。长度 Le 也不为空;因此 Le 场也存在。因此,正文由 Lc 字段、数据字段和 Le 字段组成。

    所以在我的情况下是 case 4,我需要发送一些字节,并获取一些字节。

    所以这种情况下的命令应该是:

      0x00 0x40 0x00 0x00 0x05 0x00 0x40 0x00 0x00 0x00 0x05;
       CLA INS    P1   P2  Lc   b1   b2   b3   b4   b5   Le
    
          Lc- input byte length (0x05 followed by 5 bytes of input: 0x00 0x40 0x00 0x00 0x00)
          Le- expeted output byte length (H,e,l,l,o in my case it is 5 bytes. Hence 0x05)
    

    我得到的回复是:

     CLA:00 INS:40 P1:00 P2:00 Lc:05,00,40,00,00,00 Le:05,48,65,6c,6c,6f SW1:90 SW2:00
    

    我在 Le 字段中找到了单词 H,e,l,l,o。

    正如@Vojta 所建议的,我犯的另一个错误是,我在运行命令时没有选择小程序,

    所以,正确的顺序应该是

     power up
    
     //create installer applet
    
     //create testapplet
    
     //select test appplet   (I missed this step in my question)
    
     //run get Hello Command
    
     powerdown;
    

    【讨论】:

    • 这可能有效,但肯定是错误的。您的命令不是 case 4 APDU,而是 case 2 APDU。您不想发送任何输入数据。您只需要读取输出数据。每个 APDU 由一个标头和一个数据部分组成。标头始终存在,数据部分是可选的。 Lc 字节包含数据部分的长度,而不是整个 APDU。我真的不知道你为什么还要在数据部分发送标题 - 这没有意义。您的响应符号也令​​人困惑:看起来 response 包含整个命令,但实际上没有。
    • 但是当我只给出 00 40 00 00 00 时,我得到了错误:当我尝试这个时,它给了我遇到的解析异常“;”在第 11 行错误,期待 integer_literal、character_literal、string_literal 之一。@vojta
    • 亲爱的 Vojta 和亲爱的 BzH 在他们的回答和 cmets 中提到,您应该:1- 选择您的小程序2- 发送 80 40 00 00 00到您的卡以接收您好作为回应。由于您使用的是 JCDK 模拟器,并且它基于在 apdu 命令末尾使用 0x7f 作为分隔符的旧智能卡读卡器,因此您必须在 SELECT 命令和 SHOW HELLO 命令的末尾添加此字节。所以你必须先发送00 a4 04 00 09 a0 00 00 00 62 03 01 08 01 7f 然后80 40 00 00 00 7f 才能收到Hello 回复。任何其他序列都是错误的(即使有预期的响应)
    • 由于您没有在小程序中限制 CLA 字节,00 40 00 00 00 7f 也适用于第二个命令。
    • 太好了,如果您可以将其添加为答案。我会赞成它。所有有价值的信息都应该作为答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多