61 lines
2.8 KiB
Java
61 lines
2.8 KiB
Java
package sega.a7;
|
|
|
|
import javacard.framework.JCSystem;
|
|
import javacard.framework.Util;
|
|
import javacard.security.MessageDigest;
|
|
|
|
public class MakePacket {
|
|
private byte[] m_ramD_buffer = JCSystem.makeTransientByteArray((short) 20, (byte) 1);
|
|
|
|
public boolean setData(byte[] kh, short khOffset, short khLength, short tag,
|
|
short paramSize, short result, short cmd, byte[] data, short dataOffset,
|
|
short dataLength, byte[] nonceEvent, short eventOffset, short eventLength, byte[] nonceOdd,
|
|
short oddOffset, short oddLength, byte[] packet, short packetOffset, short packetLength,
|
|
MessageDigest sha1, HmacSha1 hmacSha1) {
|
|
short ramD_offset = packetOffset;
|
|
|
|
if (packet == null || packetLength < paramSize)
|
|
return false;
|
|
|
|
if (tag != AppConfig.A7_TAG_RSP_COMMAND) {
|
|
if (tag == AppConfig.A7_TAG_RSP_AUTH_COMMAND || tag == AppConfig.A7_TAG_RSP_RSA_COMMAND) {
|
|
if (nonceEvent == null || nonceOdd == null || hmacSha1 == null)
|
|
return false;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
sha1.reset();
|
|
Util.setShort(packet, ramD_offset, tag);
|
|
ramD_offset = (short) (ramD_offset + 2);
|
|
Util.setShort(packet, ramD_offset, paramSize);
|
|
ramD_offset = (short) (ramD_offset + 2);
|
|
Util.setShort(packet, ramD_offset, result);
|
|
ramD_offset = (short) (ramD_offset + 2);
|
|
Util.setShort(this.m_ramD_buffer, (short) 0, cmd);
|
|
if (data == null) {
|
|
sha1.update(packet, packetOffset, (short) (ramD_offset - packetOffset));
|
|
sha1.doFinal(this.m_ramD_buffer, (short) 0, (short) 2, packet, ramD_offset);
|
|
} else {
|
|
sha1.update(packet, packetOffset, (short) (ramD_offset - packetOffset));
|
|
sha1.update(this.m_ramD_buffer, (short) 0, (short) 2);
|
|
Util.arrayCopyNonAtomic(data, dataOffset, packet, ramD_offset, dataLength);
|
|
ramD_offset = (short) (ramD_offset + dataLength);
|
|
sha1.doFinal(data, dataOffset, dataLength, packet, ramD_offset);
|
|
}
|
|
|
|
if (tag == AppConfig.A7_TAG_RSP_COMMAND)
|
|
return true;
|
|
|
|
Util.arrayCopyNonAtomic(packet, (short) ramD_offset, this.m_ramD_buffer, (short) 0, (short) 20);
|
|
Util.arrayCopyNonAtomic(nonceEvent, (short) eventOffset, packet, (short) ramD_offset, (short) eventLength);
|
|
ramD_offset = (short) ((short) ramD_offset + (short) eventLength);
|
|
hmacSha1.init(kh, (short) khOffset, (short) khLength);
|
|
hmacSha1.update(this.m_ramD_buffer, (short) 0, (short) 20);
|
|
hmacSha1.update(nonceEvent, (short) eventOffset, (short) eventLength);
|
|
hmacSha1.sign(nonceOdd, (short) oddOffset, (short) oddLength, packet, (short) ramD_offset);
|
|
return true;
|
|
}
|
|
}
|