/**
* 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.heartbeat;
import de.rub.nds.tlsattacker.modifiablevariable.ModifiableVariableFactory;
import de.rub.nds.tlsattacker.modifiablevariable.ModifiableVariableProperty;
import de.rub.nds.tlsattacker.modifiablevariable.bytearray.ModifiableByteArray;
import de.rub.nds.tlsattacker.modifiablevariable.integer.ModifiableInteger;
import de.rub.nds.tlsattacker.modifiablevariable.singlebyte.ModifiableByte;
import de.rub.nds.tlsattacker.tls.constants.ConnectionEnd;
import de.rub.nds.tlsattacker.tls.constants.HeartbeatMessageType;
import de.rub.nds.tlsattacker.tls.constants.ProtocolMessageType;
import de.rub.nds.tlsattacker.tls.protocol.ProtocolMessage;
import de.rub.nds.tlsattacker.tls.protocol.ProtocolMessageHandler;
import de.rub.nds.tlsattacker.tls.workflow.TlsContext;
import de.rub.nds.tlsattacker.util.ArrayConverter;
/**
* @author Juraj Somorovsky <juraj.somorovsky@rub.de>
*/
public class HeartbeatMessage extends ProtocolMessage {
@ModifiableVariableProperty(type = ModifiableVariableProperty.Type.TLS_CONSTANT)
ModifiableByte heartbeatMessageType;
@ModifiableVariableProperty(type = ModifiableVariableProperty.Type.LENGTH)
ModifiableInteger payloadLength;
@ModifiableVariableProperty()
ModifiableByteArray payload;
@ModifiableVariableProperty(type = ModifiableVariableProperty.Type.PADDING)
ModifiableByteArray padding;
public HeartbeatMessage() {
this.protocolMessageType = ProtocolMessageType.HEARTBEAT;
}
public HeartbeatMessage(ConnectionEnd messageIssuer) {
this();
this.messageIssuer = messageIssuer;
}
public ModifiableByte getHeartbeatMessageType() {
return heartbeatMessageType;
}
public void setHeartbeatMessageType(ModifiableByte heartbeatMessageType) {
this.heartbeatMessageType = heartbeatMessageType;
}
public void setHeartbeatMessageType(byte heartbeatMessageType) {
this.heartbeatMessageType = ModifiableVariableFactory.safelySetValue(this.heartbeatMessageType,
heartbeatMessageType);
}
public ModifiableInteger getPayloadLength() {
return payloadLength;
}
public void setPayloadLength(ModifiableInteger payloadLength) {
this.payloadLength = payloadLength;
}
public void setPayloadLength(int payloadLength) {
this.payloadLength = ModifiableVariableFactory.safelySetValue(this.payloadLength, payloadLength);
}
public ModifiableByteArray getPayload() {
return payload;
}
public void setPayload(ModifiableByteArray payload) {
this.payload = payload;
}
public void setPayload(byte[] payload) {
this.payload = ModifiableVariableFactory.safelySetValue(this.payload, payload);
}
public ModifiableByteArray getPadding() {
return padding;
}
public void setPadding(ModifiableByteArray padding) {
this.padding = padding;
}
public void setPadding(byte[] padding) {
this.padding = ModifiableVariableFactory.safelySetValue(this.padding, padding);
}
@Override
public ProtocolMessageHandler<? extends ProtocolMessage> getProtocolMessageHandler(TlsContext tlsContext) {
HeartbeatHandler hmh = new HeartbeatHandler(tlsContext);
hmh.setProtocolMessage(this);
return hmh;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("\nHeartbeat message:\n Type: ")
.append(HeartbeatMessageType.getHeartbeatMessageType(heartbeatMessageType.getValue()))
.append("\n Payload Length: ").append(payloadLength.getValue()).append("\n Payload: ")
.append(ArrayConverter.bytesToHexString(payload.getValue())).append("\n Padding: ")
.append(ArrayConverter.bytesToHexString(padding.getValue()));
return sb.toString();
}
@Override
public String toCompactString() {
return "Heartbeat";
}
}