/**
* 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.singlebyte;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import de.rub.nds.tlsattacker.modifiablevariable.FileConfigurationException;
import de.rub.nds.tlsattacker.modifiablevariable.VariableModification;
import de.rub.nds.tlsattacker.util.RandomHelper;
/**
* @author
*/
final public class ByteModificationFactory {
private static final int BYTE_EXPLICIT_VALUE_MODIFICATION = 3;
private static final int BYTE_XOR_MODIFICATION = 2;
private static final int BYTE_SUBTRACT_MODIFICATION = 1;
private static final int BYTE_ADD_MODIFICATION = 0;
private static final int MODIFICATION_COUNT = 5;
private static List<VariableModification<Byte>> modificationsFromFile;
public static final String FILE_NAME = "byte.vec";
private ByteModificationFactory() {
}
public static ByteAddModification add(final String summand) {
return add(new Byte(summand));
}
public static ByteAddModification add(final Byte summand) {
return new ByteAddModification(summand);
}
public static VariableModification<Byte> sub(final String subtrahend) {
return sub(new Byte(subtrahend));
}
public static VariableModification<Byte> sub(final Byte subtrahend) {
return new ByteSubtractModification(subtrahend);
}
public static VariableModification<Byte> xor(final String xor) {
return xor(new Byte(xor));
}
public static VariableModification<Byte> xor(final Byte xor) {
return new ByteXorModification(xor);
}
public static VariableModification<Byte> explicitValue(final String value) {
return explicitValue(new Byte(value));
}
public static VariableModification<Byte> explicitValue(final Byte value) {
return new ByteExplicitValueModification(value);
}
public static VariableModification<Byte> explicitValueFromFile(int value) {
List<VariableModification<Byte>> modifications = modificationsFromFile();
int pos = value % modifications.size();
return modifications.get(pos);
}
public static synchronized List<VariableModification<Byte>> modificationsFromFile() {
try {
if (modificationsFromFile == null) {
modificationsFromFile = new LinkedList<>();
ClassLoader classLoader = ByteModificationFactory.class.getClassLoader();
InputStream is = classLoader.getResourceAsStream(FILE_NAME);
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line;
while ((line = br.readLine()) != null) {
String value = line.trim().split(" ")[0];
modificationsFromFile.add(explicitValue(value));
}
}
return modificationsFromFile;
} catch (IOException ex) {
throw new FileConfigurationException("Modifiable variable file name could not have been found.", ex);
}
}
public static VariableModification<Byte> createRandomModification() {
Random random = RandomHelper.getRandom();
int r = random.nextInt(MODIFICATION_COUNT);
byte modification = (byte) random.nextInt(Byte.MAX_VALUE);
VariableModification<Byte> vm = null;
switch (r) {
case BYTE_ADD_MODIFICATION:
vm = new ByteAddModification(modification);
return vm;
case BYTE_SUBTRACT_MODIFICATION:
vm = new ByteSubtractModification(modification);
return vm;
case BYTE_XOR_MODIFICATION:
vm = new ByteXorModification(modification);
return vm;
case BYTE_EXPLICIT_VALUE_MODIFICATION:
vm = new ByteExplicitValueModification(modification);
return vm;
case 4:
vm = explicitValueFromFile(random.nextInt(Byte.MAX_VALUE));
return vm;
}
return vm;
}
}