Hex Artifact Content
Not logged in

Artifact f8205767037b0e08b90b63f3da74379f4d2f174b:


0000: 2f 2a 20 6f 77 6e 43 6c 6f 75 64 20 41 6e 64 72  /* ownCloud Andr
0010: 6f 69 64 20 4c 69 62 72 61 72 79 20 69 73 20 61  oid Library is a
0020: 76 61 69 6c 61 62 6c 65 20 75 6e 64 65 72 20 4d  vailable under M
0030: 49 54 20 6c 69 63 65 6e 73 65 0a 20 2a 20 20 20  IT license. *   
0040: 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 32 30  Copyright (C) 20
0050: 31 35 20 6f 77 6e 43 6c 6f 75 64 20 49 6e 63 2e  15 ownCloud Inc.
0060: 0a 20 2a 20 20 20 0a 20 2a 20 20 20 50 65 72 6d  . *   . *   Perm
0070: 69 73 73 69 6f 6e 20 69 73 20 68 65 72 65 62 79  ission is hereby
0080: 20 67 72 61 6e 74 65 64 2c 20 66 72 65 65 20 6f   granted, free o
0090: 66 20 63 68 61 72 67 65 2c 20 74 6f 20 61 6e 79  f charge, to any
00a0: 20 70 65 72 73 6f 6e 20 6f 62 74 61 69 6e 69 6e   person obtainin
00b0: 67 20 61 20 63 6f 70 79 0a 20 2a 20 20 20 6f 66  g a copy. *   of
00c0: 20 74 68 69 73 20 73 6f 66 74 77 61 72 65 20 61   this software a
00d0: 6e 64 20 61 73 73 6f 63 69 61 74 65 64 20 64 6f  nd associated do
00e0: 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 69 6c 65  cumentation file
00f0: 73 20 28 74 68 65 20 22 53 6f 66 74 77 61 72 65  s (the "Software
0100: 22 29 2c 20 74 6f 20 64 65 61 6c 0a 20 2a 20 20  "), to deal. *  
0110: 20 69 6e 20 74 68 65 20 53 6f 66 74 77 61 72 65   in the Software
0120: 20 77 69 74 68 6f 75 74 20 72 65 73 74 72 69 63   without restric
0130: 74 69 6f 6e 2c 20 69 6e 63 6c 75 64 69 6e 67 20  tion, including 
0140: 77 69 74 68 6f 75 74 20 6c 69 6d 69 74 61 74 69  without limitati
0150: 6f 6e 20 74 68 65 20 72 69 67 68 74 73 0a 20 2a  on the rights. *
0160: 20 20 20 74 6f 20 75 73 65 2c 20 63 6f 70 79 2c     to use, copy,
0170: 20 6d 6f 64 69 66 79 2c 20 6d 65 72 67 65 2c 20   modify, merge, 
0180: 70 75 62 6c 69 73 68 2c 20 64 69 73 74 72 69 62  publish, distrib
0190: 75 74 65 2c 20 73 75 62 6c 69 63 65 6e 73 65 2c  ute, sublicense,
01a0: 20 61 6e 64 2f 6f 72 20 73 65 6c 6c 0a 20 2a 20   and/or sell. * 
01b0: 20 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20    copies of the 
01c0: 53 6f 66 74 77 61 72 65 2c 20 61 6e 64 20 74 6f  Software, and to
01d0: 20 70 65 72 6d 69 74 20 70 65 72 73 6f 6e 73 20   permit persons 
01e0: 74 6f 20 77 68 6f 6d 20 74 68 65 20 53 6f 66 74  to whom the Soft
01f0: 77 61 72 65 20 69 73 0a 20 2a 20 20 20 66 75 72  ware is. *   fur
0200: 6e 69 73 68 65 64 20 74 6f 20 64 6f 20 73 6f 2c  nished to do so,
0210: 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20   subject to the 
0220: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 64 69 74  following condit
0230: 69 6f 6e 73 3a 0a 20 2a 20 20 20 0a 20 2a 20 20  ions:. *   . *  
0240: 20 54 68 65 20 61 62 6f 76 65 20 63 6f 70 79 72   The above copyr
0250: 69 67 68 74 20 6e 6f 74 69 63 65 20 61 6e 64 20  ight notice and 
0260: 74 68 69 73 20 70 65 72 6d 69 73 73 69 6f 6e 20  this permission 
0270: 6e 6f 74 69 63 65 20 73 68 61 6c 6c 20 62 65 20  notice shall be 
0280: 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 2a 20 20  included in. *  
0290: 20 61 6c 6c 20 63 6f 70 69 65 73 20 6f 72 20 73   all copies or s
02a0: 75 62 73 74 61 6e 74 69 61 6c 20 70 6f 72 74 69  ubstantial porti
02b0: 6f 6e 73 20 6f 66 20 74 68 65 20 53 6f 66 74 77  ons of the Softw
02c0: 61 72 65 2e 0a 20 2a 20 20 20 0a 20 2a 20 20 20  are.. *   . *   
02d0: 54 48 45 20 53 4f 46 54 57 41 52 45 20 49 53 20  THE SOFTWARE IS 
02e0: 50 52 4f 56 49 44 45 44 20 22 41 53 20 49 53 22  PROVIDED "AS IS"
02f0: 2c 20 57 49 54 48 4f 55 54 20 57 41 52 52 41 4e  , WITHOUT WARRAN
0300: 54 59 20 4f 46 20 41 4e 59 20 4b 49 4e 44 2c 20  TY OF ANY KIND, 
0310: 0a 20 2a 20 20 20 45 58 50 52 45 53 53 20 4f 52  . *   EXPRESS OR
0320: 20 49 4d 50 4c 49 45 44 2c 20 49 4e 43 4c 55 44   IMPLIED, INCLUD
0330: 49 4e 47 20 42 55 54 20 4e 4f 54 20 4c 49 4d 49  ING BUT NOT LIMI
0340: 54 45 44 20 54 4f 20 54 48 45 20 57 41 52 52 41  TED TO THE WARRA
0350: 4e 54 49 45 53 20 4f 46 0a 20 2a 20 20 20 4d 45  NTIES OF. *   ME
0360: 52 43 48 41 4e 54 41 42 49 4c 49 54 59 2c 20 46  RCHANTABILITY, F
0370: 49 54 4e 45 53 53 20 46 4f 52 20 41 20 50 41 52  ITNESS FOR A PAR
0380: 54 49 43 55 4c 41 52 20 50 55 52 50 4f 53 45 20  TICULAR PURPOSE 
0390: 41 4e 44 20 0a 20 2a 20 20 20 4e 4f 4e 49 4e 46  AND . *   NONINF
03a0: 52 49 4e 47 45 4d 45 4e 54 2e 20 49 4e 20 4e 4f  RINGEMENT. IN NO
03b0: 20 45 56 45 4e 54 20 53 48 41 4c 4c 20 54 48 45   EVENT SHALL THE
03c0: 20 41 55 54 48 4f 52 53 20 4f 52 20 43 4f 50 59   AUTHORS OR COPY
03d0: 52 49 47 48 54 20 48 4f 4c 44 45 52 53 20 0a 20  RIGHT HOLDERS . 
03e0: 2a 20 20 20 42 45 20 4c 49 41 42 4c 45 20 46 4f  *   BE LIABLE FO
03f0: 52 20 41 4e 59 20 43 4c 41 49 4d 2c 20 44 41 4d  R ANY CLAIM, DAM
0400: 41 47 45 53 20 4f 52 20 4f 54 48 45 52 20 4c 49  AGES OR OTHER LI
0410: 41 42 49 4c 49 54 59 2c 20 57 48 45 54 48 45 52  ABILITY, WHETHER
0420: 20 49 4e 20 41 4e 20 0a 20 2a 20 20 20 41 43 54   IN AN . *   ACT
0430: 49 4f 4e 20 4f 46 20 43 4f 4e 54 52 41 43 54 2c  ION OF CONTRACT,
0440: 20 54 4f 52 54 20 4f 52 20 4f 54 48 45 52 57 49   TORT OR OTHERWI
0450: 53 45 2c 20 41 52 49 53 49 4e 47 20 46 52 4f 4d  SE, ARISING FROM
0460: 2c 20 4f 55 54 20 4f 46 20 4f 52 20 49 4e 20 0a  , OUT OF OR IN .
0470: 20 2a 20 20 20 43 4f 4e 4e 45 43 54 49 4f 4e 20   *   CONNECTION 
0480: 57 49 54 48 20 54 48 45 20 53 4f 46 54 57 41 52  WITH THE SOFTWAR
0490: 45 20 4f 52 20 54 48 45 20 55 53 45 20 4f 52 20  E OR THE USE OR 
04a0: 4f 54 48 45 52 20 44 45 41 4c 49 4e 47 53 20 49  OTHER DEALINGS I
04b0: 4e 0a 20 2a 20 20 20 54 48 45 20 53 4f 46 54 57  N. *   THE SOFTW
04c0: 41 52 45 2e 0a 20 2a 0a 20 2a 2f 0a 0a 70 61 63  ARE.. *. */..pac
04d0: 6b 61 67 65 20 63 6f 6d 2e 6f 77 6e 63 6c 6f 75  kage com.ownclou
04e0: 64 2e 61 6e 64 72 6f 69 64 2e 6c 69 62 2e 63 6f  d.android.lib.co
04f0: 6d 6d 6f 6e 2e 6e 65 74 77 6f 72 6b 3b 0a 0a 69  mmon.network;..i
0500: 6d 70 6f 72 74 20 63 6f 6d 2e 6f 77 6e 63 6c 6f  mport com.ownclo
0510: 75 64 2e 61 6e 64 72 6f 69 64 2e 6c 69 62 2e 63  ud.android.lib.c
0520: 6f 6d 6d 6f 6e 2e 75 74 69 6c 73 2e 4c 6f 67 5f  ommon.utils.Log_
0530: 4f 43 3b 0a 0a 69 6d 70 6f 72 74 20 6f 72 67 2e  OC;..import org.
0540: 61 70 61 63 68 65 2e 63 6f 6d 6d 6f 6e 73 2e 68  apache.commons.h
0550: 74 74 70 63 6c 69 65 6e 74 2e 43 6f 6e 6e 65 63  ttpclient.Connec
0560: 74 54 69 6d 65 6f 75 74 45 78 63 65 70 74 69 6f  tTimeoutExceptio
0570: 6e 3b 0a 69 6d 70 6f 72 74 20 6f 72 67 2e 61 70  n;.import org.ap
0580: 61 63 68 65 2e 63 6f 6d 6d 6f 6e 73 2e 68 74 74  ache.commons.htt
0590: 70 63 6c 69 65 6e 74 2e 70 61 72 61 6d 73 2e 48  pclient.params.H
05a0: 74 74 70 43 6f 6e 6e 65 63 74 69 6f 6e 50 61 72  ttpConnectionPar
05b0: 61 6d 73 3b 0a 69 6d 70 6f 72 74 20 6f 72 67 2e  ams;.import org.
05c0: 61 70 61 63 68 65 2e 63 6f 6d 6d 6f 6e 73 2e 68  apache.commons.h
05d0: 74 74 70 63 6c 69 65 6e 74 2e 70 72 6f 74 6f 63  ttpclient.protoc
05e0: 6f 6c 2e 50 72 6f 74 6f 63 6f 6c 53 6f 63 6b 65  ol.ProtocolSocke
05f0: 74 46 61 63 74 6f 72 79 3b 0a 69 6d 70 6f 72 74  tFactory;.import
0600: 20 6f 72 67 2e 61 70 61 63 68 65 2e 63 6f 6d 6d   org.apache.comm
0610: 6f 6e 73 2e 68 74 74 70 63 6c 69 65 6e 74 2e 70  ons.httpclient.p
0620: 72 6f 74 6f 63 6f 6c 2e 53 65 63 75 72 65 50 72  rotocol.SecurePr
0630: 6f 74 6f 63 6f 6c 53 6f 63 6b 65 74 46 61 63 74  otocolSocketFact
0640: 6f 72 79 3b 0a 69 6d 70 6f 72 74 20 6f 72 67 2e  ory;.import org.
0650: 61 70 61 63 68 65 2e 68 74 74 70 2e 63 6f 6e 6e  apache.http.conn
0660: 2e 73 73 6c 2e 58 35 30 39 48 6f 73 74 6e 61 6d  .ssl.X509Hostnam
0670: 65 56 65 72 69 66 69 65 72 3b 0a 0a 69 6d 70 6f  eVerifier;..impo
0680: 72 74 20 6a 61 76 61 2e 69 6f 2e 49 4f 45 78 63  rt java.io.IOExc
0690: 65 70 74 69 6f 6e 3b 0a 69 6d 70 6f 72 74 20 6a  eption;.import j
06a0: 61 76 61 2e 6e 65 74 2e 49 6e 65 74 34 41 64 64  ava.net.Inet4Add
06b0: 72 65 73 73 3b 0a 69 6d 70 6f 72 74 20 6a 61 76  ress;.import jav
06c0: 61 2e 6e 65 74 2e 49 6e 65 74 36 41 64 64 72 65  a.net.Inet6Addre
06d0: 73 73 3b 0a 69 6d 70 6f 72 74 20 6a 61 76 61 2e  ss;.import java.
06e0: 6e 65 74 2e 49 6e 65 74 41 64 64 72 65 73 73 3b  net.InetAddress;
06f0: 0a 69 6d 70 6f 72 74 20 6a 61 76 61 2e 6e 65 74  .import java.net
0700: 2e 49 6e 65 74 53 6f 63 6b 65 74 41 64 64 72 65  .InetSocketAddre
0710: 73 73 3b 0a 69 6d 70 6f 72 74 20 6a 61 76 61 2e  ss;.import java.
0720: 6e 65 74 2e 53 6f 63 6b 65 74 3b 0a 69 6d 70 6f  net.Socket;.impo
0730: 72 74 20 6a 61 76 61 2e 6e 65 74 2e 53 6f 63 6b  rt java.net.Sock
0740: 65 74 41 64 64 72 65 73 73 3b 0a 69 6d 70 6f 72  etAddress;.impor
0750: 74 20 6a 61 76 61 2e 6e 65 74 2e 55 6e 6b 6e 6f  t java.net.Unkno
0760: 77 6e 48 6f 73 74 45 78 63 65 70 74 69 6f 6e 3b  wnHostException;
0770: 0a 69 6d 70 6f 72 74 20 6a 61 76 61 2e 73 65 63  .import java.sec
0780: 75 72 69 74 79 2e 63 65 72 74 2e 58 35 30 39 43  urity.cert.X509C
0790: 65 72 74 69 66 69 63 61 74 65 3b 0a 0a 69 6d 70  ertificate;..imp
07a0: 6f 72 74 20 6a 61 76 61 78 2e 6e 65 74 2e 53 6f  ort javax.net.So
07b0: 63 6b 65 74 46 61 63 74 6f 72 79 3b 0a 69 6d 70  cketFactory;.imp
07c0: 6f 72 74 20 6a 61 76 61 78 2e 6e 65 74 2e 73 73  ort javax.net.ss
07d0: 6c 2e 53 53 4c 43 6f 6e 74 65 78 74 3b 0a 69 6d  l.SSLContext;.im
07e0: 70 6f 72 74 20 6a 61 76 61 78 2e 6e 65 74 2e 73  port javax.net.s
07f0: 73 6c 2e 53 53 4c 45 78 63 65 70 74 69 6f 6e 3b  sl.SSLException;
0800: 0a 69 6d 70 6f 72 74 20 6a 61 76 61 78 2e 6e 65  .import javax.ne
0810: 74 2e 73 73 6c 2e 53 53 4c 48 61 6e 64 73 68 61  t.ssl.SSLHandsha
0820: 6b 65 45 78 63 65 70 74 69 6f 6e 3b 0a 69 6d 70  keException;.imp
0830: 6f 72 74 20 6a 61 76 61 78 2e 6e 65 74 2e 73 73  ort javax.net.ss
0840: 6c 2e 53 53 4c 50 61 72 61 6d 65 74 65 72 73 3b  l.SSLParameters;
0850: 0a 69 6d 70 6f 72 74 20 6a 61 76 61 78 2e 6e 65  .import javax.ne
0860: 74 2e 73 73 6c 2e 53 53 4c 50 65 65 72 55 6e 76  t.ssl.SSLPeerUnv
0870: 65 72 69 66 69 65 64 45 78 63 65 70 74 69 6f 6e  erifiedException
0880: 3b 0a 69 6d 70 6f 72 74 20 6a 61 76 61 78 2e 6e  ;.import javax.n
0890: 65 74 2e 73 73 6c 2e 53 53 4c 53 65 73 73 69 6f  et.ssl.SSLSessio
08a0: 6e 3b 0a 69 6d 70 6f 72 74 20 6a 61 76 61 78 2e  n;.import javax.
08b0: 6e 65 74 2e 73 73 6c 2e 53 53 4c 53 6f 63 6b 65  net.ssl.SSLSocke
08c0: 74 3b 0a 0a 0a 2f 2a 2a 0a 20 2a 20 41 64 76 61  t;.../**. * Adva
08d0: 6e 63 65 64 53 53 4c 50 72 6f 74 6f 63 6f 6c 53  ncedSSLProtocolS
08e0: 6f 63 6b 65 74 46 61 63 74 6f 72 79 20 61 6c 6c  ocketFactory all
08f0: 6f 77 73 20 74 6f 20 63 72 65 61 74 65 20 53 53  ows to create SS
0900: 4c 20 7b 40 6c 69 6e 6b 20 53 6f 63 6b 65 74 7d  L {@link Socket}
0910: 73 20 77 69 74 68 0a 20 2a 20 61 20 63 75 73 74  s with. * a cust
0920: 6f 6d 20 53 53 4c 43 6f 6e 74 65 78 74 20 61 6e  om SSLContext an
0930: 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 48 6f  d an optional Ho
0940: 73 74 6e 61 6d 65 20 56 65 72 69 66 69 65 72 2e  stname Verifier.
0950: 0a 20 2a 0a 20 2a 20 40 61 75 74 68 6f 72 20 44  . *. * @author D
0960: 61 76 69 64 20 41 2e 20 56 65 6c 61 73 63 6f 0a  avid A. Velasco.
0970: 20 2a 2f 0a 0a 70 75 62 6c 69 63 20 63 6c 61 73   */..public clas
0980: 73 20 41 64 76 61 6e 63 65 64 53 73 6c 53 6f 63  s AdvancedSslSoc
0990: 6b 65 74 46 61 63 74 6f 72 79 20 69 6d 70 6c 65  ketFactory imple
09a0: 6d 65 6e 74 73 20 53 65 63 75 72 65 50 72 6f 74  ments SecureProt
09b0: 6f 63 6f 6c 53 6f 63 6b 65 74 46 61 63 74 6f 72  ocolSocketFactor
09c0: 79 20 7b 0a 0a 20 20 20 20 70 72 69 76 61 74 65  y {..    private
09d0: 20 73 74 61 74 69 63 20 66 69 6e 61 6c 20 53 74   static final St
09e0: 72 69 6e 67 20 54 41 47 20 3d 20 41 64 76 61 6e  ring TAG = Advan
09f0: 63 65 64 53 73 6c 53 6f 63 6b 65 74 46 61 63 74  cedSslSocketFact
0a00: 6f 72 79 2e 63 6c 61 73 73 2e 67 65 74 53 69 6d  ory.class.getSim
0a10: 70 6c 65 4e 61 6d 65 28 29 3b 0a 0a 20 20 20 20  pleName();..    
0a20: 70 72 69 76 61 74 65 20 53 53 4c 43 6f 6e 74 65  private SSLConte
0a30: 78 74 20 6d 53 73 6c 43 6f 6e 74 65 78 74 20 3d  xt mSslContext =
0a40: 20 6e 75 6c 6c 3b 0a 20 20 20 20 70 72 69 76 61   null;.    priva
0a50: 74 65 20 41 64 76 61 6e 63 65 64 58 35 30 39 54  te AdvancedX509T
0a60: 72 75 73 74 4d 61 6e 61 67 65 72 20 6d 54 72 75  rustManager mTru
0a70: 73 74 4d 61 6e 61 67 65 72 20 3d 20 6e 75 6c 6c  stManager = null
0a80: 3b 0a 20 20 20 20 70 72 69 76 61 74 65 20 58 35  ;.    private X5
0a90: 30 39 48 6f 73 74 6e 61 6d 65 56 65 72 69 66 69  09HostnameVerifi
0aa0: 65 72 20 6d 48 6f 73 74 6e 61 6d 65 56 65 72 69  er mHostnameVeri
0ab0: 66 69 65 72 20 3d 20 6e 75 6c 6c 3b 0a 0a 20 20  fier = null;..  
0ac0: 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 43 6f 6e    /**.     * Con
0ad0: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 41 64 76  structor for Adv
0ae0: 61 6e 63 65 64 53 53 4c 50 72 6f 74 6f 63 6f 6c  ancedSSLProtocol
0af0: 53 6f 63 6b 65 74 46 61 63 74 6f 72 79 2e 0a 20  SocketFactory.. 
0b00: 20 20 20 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69      */.    publi
0b10: 63 20 41 64 76 61 6e 63 65 64 53 73 6c 53 6f 63  c AdvancedSslSoc
0b20: 6b 65 74 46 61 63 74 6f 72 79 28 0a 20 20 20 20  ketFactory(.    
0b30: 20 20 20 20 20 20 20 20 53 53 4c 43 6f 6e 74 65          SSLConte
0b40: 78 74 20 73 73 6c 43 6f 6e 74 65 78 74 2c 20 41  xt sslContext, A
0b50: 64 76 61 6e 63 65 64 58 35 30 39 54 72 75 73 74  dvancedX509Trust
0b60: 4d 61 6e 61 67 65 72 20 74 72 75 73 74 4d 61 6e  Manager trustMan
0b70: 61 67 65 72 2c 20 58 35 30 39 48 6f 73 74 6e 61  ager, X509Hostna
0b80: 6d 65 56 65 72 69 66 69 65 72 20 68 6f 73 74 6e  meVerifier hostn
0b90: 61 6d 65 56 65 72 69 66 69 65 72 0a 20 20 20 20  ameVerifier.    
0ba0: 29 20 7b 0a 0a 20 20 20 20 20 20 20 20 69 66 20  ) {..        if 
0bb0: 28 73 73 6c 43 6f 6e 74 65 78 74 20 3d 3d 20 6e  (sslContext == n
0bc0: 75 6c 6c 29 0a 20 20 20 20 20 20 20 20 20 20 20  ull).           
0bd0: 20 74 68 72 6f 77 20 6e 65 77 20 49 6c 6c 65 67   throw new Illeg
0be0: 61 6c 41 72 67 75 6d 65 6e 74 45 78 63 65 70 74  alArgumentExcept
0bf0: 69 6f 6e 28 22 41 64 76 61 6e 63 65 64 53 73 6c  ion("AdvancedSsl
0c00: 53 6f 63 6b 65 74 46 61 63 74 6f 72 79 20 63 61  SocketFactory ca
0c10: 6e 20 6e 6f 74 20 62 65 20 63 72 65 61 74 65 64  n not be created
0c20: 20 77 69 74 68 20 61 20 6e 75 6c 6c 20 53 53 4c   with a null SSL
0c30: 43 6f 6e 74 65 78 74 22 29 3b 0a 20 20 20 20 20  Context");.     
0c40: 20 20 20 69 66 20 28 74 72 75 73 74 4d 61 6e 61     if (trustMana
0c50: 67 65 72 20 3d 3d 20 6e 75 6c 6c 20 26 26 20 6d  ger == null && m
0c60: 48 6f 73 74 6e 61 6d 65 56 65 72 69 66 69 65 72  HostnameVerifier
0c70: 20 21 3d 20 6e 75 6c 6c 29 0a 20 20 20 20 20 20   != null).      
0c80: 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20        throw new 
0c90: 49 6c 6c 65 67 61 6c 41 72 67 75 6d 65 6e 74 45  IllegalArgumentE
0ca0: 78 63 65 70 74 69 6f 6e 28 0a 20 20 20 20 20 20  xception(.      
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 41                "A
0cc0: 64 76 61 6e 63 65 64 53 73 6c 53 6f 63 6b 65 74  dvancedSslSocket
0cd0: 46 61 63 74 6f 72 79 20 63 61 6e 20 6e 6f 74 20  Factory can not 
0ce0: 62 65 20 63 72 65 61 74 65 64 20 77 69 74 68 20  be created with 
0cf0: 61 20 6e 75 6c 6c 20 54 72 75 73 74 20 4d 61 6e  a null Trust Man
0d00: 61 67 65 72 20 61 6e 64 20 61 20 22 20 2b 0a 20  ager and a " +. 
0d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d20: 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f 74 20             "not 
0d30: 6e 75 6c 6c 20 48 6f 73 74 6e 61 6d 65 20 56 65  null Hostname Ve
0d40: 72 69 66 69 65 72 22 0a 20 20 20 20 20 20 20 20  rifier".        
0d50: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 6d      );.        m
0d60: 53 73 6c 43 6f 6e 74 65 78 74 20 3d 20 73 73 6c  SslContext = ssl
0d70: 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 20  Context;.       
0d80: 20 6d 54 72 75 73 74 4d 61 6e 61 67 65 72 20 3d   mTrustManager =
0d90: 20 74 72 75 73 74 4d 61 6e 61 67 65 72 3b 0a 20   trustManager;. 
0da0: 20 20 20 20 20 20 20 6d 48 6f 73 74 6e 61 6d 65         mHostname
0db0: 56 65 72 69 66 69 65 72 20 3d 20 68 6f 73 74 6e  Verifier = hostn
0dc0: 61 6d 65 56 65 72 69 66 69 65 72 3b 0a 20 20 20  ameVerifier;.   
0dd0: 20 7d 0a 0a 20 20 20 20 70 75 62 6c 69 63 20 53   }..    public S
0de0: 53 4c 43 6f 6e 74 65 78 74 20 67 65 74 53 73 6c  SLContext getSsl
0df0: 43 6f 6e 74 65 78 74 28 29 20 7b 0a 20 20 20 20  Context() {.    
0e00: 20 20 20 20 72 65 74 75 72 6e 20 6d 53 73 6c 43      return mSslC
0e10: 6f 6e 74 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20  ontext;.    }.. 
0e20: 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 40 73     /**.     * @s
0e30: 65 65 20 50 72 6f 74 6f 63 6f 6c 53 6f 63 6b 65  ee ProtocolSocke
0e40: 74 46 61 63 74 6f 72 79 23 63 72 65 61 74 65 53  tFactory#createS
0e50: 6f 63 6b 65 74 28 6a 61 76 61 2e 6c 61 6e 67 2e  ocket(java.lang.
0e60: 53 74 72 69 6e 67 2c 20 69 6e 74 2c 20 6a 61 76  String, int, jav
0e70: 61 2e 6e 65 74 2e 49 6e 65 74 41 64 64 72 65 73  a.net.InetAddres
0e80: 73 2c 20 69 6e 74 29 0a 20 20 20 20 20 2a 2f 0a  s, int).     */.
0e90: 20 20 20 20 40 4f 76 65 72 72 69 64 65 0a 20 20      @Override.  
0ea0: 20 20 70 75 62 6c 69 63 20 53 6f 63 6b 65 74 20    public Socket 
0eb0: 63 72 65 61 74 65 53 6f 63 6b 65 74 28 53 74 72  createSocket(Str
0ec0: 69 6e 67 20 68 6f 73 74 2c 20 69 6e 74 20 70 6f  ing host, int po
0ed0: 72 74 2c 20 49 6e 65 74 41 64 64 72 65 73 73 20  rt, InetAddress 
0ee0: 63 6c 69 65 6e 74 48 6f 73 74 2c 20 69 6e 74 20  clientHost, int 
0ef0: 63 6c 69 65 6e 74 50 6f 72 74 29 0a 20 20 20 20  clientPort).    
0f00: 20 20 20 20 20 20 20 20 74 68 72 6f 77 73 20 49          throws I
0f10: 4f 45 78 63 65 70 74 69 6f 6e 20 7b 0a 0a 20 20  OException {..  
0f20: 20 20 20 20 20 20 53 6f 63 6b 65 74 20 73 6f 63        Socket soc
0f30: 6b 65 74 20 3d 20 6d 53 73 6c 43 6f 6e 74 65 78  ket = mSslContex
0f40: 74 2e 67 65 74 53 6f 63 6b 65 74 46 61 63 74 6f  t.getSocketFacto
0f50: 72 79 28 29 2e 63 72 65 61 74 65 53 6f 63 6b 65  ry().createSocke
0f60: 74 28 67 65 74 49 6e 65 74 41 64 64 72 65 73 73  t(getInetAddress
0f70: 46 6f 72 48 6f 73 74 28 68 6f 73 74 29 2c 20 70  ForHost(host), p
0f80: 6f 72 74 2c 20 63 6c 69 65 6e 74 48 6f 73 74 2c  ort, clientHost,
0f90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0fa0: 20 63 6c 69 65 6e 74 50 6f 72 74 29 3b 0a 20 20   clientPort);.  
0fb0: 20 20 20 20 20 20 65 6e 61 62 6c 65 53 65 63 75        enableSecu
0fc0: 72 65 50 72 6f 74 6f 63 6f 6c 73 28 73 6f 63 6b  reProtocols(sock
0fd0: 65 74 29 3b 0a 20 20 20 20 20 20 20 20 76 65 72  et);.        ver
0fe0: 69 66 79 50 65 65 72 49 64 65 6e 74 69 74 79 28  ifyPeerIdentity(
0ff0: 68 6f 73 74 2c 20 70 6f 72 74 2c 20 73 6f 63 6b  host, port, sock
1000: 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  et);.        ret
1010: 75 72 6e 20 73 6f 63 6b 65 74 3b 0a 20 20 20 20  urn socket;.    
1020: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 70 72  }..    /*.    pr
1030: 69 76 61 74 65 20 76 6f 69 64 20 6c 6f 67 53 73  ivate void logSs
1040: 6c 49 6e 66 6f 28 29 20 7b 0a 20 20 20 20 09 69  lInfo() {.    .i
1050: 66 20 28 42 75 69 6c 64 2e 56 45 52 53 49 4f 4e  f (Build.VERSION
1060: 2e 53 44 4b 5f 49 4e 54 20 3e 20 42 75 69 6c 64  .SDK_INT > Build
1070: 2e 56 45 52 53 49 4f 4e 5f 43 4f 44 45 53 2e 46  .VERSION_CODES.F
1080: 52 4f 59 4f 29 20 7b 0a 09 20 20 20 20 09 4c 6f  ROYO) {..    .Lo
1090: 67 5f 4f 43 2e 76 28 54 41 47 2c 20 22 53 55 50  g_OC.v(TAG, "SUP
10a0: 50 4f 52 54 45 44 20 53 53 4c 20 50 41 52 41 4d  PORTED SSL PARAM
10b0: 45 54 45 52 53 22 29 3b 0a 09 20 20 20 20 09 6c  ETERS");..    .l
10c0: 6f 67 53 73 6c 50 61 72 61 6d 65 74 65 72 73 28  ogSslParameters(
10d0: 6d 53 73 6c 43 6f 6e 74 65 78 74 2e 67 65 74 53  mSslContext.getS
10e0: 75 70 70 6f 72 74 65 64 53 53 4c 50 61 72 61 6d  upportedSSLParam
10f0: 65 74 65 72 73 28 29 29 3b 0a 09 20 20 20 20 09  eters());..    .
1100: 4c 6f 67 5f 4f 43 2e 76 28 54 41 47 2c 20 22 44  Log_OC.v(TAG, "D
1110: 45 46 41 55 4c 54 20 53 53 4c 20 50 41 52 41 4d  EFAULT SSL PARAM
1120: 45 54 45 52 53 22 29 3b 0a 09 20 20 20 20 09 6c  ETERS");..    .l
1130: 6f 67 53 73 6c 50 61 72 61 6d 65 74 65 72 73 28  ogSslParameters(
1140: 6d 53 73 6c 43 6f 6e 74 65 78 74 2e 67 65 74 44  mSslContext.getD
1150: 65 66 61 75 6c 74 53 53 4c 50 61 72 61 6d 65 74  efaultSSLParamet
1160: 65 72 73 28 29 29 3b 0a 09 20 20 20 20 09 4c 6f  ers());..    .Lo
1170: 67 5f 4f 43 2e 69 28 54 41 47 2c 20 22 43 55 52  g_OC.i(TAG, "CUR
1180: 52 45 4e 54 20 50 41 52 41 4d 45 54 45 52 53 22  RENT PARAMETERS"
1190: 29 3b 0a 09 20 20 20 20 09 4c 6f 67 5f 4f 43 2e  );..    .Log_OC.
11a0: 69 28 54 41 47 2c 20 22 50 72 6f 74 6f 63 6f 6c  i(TAG, "Protocol
11b0: 3a 20 22 20 2b 20 6d 53 73 6c 43 6f 6e 74 65 78  : " + mSslContex
11c0: 74 2e 67 65 74 50 72 6f 74 6f 63 6f 6c 28 29 29  t.getProtocol())
11d0: 3b 0a 20 20 20 20 09 7d 0a 20 20 20 20 09 4c 6f  ;.    .}.    .Lo
11e0: 67 5f 4f 43 2e 69 28 54 41 47 2c 20 22 50 52 4f  g_OC.i(TAG, "PRO
11f0: 56 49 44 45 52 22 29 3b 0a 20 20 20 20 09 6c 6f  VIDER");.    .lo
1200: 67 53 65 63 75 72 69 74 79 50 72 6f 76 69 64 65  gSecurityProvide
1210: 72 28 6d 53 73 6c 43 6f 6e 74 65 78 74 2e 67 65  r(mSslContext.ge
1220: 74 50 72 6f 76 69 64 65 72 28 29 29 3b 0a 09 7d  tProvider());..}
1230: 0a 20 20 20 20 0a 20 20 20 20 70 72 69 76 61 74  .    .    privat
1240: 65 20 76 6f 69 64 20 6c 6f 67 53 65 63 75 72 69  e void logSecuri
1250: 74 79 50 72 6f 76 69 64 65 72 28 50 72 6f 76 69  tyProvider(Provi
1260: 64 65 72 20 70 72 6f 76 69 64 65 72 29 20 7b 0a  der provider) {.
1270: 20 20 20 20 09 4c 6f 67 5f 4f 43 2e 69 28 54 41      .Log_OC.i(TA
1280: 47 2c 20 22 6e 61 6d 65 3a 20 22 20 2b 20 70 72  G, "name: " + pr
1290: 6f 76 69 64 65 72 2e 67 65 74 4e 61 6d 65 28 29  ovider.getName()
12a0: 29 3b 0a 20 20 20 20 09 4c 6f 67 5f 4f 43 2e 69  );.    .Log_OC.i
12b0: 28 54 41 47 2c 20 22 76 65 72 73 69 6f 6e 3a 20  (TAG, "version: 
12c0: 22 20 2b 20 70 72 6f 76 69 64 65 72 2e 67 65 74  " + provider.get
12d0: 56 65 72 73 69 6f 6e 28 29 29 3b 0a 20 20 20 20  Version());.    
12e0: 09 4c 6f 67 5f 4f 43 2e 69 28 54 41 47 2c 20 22  .Log_OC.i(TAG, "
12f0: 69 6e 66 6f 3a 20 22 20 2b 20 70 72 6f 76 69 64  info: " + provid
1300: 65 72 2e 67 65 74 49 6e 66 6f 28 29 29 3b 0a 20  er.getInfo());. 
1310: 20 20 20 09 45 6e 75 6d 65 72 61 74 69 6f 6e 3c     .Enumeration<
1320: 3f 3e 20 6b 65 79 73 20 3d 20 70 72 6f 76 69 64  ?> keys = provid
1330: 65 72 2e 70 72 6f 70 65 72 74 79 4e 61 6d 65 73  er.propertyNames
1340: 28 29 3b 0a 20 20 20 20 09 53 74 72 69 6e 67 20  ();.    .String 
1350: 6b 65 79 3b 0a 20 20 20 20 09 77 68 69 6c 65 20  key;.    .while 
1360: 28 6b 65 79 73 2e 68 61 73 4d 6f 72 65 45 6c 65  (keys.hasMoreEle
1370: 6d 65 6e 74 73 28 29 29 20 7b 0a 20 20 20 20 09  ments()) {.    .
1380: 09 6b 65 79 20 3d 20 28 53 74 72 69 6e 67 29 20  .key = (String) 
1390: 6b 65 79 73 2e 6e 65 78 74 45 6c 65 6d 65 6e 74  keys.nextElement
13a0: 28 29 3b 0a 20 20 20 20 20 20 20 20 09 4c 6f 67  ();.        .Log
13b0: 5f 4f 43 2e 69 28 54 41 47 2c 20 22 20 20 70 72  _OC.i(TAG, "  pr
13c0: 6f 70 65 72 74 79 20 22 20 2b 20 6b 65 79 20 2b  operty " + key +
13d0: 20 22 20 3a 20 22 20 2b 20 70 72 6f 76 69 64 65   " : " + provide
13e0: 72 2e 67 65 74 50 72 6f 70 65 72 74 79 28 6b 65  r.getProperty(ke
13f0: 79 29 29 3b 0a 20 20 20 20 09 7d 0a 09 7d 0a 0a  y));.    .}..}..
1400: 09 70 72 69 76 61 74 65 20 76 6f 69 64 20 6c 6f  .private void lo
1410: 67 53 73 6c 50 61 72 61 6d 65 74 65 72 73 28 53  gSslParameters(S
1420: 53 4c 50 61 72 61 6d 65 74 65 72 73 20 70 61 72  SLParameters par
1430: 61 6d 73 29 20 7b 0a 20 20 20 20 09 4c 6f 67 5f  ams) {.    .Log_
1440: 4f 43 2e 76 28 54 41 47 2c 20 22 43 69 70 68 65  OC.v(TAG, "Ciphe
1450: 72 20 73 75 69 74 65 73 3a 20 22 29 3b 0a 20 20  r suites: ");.  
1460: 20 20 09 53 74 72 69 6e 67 20 5b 5d 20 65 6c 65    .String [] ele
1470: 6d 65 6e 74 73 20 3d 20 70 61 72 61 6d 73 2e 67  ments = params.g
1480: 65 74 43 69 70 68 65 72 53 75 69 74 65 73 28 29  etCipherSuites()
1490: 3b 0a 20 20 20 20 09 66 6f 72 20 28 69 6e 74 20  ;.    .for (int 
14a0: 69 3d 30 3b 20 69 3c 65 6c 65 6d 65 6e 74 73 2e  i=0; i<elements.
14b0: 6c 65 6e 67 74 68 20 3b 20 69 2b 2b 29 20 7b 0a  length ; i++) {.
14c0: 20 20 20 20 09 09 4c 6f 67 5f 4f 43 2e 76 28 54      ..Log_OC.v(T
14d0: 41 47 2c 20 22 20 20 22 20 2b 20 65 6c 65 6d 65  AG, "  " + eleme
14e0: 6e 74 73 5b 69 5d 29 3b 0a 20 20 20 20 09 7d 0a  nts[i]);.    .}.
14f0: 20 20 20 20 09 4c 6f 67 5f 4f 43 2e 76 28 54 41      .Log_OC.v(TA
1500: 47 2c 20 22 50 72 6f 74 6f 63 6f 6c 73 3a 20 22  G, "Protocols: "
1510: 29 3b 0a 20 20 20 20 09 65 6c 65 6d 65 6e 74 73  );.    .elements
1520: 20 3d 20 70 61 72 61 6d 73 2e 67 65 74 50 72 6f   = params.getPro
1530: 74 6f 63 6f 6c 73 28 29 3b 0a 20 20 20 20 09 66  tocols();.    .f
1540: 6f 72 20 28 69 6e 74 20 69 3d 30 3b 20 69 3c 65  or (int i=0; i<e
1550: 6c 65 6d 65 6e 74 73 2e 6c 65 6e 67 74 68 20 3b  lements.length ;
1560: 20 69 2b 2b 29 20 7b 0a 20 20 20 20 09 09 4c 6f   i++) {.    ..Lo
1570: 67 5f 4f 43 2e 76 28 54 41 47 2c 20 22 20 20 22  g_OC.v(TAG, "  "
1580: 20 2b 20 65 6c 65 6d 65 6e 74 73 5b 69 5d 29 3b   + elements[i]);
1590: 0a 20 20 20 20 09 7d 0a 09 7d 0a 09 2a 2f 0a 0a  .    .}..}..*/..
15a0: 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 41      /**.     * A
15b0: 74 74 65 6d 70 74 73 20 74 6f 20 67 65 74 20 61  ttempts to get a
15c0: 20 6e 65 77 20 73 6f 63 6b 65 74 20 63 6f 6e 6e   new socket conn
15d0: 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 67 69  ection to the gi
15e0: 76 65 6e 20 68 6f 73 74 20 77 69 74 68 69 6e 20  ven host within 
15f0: 74 68 65 0a 20 20 20 20 20 2a 20 67 69 76 65 6e  the.     * given
1600: 20 74 69 6d 65 20 6c 69 6d 69 74 2e 0a 20 20 20   time limit..   
1610: 20 20 2a 0a 20 20 20 20 20 2a 20 40 70 61 72 61    *.     * @para
1620: 6d 20 68 6f 73 74 20 20 20 20 20 20 20 74 68 65  m host       the
1630: 20 68 6f 73 74 20 6e 61 6d 65 2f 49 50 0a 20 20   host name/IP.  
1640: 20 20 20 2a 20 40 70 61 72 61 6d 20 70 6f 72 74     * @param port
1650: 20 20 20 20 20 20 20 74 68 65 20 70 6f 72 74 20         the port 
1660: 6f 6e 20 74 68 65 20 68 6f 73 74 0a 20 20 20 20  on the host.    
1670: 20 2a 20 40 70 61 72 61 6d 20 63 6c 69 65 6e 74   * @param client
1680: 48 6f 73 74 20 74 68 65 20 6c 6f 63 61 6c 20 68  Host the local h
1690: 6f 73 74 20 6e 61 6d 65 2f 49 50 20 74 6f 20 62  ost name/IP to b
16a0: 69 6e 64 20 74 68 65 20 73 6f 63 6b 65 74 20 74  ind the socket t
16b0: 6f 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20  o.     * @param 
16c0: 63 6c 69 65 6e 74 50 6f 72 74 20 74 68 65 20 70  clientPort the p
16d0: 6f 72 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ort on the local
16e0: 20 6d 61 63 68 69 6e 65 0a 20 20 20 20 20 2a 20   machine.     * 
16f0: 40 70 61 72 61 6d 20 70 61 72 61 6d 73 20 20 20  @param params   
1700: 20 20 7b 40 6c 69 6e 6b 20 48 74 74 70 43 6f 6e    {@link HttpCon
1710: 6e 65 63 74 69 6f 6e 50 61 72 61 6d 73 20 48 74  nectionParams Ht
1720: 74 70 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 61  tp connection pa
1730: 72 61 6d 65 74 65 72 73 7d 0a 20 20 20 20 20 2a  rameters}.     *
1740: 20 40 72 65 74 75 72 6e 20 53 6f 63 6b 65 74 20   @return Socket 
1750: 61 20 6e 65 77 20 73 6f 63 6b 65 74 0a 20 20 20  a new socket.   
1760: 20 20 2a 20 40 74 68 72 6f 77 73 20 49 4f 45 78    * @throws IOEx
1770: 63 65 70 74 69 6f 6e 20 20 20 20 20 20 20 20 20  ception         
1780: 20 69 66 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72   if an I/O error
1790: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 63 72   occurs while cr
17a0: 65 61 74 69 6e 67 20 74 68 65 20 73 6f 63 6b 65  eating the socke
17b0: 74 0a 20 20 20 20 20 2a 20 40 74 68 72 6f 77 73  t.     * @throws
17c0: 20 55 6e 6b 6e 6f 77 6e 48 6f 73 74 45 78 63 65   UnknownHostExce
17d0: 70 74 69 6f 6e 20 69 66 20 74 68 65 20 49 50 20  ption if the IP 
17e0: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 68  address of the h
17f0: 6f 73 74 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20  ost cannot be.  
1800: 20 20 20 2a 20 20 20 20 20 20 20 20 20 20 20 20     *            
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1820: 20 20 64 65 74 65 72 6d 69 6e 65 64 0a 20 20 20    determined.   
1830: 20 20 2a 2f 0a 20 20 20 20 40 4f 76 65 72 72 69    */.    @Overri
1840: 64 65 0a 20 20 20 20 70 75 62 6c 69 63 20 53 6f  de.    public So
1850: 63 6b 65 74 20 63 72 65 61 74 65 53 6f 63 6b 65  cket createSocke
1860: 74 28 66 69 6e 61 6c 20 53 74 72 69 6e 67 20 68  t(final String h
1870: 6f 73 74 2c 20 66 69 6e 61 6c 20 69 6e 74 20 70  ost, final int p
1880: 6f 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ort,.           
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a0: 20 20 20 20 66 69 6e 61 6c 20 49 6e 65 74 41 64      final InetAd
18b0: 64 72 65 73 73 20 6c 6f 63 61 6c 41 64 64 72 65  dress localAddre
18c0: 73 73 2c 20 66 69 6e 61 6c 20 69 6e 74 20 6c 6f  ss, final int lo
18d0: 63 61 6c 50 6f 72 74 2c 0a 20 20 20 20 20 20 20  calPort,.       
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f0: 20 20 20 20 20 20 20 20 66 69 6e 61 6c 20 48 74          final Ht
1900: 74 70 43 6f 6e 6e 65 63 74 69 6f 6e 50 61 72 61  tpConnectionPara
1910: 6d 73 20 70 61 72 61 6d 73 29 20 74 68 72 6f 77  ms params) throw
1920: 73 20 49 4f 45 78 63 65 70 74 69 6f 6e 2c 0a 20  s IOException,. 
1930: 20 20 20 20 20 20 20 20 20 20 20 55 6e 6b 6e 6f             Unkno
1940: 77 6e 48 6f 73 74 45 78 63 65 70 74 69 6f 6e 2c  wnHostException,
1950: 20 43 6f 6e 6e 65 63 74 54 69 6d 65 6f 75 74 45   ConnectTimeoutE
1960: 78 63 65 70 74 69 6f 6e 20 7b 0a 20 20 20 20 20  xception {.     
1970: 20 20 20 4c 6f 67 5f 4f 43 2e 64 28 54 41 47 2c     Log_OC.d(TAG,
1980: 20 22 43 72 65 61 74 69 6e 67 20 53 53 4c 20 53   "Creating SSL S
1990: 6f 63 6b 65 74 20 77 69 74 68 20 72 65 6d 6f 74  ocket with remot
19a0: 65 20 22 20 2b 20 68 6f 73 74 20 2b 20 22 3a 22  e " + host + ":"
19b0: 20 2b 20 70 6f 72 74 20 2b 20 22 2c 20 6c 6f 63   + port + ", loc
19c0: 61 6c 20 22 20 2b 20 6c 6f 63 61 6c 41 64 64 72  al " + localAddr
19d0: 65 73 73 20 2b 20 22 3a 22 20 2b 0a 20 20 20 20  ess + ":" +.    
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 61              loca
19f0: 6c 50 6f 72 74 20 2b 20 22 2c 20 70 61 72 61 6d  lPort + ", param
1a00: 73 3a 20 22 20 2b 20 70 61 72 61 6d 73 29 3b 0a  s: " + params);.
1a10: 20 20 20 20 20 20 20 20 69 66 20 28 70 61 72 61          if (para
1a20: 6d 73 20 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20  ms == null) {.  
1a30: 20 20 20 20 20 20 20 20 20 20 74 68 72 6f 77 20            throw 
1a40: 6e 65 77 20 49 6c 6c 65 67 61 6c 41 72 67 75 6d  new IllegalArgum
1a50: 65 6e 74 45 78 63 65 70 74 69 6f 6e 28 22 50 61  entException("Pa
1a60: 72 61 6d 65 74 65 72 73 20 6d 61 79 20 6e 6f 74  rameters may not
1a70: 20 62 65 20 6e 75 6c 6c 22 29 3b 0a 20 20 20 20   be null");.    
1a80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 6e      }.        in
1a90: 74 20 74 69 6d 65 6f 75 74 20 3d 20 70 61 72 61  t timeout = para
1aa0: 6d 73 2e 67 65 74 43 6f 6e 6e 65 63 74 69 6f 6e  ms.getConnection
1ab0: 54 69 6d 65 6f 75 74 28 29 3b 0a 0a 20 20 20 20  Timeout();..    
1ac0: 20 20 20 20 2f 2f 6c 6f 67 53 73 6c 49 6e 66 6f      //logSslInfo
1ad0: 28 29 3b 0a 0a 20 20 20 20 20 20 20 20 53 6f 63  ();..        Soc
1ae0: 6b 65 74 46 61 63 74 6f 72 79 20 73 6f 63 6b 65  ketFactory socke
1af0: 74 66 61 63 74 6f 72 79 20 3d 20 6d 53 73 6c 43  tfactory = mSslC
1b00: 6f 6e 74 65 78 74 2e 67 65 74 53 6f 63 6b 65 74  ontext.getSocket
1b10: 46 61 63 74 6f 72 79 28 29 3b 0a 20 20 20 20 20  Factory();.     
1b20: 20 20 20 4c 6f 67 5f 4f 43 2e 64 28 54 41 47 2c     Log_OC.d(TAG,
1b30: 20 22 20 2e 2e 2e 20 77 69 74 68 20 63 6f 6e 6e   " ... with conn
1b40: 65 63 74 69 6f 6e 20 74 69 6d 65 6f 75 74 20 22  ection timeout "
1b50: 20 2b 20 74 69 6d 65 6f 75 74 20 2b 20 22 20 61   + timeout + " a
1b60: 6e 64 20 73 6f 63 6b 65 74 20 74 69 6d 65 6f 75  nd socket timeou
1b70: 74 20 22 20 2b 20 70 61 72 61 6d 73 2e 67 65 74  t " + params.get
1b80: 53 6f 54 69 6d 65 6f 75 74 28 29 29 3b 0a 20 20  SoTimeout());.  
1b90: 20 20 20 20 20 20 53 6f 63 6b 65 74 20 73 6f 63        Socket soc
1ba0: 6b 65 74 20 3d 20 73 6f 63 6b 65 74 66 61 63 74  ket = socketfact
1bb0: 6f 72 79 2e 63 72 65 61 74 65 53 6f 63 6b 65 74  ory.createSocket
1bc0: 28 29 3b 0a 20 20 20 20 20 20 20 20 65 6e 61 62  ();.        enab
1bd0: 6c 65 53 65 63 75 72 65 50 72 6f 74 6f 63 6f 6c  leSecureProtocol
1be0: 73 28 73 6f 63 6b 65 74 29 3b 0a 20 20 20 20 20  s(socket);.     
1bf0: 20 20 20 53 6f 63 6b 65 74 41 64 64 72 65 73 73     SocketAddress
1c00: 20 6c 6f 63 61 6c 61 64 64 72 20 3d 20 6e 65 77   localaddr = new
1c10: 20 49 6e 65 74 53 6f 63 6b 65 74 41 64 64 72 65   InetSocketAddre
1c20: 73 73 28 6c 6f 63 61 6c 41 64 64 72 65 73 73 2c  ss(localAddress,
1c30: 20 6c 6f 63 61 6c 50 6f 72 74 29 3b 0a 0a 0a 20   localPort);... 
1c40: 20 20 20 20 20 20 20 53 6f 63 6b 65 74 41 64 64         SocketAdd
1c50: 72 65 73 73 20 72 65 6d 6f 74 65 61 64 64 72 20  ress remoteaddr 
1c60: 3d 20 6e 65 77 20 49 6e 65 74 53 6f 63 6b 65 74  = new InetSocket
1c70: 41 64 64 72 65 73 73 28 67 65 74 49 6e 65 74 41  Address(getInetA
1c80: 64 64 72 65 73 73 46 6f 72 48 6f 73 74 28 68 6f  ddressForHost(ho
1c90: 73 74 29 2c 20 70 6f 72 74 29 3b 0a 20 20 20 20  st), port);.    
1ca0: 20 20 20 20 73 6f 63 6b 65 74 2e 73 65 74 53 6f      socket.setSo
1cb0: 54 69 6d 65 6f 75 74 28 70 61 72 61 6d 73 2e 67  Timeout(params.g
1cc0: 65 74 53 6f 54 69 6d 65 6f 75 74 28 29 20 2a 20  etSoTimeout() * 
1cd0: 35 29 3b 0a 20 20 20 20 20 20 20 20 73 6f 63 6b  5);.        sock
1ce0: 65 74 2e 62 69 6e 64 28 6c 6f 63 61 6c 61 64 64  et.bind(localadd
1cf0: 72 29 3b 0a 20 20 20 20 20 20 20 20 53 65 72 76  r);.        Serv
1d00: 65 72 4e 61 6d 65 49 6e 64 69 63 61 74 6f 72 2e  erNameIndicator.
1d10: 73 65 74 53 65 72 76 65 72 4e 61 6d 65 49 6e 64  setServerNameInd
1d20: 69 63 61 74 69 6f 6e 28 68 6f 73 74 2c 20 28 53  ication(host, (S
1d30: 53 4c 53 6f 63 6b 65 74 29 20 73 6f 63 6b 65 74  SLSocket) socket
1d40: 29 3b 0a 20 20 20 20 20 20 20 20 73 6f 63 6b 65  );.        socke
1d50: 74 2e 63 6f 6e 6e 65 63 74 28 72 65 6d 6f 74 65  t.connect(remote
1d60: 61 64 64 72 2c 20 74 69 6d 65 6f 75 74 29 3b 0a  addr, timeout);.
1d70: 20 20 20 20 20 20 20 20 76 65 72 69 66 79 50 65          verifyPe
1d80: 65 72 49 64 65 6e 74 69 74 79 28 68 6f 73 74 2c  erIdentity(host,
1d90: 20 70 6f 72 74 2c 20 73 6f 63 6b 65 74 29 3b 0a   port, socket);.
1da0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73          return s
1db0: 6f 63 6b 65 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  ocket;.    }..  
1dc0: 20 20 70 72 69 76 61 74 65 20 49 6e 65 74 41 64    private InetAd
1dd0: 64 72 65 73 73 20 67 65 74 49 6e 65 74 41 64 64  dress getInetAdd
1de0: 72 65 73 73 46 6f 72 48 6f 73 74 28 53 74 72 69  ressForHost(Stri
1df0: 6e 67 20 68 6f 73 74 29 20 74 68 72 6f 77 73 20  ng host) throws 
1e00: 55 6e 6b 6e 6f 77 6e 48 6f 73 74 45 78 63 65 70  UnknownHostExcep
1e10: 74 69 6f 6e 20 7b 0a 20 20 20 20 20 20 20 20 49  tion {.        I
1e20: 6e 65 74 41 64 64 72 65 73 73 20 61 64 64 72 65  netAddress addre
1e30: 73 73 20 3d 20 49 6e 65 74 41 64 64 72 65 73 73  ss = InetAddress
1e40: 2e 67 65 74 42 79 4e 61 6d 65 28 68 6f 73 74 29  .getByName(host)
1e50: 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 61 64  ;.        if (ad
1e60: 64 72 65 73 73 20 69 6e 73 74 61 6e 63 65 6f 66  dress instanceof
1e70: 20 49 6e 65 74 36 41 64 64 72 65 73 73 29 20 7b   Inet6Address) {
1e80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 65  .            Ine
1e90: 74 41 64 64 72 65 73 73 5b 5d 20 69 6e 65 74 41  tAddress[] inetA
1ea0: 64 64 72 65 73 73 41 72 72 61 79 20 3d 20 49 6e  ddressArray = In
1eb0: 65 74 41 64 64 72 65 73 73 2e 67 65 74 41 6c 6c  etAddress.getAll
1ec0: 42 79 4e 61 6d 65 28 68 6f 73 74 29 3b 0a 20 20  ByName(host);.  
1ed0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 28 49            for (I
1ee0: 6e 65 74 41 64 64 72 65 73 73 20 69 6e 65 74 41  netAddress inetA
1ef0: 64 64 72 65 73 73 20 3a 20 69 6e 65 74 41 64 64  ddress : inetAdd
1f00: 72 65 73 73 41 72 72 61 79 29 20 7b 0a 20 20 20  ressArray) {.   
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
1f20: 28 69 6e 65 74 41 64 64 72 65 73 73 20 69 6e 73  (inetAddress ins
1f30: 74 61 6e 63 65 6f 66 20 49 6e 65 74 34 41 64 64  tanceof Inet4Add
1f40: 72 65 73 73 29 20 7b 0a 20 20 20 20 20 20 20 20  ress) {.        
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 72              addr
1f60: 65 73 73 20 3d 20 69 6e 65 74 41 64 64 72 65 73  ess = inetAddres
1f70: 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s;.             
1f80: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1fb0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
1fc0: 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 3b   return address;
1fd0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a  .    }..    /**.
1fe0: 20 20 20 20 20 2a 20 40 73 65 65 20 50 72 6f 74       * @see Prot
1ff0: 6f 63 6f 6c 53 6f 63 6b 65 74 46 61 63 74 6f 72  ocolSocketFactor
2000: 79 23 63 72 65 61 74 65 53 6f 63 6b 65 74 28 6a  y#createSocket(j
2010: 61 76 61 2e 6c 61 6e 67 2e 53 74 72 69 6e 67 2c  ava.lang.String,
2020: 20 69 6e 74 29 0a 20 20 20 20 20 2a 2f 0a 20 20   int).     */.  
2030: 20 20 40 4f 76 65 72 72 69 64 65 0a 20 20 20 20    @Override.    
2040: 70 75 62 6c 69 63 20 53 6f 63 6b 65 74 20 63 72  public Socket cr
2050: 65 61 74 65 53 6f 63 6b 65 74 28 53 74 72 69 6e  eateSocket(Strin
2060: 67 20 68 6f 73 74 2c 20 69 6e 74 20 70 6f 72 74  g host, int port
2070: 29 20 74 68 72 6f 77 73 20 49 4f 45 78 63 65 70  ) throws IOExcep
2080: 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  tion,.          
2090: 20 20 55 6e 6b 6e 6f 77 6e 48 6f 73 74 45 78 63    UnknownHostExc
20a0: 65 70 74 69 6f 6e 20 7b 0a 20 20 20 20 20 20 20  eption {.       
20b0: 20 4c 6f 67 5f 4f 43 2e 64 28 54 41 47 2c 20 22   Log_OC.d(TAG, "
20c0: 43 72 65 61 74 69 6e 67 20 53 53 4c 20 53 6f 63  Creating SSL Soc
20d0: 6b 65 74 20 77 69 74 68 20 72 65 6d 6f 74 65 20  ket with remote 
20e0: 22 20 2b 20 68 6f 73 74 20 2b 20 22 3a 22 20 2b  " + host + ":" +
20f0: 20 70 6f 72 74 29 3b 0a 20 20 20 20 20 20 20 20   port);.        
2100: 53 6f 63 6b 65 74 20 73 6f 63 6b 65 74 20 3d 20  Socket socket = 
2110: 6d 53 73 6c 43 6f 6e 74 65 78 74 2e 67 65 74 53  mSslContext.getS
2120: 6f 63 6b 65 74 46 61 63 74 6f 72 79 28 29 2e 63  ocketFactory().c
2130: 72 65 61 74 65 53 6f 63 6b 65 74 28 67 65 74 49  reateSocket(getI
2140: 6e 65 74 41 64 64 72 65 73 73 46 6f 72 48 6f 73  netAddressForHos
2150: 74 28 68 6f 73 74 29 2c 20 70 6f 72 74 29 3b 0a  t(host), port);.
2160: 20 20 20 20 20 20 20 20 65 6e 61 62 6c 65 53 65          enableSe
2170: 63 75 72 65 50 72 6f 74 6f 63 6f 6c 73 28 73 6f  cureProtocols(so
2180: 63 6b 65 74 29 3b 0a 20 20 20 20 20 20 20 20 76  cket);.        v
2190: 65 72 69 66 79 50 65 65 72 49 64 65 6e 74 69 74  erifyPeerIdentit
21a0: 79 28 68 6f 73 74 2c 20 70 6f 72 74 2c 20 73 6f  y(host, port, so
21b0: 63 6b 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72  cket);.        r
21c0: 65 74 75 72 6e 20 73 6f 63 6b 65 74 3b 0a 20 20  eturn socket;.  
21d0: 20 20 7d 0a 0a 0a 20 20 20 20 40 4f 76 65 72 72    }...    @Overr
21e0: 69 64 65 0a 20 20 20 20 70 75 62 6c 69 63 20 53  ide.    public S
21f0: 6f 63 6b 65 74 20 63 72 65 61 74 65 53 6f 63 6b  ocket createSock
2200: 65 74 28 53 6f 63 6b 65 74 20 73 6f 63 6b 65 74  et(Socket socket
2210: 2c 20 53 74 72 69 6e 67 20 68 6f 73 74 2c 20 69  , String host, i
2220: 6e 74 20 70 6f 72 74 2c 20 62 6f 6f 6c 65 61 6e  nt port, boolean
2230: 20 61 75 74 6f 43 6c 6f 73 65 29 20 74 68 72 6f   autoClose) thro
2240: 77 73 20 49 4f 45 78 63 65 70 74 69 6f 6e 2c 0a  ws IOException,.
2250: 20 20 20 20 20 20 20 20 20 20 20 20 55 6e 6b 6e              Unkn
2260: 6f 77 6e 48 6f 73 74 45 78 63 65 70 74 69 6f 6e  ownHostException
2270: 20 7b 0a 20 20 20 20 20 20 20 20 53 6f 63 6b 65   {.        Socke
2280: 74 20 73 73 6c 53 6f 63 6b 65 74 20 3d 20 6d 53  t sslSocket = mS
2290: 73 6c 43 6f 6e 74 65 78 74 2e 67 65 74 53 6f 63  slContext.getSoc
22a0: 6b 65 74 46 61 63 74 6f 72 79 28 29 2e 63 72 65  ketFactory().cre
22b0: 61 74 65 53 6f 63 6b 65 74 28 73 6f 63 6b 65 74  ateSocket(socket
22c0: 2c 20 68 6f 73 74 2c 20 70 6f 72 74 2c 20 61 75  , host, port, au
22d0: 74 6f 43 6c 6f 73 65 29 3b 0a 20 20 20 20 20 20  toClose);.      
22e0: 20 20 65 6e 61 62 6c 65 53 65 63 75 72 65 50 72    enableSecurePr
22f0: 6f 74 6f 63 6f 6c 73 28 73 73 6c 53 6f 63 6b 65  otocols(sslSocke
2300: 74 29 3b 0a 20 20 20 20 20 20 20 20 76 65 72 69  t);.        veri
2310: 66 79 50 65 65 72 49 64 65 6e 74 69 74 79 28 68  fyPeerIdentity(h
2320: 6f 73 74 2c 20 70 6f 72 74 2c 20 73 73 6c 53 6f  ost, port, sslSo
2330: 63 6b 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72  cket);.        r
2340: 65 74 75 72 6e 20 73 73 6c 53 6f 63 6b 65 74 3b  eturn sslSocket;
2350: 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 70 75 62  .    }...    pub
2360: 6c 69 63 20 62 6f 6f 6c 65 61 6e 20 65 71 75 61  lic boolean equa
2370: 6c 73 28 4f 62 6a 65 63 74 20 6f 62 6a 29 20 7b  ls(Object obj) {
2380: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2390: 28 28 6f 62 6a 20 21 3d 20 6e 75 6c 6c 29 20 26  ((obj != null) &
23a0: 26 20 6f 62 6a 2e 67 65 74 43 6c 61 73 73 28 29  & obj.getClass()
23b0: 2e 65 71 75 61 6c 73 28 0a 20 20 20 20 20 20 20  .equals(.       
23c0: 20 20 20 20 20 20 20 20 20 41 64 76 61 6e 63 65           Advance
23d0: 64 53 73 6c 53 6f 63 6b 65 74 46 61 63 74 6f 72  dSslSocketFactor
23e0: 79 2e 63 6c 61 73 73 29 29 3b 0a 20 20 20 20 7d  y.class));.    }
23f0: 0a 0a 20 20 20 20 70 75 62 6c 69 63 20 69 6e 74  ..    public int
2400: 20 68 61 73 68 43 6f 64 65 28 29 20 7b 0a 20 20   hashCode() {.  
2410: 20 20 20 20 20 20 72 65 74 75 72 6e 20 41 64 76        return Adv
2420: 61 6e 63 65 64 53 73 6c 53 6f 63 6b 65 74 46 61  ancedSslSocketFa
2430: 63 74 6f 72 79 2e 63 6c 61 73 73 2e 68 61 73 68  ctory.class.hash
2440: 43 6f 64 65 28 29 3b 0a 20 20 20 20 7d 0a 0a 0a  Code();.    }...
2450: 20 20 20 20 70 75 62 6c 69 63 20 58 35 30 39 48      public X509H
2460: 6f 73 74 6e 61 6d 65 56 65 72 69 66 69 65 72 20  ostnameVerifier 
2470: 67 65 74 48 6f 73 74 4e 61 6d 65 56 65 72 69 66  getHostNameVerif
2480: 69 65 72 28 29 20 7b 0a 20 20 20 20 20 20 20 20  ier() {.        
2490: 72 65 74 75 72 6e 20 6d 48 6f 73 74 6e 61 6d 65  return mHostname
24a0: 56 65 72 69 66 69 65 72 3b 0a 20 20 20 20 7d 0a  Verifier;.    }.
24b0: 0a 0a 20 20 20 20 70 75 62 6c 69 63 20 76 6f 69  ..    public voi
24c0: 64 20 73 65 74 48 6f 73 74 4e 61 6d 65 56 65 72  d setHostNameVer
24d0: 69 66 69 65 72 28 58 35 30 39 48 6f 73 74 6e 61  ifier(X509Hostna
24e0: 6d 65 56 65 72 69 66 69 65 72 20 68 6f 73 74 6e  meVerifier hostn
24f0: 61 6d 65 56 65 72 69 66 69 65 72 29 20 7b 0a 20  ameVerifier) {. 
2500: 20 20 20 20 20 20 20 6d 48 6f 73 74 6e 61 6d 65         mHostname
2510: 56 65 72 69 66 69 65 72 20 3d 20 68 6f 73 74 6e  Verifier = hostn
2520: 61 6d 65 56 65 72 69 66 69 65 72 3b 0a 20 20 20  ameVerifier;.   
2530: 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20   }..    /**.    
2540: 20 2a 20 56 65 72 69 66 69 65 73 20 74 68 65 20   * Verifies the 
2550: 69 64 65 6e 74 69 74 79 20 6f 66 20 74 68 65 20  identity of the 
2560: 73 65 72 76 65 72 2e 0a 20 20 20 20 20 2a 0a 20  server..     *. 
2570: 20 20 20 20 2a 20 54 68 65 20 73 65 72 76 65 72      * The server
2580: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20   certificate is 
2590: 76 65 72 69 66 69 65 64 20 66 69 72 73 74 2e 0a  verified first..
25a0: 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 54 68       *.     * Th
25b0: 65 6e 2c 20 74 68 65 20 68 6f 73 74 20 6e 61 6d  en, the host nam
25c0: 65 20 69 73 20 63 6f 6d 70 61 72 65 64 20 77 69  e is compared wi
25d0: 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  th the content o
25e0: 66 20 74 68 65 20 73 65 72 76 65 72 20 63 65 72  f the server cer
25f0: 74 69 66 69 63 61 74 65 20 75 73 69 6e 67 20 74  tificate using t
2600: 68 65 20 63 75 72 72 65 6e 74 20 68 6f 73 74 20  he current host 
2610: 6e 61 6d 65 20 76 65 72 69 66 69 65 72 2c 0a 20  name verifier,. 
2620: 20 20 20 20 2a 20 69 66 20 61 6e 79 2e 0a 20 20      * if any..  
2630: 20 20 20 2a 0a 20 20 20 20 20 2a 20 40 70 61 72     *.     * @par
2640: 61 6d 20 73 6f 63 6b 65 74 0a 20 20 20 20 20 2a  am socket.     *
2650: 2f 0a 20 20 20 20 70 72 69 76 61 74 65 20 76 6f  /.    private vo
2660: 69 64 20 76 65 72 69 66 79 50 65 65 72 49 64 65  id verifyPeerIde
2670: 6e 74 69 74 79 28 53 74 72 69 6e 67 20 68 6f 73  ntity(String hos
2680: 74 2c 20 69 6e 74 20 70 6f 72 74 2c 20 53 6f 63  t, int port, Soc
2690: 6b 65 74 20 73 6f 63 6b 65 74 29 20 74 68 72 6f  ket socket) thro
26a0: 77 73 20 49 4f 45 78 63 65 70 74 69 6f 6e 20 7b  ws IOException {
26b0: 0a 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20  .        try {. 
26c0: 20 20 20 20 20 20 20 20 20 20 20 43 65 72 74 69             Certi
26d0: 66 69 63 61 74 65 43 6f 6d 62 69 6e 65 64 45 78  ficateCombinedEx
26e0: 63 65 70 74 69 6f 6e 20 66 61 69 6c 49 6e 48 61  ception failInHa
26f0: 6e 64 73 68 61 6b 65 20 3d 20 6e 75 6c 6c 3b 0a  ndshake = null;.
2700: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 20              /// 
2710: 31 2e 20 56 45 52 49 46 59 20 54 48 45 20 53 45  1. VERIFY THE SE
2720: 52 56 45 52 20 43 45 52 54 49 46 49 43 41 54 45  RVER CERTIFICATE
2730: 20 74 68 72 6f 75 67 68 20 74 68 65 20 72 65 67   through the reg
2740: 69 73 74 65 72 65 64 20 54 72 75 73 74 4d 61 6e  istered TrustMan
2750: 61 67 65 72 20 0a 20 20 20 20 20 20 20 20 20 20  ager .          
2760: 20 20 2f 2f 2f 09 28 74 68 61 74 20 73 68 6f 75    ///.(that shou
2770: 6c 64 20 62 65 20 61 6e 20 69 6e 73 74 61 6e 63  ld be an instanc
2780: 65 20 6f 66 20 41 64 76 61 6e 63 65 64 58 35 30  e of AdvancedX50
2790: 39 54 72 75 73 74 4d 61 6e 61 67 65 72 29 20 0a  9TrustManager) .
27a0: 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 20              try 
27b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
27c0: 20 20 53 53 4c 53 6f 63 6b 65 74 20 73 6f 63 6b    SSLSocket sock
27d0: 20 3d 20 28 53 53 4c 53 6f 63 6b 65 74 29 20 73   = (SSLSocket) s
27e0: 6f 63 6b 65 74 3b 20 20 20 20 2f 2f 20 61 20 6e  ocket;    // a n
27f0: 65 77 20 53 53 4c 53 65 73 73 69 6f 6e 20 69 6e  ew SSLSession in
2800: 73 74 61 6e 63 65 20 69 73 20 63 72 65 61 74 65  stance is create
2810: 64 20 61 73 20 61 20 22 73 69 64 65 20 65 66 66  d as a "side eff
2820: 65 63 74 22 20 0a 20 20 20 20 20 20 20 20 20 20  ect" .          
2830: 20 20 20 20 20 20 73 6f 63 6b 2e 73 74 61 72 74        sock.start
2840: 48 61 6e 64 73 68 61 6b 65 28 29 3b 0a 0a 20 20  Handshake();..  
2850: 20 20 20 20 20 20 20 20 20 20 7d 20 63 61 74 63            } catc
2860: 68 20 28 52 75 6e 74 69 6d 65 45 78 63 65 70 74  h (RuntimeExcept
2870: 69 6f 6e 20 65 29 20 7b 0a 0a 20 20 20 20 20 20  ion e) {..      
2880: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 65 20            if (e 
2890: 69 6e 73 74 61 6e 63 65 6f 66 20 43 65 72 74 69  instanceof Certi
28a0: 66 69 63 61 74 65 43 6f 6d 62 69 6e 65 64 45 78  ficateCombinedEx
28b0: 63 65 70 74 69 6f 6e 29 20 7b 0a 20 20 20 20 20  ception) {.     
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
28d0: 61 69 6c 49 6e 48 61 6e 64 73 68 61 6b 65 20 3d  ailInHandshake =
28e0: 20 28 43 65 72 74 69 66 69 63 61 74 65 43 6f 6d   (CertificateCom
28f0: 62 69 6e 65 64 45 78 63 65 70 74 69 6f 6e 29 20  binedException) 
2900: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
2910: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
2920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2930: 54 68 72 6f 77 61 62 6c 65 20 63 61 75 73 65 20  Throwable cause 
2940: 3d 20 65 2e 67 65 74 43 61 75 73 65 28 29 3b 0a  = e.getCause();.
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2960: 20 20 20 20 54 68 72 6f 77 61 62 6c 65 20 70 72      Throwable pr
2970: 65 76 69 6f 75 73 43 61 75 73 65 20 3d 20 6e 75  eviousCause = nu
2980: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll;.            
2990: 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 28 63          while (c
29a0: 61 75 73 65 20 21 3d 20 6e 75 6c 6c 20 26 26 0a  ause != null &&.
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 75 73              caus
29d0: 65 20 21 3d 20 70 72 65 76 69 6f 75 73 43 61 75  e != previousCau
29e0: 73 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  se &&.          
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a00: 20 20 21 28 63 61 75 73 65 20 69 6e 73 74 61 6e    !(cause instan
2a10: 63 65 6f 66 20 43 65 72 74 69 66 69 63 61 74 65  ceof Certificate
2a20: 43 6f 6d 62 69 6e 65 64 45 78 63 65 70 74 69 6f  CombinedExceptio
2a30: 6e 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  n)) {.          
2a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
2a50: 65 76 69 6f 75 73 43 61 75 73 65 20 3d 20 63 61  eviousCause = ca
2a60: 75 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  use;.           
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 75               cau
2a80: 73 65 20 3d 20 63 61 75 73 65 2e 67 65 74 43 61  se = cause.getCa
2a90: 75 73 65 28 29 3b 0a 20 20 20 20 20 20 20 20 20  use();.         
2aa0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac0: 20 69 66 20 28 63 61 75 73 65 20 21 3d 20 6e 75   if (cause != nu
2ad0: 6c 6c 20 26 26 20 63 61 75 73 65 20 69 6e 73 74  ll && cause inst
2ae0: 61 6e 63 65 6f 66 20 43 65 72 74 69 66 69 63 61  anceof Certifica
2af0: 74 65 43 6f 6d 62 69 6e 65 64 45 78 63 65 70 74  teCombinedExcept
2b00: 69 6f 6e 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ion) {.         
2b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
2b20: 61 69 6c 49 6e 48 61 6e 64 73 68 61 6b 65 20 3d  ailInHandshake =
2b30: 20 28 43 65 72 74 69 66 69 63 61 74 65 43 6f 6d   (CertificateCom
2b40: 62 69 6e 65 64 45 78 63 65 70 74 69 6f 6e 29 20  binedException) 
2b50: 63 61 75 73 65 3b 0a 20 20 20 20 20 20 20 20 20  cause;.         
2b60: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2b90: 66 20 28 66 61 69 6c 49 6e 48 61 6e 64 73 68 61  f (failInHandsha
2ba0: 6b 65 20 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20  ke == null) {.  
2bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc0: 20 20 74 68 72 6f 77 20 65 3b 0a 20 20 20 20 20    throw e;.     
2bd0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 61 69               fai
2bf0: 6c 49 6e 48 61 6e 64 73 68 61 6b 65 2e 73 65 74  lInHandshake.set
2c00: 48 6f 73 74 49 6e 55 72 6c 28 68 6f 73 74 29 3b  HostInUrl(host);
2c10: 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ..            }.
2c20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f  .            ///
2c30: 20 32 2e 20 56 45 52 49 46 59 20 48 4f 53 54 4e   2. VERIFY HOSTN
2c40: 41 4d 45 0a 20 20 20 20 20 20 20 20 20 20 20 20  AME.            
2c50: 53 53 4c 53 65 73 73 69 6f 6e 20 6e 65 77 53 65  SSLSession newSe
2c60: 73 73 69 6f 6e 20 3d 20 6e 75 6c 6c 3b 0a 20 20  ssion = null;.  
2c70: 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 65 61            boolea
2c80: 6e 20 76 65 72 69 66 69 65 64 48 6f 73 74 6e 61  n verifiedHostna
2c90: 6d 65 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20  me = true;.     
2ca0: 20 20 20 20 20 20 20 69 66 20 28 6d 48 6f 73 74         if (mHost
2cb0: 6e 61 6d 65 56 65 72 69 66 69 65 72 20 21 3d 20  nameVerifier != 
2cc0: 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20 20 20 20  null) {.        
2cd0: 20 20 20 20 20 20 20 20 69 66 20 28 66 61 69 6c          if (fail
2ce0: 49 6e 48 61 6e 64 73 68 61 6b 65 20 21 3d 20 6e  InHandshake != n
2cf0: 75 6c 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ull) {.         
2d00: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 20 32             /// 2
2d10: 2e 31 20 3a 20 61 20 6e 65 77 20 53 53 4c 53 65  .1 : a new SSLSe
2d20: 73 73 69 6f 6e 20 69 6e 73 74 61 6e 63 65 20 77  ssion instance w
2d30: 61 73 20 4e 4f 54 20 63 72 65 61 74 65 64 20 69  as NOT created i
2d40: 6e 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 0a  n the handshake.
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d60: 20 20 20 20 58 35 30 39 43 65 72 74 69 66 69 63      X509Certific
2d70: 61 74 65 20 73 65 72 76 65 72 43 65 72 74 20 3d  ate serverCert =
2d80: 20 66 61 69 6c 49 6e 48 61 6e 64 73 68 61 6b 65   failInHandshake
2d90: 2e 67 65 74 53 65 72 76 65 72 43 65 72 74 69 66  .getServerCertif
2da0: 69 63 61 74 65 28 29 3b 0a 20 20 20 20 20 20 20  icate();.       
2db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
2dc0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
2dd0: 20 20 20 20 20 20 20 20 20 20 20 6d 48 6f 73 74             mHost
2de0: 6e 61 6d 65 56 65 72 69 66 69 65 72 2e 76 65 72  nameVerifier.ver
2df0: 69 66 79 28 68 6f 73 74 2c 20 73 65 72 76 65 72  ify(host, server
2e00: 43 65 72 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Cert);.         
2e10: 20 20 20 20 20 20 20 20 20 20 20 7d 20 63 61 74             } cat
2e20: 63 68 20 28 53 53 4c 45 78 63 65 70 74 69 6f 6e  ch (SSLException
2e30: 20 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20   e) {.          
2e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76 65                ve
2e50: 72 69 66 69 65 64 48 6f 73 74 6e 61 6d 65 20 3d  rifiedHostname =
2e60: 20 66 61 6c 73 65 3b 0a 20 20 20 20 20 20 20 20   false;.        
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20              }.. 
2e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2e90: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 20              /// 
2eb0: 32 2e 32 20 3a 20 61 20 6e 65 77 20 53 53 4c 53  2.2 : a new SSLS
2ec0: 65 73 73 69 6f 6e 20 69 6e 73 74 61 6e 63 65 20  ession instance 
2ed0: 77 61 73 20 63 72 65 61 74 65 64 20 69 6e 20 74  was created in t
2ee0: 68 65 20 68 61 6e 64 73 68 61 6b 65 0a 20 20 20  he handshake.   
2ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f00: 20 6e 65 77 53 65 73 73 69 6f 6e 20 3d 20 28 28   newSession = ((
2f10: 53 53 4c 53 6f 63 6b 65 74 29 20 73 6f 63 6b 65  SSLSocket) socke
2f20: 74 29 2e 67 65 74 53 65 73 73 69 6f 6e 28 29 3b  t).getSession();
2f30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f40: 20 20 20 20 20 69 66 20 28 21 6d 54 72 75 73 74       if (!mTrust
2f50: 4d 61 6e 61 67 65 72 2e 69 73 4b 6e 6f 77 6e 53  Manager.isKnownS
2f60: 65 72 76 65 72 28 28 58 35 30 39 43 65 72 74 69  erver((X509Certi
2f70: 66 69 63 61 74 65 29 20 28 6e 65 77 53 65 73 73  ficate) (newSess
2f80: 69 6f 6e 2e 67 65 74 50 65 65 72 43 65 72 74 69  ion.getPeerCerti
2f90: 66 69 63 61 74 65 73 28 29 5b 30 5d 29 29 29 20  ficates()[0]))) 
2fa0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2fb0: 20 20 20 20 20 20 20 20 20 20 76 65 72 69 66 69            verifi
2fc0: 65 64 48 6f 73 74 6e 61 6d 65 20 3d 20 6d 48 6f  edHostname = mHo
2fd0: 73 74 6e 61 6d 65 56 65 72 69 66 69 65 72 2e 76  stnameVerifier.v
2fe0: 65 72 69 66 79 28 68 6f 73 74 2c 20 6e 65 77 53  erify(host, newS
2ff0: 65 73 73 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20  ession);.       
3000: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
3010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
3020: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  .            }..
3030: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 20              /// 
3040: 33 2e 20 43 6f 6d 62 69 6e 65 20 74 68 65 20 65  3. Combine the e
3050: 78 63 65 70 74 69 6f 6e 73 20 74 6f 20 74 68 72  xceptions to thr
3060: 6f 77 2c 20 69 66 20 61 6e 79 0a 20 20 20 20 20  ow, if any.     
3070: 20 20 20 20 20 20 20 69 66 20 28 21 76 65 72 69         if (!veri
3080: 66 69 65 64 48 6f 73 74 6e 61 6d 65 29 20 7b 0a  fiedHostname) {.
3090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a0: 53 53 4c 50 65 65 72 55 6e 76 65 72 69 66 69 65  SSLPeerUnverifie
30b0: 64 45 78 63 65 70 74 69 6f 6e 20 70 75 65 20 3d  dException pue =
30c0: 20 6e 65 77 20 53 53 4c 50 65 65 72 55 6e 76 65   new SSLPeerUnve
30d0: 72 69 66 69 65 64 45 78 63 65 70 74 69 6f 6e 28  rifiedException(
30e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30f0: 20 20 20 20 20 20 20 20 20 22 4e 61 6d 65 73 20           "Names 
3100: 69 6e 20 74 68 65 20 73 65 72 76 65 72 20 63 65  in the server ce
3110: 72 74 69 66 69 63 61 74 65 20 64 6f 20 6e 6f 74  rtificate do not
3120: 20 6d 61 74 63 68 20 74 6f 20 22 20 2b 20 68 6f   match to " + ho
3130: 73 74 20 2b 20 22 20 69 6e 20 74 68 65 20 55 52  st + " in the UR
3140: 4c 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L".             
3150: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
3160: 20 20 20 20 20 20 69 66 20 28 66 61 69 6c 49 6e        if (failIn
3170: 48 61 6e 64 73 68 61 6b 65 20 3d 3d 20 6e 75 6c  Handshake == nul
3180: 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l) {.           
3190: 20 20 20 20 20 20 20 20 20 66 61 69 6c 49 6e 48           failInH
31a0: 61 6e 64 73 68 61 6b 65 20 3d 20 6e 65 77 20 43  andshake = new C
31b0: 65 72 74 69 66 69 63 61 74 65 43 6f 6d 62 69 6e  ertificateCombin
31c0: 65 64 45 78 63 65 70 74 69 6f 6e 28 0a 20 20 20  edException(.   
31d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e0: 20 20 20 20 20 20 20 20 20 28 58 35 30 39 43 65           (X509Ce
31f0: 72 74 69 66 69 63 61 74 65 29 20 6e 65 77 53 65  rtificate) newSe
3200: 73 73 69 6f 6e 2e 67 65 74 50 65 65 72 43 65 72  ssion.getPeerCer
3210: 74 69 66 69 63 61 74 65 73 28 29 5b 30 5d 0a 20  tificates()[0]. 
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3230: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
3240: 20 20 20 20 20 20 20 20 20 20 66 61 69 6c 49 6e            failIn
3250: 48 61 6e 64 73 68 61 6b 65 2e 73 65 74 48 6f 73  Handshake.setHos
3260: 74 49 6e 55 72 6c 28 68 6f 73 74 29 3b 0a 20 20  tInUrl(host);.  
3270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
3280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3290: 66 61 69 6c 49 6e 48 61 6e 64 73 68 61 6b 65 2e  failInHandshake.
32a0: 73 65 74 53 73 6c 50 65 65 72 55 6e 76 65 72 69  setSslPeerUnveri
32b0: 66 69 65 64 45 78 63 65 70 74 69 6f 6e 28 70 75  fiedException(pu
32c0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
32d0: 20 20 20 20 70 75 65 2e 69 6e 69 74 43 61 75 73      pue.initCaus
32e0: 65 28 66 61 69 6c 49 6e 48 61 6e 64 73 68 61 6b  e(failInHandshak
32f0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
3300: 20 20 20 20 74 68 72 6f 77 20 70 75 65 3b 0a 0a      throw pue;..
3310: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
3320: 73 65 20 69 66 20 28 66 61 69 6c 49 6e 48 61 6e  se if (failInHan
3330: 64 73 68 61 6b 65 20 21 3d 20 6e 75 6c 6c 29 20  dshake != null) 
3340: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
3350: 20 20 53 53 4c 48 61 6e 64 73 68 61 6b 65 45 78    SSLHandshakeEx
3360: 63 65 70 74 69 6f 6e 20 68 73 65 20 3d 20 6e 65  ception hse = ne
3370: 77 20 53 53 4c 48 61 6e 64 73 68 61 6b 65 45 78  w SSLHandshakeEx
3380: 63 65 70 74 69 6f 6e 28 22 53 65 72 76 65 72 20  ception("Server 
3390: 63 65 72 74 69 66 69 63 61 74 65 20 63 6f 75 6c  certificate coul
33a0: 64 20 6e 6f 74 20 62 65 20 76 65 72 69 66 69 65  d not be verifie
33b0: 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  d");.           
33c0: 20 20 20 20 20 68 73 65 2e 69 6e 69 74 43 61 75       hse.initCau
33d0: 73 65 28 66 61 69 6c 49 6e 48 61 6e 64 73 68 61  se(failInHandsha
33e0: 6b 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ke);.           
33f0: 20 20 20 20 20 74 68 72 6f 77 20 68 73 65 3b 0a       throw hse;.
3400: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20              }.. 
3410: 20 20 20 20 20 20 20 7d 20 63 61 74 63 68 20 28         } catch (
3420: 49 4f 45 78 63 65 70 74 69 6f 6e 20 69 6f 29 20  IOException io) 
3430: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72  {.            tr
3440: 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y {.            
3450: 20 20 20 20 73 6f 63 6b 65 74 2e 63 6c 6f 73 65      socket.close
3460: 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ();.            
3470: 7d 20 63 61 74 63 68 20 28 45 78 63 65 70 74 69  } catch (Excepti
3480: 6f 6e 20 78 29 20 7b 0a 20 20 20 20 20 20 20 20  on x) {.        
3490: 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 48 49          // NOTHI
34a0: 4e 47 20 2d 20 69 72 72 65 6c 65 76 61 6e 74 20  NG - irrelevant 
34b0: 65 78 63 65 70 74 69 6f 6e 20 66 6f 72 20 74 68  exception for th
34c0: 65 20 63 61 6c 6c 65 72 20 0a 20 20 20 20 20 20  e caller .      
34d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
34e0: 20 20 20 20 74 68 72 6f 77 20 69 6f 3b 0a 20 20      throw io;.  
34f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
3500: 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 47 72     /**.     * Gr
3510: 61 6e 74 73 20 74 68 61 74 20 61 6c 6c 20 70 72  ants that all pr
3520: 6f 74 6f 63 6f 6c 73 20 73 75 70 70 6f 72 74 65  otocols supporte
3530: 64 20 62 79 20 74 68 65 20 53 65 63 75 72 69 74  d by the Securit
3540: 79 20 50 72 6f 76 69 64 65 72 20 69 6e 20 6d 53  y Provider in mS
3550: 73 6c 43 6f 6e 74 65 78 74 20 61 72 65 20 65 6e  slContext are en
3560: 61 62 6c 65 64 20 69 6e 20 73 6f 63 6b 65 74 2e  abled in socket.
3570: 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 47  .     *.     * G
3580: 72 61 6e 74 73 20 61 6c 73 6f 20 74 68 61 74 20  rants also that 
3590: 6e 6f 20 75 6e 73 75 70 70 6f 72 74 65 64 20 70  no unsupported p
35a0: 72 6f 74 6f 63 6f 6c 20 69 73 20 74 72 69 65 64  rotocol is tried
35b0: 20 74 6f 20 62 65 20 65 6e 61 62 6c 65 64 2e 20   to be enabled. 
35c0: 54 68 61 74 20 77 6f 75 6c 64 20 74 72 69 67 67  That would trigg
35d0: 65 72 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 2c  er an exception,
35e0: 20 62 72 65 61 6b 69 6e 67 0a 20 20 20 20 20 2a   breaking.     *
35f0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
3600: 70 72 6f 63 65 73 73 20 61 6c 74 68 6f 75 67 68  process although
3610: 20 73 6f 6d 65 20 70 72 6f 74 6f 63 6f 6c 73 20   some protocols 
3620: 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e 0a 20  are supported.. 
3630: 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 54 68 69      *.     * Thi
3640: 73 20 69 73 20 6e 6f 74 20 63 6f 73 6d 65 74 69  s is not cosmeti
3650: 63 3a 20 6e 6f 74 20 61 6c 6c 20 74 68 65 20 73  c: not all the s
3660: 75 70 70 6f 72 74 65 64 20 70 72 6f 74 6f 63 6f  upported protoco
3670: 6c 73 20 61 72 65 20 65 6e 61 62 6c 65 64 20 62  ls are enabled b
3680: 79 20 64 65 66 61 75 6c 74 2e 20 54 6f 6f 20 73  y default. Too s
3690: 65 65 20 61 6e 20 6f 76 65 72 76 69 65 77 20 6f  ee an overview o
36a0: 66 0a 20 20 20 20 20 2a 20 73 75 70 70 6f 72 74  f.     * support
36b0: 65 64 20 61 6e 64 20 65 6e 61 62 6c 65 64 20 70  ed and enabled p
36c0: 72 6f 74 6f 63 6f 6c 73 20 69 6e 20 74 68 65 20  rotocols in the 
36d0: 73 74 6f 63 6b 20 53 65 63 75 72 69 74 79 20 50  stock Security P
36e0: 72 6f 76 69 64 65 72 20 69 6e 20 41 6e 64 72 6f  rovider in Andro
36f0: 69 64 20 73 65 65 20 74 68 65 20 74 61 62 6c 65  id see the table
3700: 73 20 69 6e 0a 20 20 20 20 20 2a 20 68 74 74 70  s in.     * http
3710: 3a 2f 2f 64 65 76 65 6c 6f 70 65 72 2e 61 6e 64  ://developer.and
3720: 72 6f 69 64 2e 63 6f 6d 2f 72 65 66 65 72 65 6e  roid.com/referen
3730: 63 65 2f 6a 61 76 61 78 2f 6e 65 74 2f 73 73 6c  ce/javax/net/ssl
3740: 2f 53 53 4c 53 6f 63 6b 65 74 2e 68 74 6d 6c 2e  /SSLSocket.html.
3750: 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 40  .     *.     * @
3760: 70 61 72 61 6d 20 73 6f 63 6b 65 74 0a 20 20 20  param socket.   
3770: 20 20 2a 2f 0a 20 20 20 20 70 72 69 76 61 74 65    */.    private
3780: 20 76 6f 69 64 20 65 6e 61 62 6c 65 53 65 63 75   void enableSecu
3790: 72 65 50 72 6f 74 6f 63 6f 6c 73 28 53 6f 63 6b  reProtocols(Sock
37a0: 65 74 20 73 6f 63 6b 65 74 29 20 7b 0a 20 20 20  et socket) {.   
37b0: 20 20 20 20 20 53 53 4c 50 61 72 61 6d 65 74 65       SSLParamete
37c0: 72 73 20 70 61 72 61 6d 73 20 3d 20 6d 53 73 6c  rs params = mSsl
37d0: 43 6f 6e 74 65 78 74 2e 67 65 74 53 75 70 70 6f  Context.getSuppo
37e0: 72 74 65 64 53 53 4c 50 61 72 61 6d 65 74 65 72  rtedSSLParameter
37f0: 73 28 29 3b 0a 20 20 20 20 20 20 20 20 53 74 72  s();.        Str
3800: 69 6e 67 5b 5d 20 73 75 70 70 6f 72 74 65 64 50  ing[] supportedP
3810: 72 6f 74 6f 63 6f 6c 73 20 3d 20 70 61 72 61 6d  rotocols = param
3820: 73 2e 67 65 74 50 72 6f 74 6f 63 6f 6c 73 28 29  s.getProtocols()
3830: 3b 0a 20 20 20 20 20 20 20 20 28 28 53 53 4c 53  ;.        ((SSLS
3840: 6f 63 6b 65 74 29 20 73 6f 63 6b 65 74 29 2e 73  ocket) socket).s
3850: 65 74 45 6e 61 62 6c 65 64 50 72 6f 74 6f 63 6f  etEnabledProtoco
3860: 6c 73 28 73 75 70 70 6f 72 74 65 64 50 72 6f 74  ls(supportedProt
3870: 6f 63 6f 6c 73 29 3b 0a 20 20 20 20 7d 0a 0a 7d  ocols);.    }..}
3880: 0a                                               .