/** * Read length bytes and return the int value * @param buffer buffer * @return value length */ protected int getValueLength(ByteBuffer buffer) { byte b = buffer.get(); int count = b & 0x7f; // check first byte for more bytes to follow if ((b & 0x80) == 0 || count == 0) return count; //fetch rest of bytes byte[] bb = new byte[count]; buffer.get(bb); //adjust buffer if first bit is turn on //important for BigInteger reprsentation if ( (bb[0] & 0x80) > 0 ) bb = ISOUtil.concat(new byte[1], bb); return new BigInteger(bb).intValue(); }
byte[] getDataNoPad() { byte[] data = new byte[0]; data = ISOUtil.concat(data, dm.get("AMMOUNT") ); data = ISOUtil.concat(data, dm.get("AMMOUNT_OTHER") ); data = ISOUtil.concat(data, dm.get("TERMINAL_COUNTRY") ); data = ISOUtil.concat(data, dm.get("TVR") ); data = ISOUtil.concat(data, dm.get("TERMINAL_CURRENCY") ); data = ISOUtil.concat(data, dm.get("TXN_DATE") ); data = ISOUtil.concat(data, dm.get("TXN_TYPE") ); data = ISOUtil.concat(data, dm.get("UPN") ); data = ISOUtil.concat(data, dm.get("AIP") ); data = ISOUtil.concat(data, dm.get("ATC") ); data = ISOUtil.concat(data, dm.get("CVR") ); return data; }
@Test(expected = NegativeArraySizeException.class) public void testConcatThrowsNegativeArraySizeException() throws Throwable { byte[] array1 = new byte[0]; byte[] array2 = new byte[1]; ISOUtil.concat(array1, 100, 0, array2, 1000, -1); }
@Test(expected = NullPointerException.class) public void testConcatThrowsNullPointerException1() throws Throwable { byte[] array2 = new byte[3]; ISOUtil.concat(null, array2); }
@Test public void testGenerateSM_MACImpl3() throws Throwable { String accountNo = accountNoA; String accntSeqNo = accountNoA_CSN; byte[] apdu = apdu01; byte[] atc = atc01; byte[] arqc = arqc01; byte[] data = ISOUtil.hex2byte("1122334455667788"); apdu = ISOUtil.concat(apdu, atc); apdu = ISOUtil.concat(apdu, arqc); apdu = ISOUtil.concat(apdu, data); byte[] result = jcesecmod.generateSM_MAC(MKDMethod.OPTION_A, SKDMethod.VSDC ,imksmi, accountNo, accntSeqNo, atc, arqc, apdu); assertArrayEquals(ISOUtil.hex2byte("E218CC0B7FEC6876"), result); }
@Test public void testGenerateSM_MACImpl2() throws Throwable { String accountNo = accountNoA; String accntSeqNo = accountNoA_CSN; byte[] apdu = apdu01; byte[] atc = atc01; byte[] arqc = arqc01; byte[] data = ISOUtil.hex2byte("11"); apdu = ISOUtil.concat(apdu, atc); apdu = ISOUtil.concat(apdu, arqc); apdu = ISOUtil.concat(apdu, data); byte[] result = jcesecmod.generateSM_MAC(MKDMethod.OPTION_A, SKDMethod.MCHIP ,imksmi, accountNo, accntSeqNo, atc, arqc, apdu); assertArrayEquals(ISOUtil.hex2byte("5E14A5A5C4B98C0C"), result); }
@Test(expected = NullPointerException.class) public void testConcatThrowsNullPointerException() throws Throwable { ISOUtil.concat(null, 100, 1000, ISOUtil.asciiToEbcdic("testISOUtils"), 0, -1); }
@Test public void testConcat1() throws Throwable { byte[] array2 = new byte[3]; byte[] array1 = new byte[3]; byte[] result = ISOUtil.concat(array1, 0, 0, array2, 1, 0); assertEquals("result.length", 0, result.length); }
@Test public void testGenerateSM_MACImpl1() throws Throwable { String accountNo = accountNoA; String accntSeqNo = accountNoA_CSN; byte[] apdu = apdu01; byte[] atc = atc01; byte[] arqc = arqc01; byte[] data = ISOUtil.hex2byte("1122334455667788"); apdu = ISOUtil.concat(apdu, atc); apdu = ISOUtil.concat(apdu, arqc); apdu = ISOUtil.concat(apdu, data); byte[] result = jcesecmod.generateSM_MAC(MKDMethod.OPTION_A, SKDMethod.MCHIP ,imksmi, accountNo, accntSeqNo, atc, arqc, apdu); assertArrayEquals(ISOUtil.hex2byte("217CF53EA0E7C327"), result); }
@Test public void testGenerateSM_MACImpl4() throws Throwable { String accountNo = accountNoA; String accntSeqNo = accountNoA_CSN; byte[] apdu = apdu01; byte[] atc = atc01; byte[] arqc = arqc01; byte[] data = ISOUtil.hex2byte("11"); apdu = ISOUtil.concat(apdu, atc); apdu = ISOUtil.concat(apdu, arqc); apdu = ISOUtil.concat(apdu, data); byte[] result = jcesecmod.generateSM_MAC(MKDMethod.OPTION_A, SKDMethod.VSDC ,imksmi, accountNo, accntSeqNo, atc, arqc, apdu); assertArrayEquals(ISOUtil.hex2byte("C1F2C04136BD48E6"), result); }
@Test public void testConcat3() throws Throwable { byte[] array2 = new byte[0]; byte[] array1 = new byte[0]; byte[] result = ISOUtil.concat(array1, array2); assertEquals("result.length", 0, result.length); }
private Key concatKeys(SecureDESKey keyA, SecureDESKey keyB) throws SMException { if ( keyA!=null && keyA.getKeyLength()==SMAdapter.LENGTH_DES && keyB!=null && keyB.getKeyLength()==SMAdapter.LENGTH_DES) { Key cvkAclear = decryptFromLMK(keyA); Key cvkBclear = decryptFromLMK(keyB); return jceHandler.formDESKey(SMAdapter.LENGTH_DES3_2KEY ,ISOUtil.concat(cvkAclear.getEncoded(), cvkBclear.getEncoded())); } if (keyA!=null && keyA.getKeyLength()!=SMAdapter.LENGTH_DES) return decryptFromLMK(keyA); if (keyB!=null && keyB.getKeyLength()!=SMAdapter.LENGTH_DES) return decryptFromLMK(keyB); return null; }
@Test public void testConcat2() throws Throwable { byte[] array1 = new byte[1]; byte[] array2 = new byte[3]; byte[] result = ISOUtil.concat(array1, array2); assertEquals("result.length", 4, result.length); assertEquals("result[0]", (byte) 0, result[0]); }
@Test public void testConcat() throws Throwable { byte[] array1 = new byte[3]; byte[] result = ISOUtil.concat(array1, 0, 1, ISOUtil.asciiToEbcdic("testISOUtils"), 10, 0); assertEquals("result.length", 1, result.length); assertEquals("result[0]", (byte) 0, result[0]); }
@Test public void testPackBinaryNoPadding() throws Throwable { Element schema = createSchema(); appendField(schema, "name", "B", null, 14); FSDMsg fSDMsg = new FSDMsg(SCHEMA_PREFIX); byte[] expected = "Test message".getBytes(); expected = ISOUtil.concat(new byte[2], expected); fSDMsg.set("name", ISOUtil.hexString("Test message".getBytes())); byte[] b = fSDMsg.packToBytes(); assertArrayEquals("FSDMsg.packToBytes() can't padd binary fields", expected, b); }
@Test public void testTranslatePINGenerateSM_MACImpl1() throws Throwable { String accountNo = accountNoA; String accntSeqNo = accountNoA_CSN; byte[] apdu = apdu01; byte[] atc = atc01; byte[] arqc = arqc01; EncryptedPIN pin = pinUnderZPK; apdu = ISOUtil.concat(apdu, atc); apdu = ISOUtil.concat(apdu, arqc); EncryptedPIN expectdPIN = new EncryptedPIN("F473D25D9B478970", SMAdapter.FORMAT34, accountNo); Pair<EncryptedPIN, byte[]> result = jcesecmod.translatePINGenerateSM_MAC( MKDMethod.OPTION_A, SKDMethod.MCHIP, null ,imksmi, accountNo, accntSeqNo, atc, arqc, apdu ,null, pin, zpk, imksmc, null, SMAdapter.FORMAT34); assertArrayEquals(expectdPIN.getPINBlock(), result.getValue0().getPINBlock()); assertArrayEquals(ISOUtil.hex2byte("831B043B4A314FD2"), result.getValue1()); }
@Test public void testTranslatePINGenerateSM_MACImpl3() throws Throwable { String accountNo = accountNoA; String accntSeqNo = accountNoA_CSN; byte[] apdu = apdu01; byte[] atc = atc01; byte[] arqc = arqc01; EncryptedPIN pin = pinUnderZPK; apdu = ISOUtil.concat(apdu, atc); apdu = ISOUtil.concat(apdu, arqc); EncryptedPIN expectdPIN = new EncryptedPIN("158C4C2E67041975DEB907E2E57EC85D", SMAdapter.FORMAT41, accountNo); Pair<EncryptedPIN, byte[]> result = jcesecmod.translatePINGenerateSM_MAC( MKDMethod.OPTION_A, SKDMethod.EMV_CSKD, PaddingMethod.VSDC ,imksmi, accountNo, accntSeqNo, atc, arqc, apdu ,null, pin, zpk, imksmc, imkac, SMAdapter.FORMAT41); assertArrayEquals(expectdPIN.getPINBlock(), result.getValue0().getPINBlock()); assertArrayEquals(ISOUtil.hex2byte("7DE6117DEB56D37F"), result.getValue1()); }
@Test public void testTranslatePINGenerateSM_MACImpl4() throws Throwable { String accountNo = accountNoA; String accntSeqNo = accountNoA_CSN; byte[] apdu = apdu01; byte[] atc = atc01; byte[] arqc = arqc01; EncryptedPIN pin = pinUnderZPK; apdu = ISOUtil.concat(apdu, atc); apdu = ISOUtil.concat(apdu, arqc); EncryptedPIN expectdPIN = new EncryptedPIN("F473D25D9B478970E72651C08FE487EF", SMAdapter.FORMAT34, accountNo); Pair<EncryptedPIN, byte[]> result = jcesecmod.translatePINGenerateSM_MAC( MKDMethod.OPTION_A, SKDMethod.EMV_CSKD, null ,imksmi, accountNo, accntSeqNo, atc, arqc, apdu ,null, pin, zpk, imksmc, null, SMAdapter.FORMAT34); assertArrayEquals(expectdPIN.getPINBlock(), result.getValue0().getPINBlock()); assertArrayEquals(ISOUtil.hex2byte("299E98C2B5A38B27"), result.getValue1()); }
@Test public void testTranslatePINGenerateSM_MACImpl2() throws Throwable { String accountNo = accountNoA; String accntSeqNo = accountNoA_CSN; byte[] apdu = apdu01; byte[] atc = atc01; byte[] arqc = arqc01; EncryptedPIN pin = pinUnderZPK; apdu = ISOUtil.concat(apdu, atc); apdu = ISOUtil.concat(apdu, arqc); EncryptedPIN expectdPIN = new EncryptedPIN("E60663E4B11CDB2DE4667CC9433384B4", SMAdapter.FORMAT41, accountNo); Pair<EncryptedPIN, byte[]> result = jcesecmod.translatePINGenerateSM_MAC( MKDMethod.OPTION_A, SKDMethod.EMV_CSKD, null ,imksmi, accountNo, accntSeqNo, atc, arqc, apdu ,null, pin, zpk, imksmc, imkac, SMAdapter.FORMAT41); assertArrayEquals(expectdPIN.getPINBlock(), result.getValue0().getPINBlock()); assertArrayEquals(ISOUtil.hex2byte("0405DB9BFB25BE6F"), result.getValue1()); }
@Test public void testTranslatePINGenerateSM_MACImpl5() throws Throwable { String accountNo = accountNoA; String accntSeqNo = accountNoA_CSN; byte[] apdu = apdu01; byte[] atc = atc01; byte[] arqc = arqc01; EncryptedPIN pin = pinUnderZPK; apdu = ISOUtil.concat(apdu, atc); apdu = ISOUtil.concat(apdu, arqc); EncryptedPIN expectdPIN = new EncryptedPIN("EF0F091EDA14326440C47C0F7C572473", SMAdapter.FORMAT41, accountNo); Pair<EncryptedPIN, byte[]> result = jcesecmod.translatePINGenerateSM_MAC( MKDMethod.OPTION_A, SKDMethod.VSDC, null ,imksmi, accountNo, accntSeqNo, atc, arqc, apdu ,null, pin, zpk, imksmc, imkac, SMAdapter.FORMAT41); assertArrayEquals(expectdPIN.getPINBlock(), result.getValue0().getPINBlock()); assertArrayEquals(ISOUtil.hex2byte("9F1B829D179E55C2"), result.getValue1()); }