package sega.a7; import javacard.framework.Util; import javacard.security.MessageDigest; public class GkeyEnc extends AuthCommand { private static final short RECV_PACKET_SIZE = 63; private static final byte AUTH_LEVEL = 2; private static final short PARAM_SIZE = 62; private static final short IV_INIT_OFFSET = 6; private static final short DATA_OFFSET = 7; private static final short DATA_SIZE = 16; public GkeyEnc(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) { byte ramD_ivInit = data[dataOffset + IV_INIT_OFFSET]; byte[] ramD_encData = this.m_ee_data.getGeneralBuffer_ramD(); boolean bInit = false; if (ramD_encData.length < 48) return AppConfig.A7_FAIL; short ramD_decSize = decData(data, (short) (dataOffset + DATA_OFFSET), DATA_SIZE, ramD_encData, (short) 0); if (16 > ramD_decSize) return AppConfig.A7_FAIL; if (1 == ramD_ivInit) bInit = true; encUpdate_GKey(ramD_encData, (short) 0, (short) 16, ramD_encData, (short) 16, bInit); short ramD_encSize = encData(ramD_encData, (short) 16, (short) 16, ramD_encData, (short) 32); if (16 != ramD_encSize) return AppConfig.A7_FAIL; this.m_ramD_outDataInfo[0] = 32; this.m_ramD_outDataInfo[1] = 16; Util.arrayCopyNonAtomic(ramD_encData, this.m_ramD_outDataInfo[0], this.m_ramD_outData, this.m_ramD_outDataInfo[0], this.m_ramD_outDataInfo[1]); return AppConfig.A7_SUCCESS; } }