/** * TLS-Attacker - A Modular Penetration Testing Framework for TLS * * Copyright 2014-2016 Ruhr University Bochum / Hackmanit GmbH * * Licensed under Apache License 2.0 * http://www.apache.org/licenses/LICENSE-2.0 */ package de.rub.nds.tlsattacker.modifiablevariable.serialization; import de.rub.nds.tlsattacker.modifiablevariable.VariableModification; import de.rub.nds.tlsattacker.modifiablevariable.bytearray.ByteArrayDeleteModification; import de.rub.nds.tlsattacker.modifiablevariable.bytearray.ByteArrayExplicitValueModification; import de.rub.nds.tlsattacker.modifiablevariable.bytearray.ByteArrayInsertModification; import de.rub.nds.tlsattacker.modifiablevariable.bytearray.ByteArrayModificationFactory; import de.rub.nds.tlsattacker.modifiablevariable.bytearray.ByteArrayXorModification; import de.rub.nds.tlsattacker.modifiablevariable.bytearray.ModifiableByteArray; import de.rub.nds.tlsattacker.modifiablevariable.filter.AccessModificationFilter; import de.rub.nds.tlsattacker.modifiablevariable.filter.ModificationFilterFactory; import java.io.StringReader; import java.io.StringWriter; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.*; /** * * @author Juraj Somorovsky - juraj.somorovsky@rub.de */ public class ByteArraySerializationTest { private static final Logger LOGGER = LogManager.getLogger(ByteArraySerializationTest.class); private ModifiableByteArray start; private byte[] expectedResult, result; private StringWriter writer; private JAXBContext context; private Marshaller m; private Unmarshaller um; public ByteArraySerializationTest() { } @Before public void setUp() throws JAXBException { start = new ModifiableByteArray(); start.setOriginalValue(new byte[] { (byte) 0xff, 1, 2, 3 }); expectedResult = null; result = null; writer = new StringWriter(); context = JAXBContext.newInstance(ModifiableByteArray.class, ByteArrayDeleteModification.class, ByteArrayExplicitValueModification.class, ByteArrayInsertModification.class, ByteArrayXorModification.class); m = context.createMarshaller(); m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); um = context.createUnmarshaller(); } @Test public void testSerializeDeserializeSimple() throws Exception { start.setModification(null); m.marshal(start, writer); String xmlString = writer.toString(); LOGGER.debug(xmlString); um = context.createUnmarshaller(); ModifiableByteArray mba = (ModifiableByteArray) um.unmarshal(new StringReader(xmlString)); expectedResult = new byte[] { (byte) 0xff, 1, 2, 3 }; result = mba.getValue(); assertArrayEquals(expectedResult, result); assertNotSame(expectedResult, result); } @Test public void testSerializeDeserializeWithDoubleModification() throws Exception { VariableModification<byte[]> modifier = ByteArrayModificationFactory.insert(new byte[] { 1, 2 }, 0); VariableModification<byte[]> modifier2 = ByteArrayModificationFactory.insert(new byte[] { 9, 8, 7 }, 3); modifier.setPostModification(modifier2); start.setModification(modifier); m.marshal(start, writer); String xmlString = writer.toString(); LOGGER.debug(xmlString); um = context.createUnmarshaller(); ModifiableByteArray mba = (ModifiableByteArray) um.unmarshal(new StringReader(xmlString)); expectedResult = new byte[] { 1, 2, (byte) 0xff, 9, 8, 7, 1, 2, 3 }; result = mba.getValue(); assertArrayEquals(expectedResult, result); assertNotSame(expectedResult, result); } @Test public void testSerializeDeserializeWithDoubleModificationFilter() throws Exception { VariableModification<byte[]> modifier = ByteArrayModificationFactory.delete(1, 1); int[] filtered = { 1, 3 }; AccessModificationFilter filter = ModificationFilterFactory.access(filtered); modifier.setModificationFilter(filter); VariableModification<byte[]> modifier2 = ByteArrayModificationFactory.xor(new byte[] { 1 }, 1); modifier.setPostModification(modifier2); start.setModification(modifier); m.marshal(start, writer); String xmlString = writer.toString(); LOGGER.debug(xmlString); um = context.createUnmarshaller(); ModifiableByteArray mv = (ModifiableByteArray) um.unmarshal(new StringReader(xmlString)); // it happens nothing, because the first modification is filtered expectedResult = new byte[] { (byte) 0xff, 1, 2, 3 }; result = mv.getValue(); assertArrayEquals(expectedResult, result); assertNotSame(expectedResult, result); // there we have a modification // first, 1 is deleted // then, 2 is xored with 1, resulting in 3 expectedResult = new byte[] { (byte) 0xff, 3, 3 }; result = mv.getValue(); assertArrayEquals(expectedResult, result); assertNotSame(expectedResult, result); } }