a7firm/src/sega/a7/GkeyEnc.java

45 lines
1.8 KiB
Java

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;
}
}