73 lines
3.3 KiB
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;
|
|
}
|
|
}
|