a7firm/src/sega/a7/StorageRead.java

39 lines
1.9 KiB
Java

package sega.a7;
import javacard.framework.Util;
import javacard.security.MessageDigest;
public class StorageRead extends AuthCommand {
private static final short RECV_PACKET_SIZE = 50;
private static final byte AUTH_LEVEL = 2;
private static final short PARAM_SIZE = 46;
private static final short READ_OFFSET_OFFSET = 6;
private static final short DATA_SIZE_OFFSET = 8;
public StorageRead(short cmd, AppData data, MakePacket packet, MessageDigest sha1, HmacSha1 hmacSha1, Crypt crypt) {
super(cmd, RECV_PACKET_SIZE, PARAM_SIZE, AUTH_LEVEL, data, packet, sha1, hmacSha1, crypt);
}
public short core(byte[] data, short dataOffset, short dataLength) {
short ramD_readSize = Util.getShort(data, (short) (dataOffset + DATA_SIZE_OFFSET));
if ((ramD_readSize % 16) != 0)
ramD_readSize = (short) (ramD_readSize + (short) (16 - (short) (ramD_readSize % 16)));
short ramD_bufferOffset = (short) Util.getShort(data, (short) (dataOffset + READ_OFFSET_OFFSET));
byte[] ee_storageData = this.m_ee_data.getStorageData_ee();
byte[] ramD_encStorageData = this.m_ee_data.getGeneralBuffer_ramD();
if (ramD_encStorageData.length < ramD_readSize || 192 < ramD_readSize || ramD_readSize == 0
|| AppConfig.STORAGE_SIZE < (short) (ramD_readSize + ramD_bufferOffset))
return AppConfig.A7_BAD_PARAMETER;
short ramD_encSize = encData(ee_storageData, ramD_bufferOffset, ramD_readSize, ramD_encStorageData, (short) 0);
if (ramD_readSize > ramD_encSize)
return AppConfig.A7_FAIL;
this.m_ramD_outDataInfo[0] = 0;
this.m_ramD_outDataInfo[1] = ramD_encSize;
Util.arrayCopyNonAtomic(ramD_encStorageData, this.m_ramD_outDataInfo[0], this.m_ramD_outData,
this.m_ramD_outDataInfo[0], this.m_ramD_outDataInfo[1]);
setSendPacketSize_ramD((short) (46 + ramD_readSize));
return AppConfig.A7_SUCCESS;
}
}