1fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin/* 2fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin * Copyright (C) 2014 The Android Open Source Project 3fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin * 4fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin * Licensed under the Apache License, Version 2.0 (the "License"); 5fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin * you may not use this file except in compliance with the License. 6fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin * You may obtain a copy of the License at 7fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin * 8fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin * http://www.apache.org/licenses/LICENSE-2.0 9fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin * 10fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin * Unless required by applicable law or agreed to in writing, software 11fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin * distributed under the License is distributed on an "AS IS" BASIS, 12fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin * See the License for the specific language governing permissions and 14fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin * limitations under the License. 15fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin */ 16fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin 17fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubinpackage libcore.tlswire.util; 18fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin 19fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubinimport java.io.DataInput; 20fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubinimport java.io.IOException; 21fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin 22fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin/** 23fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin * {@code ProtovolVersion} struct from TLS 1.2 RFC 5246. 24fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin */ 25fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubinpublic class TlsProtocolVersion { 26fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin public static final TlsProtocolVersion SSLV3 = new TlsProtocolVersion(3, 0, "SSLv3"); 27fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin public static final TlsProtocolVersion TLSv1_0 = new TlsProtocolVersion(3, 1, "TLSv1.0"); 28fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin public static final TlsProtocolVersion TLSv1_1 = new TlsProtocolVersion(3, 2, "TLSv1.1"); 29fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin public static final TlsProtocolVersion TLSv1_2 = new TlsProtocolVersion(3, 3, "TLSv1.2"); 30fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin 31fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin public final int major; 32fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin public final int minor; 33fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin public final String name; 34fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin 35fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin private TlsProtocolVersion(int major, int minor, String name) { 36fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin this.major = major; 37fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin this.minor = minor; 38fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin this.name = name; 39fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin } 40fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin 41fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin public static TlsProtocolVersion valueOf(int major, int minor) { 42fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin if (major == 3) { 43fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin switch (minor) { 44fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin case 0: 45fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin return SSLV3; 46fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin case 1: 47fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin return TLSv1_0; 48fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin case 2: 49fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin return TLSv1_1; 50fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin case 3: 51fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin return TLSv1_2; 52fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin } 53fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin } 54fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin return new TlsProtocolVersion(major, minor, major + "." + minor); 55fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin } 56fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin 57fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin public static TlsProtocolVersion read(DataInput in) throws IOException { 58fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin int major = in.readUnsignedByte(); 59fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin int minor = in.readUnsignedByte(); 60fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin return TlsProtocolVersion.valueOf(major, minor); 61fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin } 62fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin 63fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin @Override 64fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin public String toString() { 65fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin return name; 66fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin } 67fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin 68fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin @Override 69fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin public int hashCode() { 70fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin final int prime = 31; 71fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin int result = 1; 72fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin result = prime * result + major; 73fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin result = prime * result + minor; 74fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin return result; 75fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin } 76fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin 77fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin @Override 78fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin public boolean equals(Object obj) { 79fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin if (this == obj) { 80fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin return true; 81fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin } 82fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin if (obj == null) { 83fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin return false; 84fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin } 85fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin if (getClass() != obj.getClass()) { 86fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin return false; 87fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin } 88fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin TlsProtocolVersion other = (TlsProtocolVersion) obj; 89fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin if (major != other.major) { 90fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin return false; 91fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin } 92fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin if (minor != other.minor) { 93fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin return false; 94fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin } 95fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin return true; 96fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin } 97fb30da617fb979e7ae98c5a22b926aa15c6f2502Alex Klyubin} 98