/** * 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.tls.protocol.extension; import de.rub.nds.tlsattacker.tls.constants.ExtensionByteLength; import de.rub.nds.tlsattacker.tls.constants.ExtensionType; import de.rub.nds.tlsattacker.util.ArrayConverter; import java.util.Arrays; /** * @author Juraj Somorovsky <juraj.somorovsky@rub.de> */ public class MaxFragmentLengthExtensionHandler extends ExtensionHandler<MaxFragmentLengthExtensionMessage> { private static MaxFragmentLengthExtensionHandler instance; /** * Max fragment length */ public static final int MAX_FRAGMENT_LENGTH = 1; private MaxFragmentLengthExtensionHandler() { } public static MaxFragmentLengthExtensionHandler getInstance() { if (instance == null) { instance = new MaxFragmentLengthExtensionHandler(); } return instance; } @Override public void initializeClientHelloExtension(MaxFragmentLengthExtensionMessage extension) { byte[] maxFragmentLength = { extension.getMaxFragmentLengthConfig().getValue() }; extension.setExtensionType(ExtensionType.MAX_FRAGMENT_LENGTH.getValue()); extension.setMaxFragmentLength(maxFragmentLength); extension.setExtensionLength(extension.getMaxFragmentLength().getValue().length); byte[] result = ArrayConverter.concatenate(extension.getExtensionType().getValue(), ArrayConverter.intToBytes(extension.getExtensionLength().getValue(), ExtensionByteLength.EXTENSIONS), extension.getMaxFragmentLength().getValue()); extension.setExtensionBytes(result); } @Override public int parseExtension(byte[] message, int pointer) { if (extensionMessage == null) { extensionMessage = new MaxFragmentLengthExtensionMessage(); } MaxFragmentLengthExtensionMessage mflExtension = (MaxFragmentLengthExtensionMessage) extensionMessage; int nextPointer = pointer + ExtensionByteLength.TYPE; byte[] extensionType = Arrays.copyOfRange(message, pointer, nextPointer); mflExtension.setExtensionType(extensionType); pointer = nextPointer; nextPointer = pointer + ExtensionByteLength.EXTENSIONS; int extensionLength = ArrayConverter.bytesToInt(Arrays.copyOfRange(message, pointer, nextPointer)); mflExtension.setExtensionLength(extensionLength); pointer = nextPointer; byte[] fragmentLength = { message[pointer] }; mflExtension.setMaxFragmentLength(fragmentLength); byte[] result = ArrayConverter .concatenate(mflExtension.getExtensionType().getValue(), ArrayConverter.intToBytes(mflExtension .getExtensionLength().getValue(), ExtensionByteLength.EXTENSIONS), mflExtension .getMaxFragmentLength().getValue()); mflExtension.setExtensionBytes(result); return pointer + 1; } }