/** * 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.HoldsModifiableVariable; 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.tls.protocol.ModifiableVariableHolder; import de.rub.nds.tlsattacker.tls.constants.ExtensionType; import de.rub.nds.tlsattacker.tls.protocol.extension.ECPointFormatExtensionMessage; import de.rub.nds.tlsattacker.tls.protocol.extension.EllipticCurvesExtensionMessage; import de.rub.nds.tlsattacker.tls.protocol.extension.ExtensionMessage; import de.rub.nds.tlsattacker.tls.protocol.extension.HeartbeatExtensionMessage; import de.rub.nds.tlsattacker.tls.protocol.extension.MaxFragmentLengthExtensionMessage; import de.rub.nds.tlsattacker.tls.protocol.extension.ServerNameIndicationExtensionMessage; import de.rub.nds.tlsattacker.tls.protocol.extension.SignatureAndHashAlgorithmsExtensionMessage; import de.rub.nds.tlsattacker.tls.constants.HandshakeMessageType; import java.util.LinkedList; import java.util.List; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlElements; /** * * @author Juraj Somorovsky <juraj.somorovsky@rub.de> */ abstract class HelloMessage extends HandshakeMessage { /** * protocol version in the client and server hello */ @ModifiableVariableProperty(type = ModifiableVariableProperty.Type.TLS_CONSTANT) ModifiableByteArray protocolVersion; /** * unix time */ @ModifiableVariableProperty ModifiableByteArray unixTime; /** * random */ @ModifiableVariableProperty ModifiableByteArray random; /** * length of the session id length field indicating the session id length */ @ModifiableVariableProperty(type = ModifiableVariableProperty.Type.LENGTH) ModifiableInteger sessionIdLength; /** * session id */ @ModifiableVariableProperty ModifiableByteArray sessionId; /** * List of extensions */ @HoldsModifiableVariable List<ExtensionMessage> extensions = new LinkedList<>(); public HelloMessage(HandshakeMessageType handshakeMessageType) { super(handshakeMessageType); } public ModifiableByteArray getRandom() { return random; } public ModifiableByteArray getSessionId() { return sessionId; } public ModifiableByteArray getUnixTime() { return unixTime; } public ModifiableByteArray getProtocolVersion() { return protocolVersion; } public ModifiableInteger getSessionIdLength() { return sessionIdLength; } public void setProtocolVersion(ModifiableByteArray protocolVersion) { this.protocolVersion = protocolVersion; } public void setUnixTime(ModifiableByteArray unixTime) { this.unixTime = unixTime; } public void setRandom(ModifiableByteArray random) { this.random = random; } public void setSessionIdLength(ModifiableInteger sessionIdLength) { this.sessionIdLength = sessionIdLength; } public void setSessionId(ModifiableByteArray sessionId) { this.sessionId = sessionId; } public void setRandom(byte[] random) { this.random = ModifiableVariableFactory.safelySetValue(this.random, random); } public void setSessionId(byte[] sessionId) { this.sessionId = ModifiableVariableFactory.safelySetValue(this.sessionId, sessionId); } public void setUnixTime(byte[] unixTime) { this.unixTime = ModifiableVariableFactory.safelySetValue(this.unixTime, unixTime); } public void setSessionIdLength(int sessionIdLength) { this.sessionIdLength = ModifiableVariableFactory.safelySetValue(this.sessionIdLength, sessionIdLength); } public void setProtocolVersion(byte[] array) { this.protocolVersion = ModifiableVariableFactory.safelySetValue(this.protocolVersion, array); } @XmlElementWrapper @XmlElements(value = { @XmlElement(type = ECPointFormatExtensionMessage.class, name = "ECPointFormat"), @XmlElement(type = EllipticCurvesExtensionMessage.class, name = "EllipticCurves"), @XmlElement(type = HeartbeatExtensionMessage.class, name = "HeartbeatExtension"), @XmlElement(type = MaxFragmentLengthExtensionMessage.class, name = "MaxFragmentLengthExtension"), @XmlElement(type = ServerNameIndicationExtensionMessage.class, name = "ServerNameIndicationExtension"), @XmlElement(type = SignatureAndHashAlgorithmsExtensionMessage.class, name = "SignatureAndHashAlgorithmsExtension") }) public List<ExtensionMessage> getExtensions() { return extensions; } public void setExtensions(List<ExtensionMessage> extensions) { this.extensions = extensions; } public void addExtension(ExtensionMessage extension) { this.extensions.add(extension); } public boolean containsExtension(ExtensionType extensionType) { for (ExtensionMessage e : extensions) { if (e.getExtensionTypeConstant() == extensionType) { return true; } } return false; } @Override public List<ModifiableVariableHolder> getAllModifiableVariableHolders() { List<ModifiableVariableHolder> holders = super.getAllModifiableVariableHolders(); if (extensions != null) { for (ExtensionMessage em : extensions) { holders.add(em); } } return holders; } }