/** * 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 HeartbeatExtensionHandler extends ExtensionHandler<HeartbeatExtensionMessage> { private static HeartbeatExtensionHandler instance; private HeartbeatExtensionHandler() { } public static HeartbeatExtensionHandler getInstance() { if (instance == null) { instance = new HeartbeatExtensionHandler(); } return instance; } @Override public void initializeClientHelloExtension(HeartbeatExtensionMessage extension) { byte[] heartbeatMode = { extension.getHeartbeatModeConfig().getValue() }; extension.setExtensionType(ExtensionType.HEARTBEAT.getValue()); extension.setHeartbeatMode(heartbeatMode); extension.setExtensionLength(extension.getHeartbeatMode().getValue().length); byte[] pfExtension = ArrayConverter.concatenate(extension.getExtensionType().getValue(), ArrayConverter.intToBytes(extension.getExtensionLength().getValue(), ExtensionByteLength.EXTENSIONS), extension.getHeartbeatMode().getValue()); extension.setExtensionBytes(pfExtension); } @Override public int parseExtension(byte[] message, int pointer) { if (extensionMessage == null) { extensionMessage = new HeartbeatExtensionMessage(); } HeartbeatExtensionMessage hem = (HeartbeatExtensionMessage) extensionMessage; int nextPointer = pointer + ExtensionByteLength.TYPE; byte[] extensionType = Arrays.copyOfRange(message, pointer, nextPointer); hem.setExtensionType(extensionType); pointer = nextPointer; nextPointer = pointer + ExtensionByteLength.EXTENSIONS; int extensionLength = ArrayConverter.bytesToInt(Arrays.copyOfRange(message, pointer, nextPointer)); hem.setExtensionLength(extensionLength); pointer = nextPointer; byte[] mode = { message[pointer] }; hem.setHeartbeatMode(mode); byte[] result = ArrayConverter.concatenate(hem.getExtensionType().getValue(), ArrayConverter.intToBytes(hem .getExtensionLength().getValue(), ExtensionByteLength.EXTENSIONS), hem.getHeartbeatMode().getValue()); hem.setExtensionBytes(result); return pointer + 1; } }