SSLEngine.java revision c9461f39290f815f560f2ec50e9ccde5ff4eb8f7
1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership. 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. You may obtain a copy of the License at 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 18f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilsonpackage javax.net.ssl; 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.nio.ByteBuffer; 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The abstract implementation of secure communications using SSL, TLS, or other 24f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * protocols. It includes the setup, handshake, and encrypt/decrypt 25f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * functionality needed to create a secure connection. 26f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 27b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <h3>Default configuration</h3> 28b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <p>{@code SSLEngine} instances obtained from default {@link SSLContext} are configured as 29b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * follows: 30b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * 31b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <h4>Protocols</h4> 32b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <table> 33b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <thead> 34b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 35b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <th>Protocol</th> 36b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <th>Supported (API Levels)</th> 37b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <th>Enabled by default (API Levels)</th> 38b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 39b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </thead> 40b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tbody> 41b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 42b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>SSLv3</td> 43b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>1+</td> 44b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>1+</td> 45b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 46b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 47b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>TLSv1</td> 48b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>1+</td> 49b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>1+</td> 50b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 51b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tbody> 52b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </table> 53b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * 54b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <h4>Cipher suites</h4> 55b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <table> 56b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <thead> 57b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 58b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <th>Cipher suite</th> 59b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <th>Supported (API Levels)</th> 60b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <th>Enabled by default (API Levels)</th> 61b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 62b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </thead> 63b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tbody> 64b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 65b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA</td> 66b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9+</td> 67b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td></td> 68b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 69b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 70b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>SSL_DH_anon_EXPORT_WITH_RC4_40_MD5</td> 71b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9+</td> 72b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td></td> 73b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 74b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 75b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>SSL_DH_anon_WITH_3DES_EDE_CBC_SHA</td> 76b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9+</td> 77b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td></td> 78b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 79b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 80b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>SSL_DH_anon_WITH_DES_CBC_SHA</td> 81b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9+</td> 82b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td></td> 83b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 84b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 85b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>SSL_DH_anon_WITH_RC4_128_MD5</td> 86b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9+</td> 87b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td></td> 88b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 89b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 90b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA</td> 91b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9+</td> 92b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9-19</td> 93b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 94b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 95b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA</td> 96b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9+</td> 97b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9+</td> 98b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 99b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 100b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>SSL_DHE_DSS_WITH_DES_CBC_SHA</td> 101b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9+</td> 102b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9-19</td> 103b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 104b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 105b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA</td> 106b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9+</td> 107b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9-19</td> 108b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 109b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 110b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA</td> 111b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9+</td> 112b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9+</td> 113b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 114b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 115b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>SSL_DHE_RSA_WITH_DES_CBC_SHA</td> 116b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9+</td> 117b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9-19</td> 118b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 119b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 120b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>SSL_RSA_EXPORT_WITH_DES40_CBC_SHA</td> 121b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9+</td> 122b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9-19</td> 123b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 124b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 125b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>SSL_RSA_EXPORT_WITH_RC4_40_MD5</td> 126b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9+</td> 127b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9-19</td> 128b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 129b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 130b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>SSL_RSA_WITH_3DES_EDE_CBC_SHA</td> 131b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9+</td> 132b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9+</td> 133b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 134b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 135b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>SSL_RSA_WITH_DES_CBC_SHA</td> 136b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9+</td> 137b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9-19</td> 138b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 139b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 140b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>SSL_RSA_WITH_NULL_MD5</td> 141b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9+</td> 142b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td></td> 143b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 144b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 145b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>SSL_RSA_WITH_NULL_SHA</td> 146b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9+</td> 147b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td></td> 148b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 149b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 150b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>SSL_RSA_WITH_RC4_128_MD5</td> 151b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9+</td> 152b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9+</td> 153b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 154b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 155b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>SSL_RSA_WITH_RC4_128_SHA</td> 156b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9+</td> 157b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9+</td> 158b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 159b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 160b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA</td> 161b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>1-8</td> 162b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td></td> 163b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 164b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 165b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>TLS_DH_anon_WITH_3DES_EDE_CBC_SHA</td> 166b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>1-8</td> 167b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td></td> 168b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 169b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 170b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>TLS_DH_anon_WITH_AES_128_CBC_SHA</td> 171b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9+</td> 172b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td></td> 173b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 174b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 175b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>TLS_DH_anon_WITH_AES_256_CBC_SHA</td> 176b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9+</td> 177b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td></td> 178b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 179b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 180b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>TLS_DH_anon_WITH_DES_CBC_SHA</td> 181b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>1-8</td> 182b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td></td> 183b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 184b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 185b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA</td> 186b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>1-8</td> 187b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td></td> 188b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 189b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 190b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA</td> 191b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>1-8</td> 192b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td></td> 193b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 194b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 195b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>TLS_DH_DSS_WITH_DES_CBC_SHA</td> 196b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>1-8</td> 197b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td></td> 198b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 199b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 200b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA</td> 201b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>1-8</td> 202b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td></td> 203b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 204b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 205b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA</td> 206b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>1-8</td> 207b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td></td> 208b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 209b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 210b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>TLS_DH_RSA_WITH_DES_CBC_SHA</td> 211b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>1-8</td> 212b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td></td> 213b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 214b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 215b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA</td> 216b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>1-8</td> 217b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>1-8</td> 218b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 219b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 220b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA</td> 221b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>1-8</td> 222b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>1-8</td> 223b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 224b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 225b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>TLS_DHE_DSS_WITH_AES_128_CBC_SHA</td> 226b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9+</td> 227b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9+</td> 228b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 229b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 230b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>TLS_DHE_DSS_WITH_AES_256_CBC_SHA</td> 231b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9+</td> 232b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>20+</td> 233b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 234b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 235b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>TLS_DHE_DSS_WITH_DES_CBC_SHA</td> 236b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>1-8</td> 237b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>1-8</td> 238b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 239b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 240b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA</td> 241b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>1-8</td> 242b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>1-8</td> 243b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 244b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 245b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA</td> 246b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>1-8</td> 247b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>1-8</td> 248b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 249b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 250b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>TLS_DHE_RSA_WITH_AES_128_CBC_SHA</td> 251b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9+</td> 252b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9+</td> 253b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 254b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 255b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>TLS_DHE_RSA_WITH_AES_256_CBC_SHA</td> 256b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9+</td> 257b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>20+</td> 258b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 259b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 260b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>TLS_DHE_RSA_WITH_DES_CBC_SHA</td> 261b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>1-8</td> 262b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>1-8</td> 263b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 264b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 265c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * <td>TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256</td> 266c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * <td>20+</td> 267c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * <td></td> 268c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * </tr> 269c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * <tr> 270c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * <td>TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384</td> 271c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * <td>20+</td> 272c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * <td></td> 273c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * </tr> 274c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * <tr> 275b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>TLS_NULL_WITH_NULL_NULL</td> 276b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>1-8</td> 277b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td></td> 278b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 279b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 280c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * <td>TLS_PSK_WITH_3DES_EDE_CBC_SHA</td> 281c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * <td>20+</td> 282c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * <td></td> 283c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * </tr> 284c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * <tr> 285c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * <td>TLS_PSK_WITH_AES_128_CBC_SHA</td> 286c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * <td>20+</td> 287c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * <td></td> 288c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * </tr> 289c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * <tr> 290c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * <td>TLS_PSK_WITH_AES_256_CBC_SHA</td> 291c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * <td>20+</td> 292c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * <td></td> 293c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * </tr> 294c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * <tr> 295c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * <td>TLS_PSK_WITH_RC4_128_SHA</td> 296c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * <td>20+</td> 297c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * <td></td> 298c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * </tr> 299c9461f39290f815f560f2ec50e9ccde5ff4eb8f7Alex Klyubin * <tr> 300b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>TLS_RSA_EXPORT_WITH_DES40_CBC_SHA</td> 301b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>1-8</td> 302b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>1-8</td> 303b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 304b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 305b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>TLS_RSA_WITH_3DES_EDE_CBC_SHA</td> 306b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>1-8</td> 307b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>1-8</td> 308b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 309b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 310b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>TLS_RSA_WITH_AES_128_CBC_SHA</td> 311b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9+</td> 312b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9+</td> 313b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 314b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 315b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>TLS_RSA_WITH_AES_256_CBC_SHA</td> 316b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>9+</td> 317b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>20+</td> 318b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 319b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 320b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>TLS_RSA_WITH_DES_CBC_SHA</td> 321b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>1-8</td> 322b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>1-8</td> 323b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 324b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 325b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>TLS_RSA_WITH_NULL_MD5</td> 326b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>1-8</td> 327b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td></td> 328b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 329b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <tr> 330b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>TLS_RSA_WITH_NULL_SHA</td> 331b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td>1-8</td> 332b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * <td></td> 333b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tr> 334b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </tbody> 335b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * </table> 336b4675a53abbbb55acad213485636cf6a0d8b5bf6Alex Klyubin * 337f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * @since 1.5 338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic abstract class SSLEngine { 340f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson private final String peerHost; 341f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson private final int peerPort; 342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a new {@code SSLEngine} instance. 345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected SSLEngine() { 347f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson peerHost = null; 348f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson peerPort = -1; 349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a new {@code SSLEngine} instance with the specified host and 353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * port. 354f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param host 356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the name of the host. 357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param port 358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the port of the host. 359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected SSLEngine(String host, int port) { 361f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson this.peerHost = host; 362f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson this.peerPort = port; 363f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson } 364f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson 365f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson /** 366f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * Returns the name of the peer host. 367f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 368f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * @return the name of the peer host, or {@code null} if none is available. 369f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson */ 370f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson public String getPeerHost() { 371f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson return peerHost; 372f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson } 373f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson 374f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson /** 375f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * Returns the port number of the peer host. 376f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 377f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * @return the port number of the peer host, or {@code -1} is none is 378f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * available. 379f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson */ 380f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson public int getPeerPort() { 381f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson return peerPort; 382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Initiates a handshake on this engine. 386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Calling this method is not needed for the initial handshake: it will be 388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * called by {@code wrap} or {@code unwrap} if the initial handshake has not 389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * been started yet. 390f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SSLException 392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if starting the handshake fails. 393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalStateException 394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the engine does not have all the needed settings (e.g. 395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * client/server mode not set). 396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract void beginHandshake() throws SSLException; 398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Notifies this engine instance that no more inbound network data will be 401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * sent to this engine. 402f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SSLException 404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this engine did not receive a needed protocol specific 405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * close notification message from the peer. 406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract void closeInbound() throws SSLException; 408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Notifies this engine instance that no more outbound application data will 411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * be sent to this engine. 412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract void closeOutbound(); 414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a delegate task for this engine instance. Some engine operations 417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * may require the results of blocking or long running operations, and the 418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code SSLEngineResult} instances returned by this engine may indicate 419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * that a delegated task result is needed. In this case the 420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link Runnable#run() run} method of the returned {@code Runnable} 421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * delegated task must be called. 422f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a delegate task, or {@code null} if none are available. 424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract Runnable getDelegatedTask(); 426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the SSL cipher suite names that are enabled in this engine 429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * instance. 430f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the SSL cipher suite names that are enabled in this engine 432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * instance. 433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract String[] getEnabledCipherSuites(); 435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the protocol version names that are enabled in this engine 438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * instance. 439f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the protocol version names that are enabled in this engine 441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * instance. 442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract String[] getEnabledProtocols(); 444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns whether new SSL sessions may be established by this engine. 447f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if new session may be established, {@code false} if 449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * existing sessions must be reused. 450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract boolean getEnableSessionCreation(); 452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the status of the handshake of this engine instance. 455f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the status of the handshake of this engine instance. 457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract SSLEngineResult.HandshakeStatus getHandshakeStatus(); 459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns whether this engine instance will require client authentication. 462f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if this engine will require client authentication, 464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code false} if no client authentication is needed. 465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract boolean getNeedClientAuth(); 467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the SSL session for this engine instance. 470f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the SSL session for this engine instance. 472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract SSLSession getSession(); 474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 47670bf6bc3ad78ed9a0a7a5767381ad6c25debbd70Kenny Root * Returns the SSL session for this engine instance. Does not cause the 47770bf6bc3ad78ed9a0a7a5767381ad6c25debbd70Kenny Root * handshake to start if it has not already started. 47870bf6bc3ad78ed9a0a7a5767381ad6c25debbd70Kenny Root * 47970bf6bc3ad78ed9a0a7a5767381ad6c25debbd70Kenny Root * @return the SSL session for this engine instance. 48070bf6bc3ad78ed9a0a7a5767381ad6c25debbd70Kenny Root * @since 1.7 48170bf6bc3ad78ed9a0a7a5767381ad6c25debbd70Kenny Root * @hide 48270bf6bc3ad78ed9a0a7a5767381ad6c25debbd70Kenny Root */ 48370bf6bc3ad78ed9a0a7a5767381ad6c25debbd70Kenny Root public SSLSession getHandshakeSession() { 48470bf6bc3ad78ed9a0a7a5767381ad6c25debbd70Kenny Root throw new UnsupportedOperationException(); 48570bf6bc3ad78ed9a0a7a5767381ad6c25debbd70Kenny Root } 48670bf6bc3ad78ed9a0a7a5767381ad6c25debbd70Kenny Root 48770bf6bc3ad78ed9a0a7a5767381ad6c25debbd70Kenny Root /** 488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the SSL cipher suite names that are supported by this engine. 489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * These cipher suites can be enabled using 490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link #setEnabledCipherSuites(String[])}. 491f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the SSL cipher suite names that are supported by this engine. 493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract String[] getSupportedCipherSuites(); 495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the protocol names that are supported by this engine. These 498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * protocols can be enables using {@link #setEnabledProtocols(String[])}. 499f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the protocol names that are supported by this engine. 501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract String[] getSupportedProtocols(); 503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns whether this engine is set to act in client mode when 506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * handshaking. 507f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if the engine is set to do handshaking in client 509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * mode. 510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract boolean getUseClientMode(); 512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns whether this engine will request client authentication. 515f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if client authentication will be requested, 517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code false} otherwise. 518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract boolean getWantClientAuth(); 520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns whether no more inbound data will be accepted by this engine. 523f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if no more inbound data will be accepted by this 525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * engine, {@code false} otherwise. 526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract boolean isInboundDone(); 528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns whether no more outbound data will be produced by this engine. 531f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if no more outbound data will be producted by this 533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * engine, {@code otherwise} false. 534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract boolean isOutboundDone(); 536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets the SSL cipher suite names that should be enabled in this engine 539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * instance. Only cipher suites listed by {@code getSupportedCipherSuites()} 540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * are allowed. 541f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param suites 543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the SSL cipher suite names to be enabled. 544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if one of the specified cipher suites is not supported, or if 546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code suites} is {@code null}. 547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract void setEnabledCipherSuites(String[] suites); 549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets the protocol version names that should be enabled in this engine 552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * instance. Only protocols listed by {@code getSupportedProtocols()} are 553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * allowed. 554f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param protocols 556adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the protocol version names to be enabled. 557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if one of the protocol version names is not supported, or if 559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code protocols} is {@code null}. 560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract void setEnabledProtocols(String[] protocols); 562adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 563adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 564adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets whether new SSL sessions may be established by this engine instance. 565f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 566adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param flag 567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code true} if new SSL sessions may be established, 568adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code false} if existing SSL sessions must be reused. 569adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract void setEnableSessionCreation(boolean flag); 571adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 572adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 573adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets whether this engine must require client authentication. The client 574adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * authentication is one of: 575adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul> 576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>authentication required</li> 577adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>authentication requested</li> 578adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>no authentication needed</li> 579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul> 580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This method overrides the setting of {@link #setWantClientAuth(boolean)}. 581f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param need 583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code true} if client authentication is required, 584adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code false} if no authentication is needed. 585adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 586adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract void setNeedClientAuth(boolean need); 587adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 588adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 589adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets whether this engine should act in client (or server) mode when 590adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * handshaking. 591f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 592adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param mode 593adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code true} if this engine should act in client mode, 594adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code false} if not. 595adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 596adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this method is called after starting the initial 597adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * handshake. 598adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 599adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract void setUseClientMode(boolean mode); 600adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 601adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 602adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets whether this engine should request client authentication. The client 603adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * authentication is one of the following: 604adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul> 605adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>authentication required</li> 606adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>authentication requested</li> 607adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>no authentication needed</li> 608adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul> 609adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This method overrides the setting of {@link #setNeedClientAuth(boolean)}. 610f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 611adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param want 612adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code true} if client authentication should be requested, 613adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code false} if no authentication is needed. 614adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 615adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract void setWantClientAuth(boolean want); 616adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 617adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 618adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Decodes the incoming network data buffer into application data buffers. 619adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If a handshake has not been started yet, it will automatically be 620adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * started. 621f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 622adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param src 623adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the buffer with incoming network data 624adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param dsts 625adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the array of destination buffers for incoming application 626adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * data. 627adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param offset 628adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the offset in the array of destination buffers to which data 629adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is to be transferred. 630adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param length 631f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * the maximum number of destination buffers to be used. 632adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the result object of this operation. 633adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SSLException 634adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if a problem occurred while processing the data. 635adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IndexOutOfBoundsException 636adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code length} is greater than 637adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code dsts.length - offset}. 638f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * @throws java.nio.ReadOnlyBufferException 639adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if one of the destination buffers is read-only. 640adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 641adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code src}, {@code dsts}, or one of the entries in 642adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code dsts} is {@code null}. 643adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalStateException 644adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the engine does not have all the needed settings (e.g. 645adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * client/server mode not set). 646adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 6470c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom public abstract SSLEngineResult unwrap(ByteBuffer src, 6480c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom ByteBuffer[] dsts, 6490c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom int offset, 6500c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom int length) throws SSLException; 651adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 652adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 653adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Encodes the outgoing application data buffers into the network data 654adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * buffer. If a handshake has not been started yet, it will automatically be 655adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * started. 656f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 657adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param srcs 658adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the array of source buffers of outgoing application data. 659adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param offset 660adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the offset in the array of source buffers from which data is 661adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * to be retrieved. 662adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param length 663adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the maximum number of source buffers to be used. 664adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param dst 665adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the destination buffer for network data. 666adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the result object of this operation. 667adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SSLException 668adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if a problem occurred while processing the data. 669adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IndexOutOfBoundsException 670adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code length} is greater than 671adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code srcs.length - offset}. 672f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * @throws java.nio.ReadOnlyBufferException 673adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the destination buffer is readonly. 674adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 675adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code srcs}, {@code dst}, or one the entries in 676adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code srcs} is {@code null}. 677adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalStateException 678adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the engine does not have all the needed settings (e.g. 679adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * client/server mode not set). 680adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 681f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson public abstract SSLEngineResult wrap(ByteBuffer[] srcs, int offset, int length, ByteBuffer dst) 682f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson throws SSLException; 683adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 684adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 685adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Decodes the incoming network data buffer into the application data 686adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * buffer. If a handshake has not been started yet, it will automatically be 687adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * started. 688f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 689adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param src 690adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the buffer with incoming network data 691adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param dst 692adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the destination buffer for incoming application data. 693adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the result object of this operation. 694adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SSLException 695adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if a problem occurred while processing the data. 696f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * @throws java.nio.ReadOnlyBufferException 697adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if one of the destination buffers is read-only. 698adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 699adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code src} or {@code dst} is {@code null}. 700adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalStateException 701adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the engine does not have all the needed settings (e.g. 702adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * client/server mode not set). 703f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson */ 704f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson public SSLEngineResult unwrap(ByteBuffer src, ByteBuffer dst) throws SSLException { 705adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return unwrap(src, new ByteBuffer[] { dst }, 0, 1); 706adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 707adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 708adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 709adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Decodes the incoming network data buffer into the application data 710adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * buffers. If a handshake has not been started yet, it will automatically 711adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * be started. 712f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 713adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param src 714adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the buffer with incoming network data 715adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param dsts 716adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the array of destination buffers for incoming application 717adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * data. 718adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the result object of this operation. 719adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SSLException 720adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if a problem occurred while processing the data. 721f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * @throws java.nio.ReadOnlyBufferException 722adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if one of the destination buffers is read-only. 723adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 724adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code src} or {@code dsts} is {@code null}. 725adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalStateException 726adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the engine does not have all the needed settings (e.g. 727adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * client/server mode not set). 728adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 729f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson public SSLEngineResult unwrap(ByteBuffer src, ByteBuffer[] dsts) throws SSLException { 730adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (dsts == null) { 731adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalArgumentException("Byte buffer array dsts is null"); 732adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 733adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return unwrap(src, dsts, 0, dsts.length); 734adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 735adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 736adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 737adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Encodes the outgoing application data buffers into the network data 738adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * buffer. If a handshake has not been started yet, it will automatically be 739adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * started. 740f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 741adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param srcs 742adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the array of source buffers of outgoing application data. 743adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param dst 744adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the destination buffer for network data. 745adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the result object of this operation. 746adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SSLException 747adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if a problem occurred while processing the data. 748f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * @throws java.nio.ReadOnlyBufferException 749adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the destination buffer is readonly. 750adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 751adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code srcs} or {@code dst} is {@code null}. 752adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalStateException 753adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the engine does not have all the needed settings (e.g. 754adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * client/server mode not set). 755adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 756f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson public SSLEngineResult wrap(ByteBuffer[] srcs, ByteBuffer dst) throws SSLException { 757adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (srcs == null) { 758adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalArgumentException("Byte buffer array srcs is null"); 759adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 760adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return wrap(srcs, 0, srcs.length, dst); 761adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 762adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 763adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 764adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Encodes the outgoing application data buffer into the network data 765adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * buffer. If a handshake has not been started yet, it will automatically be 766adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * started. 767f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 768adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param src 769adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the source buffers of outgoing application data. 770adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param dst 771adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the destination buffer for network data. 772adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the result object of this operation. 773adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SSLException 774adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if a problem occurred while processing the data. 775f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * @throws java.nio.ReadOnlyBufferException 776adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the destination buffer is readonly. 777adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 778adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code src} or {@code dst} is {@code null}. 779adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalStateException 780adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the engine does not have all the needed settings (e.g. 781adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * client/server mode not set). 782f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson */ 783f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson public SSLEngineResult wrap(ByteBuffer src, ByteBuffer dst) throws SSLException { 784adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return wrap(new ByteBuffer[] { src }, 0, 1, dst); 785adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 7860c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom 7870c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom /** 7880c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom * Returns a new SSLParameters based on this SSLSocket's current 7890c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom * cipher suites, protocols, and client authentication settings. 7900c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom * 7910c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom * @since 1.6 7920c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom */ 7930c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom public SSLParameters getSSLParameters() { 7940c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom SSLParameters p = new SSLParameters(); 7950c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom p.setCipherSuites(getEnabledCipherSuites()); 7960c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom p.setProtocols(getEnabledProtocols()); 7970c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom p.setNeedClientAuth(getNeedClientAuth()); 7980c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom p.setWantClientAuth(getWantClientAuth()); 7990c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom return p; 8000c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom } 8010c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom 8020c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom /** 8030c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom * Sets various SSL handshake parameters based on the SSLParameter 8040c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom * argument. Specifically, sets the SSLEngine's enabled cipher 8050c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom * suites if the parameter's cipher suites are non-null. Similarly 8060c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom * sets the enabled protocols. If the parameters specify the want 8070c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom * or need for client authentication, those requirements are set 8080c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom * on the SSLEngine, otherwise both are set to false. 8090c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom * @since 1.6 8100c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom */ 8110c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom public void setSSLParameters(SSLParameters p) { 8120c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom String[] cipherSuites = p.getCipherSuites(); 8130c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom if (cipherSuites != null) { 8140c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom setEnabledCipherSuites(cipherSuites); 8150c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom } 8160c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom String[] protocols = p.getProtocols(); 8170c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom if (protocols != null) { 8180c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom setEnabledProtocols(protocols); 8190c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom } 8200c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom if (p.getNeedClientAuth()) { 8210c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom setNeedClientAuth(true); 8220c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom } else if (p.getWantClientAuth()) { 8230c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom setWantClientAuth(true); 8240c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom } else { 8250c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom setWantClientAuth(false); 8260c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom } 8270c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom } 828adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 829