42 lines
1.9 KiB
Java
42 lines
1.9 KiB
Java
package sega.a7;
|
|
|
|
import javacard.framework.Util;
|
|
import javacard.security.MessageDigest;
|
|
|
|
public class StorageWrite extends AuthCommand {
|
|
private static final short RECV_PACKET_SIZE = 0;
|
|
private static final byte AUTH_LEVEL = 2;
|
|
private static final short PARAM_SIZE = 46;
|
|
private static final short RECV_PACKET_EXCLUDING_DATA_SIZE = 50;
|
|
private static final short DATA_SIZE_OFFSET = 6;
|
|
private static final short WRITE_OFFSET_OFFSET = 8;
|
|
private static final short WRITE_DATA_OFFSET = 10;
|
|
|
|
public StorageWrite(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_paramsize = Util.getShort(data, (short) (dataOffset + 2));
|
|
short ramD_encDataSize = (short) (ramD_paramsize - RECV_PACKET_EXCLUDING_DATA_SIZE);
|
|
short ramD_wirteDataSize = Util.getShort(data, (short) (dataOffset + DATA_SIZE_OFFSET));
|
|
short ramD_bufferOffset = Util.getShort(data, (short) (dataOffset + WRITE_OFFSET_OFFSET));
|
|
byte[] ramD_newWriteData = this.m_ee_data.getGeneralBuffer_ramD();
|
|
|
|
if ((ramD_encDataSize % 16) != 0 || ramD_newWriteData.length < ramD_encDataSize
|
|
|| ramD_wirteDataSize == 0
|
|
|| ramD_wirteDataSize + ramD_bufferOffset > AppConfig.STORAGE_SIZE)
|
|
return AppConfig.A7_BAD_PARAMETER;
|
|
|
|
short ramD_decSize = decData(data, (short) (dataOffset + WRITE_DATA_OFFSET), ramD_encDataSize,
|
|
ramD_newWriteData, (short) 0);
|
|
if (ramD_wirteDataSize > ramD_decSize)
|
|
return AppConfig.A7_FAIL;
|
|
|
|
if (!this.m_ee_data.setStorageData_ee(ramD_newWriteData, (short) 0, ramD_wirteDataSize, ramD_bufferOffset))
|
|
return AppConfig.A7_EEP_WRITEFAIL;
|
|
return AppConfig.A7_SUCCESS;
|
|
}
|
|
}
|