我想存储三张证书。
我有两个相关的问题:
Get_Offset_Read()
,Get_Offset_Write()
并计算缓冲区中的偏移量以便在缓冲区中进行写入和读取? ObjectArray
来存储证书数据。这是存储此类数据的正确方法吗?以下是代码:
public class writeApplet extends Applet {
private Object[] FileArray;
private byte FileCount;
private writeApplet() {
FileArray=new Object[3];
FileCount=0;
}
public static void install(byte bArray[], short bOffset, byte bLength)
throws ISOException {
new writeApplet().register();
}
public void process(APDU arg0) throws ISOException {
//….
}
private void ReadBinaryData(APDU apdu)
{
//How to write Get_Offset_Read();
short offset = Get_Offset_Read();
byte[] buf= apdu.getBuffer();
// p1value is certificate index in FileArray
byte p1value=buf[ISO7816.OFFSET_P1];
byte[] FileObj=(byte[]) FileArray[p1value];
short le = apdu.setOutgoing();
boolean eof = false;
if((short)(FileObj.length - offset) < le) {
le = (short)(FileObj.length - offset);
eof = true;
}
apdu.setOutgoingLength(le);
apdu.sendBytesLong(FileObj, offset, le);
if(eof)
{
ISOException.throwIt(SW_END_OF_FILE);
}
}
private void WriteBinaryData(APDU apdu)
{
if(FileCount==3)
{
ISOException.throwIt(SW_END_OF_ThreeFILES);
}
byte[] buf = apdu.getBuffer();
short offset =Get_Offset_Write();
byte lc=buf[ISO7816.OFFSET_LC];
if((short)(offset + lc) >((byte[])FileArray[FileCount]).length)
{
ISOException.throwIt(SW_WRONG_LENGTH);
}
apdu.setIncomingAndReceive();
Util.arrayCopyNonAtomic(buf, ISO7816.OFFSET_CDATA,(byte[]);
FileArray[FileCount],offset,lc);
FileCount++;
}
}
答案 0 :(得分:1)
将持久化数组存储在对象数组中的想法当然没有错。所以这个答案的其余部分将集中在偏移问题上。
通常,文件操作是遵循ISO 7816-4规范实现的。
在这种情况下,您至少要创建三种方法,而不是两种方法:
CREATE FILE
- 创建一个文件(特定大小)UPDATE BINARY
- 使用P1 / P2 READ BINARY
- 使用P1 / P2中的偏移量读取(部分)文件指示的偏移量当然是文件中的偏移量,而不是缓冲区中的偏移量。
我会使用Odd INS跳过UPDATE BINARY
和READ BINARY
,因为通常只有超过32KiB的文件才需要它们。
如果要保留当前的设计,则可以将偏移量存储在命令数据(CDATA)部分中。或者,您可以将文件写入特定大小的块中,并在P2中指示块编号。
在我看来,应首选添加CREATE FILE命令。目前,用于读取和创建/写入文件的方法不是对称的。