/** * 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.constants; import java.util.Arrays; import java.util.HashMap; import java.util.Map; /** * @author Juraj Somorovsky <juraj.somorovsky@rub.de> */ public enum ProtocolVersion { TLS10(new byte[] { (byte) 0x03, (byte) 0x01 }), TLS11(new byte[] { (byte) 0x03, (byte) 0x02 }), TLS12(new byte[] { (byte) 0x03, (byte) 0x03 }), DTLS10(new byte[] { (byte) 0xFE, (byte) 0xFF }), DTLS12(new byte[] { (byte) 0xFE, (byte) 0xFD }); private byte[] value; private static final Map<Integer, ProtocolVersion> MAP; private ProtocolVersion(byte[] value) { this.value = value; } static { MAP = new HashMap<>(); for (ProtocolVersion c : ProtocolVersion.values()) { MAP.put(valueToInt(c.value), c); } } private static int valueToInt(byte[] value) { return (value[0] & 0xff) << 8 | (value[1] & 0xff); } public static ProtocolVersion getProtocolVersion(byte[] value) { return MAP.get(valueToInt(value)); } public byte[] getValue() { return value; } public byte getMajor() { return value[0]; } public byte getMinor() { return value[1]; } /** * Maps a string protocol version value to an enum. * * It handles specific cases like TLSv1.2 or SSLv3 * * @param protocolVersion * @return */ public static ProtocolVersion fromString(String protocolVersion) { protocolVersion = protocolVersion.replaceFirst("v", ""); protocolVersion = protocolVersion.replaceFirst("\\.", ""); for (ProtocolVersion pv : ProtocolVersion.values()) { if (protocolVersion.equalsIgnoreCase(pv.toString())) { return pv; } } throw new IllegalArgumentException("Value " + protocolVersion + " cannot be converted to a protocol version. " + "Available values are: " + Arrays.toString(ProtocolVersion.values())); } }