/** * 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.mlong; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; 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.modifiablevariable.integer.IntegerModificationFactory; import de.rub.nds.tlsattacker.util.RandomHelper; /** * @author */ final public class LongModificationFactory { private static final int MODIFICATION_COUNT = 5; private static final int MAX_MODIFICATION_VALUE = 32000; private static List<VariableModification<Long>> modificationsFromFile; private LongModificationFactory() { } public static LongAddModification add(final String summand) { return add(new Long(summand)); } public static LongAddModification add(final Long summand) { return new LongAddModification(summand); } public static VariableModification<Long> sub(final String subtrahend) { return sub(new Long(subtrahend)); } public static VariableModification<Long> sub(final Long subtrahend) { return new LongSubtractModification(subtrahend); } public static VariableModification<Long> xor(final String xor) { return xor(new Long(xor)); } public static VariableModification<Long> xor(final Long xor) { return new LongXorModification(xor); } public static VariableModification<Long> explicitValue(final String value) { return explicitValue(new Long(value)); } public static VariableModification<Long> explicitValue(final Long value) { return new LongExplicitValueModification(value); } public static VariableModification<Long> explicitValueFromFile(int value) { List<VariableModification<Long>> modifications = modificationsFromFile(); int pos = value % modifications.size(); return modifications.get(pos); } public static synchronized List<VariableModification<Long>> modificationsFromFile() { try { if (modificationsFromFile == null) { modificationsFromFile = new LinkedList<>(); ClassLoader classLoader = IntegerModificationFactory.class.getClassLoader(); File file = new File(classLoader.getResource(IntegerModificationFactory.FILE_NAME).getFile()); try(BufferedReader br = new BufferedReader(new FileReader(file))) { 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<Long> createRandomModification() { Random random = RandomHelper.getRandom(); int r = random.nextInt(MODIFICATION_COUNT); long modification = random.nextInt(MAX_MODIFICATION_VALUE); VariableModification<Long> vm = null; switch (r) { case 0: vm = new LongAddModification(modification); return vm; case 1: vm = new LongSubtractModification(modification); return vm; case 2: vm = new LongXorModification(modification); return vm; case 3: vm = new LongExplicitValueModification(modification); return vm; case 4: vm = explicitValueFromFile(random.nextInt(MAX_MODIFICATION_VALUE)); return vm; } return vm; } }