/** * 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.integer; 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 IntegerModificationFactory { private static final int MODIFICATION_COUNT = 7; private static final int MAX_MODIFICATION_VALUE = 32000; private static final int MAX_MODIFICATION_SHIFT_VALUE = 20; private static List<VariableModification<Integer>> modificationsFromFile; public static final String FILE_NAME = "integer.vec"; private IntegerModificationFactory() { } public static IntegerAddModification add(final String summand) { return add(new Integer(summand)); } public static IntegerAddModification add(final Integer summand) { return new IntegerAddModification(summand); } public static IntegerShiftLeftModification shiftLeft(final String shift) { return shiftLeft(new Integer(shift)); } public static IntegerShiftLeftModification shiftLeft(final Integer shift) { return new IntegerShiftLeftModification(shift); } public static IntegerShiftRightModification shiftRight(final String shift) { return shiftRight(new Integer(shift)); } public static IntegerShiftRightModification shiftRight(final Integer shift) { return new IntegerShiftRightModification(shift); } public static VariableModification<Integer> sub(final String subtrahend) { return sub(new Integer(subtrahend)); } public static VariableModification<Integer> sub(final Integer subtrahend) { return new IntegerSubtractModification(subtrahend); } public static VariableModification<Integer> xor(final String xor) { return xor(new Integer(xor)); } public static VariableModification<Integer> xor(final Integer xor) { return new IntegerXorModification(xor); } public static VariableModification<Integer> explicitValue(final String value) { return explicitValue(new Integer(value)); } public static VariableModification<Integer> explicitValue(final Integer value) { return new IntegerExplicitValueModification(value); } public static VariableModification<Integer> explicitValueFromFile(int value) { List<VariableModification<Integer>> modifications = modificationsFromFile(); int pos = value % modifications.size(); return modifications.get(pos); } public static synchronized List<VariableModification<Integer>> modificationsFromFile() { try { if (modificationsFromFile == null) { modificationsFromFile = new LinkedList<>(); ClassLoader classLoader = IntegerModificationFactory.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<Integer> createRandomModification() { Random random = RandomHelper.getRandom(); int r = random.nextInt(MODIFICATION_COUNT); int modification = random.nextInt(MAX_MODIFICATION_VALUE); int shiftModification = random.nextInt(MAX_MODIFICATION_SHIFT_VALUE); VariableModification<Integer> vm = null; switch (r) { case 0: vm = new IntegerAddModification(modification); return vm; case 1: vm = new IntegerSubtractModification(modification); return vm; case 2: vm = new IntegerXorModification(modification); return vm; case 3: vm = new IntegerExplicitValueModification(modification); return vm; case 4: vm = new IntegerShiftLeftModification(shiftModification); return vm; case 5: vm = new IntegerShiftRightModification(shiftModification); return vm; case 6: vm = explicitValueFromFile(random.nextInt(MAX_MODIFICATION_VALUE)); return vm; } return vm; } }