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