OSDN Git Service

original
[gb-231r1-is01/Gingerbread_2.3.3_r1_IS01.git] / libcore / luni / src / main / java / org / apache / harmony / xnet / provider / jsse / ProtocolVersion.java
1 /*
2  *  Licensed to the Apache Software Foundation (ASF) under one or more
3  *  contributor license agreements.  See the NOTICE file distributed with
4  *  this work for additional information regarding copyright ownership.
5  *  The ASF licenses this file to You under the Apache License, Version 2.0
6  *  (the "License"); you may not use this file except in compliance with
7  *  the License.  You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  */
17 package org.apache.harmony.xnet.provider.jsse;
18
19 import java.util.Hashtable;
20
21 /**
22  *
23  * Represents Protocol Version
24  */
25 public class ProtocolVersion {
26     /**
27      * Protocols supported by this provider implementation
28      */
29     public static final String[] supportedProtocols = new String[] { "TLSv1",
30             "SSLv3" };
31
32     private static Hashtable<String, ProtocolVersion> protocolsByName = new Hashtable<String, ProtocolVersion>(4);
33
34     /**
35      *
36      * Returns true if protocol version is supported
37      *
38      * @param version
39      */
40     public static boolean isSupported(byte[] version) {
41         if (version[0] != 3 || (version[1] != 0 && version[1] != 1)) {
42             return false;
43         }
44         return true;
45     }
46
47     /**
48      * Returns ProtocolVersion
49      *
50      * @param version
51      * @return
52      */
53     public static ProtocolVersion getByVersion(byte[] version) {
54         if (version[0] == 3) {
55             if (version[1] == 1) {
56                 return TLSv1;
57             }
58             if (version[1] == 0) {
59                 return SSLv3;
60             }
61         }
62         return null;
63     }
64
65     /**
66      * Returns true if provider supports protocol version
67      *
68      * @param name
69      * @return
70      */
71     public static boolean isSupported(String name) {
72         return protocolsByName.containsKey(name);
73     }
74
75     /**
76      * Returns ProtocolVersion
77      *
78      * @param name
79      * @return
80      */
81     public static ProtocolVersion getByName(String name) {
82         return protocolsByName.get(name);
83     }
84
85     /**
86      * Highest protocol version supported by provider implementation
87      *
88      * @param protocols
89      * @return
90      */
91     public static ProtocolVersion getLatestVersion(String[] protocols) {
92         if (protocols == null || protocols.length == 0) {
93             return null;
94         }
95         ProtocolVersion latest = getByName(protocols[0]);
96         ProtocolVersion current;
97         for (int i = 1; i < protocols.length; i++) {
98             current = getByName(protocols[i]);
99             if (current == null) {
100                 continue;
101             }
102             if ((latest == null)
103                     || (latest.version[0] < current.version[0])
104                     || (latest.version[0] == current.version[0] && latest.version[1] < current.version[1])) {
105                 latest = current;
106             }
107         }
108         return latest;
109
110     }
111
112     /**
113      * SSL 3.0 protocol version
114      */
115     public static ProtocolVersion SSLv3 = new ProtocolVersion("SSLv3",
116             new byte[] { 3, 0 });
117
118     /**
119      * TLS 1.0 protocol version
120      */
121     public static ProtocolVersion TLSv1 = new ProtocolVersion("TLSv1",
122             new byte[] { 3, 1 });
123
124     static {
125         protocolsByName.put(SSLv3.name, SSLv3);
126         protocolsByName.put(TLSv1.name, TLSv1);
127         protocolsByName.put("SSL", SSLv3);
128         protocolsByName.put("TLS", TLSv1);
129     }
130
131     /**
132      * Protocol name
133      */
134     public final String name;
135
136     /**
137      * Protocol version as byte array
138      */
139     public final byte[] version;
140
141     private ProtocolVersion(String name, byte[] version) {
142         this.name = name;
143         this.version = version;
144     }
145
146     /**
147      * Compares this ProtocolVersion to the specified object.
148      */
149     @Override
150     public boolean equals(Object o) {
151         if (o instanceof ProtocolVersion
152                 && this.version[0] == ((ProtocolVersion) o).version[0]
153                 && this.version[1] == ((ProtocolVersion) o).version[1]) {
154             return true;
155         }
156         return false;
157     }
158 }