我使用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
我的问题是,为什么我必须将命令中的数据设置为红色,因为数据的长度需要为红色
如何修复此错误?
您没有正确使用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);
}
首先,为什么要使用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上,则可以执行以下操作: 如果要使