2017-06-01 5 views
3

Ich habe eine Smartcard-Anwendung erstellt, wo ich Daten bis zu 60 KB in einem Byte-Array speichern kann. Aber wenn ich das Array mehrere Male lese, bekomme ich einen Fehler und ich kann nicht mehr auf die Daten zugreifen.Java-Karte Lesen von Daten aus Array

-Code erstellen Array:

public void createFile(short fileID, short fileSize) { 
    short index = getFileIndex(fileID); 

    if(listFiles[index] == null) { 
     listFiles[index] = new byte[fileSize]; 
    } 

    listfileSizes[index] = fileSize; 
} 

-Code Daten lesen:

public byte[] readDataFromFile(short fileID, short fileOffset, short length) { 

    short selFileSize = getFileSize(fileID); 
    byte[] data = new byte[length]; 

    if (selFileSize < (short)(fileOffset + length)) { 
     ISOException.throwIt(ISO7816.SW_FILE_FULL); 
    } 

    Util.arrayCopy(getFile(fileID), fileOffset, data, (short)0, length); 

    return (byte[])data; 
} 

-Code Zugriff lesen:

short data_length = Util.getShort(buf, (short)(offset_cdata + 2)); 
    short file_offset = Util.getShort(buf, offset_cdata); 

    if(p2 == (byte)0x01) { 

     Util.arrayCopy(myfile.readDataFromFile(myfile.keepassData1, file_offset, data_length), (short)0, buf, (short)0, data_length); 

    } else if (p2 == (byte)0x02) { 

     Util.arrayCopy(myfile.readDataFromFile(myfile.keepassData2, file_offset, data_length), (short)0, buf, (short)0, data_length); 

    } 

wenn ich die App neu installieren kann ich lesen und schreiben, aber nur einige Zeit, bis die Daten blockiert sind. Ich bekomme den Fehler 6f00.

Antwort

4

Ihr Applet ist läuft aus dem persistenten Speicher, daher der Fehler.

Diese Linie

byte[] data = new byte[length]; 

weist einen neuen persistenten Byte-Array jedes Mal, wenn die Methode aufgerufen wird! Dieses Objekt wird niemals freigegeben, da Java Card keinen automatischen Garbage Collector unterstützt.

Sie sollten die Daten direkt in den APDU-Puffer kopieren:

private final byte[] readDataFromFile(short fileID, short fileOffset, short length, byte[] outBuffer, short outOffset) { 
    final short selFileSize = getFileSize(fileID); 
    if (selFileSize < (short)(fileOffset + length)) { 
     ISOException.throwIt(ISO7816.SW_FILE_FULL); 
    } 
    Util.arrayCopyNonAtomic(getFile(fileID), fileOffset, outBuffer, outOffset, length); 
} 
+0

Ok Thanky ich werde es versuchen – schisskiss