/** * 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.bytearray.ModifiableByteArray; import de.rub.nds.tlsattacker.modifiablevariable.singlebyte.ModifiableByte; import de.rub.nds.tlsattacker.tls.constants.ConnectionEnd; import de.rub.nds.tlsattacker.tls.protocol.extension.ExtensionMessage; import de.rub.nds.tlsattacker.tls.constants.CipherSuite; import de.rub.nds.tlsattacker.tls.constants.CompressionMethod; import de.rub.nds.tlsattacker.tls.constants.HandshakeMessageType; import de.rub.nds.tlsattacker.tls.constants.ProtocolVersion; import de.rub.nds.tlsattacker.util.ArrayConverter; import java.util.Date; /** * @author Juraj Somorovsky <juraj.somorovsky@rub.de> */ public class ServerHelloMessage extends HelloMessage { @ModifiableVariableProperty(type = ModifiableVariableProperty.Type.TLS_CONSTANT) ModifiableByteArray selectedCipherSuite; @ModifiableVariableProperty(type = ModifiableVariableProperty.Type.TLS_CONSTANT) ModifiableByte selectedCompressionMethod; public ServerHelloMessage() { super(HandshakeMessageType.SERVER_HELLO); this.messageIssuer = ConnectionEnd.SERVER; } public ServerHelloMessage(ConnectionEnd messageIssuer) { super(HandshakeMessageType.SERVER_HELLO); this.messageIssuer = messageIssuer; } public ModifiableByteArray getSelectedCipherSuite() { return selectedCipherSuite; } public void setSelectedCipherSuite(ModifiableByteArray selectedCipherSuite) { this.selectedCipherSuite = selectedCipherSuite; } public void setSelectedCipherSuite(byte[] value) { this.selectedCipherSuite = ModifiableVariableFactory.safelySetValue(this.selectedCipherSuite, value); } public ModifiableByte getSelectedCompressionMethod() { return selectedCompressionMethod; } public void setSelectedCompressionMethod(ModifiableByte selectedCompressionMethod) { this.selectedCompressionMethod = selectedCompressionMethod; } public void setSelectedCompressionMethod(byte value) { this.selectedCompressionMethod = ModifiableVariableFactory .safelySetValue(this.selectedCompressionMethod, value); } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append(super.toString()).append("\n Protocol Version: ") .append(ProtocolVersion.getProtocolVersion(protocolVersion.getValue())) .append("\n Server Unix Time: ") .append(new Date(ArrayConverter.bytesToLong(this.unixTime.getValue()) * 1000)) .append("\n Server Random: ").append(ArrayConverter.bytesToHexString(random.getValue())) .append("\n Session ID: ").append(ArrayConverter.bytesToHexString(sessionId.getValue())) .append("\n Selected Cipher Suite: ") .append(CipherSuite.getCipherSuite(selectedCipherSuite.getValue())) .append("\n Selected Compression Method: ") .append(CompressionMethod.getCompressionMethod(selectedCompressionMethod.getValue())) .append("\n Extensions: "); for (ExtensionMessage e : extensions) { sb.append(e.toString()); } return sb.toString(); } }