package sega.a7; import javacard.framework.Util; import javacard.security.MessageDigest; public class AuthStart extends AuthCommand { private static final short RECV_PACKET_SIZE = 302; private static final byte AUTH_LEVEL = 1; private static final byte SET_AUTH_LEVEL = 2; private static final short PARAM_SIZE = 46; public AuthStart(short cmd, AppData data, MakePacket packet, MessageDigest sha1, HmacSha1 hmacSha1, Crypt crypt) { super(cmd, RECV_PACKET_SIZE, (short) 2, AUTH_LEVEL, data, packet, sha1, hmacSha1, crypt); } public short execute(byte[] data, short dataOffset, short dataLength, byte[] dst, short dstOffset, short dstLength) { short dataSize = 256; if (this.m_ee_data.getSession_ramD() != 1) return makeErrorPacket(AppConfig.A7_INVALID_AUTH, dst, dstOffset, dstLength); if (this.m_ee_data.getLevel_ramD() != SET_AUTH_LEVEL) return makeErrorPacket(AppConfig.A7_LV_ERROR, dst, dstOffset, dstLength); short error = checkHeader(data, dataOffset, dataLength); if (error != AppConfig.A7_SUCCESS) return makeErrorPacket(error, dst, dstOffset, dstLength); byte[] newData = this.m_ee_data.getGeneralBuffer_ramD(); if (dataSize > newData.length) return makeErrorPacket(AppConfig.A7_FAIL, dst, dstOffset, dstLength); short decSize = 0; try { decSize = rsaDecData(data, (short) (6 + dataOffset), dataSize, newData, (short) 0); } catch (Exception e) { return makeErrorPacket(AppConfig.A7_AUTHFAIL, dst, dstOffset, dstLength); } if (decSize < 52) return makeErrorPacket(AppConfig.A7_AUTHFAIL, dst, dstOffset, dstLength); boolean bRet = this.m_ee_data.setKh_ramD(newData, (short) 32, (short) 20); if (!bRet) return makeErrorPacket(AppConfig.A7_FAIL, dst, dstOffset, dstLength); error = checkFooter(data, dataOffset, dataLength); if (error != AppConfig.A7_SUCCESS) return makeErrorPacket(error, dst, dstOffset, dstLength); bRet = changeConnectionKey_ee(newData, (short) 0, AppConfig.AES_KEY_SIZE, newData, AppConfig.AES_KEY_SIZE, AppConfig.AES_IV_SIZE); if (!bRet) return makeErrorPacket(AppConfig.A7_FAIL, dst, dstOffset, dstLength); byte[] nonceOdd = this.m_ee_data.getNonceOddBuffer_ramD(); Util.arrayCopyNonAtomic(data, (short) (262 + dataOffset), nonceOdd, (short) 0, (short) 20); this.m_ee_data.setLevel_ramD((byte) 2); return makeSendAuthPacket(AppConfig.A7_TAG_RSP_RSA_COMMAND, PARAM_SIZE, (short) 0, null, (short) 0, (short) 0, data, (short) (262 + dataOffset), (short) 20, dst, dstOffset, dstLength); } protected short checkHeader(byte[] data, short dataOffset, short dataLength) { if (dataLength != this.m_ee_recvPacketSize) return AppConfig.A7_BAD_DATASIZE; short tag = Util.getShort(data, (short) (dataOffset + 0)); if (tag != AppConfig.A7_TAG_RQU_RSA_COMMAND) return AppConfig.A7_BAD_TAG; short paramsize = Util.getShort(data, (short) (dataOffset + 2)); if (paramsize != this.m_ee_recvPacketSize) return AppConfig.A7_BAD_DATASIZE; return AppConfig.A7_SUCCESS; } }