/** * 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.handshake; import de.rub.nds.tlsattacker.modifiablevariable.ModifiableVariableFactory; import de.rub.nds.tlsattacker.modifiablevariable.ModifiableVariableProperty; import de.rub.nds.tlsattacker.modifiablevariable.integer.ModifiableInteger; import de.rub.nds.tlsattacker.modifiablevariable.singlebyte.ModifiableByte; import de.rub.nds.tlsattacker.tls.constants.HandshakeMessageType; 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; /** * @author Juraj Somorovsky <juraj.somorovsky@rub.de> */ public abstract class HandshakeMessage extends ProtocolMessage { final HandshakeMessageType handshakeMessageType; /** * handshake type */ @ModifiableVariableProperty ModifiableByte type; @ModifiableVariableProperty(type = ModifiableVariableProperty.Type.LENGTH) protected ModifiableInteger length = ModifiableVariableFactory.createIntegerModifiableVariable(); @ModifiableVariableProperty(type = ModifiableVariableProperty.Type.COUNT) private ModifiableInteger messageSeq = null; @ModifiableVariableProperty private ModifiableInteger fragmentOffset = null; @ModifiableVariableProperty(type = ModifiableVariableProperty.Type.LENGTH) private ModifiableInteger fragmentLength = null; boolean includeInDigest = true; public HandshakeMessage(HandshakeMessageType handshakeMessageType) { this.protocolMessageType = ProtocolMessageType.HANDSHAKE; this.handshakeMessageType = handshakeMessageType; this.messageSeq = ModifiableVariableFactory.safelySetValue(messageSeq, 0); this.fragmentOffset = ModifiableVariableFactory.safelySetValue(fragmentOffset, 0); this.fragmentLength = ModifiableVariableFactory.safelySetValue(fragmentLength, 0); } public ModifiableByte getType() { return type; } public boolean getIncludeInDigest() { return includeInDigest; } public void setType(ModifiableByte type) { this.type = type; } public void setType(Byte type) { this.type = ModifiableVariableFactory.safelySetValue(this.type, type); } public ModifiableInteger getLength() { return length; } public void setLength(ModifiableInteger length) { this.length = length; } public void setLength(int length) { this.length = ModifiableVariableFactory.safelySetValue(this.length, length); } public ModifiableInteger getMessageSeq() { return messageSeq; } public ModifiableInteger getFragmentOffset() { return fragmentOffset; } public ModifiableInteger getFragmentLength() { return fragmentLength; } public void setMessageSeq(int messageSeq) { this.messageSeq = ModifiableVariableFactory.safelySetValue(this.messageSeq, messageSeq); } public void setMessageSeq(ModifiableInteger messageSeq) { this.messageSeq = messageSeq; } public void setFragmentOffset(int fragmentOffset) { this.fragmentOffset = ModifiableVariableFactory.safelySetValue(this.fragmentOffset, fragmentOffset); } public void setFragmentOffset(ModifiableInteger fragmentOffset) { this.fragmentOffset = fragmentOffset; } public void setFragmentLength(int fragmentLength) { this.fragmentLength = ModifiableVariableFactory.safelySetValue(this.fragmentLength, fragmentLength); } public void setFragmentLength(ModifiableInteger fragmentLength) { this.fragmentLength = fragmentLength; } public HandshakeMessageType getHandshakeMessageType() { return handshakeMessageType; } public void setIncludeInDigest(boolean includeInDigest) { this.includeInDigest = includeInDigest; } @Override public String toString() { StringBuilder sb = new StringBuilder("\n" + handshakeMessageType.getName()); sb.append("\n Handshake Message Length: ").append(length.getValue()); if (messageSeq != null && messageSeq.getValue() != null && messageSeq.getValue() != 0) { sb.append("\n Handshake Message message_seq: ").append(messageSeq.getValue()); sb.append("\n Handshake Message fragment_offset: ").append(fragmentOffset.getValue()); sb.append("\n Handshake Message fragment_length: ").append(fragmentLength.getValue()); } return sb.toString(); } @Override public String toCompactString() { return handshakeMessageType.getName(); } @Override public ProtocolMessageHandler<? extends ProtocolMessage> getProtocolMessageHandler(TlsContext tlsContext) { ProtocolMessageHandler<? extends ProtocolMessage> pmh = handshakeMessageType.getProtocolMessageHandler(tlsContext); pmh.setProtocolMessage(this); return pmh; } }