a7firm/src/sega/a7/AuthStart.java

73 lines
3.3 KiB
Java

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