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