如何在没有扩展apdu的情况下在卡中写入超过4K字节的二进制数据

时间:2016-08-28 04:57:36

标签: javacard

我的卡是gemalto v2.2.1,T = 0并且它不支持apdu链。 我看到样本他们正在使用ExtendedLength,但我的卡不受支持。 我写了一个代码,但我有问题。每个人都可以告诉我 我在哪里弄错了,或者请给我一个解决方案。

public class ap2 extends Applet {

private Object[] FileArray;

private ap2() {

// I want to save three binary data
    FileArray=new Object[3];

}

public static void install(byte bArray[], short bOffset, byte bLength)
        throws ISOException {
    new ap2().register();
}

public void process(APDU arg0) throws ISOException {
    // TODO Auto-generated method stub

}

private void ReadBinaryData(APDU apdu)
{

    short offset = getoffset_read(apdu);
    byte[] buf= apdu.getBuffer();

    //I send file index in p1 from host and get File Index in card
    byte p1value=buf[ISO7816.OFFSET_P1];

    byte[] FileObj=(byte[]) FileArray[p1value];

    short le = apdu.setOutgoing();

    if(le == 0 || le == 256) {
            le = (short)(FileObj.length - offset);
            if(le > 256) le = 256;
        }

    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 short getoffset_read(APDU apdu)
{
    ?????????????????

}



private void WriteBinaryData(APDU apdu)
{
  if(FileCount==3)
  {
      ISOException.throwIt(SW_END_OF_ThreeFILES);
  }
  byte[] buf = apdu.getBuffer();
  short offset = getoffset_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);


}

private short getoffset_write()
{
    ????????????????????
}

我不知道如何计算偏移量。

1 个答案:

答案 0 :(得分:0)

将偏移量编码为字节P1P2作为短值

short offset = Util.getShort(apdu.getBuffer(), ISO7816.OFFSET_P1);

您不应该按P1字节选择文件,而是在使用Select命令读取/写入数据之前选择它。请详细研究ISO7816-4,因为这将解决您的所有问题。