当前位置: 首页 > 知识库问答 >
问题:

APDU读文件java卡程序

楮乐邦
2023-03-14

我使用netbeans制作了java card classic小程序

当我编程读取操作时,我检查APDU中的第一个字节是否为0x80,然后第二个字节是否为0xB0,然后从字节2和3中读取文件中的偏移量,然后从字节4中读取字节数

作为默认的APDU

0x80 0xB0 0x00 0x03 0x60从当前文件中读取60个字节,从偏移量3开始

当我尝试这个命令时,它返回错误Input data length!=第12行附近的Lc

经过一番努力,我发现了问题

问题是编译器假定字节4是数据的长度,所以在我的命令中,他等待60个字节

当我搜索时,我发现字节4并不意味着当INS=B0

我不知道为什么会这样,当我试图调试编译器时,甚至没有进入进程函数。

我的脚本文件是

0x00 0xA4 0x04 0x00 0X06 0X87 0XF1 0X3F 0X5E 0X22 0X47 0x7F;
0x80 0xA4 0x00 0x00 0x02 0x3F 0x00 0x7F;
0x80 0xA4 0x00 0x00 0x02 0x50 0x15 0x7F;
0x80 0xA4 0x00 0x00 0x02 0x53 0x00 0x7F;
0x80 0xA4 0x00 0x00 0x02 0x50 0x31 0x7F;
0x80 0xB0 0x00 0x00 0x33 0x7F ; 
powerdown;

读取功能是

 void read(APDU apdu)
    {
        if(current.isDF())//can not read DF file
        {
            ISOException.throwIt((short)27014);
        }
        EFile f = (EFile)current;
       byte[]data=apdu.getBuffer();
        short offset = Util.getShort(data, (short)2);
        if(offset < 0 || offset > f.length)//can not read
        {
            ISOException.throwIt((short)27270);
        }
        data=apdu.getBuffer();
        short len = (short)(data[4]&0xFF);
       if(offset + len > f.length)//can not read 
       {
            ISOException.throwIt((short)26368);
       }
        apdu.setOutgoing();
        apdu.setOutgoingLength(len);
        apdu.sendBytesLong(f.data, (short)(f.offset + offset),len);//return the data

    }

首先选择程序,然后选择文件,然后尝试读取无效数据

但是如果我做了0x80 0xB0 0x00 0x00 0x02 0x00 0x00它会从偏移量0读取2个字节的写操作,尽管即使在标准中也没有使用最终的0x00 0x00

我的问题是,为什么我必须将命令中的数据设置为红色,因为数据的长度需要为红色

如何修复此错误?

共有2个答案

沙宣
2023-03-14

您没有正确使用Java卡应用编程接口。下面我添加了一段代码,这是我从头顶键入的。如果代码不运行,请尝试并编辑它。

void read() {
    final APDU apdu = APDU.getCurrentAPDU();
    final byte[] buf = apdu.getBuffer();

    if(current.isDF()) {
        ISOException.throwIt(ISO7816.SW_COMMAND_NOT_ALLOWED);
    }

    final EFile file = (EFile) current;

    final short fileOffset = Util.getShort(buf, ISO7816.OFFSET_P1);
    if (fileOffset < 0 || fileOffset >= file.length) {
        ISOException.throwIt(ISO7816.SW_INCORRECT_P1P2);
    }

    // Ne (encoded by Le) is the *maximum* size of the response data 
    final short ne = apdu.setOutgoing();            

    // Re is the actual number of the bytes to be returned
    final short fileDataLeft = file.length - fileOffset;
    final short re = ne < fileDataLeft ? ne : fileDataLeft;

    apdu.setOutgoingLength(re);
    apdu.sendBytes(file.data, fileOffset, re);
}
慕阳文
2023-03-14

首先,为什么要使用0x80作为CLS字节?实际上,0x80是为全局平台命令保留的。如果您的卡是2G,则应使用0xA0,如果您的卡是3G,则最好使用0x0x(通道0通常为0x00)。第二个读取的二进制APDU为OUT APDU,这意味着P3指定了预期的数据长度,即:

0x00 0xB0 P1 P2 P3

其中:P1编码:

|   b8   |   B7   |   b6   |   b5   |   b4   |   b3   |   b2   |   b1   |   Meaning
----------------------------------------------------------------------------------------------------------------------
|   0    |   X    |   X    |   X    |   X    |   X    |   X    |   X    | b7-b1 is the offset to the first byte 
|        |        |        |        |        |        |        |        | to read – P2 is the low part of the offset
----------------------------------------------------------------------------------------------------------------------
|   1    |   0    |   0    |   X    |   X    |   X    |   X    |   X    | SFI referencing used,  b1-b5 are the SFI 
|        |        |        |        |        |        |        |        | and P2 is the offset to the first byte to read

P2-是偏移量

P3-是预期长度,您不应在之后指定任何其他字节。如果P3等于0,则将传输256字节的数据

有关所有详细信息,请查看标准ETSI TS 102 221(http://pda.etsi.org/pda/home.asp?wki_id=, m5nDbNrlEWZbXcW5h86B)-您不需要帐户,只需输入电子邮件地址,您就可以下载它。

希望会有帮助。

KR,-Nodir

 类似资料:
  • 我使用ACR122U-A9读取智能卡,通过以下APDU,我可以获取UID和ATS: 使用NXP TagInfo应用程序(android),我可以看到一个包含我所需数据的十六进制表。使用什么APDU命令可以检索这些数据? 六边形表如下所示: [0000]中是我想要检索的数据。

  • 我正在尝试将小程序(.cap文件)安装到智能卡中。我读到可以使用APDU完成。我使用Netbeans创建了我的小程序,它的助手是//aid/9AE9BE4D27/53。 首先构建apdu,选择安装程序小程序: ; 然后构建将创建我的小程序的apdu(遵循此结构): 我开发了一个应用程序,可以使用。我想如果我发送正确的安装命令,我的。cap文件应安装在卡中。 有了这些信息,谁能帮我建立正确的apdu

  • 问题内容: 我已经编写了一个applet,并将其安装在智能卡中。但是我不知道如何在智能卡上读写数据? 从智能卡读取数据是否正确? 请告诉我如何使用javacard将数据写入智能卡。 问题答案: 我找到了解决方案。实际上我正在使用eclipse,因为其中安装了编辑器java卡插件。当我在智能卡上运行程序时,每次都会在以前的applet上安装最新的applet。要查看结果,我们可以使用pyapdu工具

  • 我有一本书。CAP文件(applet),我想把它安装到我的java卡上。我知道我可以使用GPShell或apdutool(来自JCDK)这样的工具来实现这一点,但我想自己复制安装过程。 令人困惑的是,在GP标准中,安装过程是:APDU命令INSTALL[for load]后跟多个load命令,后跟INSTALL[for INSTALL]命令。 而oracle留档为安装. CAP文件提出了不同的AP

  • 我可以毫无问题地从智能卡发送大部分数据。我注意到由于某种原因,我总是需要删除APDU中的前6个字节才能获得真正的数据。 然而,当发送一个特定的数据时,很难知道数据在APDU中的位置。 这是Java智能卡模拟器的代码: 预计发送/接收的数据为: {0x2} 但是,在中间件APDU中接收到的数据响应是: 响应Apdu.get数据(): {0x80,0x32,0x0,0x0,0x8,0x0,0x0,0x

  • 问题内容: 我正在寻找一种简单的方法来获取位于远程服务器上的文件。为此,我在Windows XP上创建了本地ftp服务器,现在我想为测试Applet提供以下地址: 当然,我会收到以下错误: URI方案不是“文件” 我一直在尝试其他方法来获取文件,但它们似乎没有用。我该怎么办?(我也很想执行HTTP请求) 问题答案: 您不能使用ftp开箱即用。 如果文件位于http上,则可以执行以下操作: 如果要使