/** * 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.bytearray; import de.rub.nds.tlsattacker.modifiablevariable.VariableModification; import de.rub.nds.tlsattacker.util.ByteArrayAdapter; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; /** * Shuffles the byte array, using a pre-defined array of array pointers * (#shuffle). Array pointers are currently defined as bytes, since we are * modifying rather smaller arrays. * * @author Juraj Somorovsky - juraj.somorovsky@rub.de */ @XmlRootElement @XmlType(propOrder = {"shuffle", "modificationFilter", "postModification"}) public class ByteArrayShuffleModification extends VariableModification<byte[]> { private byte[] shuffle; public ByteArrayShuffleModification() { } public ByteArrayShuffleModification(byte[] shuffle) { this.shuffle = shuffle; } @Override protected byte[] modifyImplementationHook(final byte[] input) { byte[] result = input.clone(); int size = input.length; for (int i = 0; i < shuffle.length - 1; i += 2) { int p1 = (shuffle[i] & 0xff) % size; int p2 = (shuffle[i + 1] & 0xff) % size; byte tmp = result[p1]; result[p1] = result[p2]; result[p2] = tmp; } return result; } @XmlJavaTypeAdapter(ByteArrayAdapter.class) public byte[] getShuffle() { return shuffle; } public void setShuffle(byte[] shuffle) { this.shuffle = shuffle; } }