/*
* passportapplet - A reference implementation of the MRTD standards.
*
* Copyright (C) 2006 SoS group, Radboud University
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* $Id: FileSystem.java 915 2009-03-24 15:25:42Z woj76 $
*/
package sos.passportapplet;
import javacard.framework.ISO7816;
import javacard.framework.ISOException;
import javacard.framework.Util;
/**
* FileSystem.
*
* @author Martijn Oostdijk (martijno@cs.ru.nl)
* @author Cees-Bart Breunesse (ceesb@cs.ru.nl)
*
* @version $Revision: 915 $
*/
public class FileSystem {
static final short EF_DG1_FID = (short) 0x0101;
static final short EF_DG2_FID = (short) 0x0102;
static final short EF_DG3_FID = (short) 0x0103;
static final short EF_DG4_FID = (short) 0x0104;
static final short EF_DG5_FID = (short) 0x0105;
static final short EF_DG6_FID = (short) 0x0106;
static final short EF_DG7_FID = (short) 0x0107;
static final short EF_DG8_FID = (short) 0x0108;
static final short EF_DG9_FID = (short) 0x0109;
static final short EF_DG10_FID = (short) 0x010A;
static final short EF_DG11_FID = (short) 0x010B;
static final short EF_DG12_FID = (short) 0x010C;
static final short EF_DG13_FID = (short) 0x010D;
static final short EF_DG14_FID = (short) 0x010E;
static final short EF_DG15_FID = (short) 0x010F;
static final short EF_SOD_FID = (short) 0x011D;
static final short EF_COM_FID = (short) 0x011E;
static final short EF_CVCA_FID = (short) 0x011C;
static final short SOS_LOG_FID = (short) 0xdead;
private static final short EF_DG1_INDEX = (short) 0;
private static final short EF_DG2_INDEX = (short) 1;
private static final short EF_DG3_INDEX = (short) 2;
private static final short EF_DG4_INDEX = (short) 3;
private static final short EF_DG5_INDEX = (short) 4;
private static final short EF_DG6_INDEX = (short) 5;
private static final short EF_DG7_INDEX = (short) 6;
private static final short EF_DG8_INDEX = (short) 7;
private static final short EF_DG9_INDEX = (short) 8;
private static final short EF_DG10_INDEX = (short) 9;
private static final short EF_DG11_INDEX = (short) 10;
private static final short EF_DG12_INDEX = (short) 11;
private static final short EF_DG13_INDEX = (short) 12;
private static final short EF_DG14_INDEX = (short) 13;
private static final short EF_DG15_INDEX = (short) 14;
private static final short EF_SOD_INDEX = (short) 15;
private static final short EF_COM_INDEX = (short) 16;
private static final short EF_CVCA_INDEX = (short) 17;
private static final short SOS_LOG_INDEX = (short) 18;
private Object[] files;
private short[] fileSizes;
public FileSystem() {
short size = (short) (SOS_LOG_INDEX + 1);
files = new Object[size];
fileSizes = new short[size];
}
public void createFile(short fid, short size) {
createFile(fid, size, null);
}
public void createFile(short fid, short size, CVCertificate certObject) {
short idx = getFileIndex(fid);
// first create determines maximum file size
if (files[idx] == null)
files[idx] = new byte[size];
if (certObject != null) {
certObject.cvcaFileReference = (byte[]) files[idx];
}
if (((byte[]) files[idx]).length < size)
ISOException.throwIt(ISO7816.SW_FILE_FULL);
fileSizes[idx] = size;
}
public void writeData(short fid, short file_offset, byte[] data,
short data_offset, short length) {
byte[] file = getFile(fid);
short fileSize = getFileSize(fid);
if (file == null) {
ISOException.throwIt(ISO7816.SW_FILE_NOT_FOUND);
}
if (fileSize < (short) (file_offset + length))
ISOException.throwIt(ISO7816.SW_FILE_FULL);
Util.arrayCopy(data, data_offset, getFile(fid), file_offset, length);
}
public byte[] getFile(short fid) {
short idx = getFileIndex(fid);
if (idx == -1) {
return null;
}
return (byte[]) files[idx];
}
public short getFileSize(short fid) {
short idx = getFileIndex(fid);
if (idx == -1) {
return -1;
}
return fileSizes[idx];
}
private static short getFileIndex(short fid) throws ISOException {
if ((fid == EF_DG3_FID && !PassportApplet.certificate.isDG3Accessible())
|| (fid == EF_DG4_FID && !PassportApplet.certificate
.isDG4Accessible())) {
ISOException
.throwIt(PassportApplet.SW_SECURITY_STATUS_NOT_SATISFIED);
}
switch (fid) {
case EF_DG1_FID:
return EF_DG1_INDEX;
case EF_DG2_FID:
return EF_DG2_INDEX;
case EF_DG3_FID:
return EF_DG3_INDEX;
case EF_DG4_FID:
return EF_DG4_INDEX;
case EF_DG5_FID:
return EF_DG5_INDEX;
case EF_DG6_FID:
return EF_DG6_INDEX;
case EF_DG7_FID:
return EF_DG7_INDEX;
case EF_DG8_FID:
return EF_DG8_INDEX;
case EF_DG9_FID:
return EF_DG9_INDEX;
case EF_DG10_FID:
return EF_DG10_INDEX;
case EF_DG11_FID:
return EF_DG11_INDEX;
case EF_DG12_FID:
return EF_DG12_INDEX;
case EF_DG13_FID:
return EF_DG13_INDEX;
case EF_DG14_FID:
return EF_DG14_INDEX;
case EF_DG15_FID:
return EF_DG15_INDEX;
case EF_SOD_FID:
return EF_SOD_INDEX;
case EF_COM_FID:
return EF_COM_INDEX;
case EF_CVCA_FID:
return EF_CVCA_INDEX;
case SOS_LOG_FID:
return SOS_LOG_INDEX;
default:
return -1;
}
}
}