From 6bd0429935a42d1e351819424da58d95e9aff667 Mon Sep 17 00:00:00 2001 From: Till Neunast Date: Sun, 3 Mar 2024 14:12:31 +1300 Subject: [PATCH] Fix handling of packed MAC --- .../co/breakpoint/jmeter/iso8583/ISO8583Crypto.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/nz/co/breakpoint/jmeter/iso8583/ISO8583Crypto.java b/src/main/java/nz/co/breakpoint/jmeter/iso8583/ISO8583Crypto.java index badfa47..5f3b6a2 100644 --- a/src/main/java/nz/co/breakpoint/jmeter/iso8583/ISO8583Crypto.java +++ b/src/main/java/nz/co/breakpoint/jmeter/iso8583/ISO8583Crypto.java @@ -103,13 +103,20 @@ protected void calculateMAC(ISO8583Sampler sampler) { int macField = (fixedMacField != null && !fixedMacField.isEmpty()) ? Integer.parseInt(fixedMacField) : ((msg.getMaxField() - 1)/MAC_FIELD_NO + 1)*MAC_FIELD_NO; // round up to the next multiple of 64 - int macLength = ((ISOBasePackager)msg.getPackager()).getFieldPackager(macField).getLength(); + ISOFieldPackager fp = ((ISOBasePackager)msg.getPackager()).getFieldPackager(macField); + if (!(fp instanceof ISOBinaryFieldPackager)) { + log.error("MAC cannot be packed into non-binary field "+fp.getClass()); + return; + } + int macLength = fp.getLength(); + int packedLength = fp.getMaxPackedLength(); + final String dummyMac = String.format("%0" + 2*macLength + "d", 0); msg.set(macField, dummyMac); try { byte[] packedMsg = msg.pack(); // cut off MAC bytes and don't include them in calculation: - String mac = securityModule.generateMAC(Arrays.copyOf(packedMsg, packedMsg.length-macLength), + String mac = securityModule.generateMAC(Arrays.copyOf(packedMsg, packedMsg.length-packedLength), macKey, macAlgorithm); sampler.addField(String.valueOf(macField), ISOUtil.padright(mac, 2*macLength, 'f')); } catch (ISOException e) {