package sega.a7; import javacard.framework.Util; import javacard.security.MessageDigest; import javacard.security.RandomData; public class StorageSizeGet extends AuthCommand { private static final short RECV_PACKET_SIZE = 46; private static final byte AUTH_LEVEL = 2; private static final short PARAM_SIZE = 62; private static final short STORAGE_SIZE_VALUE_SIZE = 2; private static final short RANDOM_VALUE_SIZE = 14; private static final short ENC_DATA_SIZE = 16; private RandomData m_ee_rand; public StorageSizeGet(short cmd, AppData data, MakePacket packet, MessageDigest sha1, HmacSha1 hmacSha1, Crypt crypt, RandomData rand) { super(cmd, RECV_PACKET_SIZE, PARAM_SIZE, AUTH_LEVEL, data, packet, sha1, hmacSha1, crypt); this.m_ee_rand = rand; } public short core(byte[] data, short dataOffset, short dataLength) { byte[] ramD_storageSize = this.m_ee_data.getGeneralBuffer_ramD(); if (ramD_storageSize.length < (short) (STORAGE_SIZE_VALUE_SIZE + RANDOM_VALUE_SIZE + ENC_DATA_SIZE)) return AppConfig.A7_FAIL; this.m_ee_rand.generateData(ramD_storageSize, (short) 0, (short) (STORAGE_SIZE_VALUE_SIZE + RANDOM_VALUE_SIZE)); Util.setShort(ramD_storageSize, (short) 0, AppConfig.STORAGE_SIZE); short ramD_encSize = encData(ramD_storageSize, (short) 0, ENC_DATA_SIZE, ramD_storageSize, (short) (STORAGE_SIZE_VALUE_SIZE + RANDOM_VALUE_SIZE)); if (ramD_encSize != ENC_DATA_SIZE) return AppConfig.A7_FAIL; this.m_ramD_outDataInfo[0] = (short) (STORAGE_SIZE_VALUE_SIZE + RANDOM_VALUE_SIZE); this.m_ramD_outDataInfo[1] = ramD_encSize; Util.arrayCopyNonAtomic(ramD_storageSize, this.m_ramD_outDataInfo[0], this.m_ramD_outData, this.m_ramD_outDataInfo[0], this.m_ramD_outDataInfo[1]); return AppConfig.A7_SUCCESS; } }