a7firm/src/sega/a7/MakePacket.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;
}
}