1 /*
   2  * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 
  27 package sun.security.ssl;
  28 
  29 import java.io.*;
  30 import java.util.*;
  31 import java.security.*;
  32 import java.security.NoSuchAlgorithmException;
  33 import java.security.AccessController;
  34 import java.security.AlgorithmConstraints;
  35 import java.security.AccessControlContext;
  36 import java.security.PrivilegedExceptionAction;
  37 import java.security.PrivilegedActionException;
  38 
  39 import javax.crypto.*;
  40 import javax.crypto.spec.*;
  41 
  42 import javax.net.ssl.*;
  43 import sun.misc.HexDumpEncoder;
  44 
  45 import sun.security.internal.spec.*;
  46 import sun.security.internal.interfaces.TlsMasterSecret;
  47 
  48 import sun.security.ssl.HandshakeMessage.*;
  49 import sun.security.ssl.CipherSuite.*;
  50 
  51 import static sun.security.ssl.CipherSuite.PRF.*;
  52 import static sun.security.ssl.CipherSuite.CipherType.*;
  53 
  54 /**
  55  * Handshaker ... processes handshake records from an SSL V3.0
  56  * data stream, handling all the details of the handshake protocol.
  57  *
  58  * Note that the real protocol work is done in two subclasses, the  base
  59  * class just provides the control flow and key generation framework.
  60  *
  61  * @author David Brownell
  62  */
  63 abstract class Handshaker {
  64 
  65     // protocol version being established using this Handshaker
  66     ProtocolVersion protocolVersion;
  67 
  68     // the currently active protocol version during a renegotiation
  69     ProtocolVersion     activeProtocolVersion;
  70 
  71     // security parameters for secure renegotiation.
  72     boolean             secureRenegotiation;
  73     byte[]              clientVerifyData;
  74     byte[]              serverVerifyData;
  75 
  76     // Is it an initial negotiation  or a renegotiation?
  77     boolean                     isInitialHandshake;
  78 
  79     // List of enabled protocols
  80     private ProtocolList        enabledProtocols;
  81 
  82     // List of enabled CipherSuites
  83     private CipherSuiteList     enabledCipherSuites;
  84 
  85     // The endpoint identification protocol
  86     String              identificationProtocol;
  87 
  88     // The cryptographic algorithm constraints
  89     private AlgorithmConstraints    algorithmConstraints = null;
  90 
  91     // Local supported signature and algorithms
  92     Collection<SignatureAndHashAlgorithm> localSupportedSignAlgs;
  93 
  94     // Peer supported signature and algorithms
  95     Collection<SignatureAndHashAlgorithm> peerSupportedSignAlgs;
  96 
  97     /*
  98 
  99     /*
 100      * List of active protocols
 101      *
 102      * Active protocols is a subset of enabled protocols, and will
 103      * contain only those protocols that have vaild cipher suites
 104      * enabled.
 105      */
 106     private ProtocolList       activeProtocols;
 107 
 108     /*
 109      * List of active cipher suites
 110      *
 111      * Active cipher suites is a subset of enabled cipher suites, and will
 112      * contain only those cipher suites available for the active protocols.
 113      */
 114     private CipherSuiteList    activeCipherSuites;
 115 
 116     // The server name indication and matchers
 117     List<SNIServerName>         serverNames =
 118                                     Collections.<SNIServerName>emptyList();
 119     Collection<SNIMatcher>      sniMatchers =
 120                                     Collections.<SNIMatcher>emptyList();
 121 
 122     private boolean             isClient;
 123     private boolean             needCertVerify;
 124 
 125     SSLSocketImpl               conn = null;
 126     SSLEngineImpl               engine = null;
 127 
 128     HandshakeHash               handshakeHash;
 129     HandshakeInStream           input;
 130     HandshakeOutStream          output;
 131     int                         state;
 132     SSLContextImpl              sslContext;
 133     RandomCookie                clnt_random, svr_random;
 134     SSLSessionImpl              session;
 135 
 136     // current CipherSuite. Never null, initially SSL_NULL_WITH_NULL_NULL
 137     CipherSuite         cipherSuite;
 138 
 139     // current key exchange. Never null, initially K_NULL
 140     KeyExchange         keyExchange;
 141 
 142     /* True if this session is being resumed (fast handshake) */
 143     boolean             resumingSession;
 144 
 145     /* True if it's OK to start a new SSL session */
 146     boolean             enableNewSession;
 147 
 148     // Whether local cipher suites preference should be honored during
 149     // handshaking?
 150     //
 151     // Note that in this provider, this option only applies to server side.
 152     // Local cipher suites preference is always honored in client side in
 153     // this provider.
 154     boolean preferLocalCipherSuites = false;
 155 
 156     // Temporary storage for the individual keys. Set by
 157     // calculateConnectionKeys() and cleared once the ciphers are
 158     // activated.
 159     private SecretKey clntWriteKey, svrWriteKey;
 160     private IvParameterSpec clntWriteIV, svrWriteIV;
 161     private SecretKey clntMacSecret, svrMacSecret;
 162 
 163     /*
 164      * Delegated task subsystem data structures.
 165      *
 166      * If thrown is set, we need to propagate this back immediately
 167      * on entry into processMessage().
 168      *
 169      * Data is protected by the SSLEngine.this lock.
 170      */
 171     private volatile boolean taskDelegated = false;
 172     private volatile DelegatedTask<?> delegatedTask = null;
 173     private volatile Exception thrown = null;
 174 
 175     // Could probably use a java.util.concurrent.atomic.AtomicReference
 176     // here instead of using this lock.  Consider changing.
 177     private Object thrownLock = new Object();
 178 
 179     /* Class and subclass dynamic debugging support */
 180     static final Debug debug = Debug.getInstance("ssl");
 181 
 182     // By default, disable the unsafe legacy session renegotiation
 183     static final boolean allowUnsafeRenegotiation = Debug.getBooleanProperty(
 184                     "sun.security.ssl.allowUnsafeRenegotiation", false);
 185 
 186     // For maximum interoperability and backward compatibility, RFC 5746
 187     // allows server (or client) to accept ClientHello (or ServerHello)
 188     // message without the secure renegotiation_info extension or SCSV.
 189     //
 190     // For maximum security, RFC 5746 also allows server (or client) to
 191     // reject such message with a fatal "handshake_failure" alert.
 192     //
 193     // By default, allow such legacy hello messages.
 194     static final boolean allowLegacyHelloMessages = Debug.getBooleanProperty(
 195                     "sun.security.ssl.allowLegacyHelloMessages", true);
 196 
 197     // To prevent the TLS renegotiation issues, by setting system property
 198     // "jdk.tls.rejectClientInitiatedRenegotiation" to true, applications in
 199     // server side can disable all client initiated SSL renegotiations
 200     // regardless of the support of TLS protocols.
 201     //
 202     // By default, allow client initiated renegotiations.
 203     static final boolean rejectClientInitiatedRenego =
 204             Debug.getBooleanProperty(
 205                 "jdk.tls.rejectClientInitiatedRenegotiation", false);
 206 
 207     // need to dispose the object when it is invalidated
 208     boolean invalidated;
 209 
 210     Handshaker(SSLSocketImpl c, SSLContextImpl context,
 211             ProtocolList enabledProtocols, boolean needCertVerify,
 212             boolean isClient, ProtocolVersion activeProtocolVersion,
 213             boolean isInitialHandshake, boolean secureRenegotiation,
 214             byte[] clientVerifyData, byte[] serverVerifyData) {
 215         this.conn = c;
 216         init(context, enabledProtocols, needCertVerify, isClient,
 217             activeProtocolVersion, isInitialHandshake, secureRenegotiation,
 218             clientVerifyData, serverVerifyData);
 219     }
 220 
 221     Handshaker(SSLEngineImpl engine, SSLContextImpl context,
 222             ProtocolList enabledProtocols, boolean needCertVerify,
 223             boolean isClient, ProtocolVersion activeProtocolVersion,
 224             boolean isInitialHandshake, boolean secureRenegotiation,
 225             byte[] clientVerifyData, byte[] serverVerifyData) {
 226         this.engine = engine;
 227         init(context, enabledProtocols, needCertVerify, isClient,
 228             activeProtocolVersion, isInitialHandshake, secureRenegotiation,
 229             clientVerifyData, serverVerifyData);
 230     }
 231 
 232     private void init(SSLContextImpl context, ProtocolList enabledProtocols,
 233             boolean needCertVerify, boolean isClient,
 234             ProtocolVersion activeProtocolVersion,
 235             boolean isInitialHandshake, boolean secureRenegotiation,
 236             byte[] clientVerifyData, byte[] serverVerifyData) {
 237 
 238         if (debug != null && Debug.isOn("handshake")) {
 239             System.out.println(
 240                 "Allow unsafe renegotiation: " + allowUnsafeRenegotiation +
 241                 "\nAllow legacy hello messages: " + allowLegacyHelloMessages +
 242                 "\nIs initial handshake: " + isInitialHandshake +
 243                 "\nIs secure renegotiation: " + secureRenegotiation);
 244         }
 245 
 246         this.sslContext = context;
 247         this.isClient = isClient;
 248         this.needCertVerify = needCertVerify;
 249         this.activeProtocolVersion = activeProtocolVersion;
 250         this.isInitialHandshake = isInitialHandshake;
 251         this.secureRenegotiation = secureRenegotiation;
 252         this.clientVerifyData = clientVerifyData;
 253         this.serverVerifyData = serverVerifyData;
 254         enableNewSession = true;
 255         invalidated = false;
 256 
 257         setCipherSuite(CipherSuite.C_NULL);
 258         setEnabledProtocols(enabledProtocols);
 259 
 260         if (conn != null) {
 261             algorithmConstraints = new SSLAlgorithmConstraints(conn, true);
 262         } else {        // engine != null
 263             algorithmConstraints = new SSLAlgorithmConstraints(engine, true);
 264         }
 265 
 266 
 267         //
 268         // In addition to the connection state machine, controlling
 269         // how the connection deals with the different sorts of records
 270         // that get sent (notably handshake transitions!), there's
 271         // also a handshaking state machine that controls message
 272         // sequencing.
 273         //
 274         // It's a convenient artifact of the protocol that this can,
 275         // with only a couple of minor exceptions, be driven by the
 276         // type constant for the last message seen:  except for the
 277         // client's cert verify, those constants are in a convenient
 278         // order to drastically simplify state machine checking.
 279         //
 280         state = -2;  // initialized but not activated
 281     }
 282 
 283     /*
 284      * Reroutes calls to the SSLSocket or SSLEngine (*SE).
 285      *
 286      * We could have also done it by extra classes
 287      * and letting them override, but this seemed much
 288      * less involved.
 289      */
 290     void fatalSE(byte b, String diagnostic) throws IOException {
 291         fatalSE(b, diagnostic, null);
 292     }
 293 
 294     void fatalSE(byte b, Throwable cause) throws IOException {
 295         fatalSE(b, null, cause);
 296     }
 297 
 298     void fatalSE(byte b, String diagnostic, Throwable cause)
 299             throws IOException {
 300         if (conn != null) {
 301             conn.fatal(b, diagnostic, cause);
 302         } else {
 303             engine.fatal(b, diagnostic, cause);
 304         }
 305     }
 306 
 307     void warningSE(byte b) {
 308         if (conn != null) {
 309             conn.warning(b);
 310         } else {
 311             engine.warning(b);
 312         }
 313     }
 314 
 315     // ONLY used by ClientHandshaker to setup the peer host in SSLSession.
 316     String getHostSE() {
 317         if (conn != null) {
 318             return conn.getHost();
 319         } else {
 320             return engine.getPeerHost();
 321         }
 322     }
 323 
 324     // ONLY used by ServerHandshaker to setup the peer host in SSLSession.
 325     String getHostAddressSE() {
 326         if (conn != null) {
 327             return conn.getInetAddress().getHostAddress();
 328         } else {
 329             /*
 330              * This is for caching only, doesn't matter that's is really
 331              * a hostname.  The main thing is that it doesn't do
 332              * a reverse DNS lookup, potentially slowing things down.
 333              */
 334             return engine.getPeerHost();
 335         }
 336     }
 337 
 338     int getPortSE() {
 339         if (conn != null) {
 340             return conn.getPort();
 341         } else {
 342             return engine.getPeerPort();
 343         }
 344     }
 345 
 346     int getLocalPortSE() {
 347         if (conn != null) {
 348             return conn.getLocalPort();
 349         } else {
 350             return -1;
 351         }
 352     }
 353 
 354     AccessControlContext getAccSE() {
 355         if (conn != null) {
 356             return conn.getAcc();
 357         } else {
 358             return engine.getAcc();
 359         }
 360     }
 361 
 362     String getEndpointIdentificationAlgorithmSE() {
 363         SSLParameters paras;
 364         if (conn != null) {
 365             paras = conn.getSSLParameters();
 366         } else {
 367             paras = engine.getSSLParameters();
 368         }
 369 
 370         return paras.getEndpointIdentificationAlgorithm();
 371     }
 372 
 373     private void setVersionSE(ProtocolVersion protocolVersion) {
 374         if (conn != null) {
 375             conn.setVersion(protocolVersion);
 376         } else {
 377             engine.setVersion(protocolVersion);
 378         }
 379     }
 380 
 381     /**
 382      * Set the active protocol version and propagate it to the SSLSocket
 383      * and our handshake streams. Called from ClientHandshaker
 384      * and ServerHandshaker with the negotiated protocol version.
 385      */
 386     void setVersion(ProtocolVersion protocolVersion) {
 387         this.protocolVersion = protocolVersion;
 388         setVersionSE(protocolVersion);
 389 
 390         output.r.setVersion(protocolVersion);
 391     }
 392 
 393     /**
 394      * Set the enabled protocols. Called from the constructor or
 395      * SSLSocketImpl/SSLEngineImpl.setEnabledProtocols() (if the
 396      * handshake is not yet in progress).
 397      */
 398     void setEnabledProtocols(ProtocolList enabledProtocols) {
 399         activeCipherSuites = null;
 400         activeProtocols = null;
 401 
 402         this.enabledProtocols = enabledProtocols;
 403     }
 404 
 405     /**
 406      * Set the enabled cipher suites. Called from
 407      * SSLSocketImpl/SSLEngineImpl.setEnabledCipherSuites() (if the
 408      * handshake is not yet in progress).
 409      */
 410     void setEnabledCipherSuites(CipherSuiteList enabledCipherSuites) {
 411         activeCipherSuites = null;
 412         activeProtocols = null;
 413         this.enabledCipherSuites = enabledCipherSuites;
 414     }
 415 
 416     /**
 417      * Set the algorithm constraints. Called from the constructor or
 418      * SSLSocketImpl/SSLEngineImpl.setAlgorithmConstraints() (if the
 419      * handshake is not yet in progress).
 420      */
 421     void setAlgorithmConstraints(AlgorithmConstraints algorithmConstraints) {
 422         activeCipherSuites = null;
 423         activeProtocols = null;
 424 
 425         this.algorithmConstraints =
 426             new SSLAlgorithmConstraints(algorithmConstraints);
 427         this.localSupportedSignAlgs = null;
 428     }
 429 
 430     Collection<SignatureAndHashAlgorithm> getLocalSupportedSignAlgs() {
 431         if (localSupportedSignAlgs == null) {
 432             localSupportedSignAlgs =
 433                 SignatureAndHashAlgorithm.getSupportedAlgorithms(
 434                                                     algorithmConstraints);
 435         }
 436 
 437         return localSupportedSignAlgs;
 438     }
 439 
 440     void setPeerSupportedSignAlgs(
 441             Collection<SignatureAndHashAlgorithm> algorithms) {
 442         peerSupportedSignAlgs =
 443             new ArrayList<SignatureAndHashAlgorithm>(algorithms);
 444     }
 445 
 446     Collection<SignatureAndHashAlgorithm> getPeerSupportedSignAlgs() {
 447         return peerSupportedSignAlgs;
 448     }
 449 
 450 
 451     /**
 452      * Set the identification protocol. Called from the constructor or
 453      * SSLSocketImpl/SSLEngineImpl.setIdentificationProtocol() (if the
 454      * handshake is not yet in progress).
 455      */
 456     void setIdentificationProtocol(String protocol) {
 457         this.identificationProtocol = protocol;
 458     }
 459 
 460     /**
 461      * Sets the server name indication of the handshake.
 462      */
 463     void setSNIServerNames(List<SNIServerName> serverNames) {
 464         // The serverNames parameter is unmodifiable.
 465         this.serverNames = serverNames;
 466     }
 467 
 468     /**
 469      * Sets the server name matchers of the handshaking.
 470      */
 471     void setSNIMatchers(Collection<SNIMatcher> sniMatchers) {
 472         // The sniMatchers parameter is unmodifiable.
 473         this.sniMatchers = sniMatchers;
 474     }
 475 
 476     /**
 477      * Sets the cipher suites preference.
 478      */
 479     void setUseCipherSuitesOrder(boolean on) {
 480         this.preferLocalCipherSuites = on;
 481     }
 482 
 483     /**
 484      * Prior to handshaking, activate the handshake and initialize the version,
 485      * input stream and output stream.
 486      */
 487     void activate(ProtocolVersion helloVersion) throws IOException {
 488         if (activeProtocols == null) {
 489             activeProtocols = getActiveProtocols();
 490         }
 491 
 492         if (activeProtocols.collection().isEmpty() ||
 493                 activeProtocols.max.v == ProtocolVersion.NONE.v) {
 494             throw new SSLHandshakeException("No appropriate protocol");
 495         }
 496 
 497         if (activeCipherSuites == null) {
 498             activeCipherSuites = getActiveCipherSuites();
 499         }
 500 
 501         if (activeCipherSuites.collection().isEmpty()) {
 502             throw new SSLHandshakeException("No appropriate cipher suite");
 503         }
 504 
 505         // temporary protocol version until the actual protocol version
 506         // is negotiated in the Hello exchange. This affects the record
 507         // version we sent with the ClientHello.
 508         if (!isInitialHandshake) {
 509             protocolVersion = activeProtocolVersion;
 510         } else {
 511             protocolVersion = activeProtocols.max;
 512         }
 513 
 514         if (helloVersion == null || helloVersion.v == ProtocolVersion.NONE.v) {
 515             helloVersion = activeProtocols.helloVersion;
 516         }
 517 
 518         // We accumulate digests of the handshake messages so that
 519         // we can read/write CertificateVerify and Finished messages,
 520         // getting assurance against some particular active attacks.
 521         handshakeHash = new HandshakeHash(needCertVerify);
 522 
 523         // Generate handshake input/output stream.
 524         input = new HandshakeInStream(handshakeHash);
 525         if (conn != null) {
 526             output = new HandshakeOutStream(protocolVersion, helloVersion,
 527                                         handshakeHash, conn);
 528             conn.getAppInputStream().r.setHandshakeHash(handshakeHash);
 529             conn.getAppInputStream().r.setHelloVersion(helloVersion);
 530             conn.getAppOutputStream().r.setHelloVersion(helloVersion);
 531         } else {
 532             output = new HandshakeOutStream(protocolVersion, helloVersion,
 533                                         handshakeHash, engine);
 534             engine.inputRecord.setHandshakeHash(handshakeHash);
 535             engine.inputRecord.setHelloVersion(helloVersion);
 536             engine.outputRecord.setHelloVersion(helloVersion);
 537         }
 538 
 539         // move state to activated
 540         state = -1;
 541     }
 542 
 543     /**
 544      * Set cipherSuite and keyExchange to the given CipherSuite.
 545      * Does not perform any verification that this is a valid selection,
 546      * this must be done before calling this method.
 547      */
 548     void setCipherSuite(CipherSuite s) {
 549         this.cipherSuite = s;
 550         this.keyExchange = s.keyExchange;
 551     }
 552 
 553     /**
 554      * Check if the given ciphersuite is enabled and available within the
 555      * current active cipher suites.
 556      *
 557      * Does not check if the required server certificates are available.
 558      */
 559     boolean isNegotiable(CipherSuite s) {
 560         if (activeCipherSuites == null) {
 561             activeCipherSuites = getActiveCipherSuites();
 562         }
 563 
 564         return isNegotiable(activeCipherSuites, s);
 565     }
 566 
 567     /**
 568      * Check if the given ciphersuite is enabled and available within the
 569      * proposed cipher suite list.
 570      *
 571      * Does not check if the required server certificates are available.
 572      */
 573     final static boolean isNegotiable(CipherSuiteList proposed, CipherSuite s) {
 574         return proposed.contains(s) && s.isNegotiable();
 575     }
 576 
 577     /**
 578      * Check if the given protocol version is enabled and available.
 579      */
 580     boolean isNegotiable(ProtocolVersion protocolVersion) {
 581         if (activeProtocols == null) {
 582             activeProtocols = getActiveProtocols();
 583         }
 584 
 585         return activeProtocols.contains(protocolVersion);
 586     }
 587 
 588     /**
 589      * Select a protocol version from the list. Called from
 590      * ServerHandshaker to negotiate protocol version.
 591      *
 592      * Return the lower of the protocol version suggested in the
 593      * clien hello and the highest supported by the server.
 594      */
 595     ProtocolVersion selectProtocolVersion(ProtocolVersion protocolVersion) {
 596         if (activeProtocols == null) {
 597             activeProtocols = getActiveProtocols();
 598         }
 599 
 600         return activeProtocols.selectProtocolVersion(protocolVersion);
 601     }
 602 
 603     /**
 604      * Get the active cipher suites.
 605      *
 606      * In TLS 1.1, many weak or vulnerable cipher suites were obsoleted,
 607      * such as TLS_RSA_EXPORT_WITH_RC4_40_MD5. The implementation MUST NOT
 608      * negotiate these cipher suites in TLS 1.1 or later mode.
 609      *
 610      * Therefore, when the active protocols only include TLS 1.1 or later,
 611      * the client cannot request to negotiate those obsoleted cipher
 612      * suites.  That is, the obsoleted suites should not be included in the
 613      * client hello. So we need to create a subset of the enabled cipher
 614      * suites, the active cipher suites, which does not contain obsoleted
 615      * cipher suites of the minimum active protocol.
 616      *
 617      * Return empty list instead of null if no active cipher suites.
 618      */
 619     CipherSuiteList getActiveCipherSuites() {
 620         if (activeCipherSuites == null) {
 621             if (activeProtocols == null) {
 622                 activeProtocols = getActiveProtocols();
 623             }
 624 
 625             ArrayList<CipherSuite> suites = new ArrayList<>();
 626             if (!(activeProtocols.collection().isEmpty()) &&
 627                     activeProtocols.min.v != ProtocolVersion.NONE.v) {
 628                 for (CipherSuite suite : enabledCipherSuites.collection()) {
 629                     if (suite.obsoleted > activeProtocols.min.v &&
 630                             suite.supported <= activeProtocols.max.v) {
 631                         if (algorithmConstraints.permits(
 632                                 EnumSet.of(CryptoPrimitive.KEY_AGREEMENT),
 633                                 suite.name, null)) {
 634                             suites.add(suite);
 635                         }
 636                     } else if (debug != null && Debug.isOn("verbose")) {
 637                         if (suite.obsoleted <= activeProtocols.min.v) {
 638                             System.out.println(
 639                                 "Ignoring obsoleted cipher suite: " + suite);
 640                         } else {
 641                             System.out.println(
 642                                 "Ignoring unsupported cipher suite: " + suite);
 643                         }
 644                     }
 645                 }
 646             }
 647             activeCipherSuites = new CipherSuiteList(suites);
 648         }
 649 
 650         return activeCipherSuites;
 651     }
 652 
 653     /*
 654      * Get the active protocol versions.
 655      *
 656      * In TLS 1.1, many weak or vulnerable cipher suites were obsoleted,
 657      * such as TLS_RSA_EXPORT_WITH_RC4_40_MD5. The implementation MUST NOT
 658      * negotiate these cipher suites in TLS 1.1 or later mode.
 659      *
 660      * For example, if "TLS_RSA_EXPORT_WITH_RC4_40_MD5" is the
 661      * only enabled cipher suite, the client cannot request TLS 1.1 or
 662      * later, even though TLS 1.1 or later is enabled.  We need to create a
 663      * subset of the enabled protocols, called the active protocols, which
 664      * contains protocols appropriate to the list of enabled Ciphersuites.
 665      *
 666      * Return empty list instead of null if no active protocol versions.
 667      */
 668     ProtocolList getActiveProtocols() {
 669         if (activeProtocols == null) {
 670             boolean enabledSSL20Hello = false;
 671             ArrayList<ProtocolVersion> protocols = new ArrayList<>(4);
 672             for (ProtocolVersion protocol : enabledProtocols.collection()) {
 673                 // Need not to check the SSL20Hello protocol.
 674                 if (protocol.v == ProtocolVersion.SSL20Hello.v) {
 675                     enabledSSL20Hello = true;
 676                     continue;
 677                 }
 678 
 679                 boolean found = false;
 680                 for (CipherSuite suite : enabledCipherSuites.collection()) {
 681                     if (suite.isAvailable() && suite.obsoleted > protocol.v &&
 682                                                suite.supported <= protocol.v) {
 683                         if (algorithmConstraints.permits(
 684                                 EnumSet.of(CryptoPrimitive.KEY_AGREEMENT),
 685                                 suite.name, null)) {
 686                             protocols.add(protocol);
 687                             found = true;
 688                             break;
 689                         } else if (debug != null && Debug.isOn("verbose")) {
 690                             System.out.println(
 691                                 "Ignoring disabled cipher suite: " + suite +
 692                                  " for " + protocol);
 693                         }
 694                     } else if (debug != null && Debug.isOn("verbose")) {
 695                         System.out.println(
 696                             "Ignoring unsupported cipher suite: " + suite +
 697                                  " for " + protocol);
 698                     }
 699                 }
 700                 if (!found && (debug != null) && Debug.isOn("handshake")) {
 701                     System.out.println(
 702                         "No available cipher suite for " + protocol);
 703                 }
 704             }
 705 
 706             if (!protocols.isEmpty() && enabledSSL20Hello) {
 707                 protocols.add(ProtocolVersion.SSL20Hello);
 708             }
 709 
 710             activeProtocols = new ProtocolList(protocols);
 711         }
 712 
 713         return activeProtocols;
 714     }
 715 
 716     /**
 717      * As long as handshaking has not activated, we can
 718      * change whether session creations are allowed.
 719      *
 720      * Callers should do their own checking if handshaking
 721      * has activated.
 722      */
 723     void setEnableSessionCreation(boolean newSessions) {
 724         enableNewSession = newSessions;
 725     }
 726 
 727     /**
 728      * Create a new read cipher and return it to caller.
 729      */
 730     CipherBox newReadCipher() throws NoSuchAlgorithmException {
 731         BulkCipher cipher = cipherSuite.cipher;
 732         CipherBox box;
 733         if (isClient) {
 734             box = cipher.newCipher(protocolVersion, svrWriteKey, svrWriteIV,
 735                                    sslContext.getSecureRandom(), false);
 736             svrWriteKey = null;
 737             svrWriteIV = null;
 738         } else {
 739             box = cipher.newCipher(protocolVersion, clntWriteKey, clntWriteIV,
 740                                    sslContext.getSecureRandom(), false);
 741             clntWriteKey = null;
 742             clntWriteIV = null;
 743         }
 744         return box;
 745     }
 746 
 747     /**
 748      * Create a new write cipher and return it to caller.
 749      */
 750     CipherBox newWriteCipher() throws NoSuchAlgorithmException {
 751         BulkCipher cipher = cipherSuite.cipher;
 752         CipherBox box;
 753         if (isClient) {
 754             box = cipher.newCipher(protocolVersion, clntWriteKey, clntWriteIV,
 755                                    sslContext.getSecureRandom(), true);
 756             clntWriteKey = null;
 757             clntWriteIV = null;
 758         } else {
 759             box = cipher.newCipher(protocolVersion, svrWriteKey, svrWriteIV,
 760                                    sslContext.getSecureRandom(), true);
 761             svrWriteKey = null;
 762             svrWriteIV = null;
 763         }
 764         return box;
 765     }
 766 
 767     /**
 768      * Create a new read MAC and return it to caller.
 769      */
 770     Authenticator newReadAuthenticator()
 771             throws NoSuchAlgorithmException, InvalidKeyException {
 772 
 773         Authenticator authenticator = null;
 774         if (cipherSuite.cipher.cipherType == AEAD_CIPHER) {
 775             authenticator = new Authenticator(protocolVersion);
 776         } else {
 777             MacAlg macAlg = cipherSuite.macAlg;
 778             if (isClient) {
 779                 authenticator = macAlg.newMac(protocolVersion, svrMacSecret);
 780                 svrMacSecret = null;
 781             } else {
 782                 authenticator = macAlg.newMac(protocolVersion, clntMacSecret);
 783                 clntMacSecret = null;
 784             }
 785         }
 786 
 787         return authenticator;
 788     }
 789 
 790     /**
 791      * Create a new write MAC and return it to caller.
 792      */
 793     Authenticator newWriteAuthenticator()
 794             throws NoSuchAlgorithmException, InvalidKeyException {
 795 
 796         Authenticator authenticator = null;
 797         if (cipherSuite.cipher.cipherType == AEAD_CIPHER) {
 798             authenticator = new Authenticator(protocolVersion);
 799         } else {
 800             MacAlg macAlg = cipherSuite.macAlg;
 801             if (isClient) {
 802                 authenticator = macAlg.newMac(protocolVersion, clntMacSecret);
 803                 clntMacSecret = null;
 804             } else {
 805                 authenticator = macAlg.newMac(protocolVersion, svrMacSecret);
 806                 svrMacSecret = null;
 807             }
 808         }
 809 
 810         return authenticator;
 811     }
 812 
 813     /*
 814      * Returns true iff the handshake sequence is done, so that
 815      * this freshly created session can become the current one.
 816      */
 817     boolean isDone() {
 818         return state == HandshakeMessage.ht_finished;
 819     }
 820 
 821 
 822     /*
 823      * Returns the session which was created through this
 824      * handshake sequence ... should be called after isDone()
 825      * returns true.
 826      */
 827     SSLSessionImpl getSession() {
 828         return session;
 829     }
 830 
 831     /*
 832      * Set the handshake session
 833      */
 834     void setHandshakeSessionSE(SSLSessionImpl handshakeSession) {
 835         if (conn != null) {
 836             conn.setHandshakeSession(handshakeSession);
 837         } else {
 838             engine.setHandshakeSession(handshakeSession);
 839         }
 840     }
 841 
 842     /*
 843      * Returns true if renegotiation is in use for this connection.
 844      */
 845     boolean isSecureRenegotiation() {
 846         return secureRenegotiation;
 847     }
 848 
 849     /*
 850      * Returns the verify_data from the Finished message sent by the client.
 851      */
 852     byte[] getClientVerifyData() {
 853         return clientVerifyData;
 854     }
 855 
 856     /*
 857      * Returns the verify_data from the Finished message sent by the server.
 858      */
 859     byte[] getServerVerifyData() {
 860         return serverVerifyData;
 861     }
 862 
 863     /*
 864      * This routine is fed SSL handshake records when they become available,
 865      * and processes messages found therein.
 866      */
 867     void process_record(InputRecord r, boolean expectingFinished)
 868             throws IOException {
 869 
 870         checkThrown();
 871 
 872         /*
 873          * Store the incoming handshake data, then see if we can
 874          * now process any completed handshake messages
 875          */
 876         input.incomingRecord(r);
 877 
 878         /*
 879          * We don't need to create a separate delegatable task
 880          * for finished messages.
 881          */
 882         if ((conn != null) || expectingFinished) {
 883             processLoop();
 884         } else {
 885             delegateTask(new PrivilegedExceptionAction<Void>() {
 886                 @Override
 887                 public Void run() throws Exception {
 888                     processLoop();
 889                     return null;
 890                 }
 891             });
 892         }
 893     }
 894 
 895     /*
 896      * On input, we hash messages one at a time since servers may need
 897      * to access an intermediate hash to validate a CertificateVerify
 898      * message.
 899      *
 900      * Note that many handshake messages can come in one record (and often
 901      * do, to reduce network resource utilization), and one message can also
 902      * require multiple records (e.g. very large Certificate messages).
 903      */
 904     void processLoop() throws IOException {
 905 
 906         // need to read off 4 bytes at least to get the handshake
 907         // message type and length.
 908         while (input.available() >= 4) {
 909             byte messageType;
 910             int messageLen;
 911 
 912             /*
 913              * See if we can read the handshake message header, and
 914              * then the entire handshake message.  If not, wait till
 915              * we can read and process an entire message.
 916              */
 917             input.mark(4);
 918 
 919             messageType = (byte)input.getInt8();
 920             messageLen = input.getInt24();
 921 
 922             if (input.available() < messageLen) {
 923                 input.reset();
 924                 return;
 925             }
 926 
 927             /*
 928              * Process the message.  We require
 929              * that processMessage() consumes the entire message.  In
 930              * lieu of explicit error checks (how?!) we assume that the
 931              * data will look like garbage on encoding/processing errors,
 932              * and that other protocol code will detect such errors.
 933              *
 934              * Note that digesting is normally deferred till after the
 935              * message has been processed, though to process at least the
 936              * client's Finished message (i.e. send the server's) we need
 937              * to acccelerate that digesting.
 938              *
 939              * Also, note that hello request messages are never hashed;
 940              * that includes the hello request header, too.
 941              */
 942             if (messageType == HandshakeMessage.ht_hello_request) {
 943                 input.reset();
 944                 processMessage(messageType, messageLen);
 945                 input.ignore(4 + messageLen);
 946             } else {
 947                 input.mark(messageLen);
 948                 processMessage(messageType, messageLen);
 949                 input.digestNow();
 950             }
 951         }
 952     }
 953 
 954 
 955     /**
 956      * Returns true iff the handshaker has been activated.
 957      *
 958      * In activated state, the handshaker may not send any messages out.
 959      */
 960     boolean activated() {
 961         return state >= -1;
 962     }
 963 
 964     /**
 965      * Returns true iff the handshaker has sent any messages.
 966      */
 967     boolean started() {
 968         return state >= 0;  // 0: HandshakeMessage.ht_hello_request
 969                             // 1: HandshakeMessage.ht_client_hello
 970     }
 971 
 972 
 973     /*
 974      * Used to kickstart the negotiation ... either writing a
 975      * ClientHello or a HelloRequest as appropriate, whichever
 976      * the subclass returns.  NOP if handshaking's already started.
 977      */
 978     void kickstart() throws IOException {
 979         if (state >= 0) {
 980             return;
 981         }
 982 
 983         HandshakeMessage m = getKickstartMessage();
 984 
 985         if (debug != null && Debug.isOn("handshake")) {
 986             m.print(System.out);
 987         }
 988         m.write(output);
 989         output.flush();
 990 
 991         state = m.messageType();
 992     }
 993 
 994     /**
 995      * Both client and server modes can start handshaking; but the
 996      * message they send to do so is different.
 997      */
 998     abstract HandshakeMessage getKickstartMessage() throws SSLException;
 999 
1000     /*
1001      * Client and Server side protocols are each driven though this
1002      * call, which processes a single message and drives the appropriate
1003      * side of the protocol state machine (depending on the subclass).
1004      */
1005     abstract void processMessage(byte messageType, int messageLen)
1006         throws IOException;
1007 
1008     /*
1009      * Most alerts in the protocol relate to handshaking problems.
1010      * Alerts are detected as the connection reads data.
1011      */
1012     abstract void handshakeAlert(byte description) throws SSLProtocolException;
1013 
1014     /*
1015      * Sends a change cipher spec message and updates the write side
1016      * cipher state so that future messages use the just-negotiated spec.
1017      */
1018     void sendChangeCipherSpec(Finished mesg, boolean lastMessage)
1019             throws IOException {
1020 
1021         output.flush(); // i.e. handshake data
1022 
1023         /*
1024          * The write cipher state is protected by the connection write lock
1025          * so we must grab it while making the change. We also
1026          * make sure no writes occur between sending the ChangeCipherSpec
1027          * message, installing the new cipher state, and sending the
1028          * Finished message.
1029          *
1030          * We already hold SSLEngine/SSLSocket "this" by virtue
1031          * of this being called from the readRecord code.
1032          */
1033         OutputRecord r;
1034         if (conn != null) {
1035             r = new OutputRecord(Record.ct_change_cipher_spec);
1036         } else {
1037             r = new EngineOutputRecord(Record.ct_change_cipher_spec, engine);
1038         }
1039 
1040         r.setVersion(protocolVersion);
1041         r.write(1);     // single byte of data
1042 
1043         if (conn != null) {
1044             conn.writeLock.lock();
1045             try {
1046                 conn.writeRecord(r);
1047                 conn.changeWriteCiphers();
1048                 if (debug != null && Debug.isOn("handshake")) {
1049                     mesg.print(System.out);
1050                 }
1051                 mesg.write(output);
1052                 output.flush();
1053             } finally {
1054                 conn.writeLock.unlock();
1055             }
1056         } else {
1057             synchronized (engine.writeLock) {
1058                 engine.writeRecord((EngineOutputRecord)r);
1059                 engine.changeWriteCiphers();
1060                 if (debug != null && Debug.isOn("handshake")) {
1061                     mesg.print(System.out);
1062                 }
1063                 mesg.write(output);
1064 
1065                 if (lastMessage) {
1066                     output.setFinishedMsg();
1067                 }
1068                 output.flush();
1069             }
1070         }
1071     }
1072 
1073     /*
1074      * Single access point to key calculation logic.  Given the
1075      * pre-master secret and the nonces from client and server,
1076      * produce all the keying material to be used.
1077      */
1078     void calculateKeys(SecretKey preMasterSecret, ProtocolVersion version) {
1079         SecretKey master = calculateMasterSecret(preMasterSecret, version);
1080         session.setMasterSecret(master);
1081         calculateConnectionKeys(master);
1082     }
1083 
1084 
1085     /*
1086      * Calculate the master secret from its various components.  This is
1087      * used for key exchange by all cipher suites.
1088      *
1089      * The master secret is the catenation of three MD5 hashes, each
1090      * consisting of the pre-master secret and a SHA1 hash.  Those three
1091      * SHA1 hashes are of (different) constant strings, the pre-master
1092      * secret, and the nonces provided by the client and the server.
1093      */
1094     private SecretKey calculateMasterSecret(SecretKey preMasterSecret,
1095             ProtocolVersion requestedVersion) {
1096 
1097         if (debug != null && Debug.isOn("keygen")) {
1098             HexDumpEncoder      dump = new HexDumpEncoder();
1099 
1100             System.out.println("SESSION KEYGEN:");
1101 
1102             System.out.println("PreMaster Secret:");
1103             printHex(dump, preMasterSecret.getEncoded());
1104 
1105             // Nonces are dumped with connection keygen, no
1106             // benefit to doing it twice
1107         }
1108 
1109         // What algs/params do we need to use?
1110         String masterAlg;
1111         PRF prf;
1112 
1113         if (protocolVersion.v >= ProtocolVersion.TLS12.v) {
1114             masterAlg = "SunTls12MasterSecret";
1115             prf = cipherSuite.prfAlg;
1116         } else {
1117             masterAlg = "SunTlsMasterSecret";
1118             prf = P_NONE;
1119         }
1120 
1121         String prfHashAlg = prf.getPRFHashAlg();
1122         int prfHashLength = prf.getPRFHashLength();
1123         int prfBlockSize = prf.getPRFBlockSize();
1124 
1125         TlsMasterSecretParameterSpec spec = new TlsMasterSecretParameterSpec(
1126                 preMasterSecret, protocolVersion.major, protocolVersion.minor,
1127                 clnt_random.random_bytes, svr_random.random_bytes,
1128                 prfHashAlg, prfHashLength, prfBlockSize);
1129 
1130         try {
1131             KeyGenerator kg = JsseJce.getKeyGenerator(masterAlg);
1132             kg.init(spec);
1133             return kg.generateKey();
1134         } catch (InvalidAlgorithmParameterException |
1135                 NoSuchAlgorithmException iae) {
1136             // unlikely to happen, otherwise, must be a provider exception
1137             //
1138             // For RSA premaster secrets, do not signal a protocol error
1139             // due to the Bleichenbacher attack. See comments further down.
1140             if (debug != null && Debug.isOn("handshake")) {
1141                 System.out.println("RSA master secret generation error:");
1142                 iae.printStackTrace(System.out);
1143             }
1144             throw new ProviderException(iae);
1145 
1146         }
1147     }
1148 
1149     /*
1150      * Calculate the keys needed for this connection, once the session's
1151      * master secret has been calculated.  Uses the master key and nonces;
1152      * the amount of keying material generated is a function of the cipher
1153      * suite that's been negotiated.
1154      *
1155      * This gets called both on the "full handshake" (where we exchanged
1156      * a premaster secret and started a new session) as well as on the
1157      * "fast handshake" (where we just resumed a pre-existing session).
1158      */
1159     void calculateConnectionKeys(SecretKey masterKey) {
1160         /*
1161          * For both the read and write sides of the protocol, we use the
1162          * master to generate MAC secrets and cipher keying material.  Block
1163          * ciphers need initialization vectors, which we also generate.
1164          *
1165          * First we figure out how much keying material is needed.
1166          */
1167         int hashSize = cipherSuite.macAlg.size;
1168         boolean is_exportable = cipherSuite.exportable;
1169         BulkCipher cipher = cipherSuite.cipher;
1170         int expandedKeySize = is_exportable ? cipher.expandedKeySize : 0;
1171 
1172         // Which algs/params do we need to use?
1173         String keyMaterialAlg;
1174         PRF prf;
1175 
1176         if (protocolVersion.v >= ProtocolVersion.TLS12.v) {
1177             keyMaterialAlg = "SunTls12KeyMaterial";
1178             prf = cipherSuite.prfAlg;
1179         } else {
1180             keyMaterialAlg = "SunTlsKeyMaterial";
1181             prf = P_NONE;
1182         }
1183 
1184         String prfHashAlg = prf.getPRFHashAlg();
1185         int prfHashLength = prf.getPRFHashLength();
1186         int prfBlockSize = prf.getPRFBlockSize();
1187 
1188         // TLS v1.1 or later uses an explicit IV in CBC cipher suites to
1189         // protect against the CBC attacks.  AEAD/GCM cipher suites in TLS
1190         // v1.2 or later use a fixed IV as the implicit part of the partially
1191         // implicit nonce technique described in RFC 5116.
1192         int ivSize = cipher.ivSize;
1193         if (cipher.cipherType == AEAD_CIPHER) {
1194             ivSize = cipher.fixedIvSize;
1195         } else if (protocolVersion.v >= ProtocolVersion.TLS11.v &&
1196                 cipher.cipherType == BLOCK_CIPHER) {
1197             ivSize = 0;
1198         }
1199 
1200         TlsKeyMaterialParameterSpec spec = new TlsKeyMaterialParameterSpec(
1201             masterKey, protocolVersion.major, protocolVersion.minor,
1202             clnt_random.random_bytes, svr_random.random_bytes,
1203             cipher.algorithm, cipher.keySize, expandedKeySize,
1204             ivSize, hashSize,
1205             prfHashAlg, prfHashLength, prfBlockSize);
1206 
1207         try {
1208             KeyGenerator kg = JsseJce.getKeyGenerator(keyMaterialAlg);
1209             kg.init(spec);
1210             TlsKeyMaterialSpec keySpec = (TlsKeyMaterialSpec)kg.generateKey();
1211 
1212             // Return null if cipher keys are not supposed to be generated.
1213             clntWriteKey = keySpec.getClientCipherKey();
1214             svrWriteKey = keySpec.getServerCipherKey();
1215 
1216             // Return null if IVs are not supposed to be generated.
1217             clntWriteIV = keySpec.getClientIv();
1218             svrWriteIV = keySpec.getServerIv();
1219 
1220             // Return null if MAC keys are not supposed to be generated.
1221             clntMacSecret = keySpec.getClientMacKey();
1222             svrMacSecret = keySpec.getServerMacKey();
1223         } catch (GeneralSecurityException e) {
1224             throw new ProviderException(e);
1225         }
1226 
1227         //
1228         // Dump the connection keys as they're generated.
1229         //
1230         if (debug != null && Debug.isOn("keygen")) {
1231             synchronized (System.out) {
1232                 HexDumpEncoder  dump = new HexDumpEncoder();
1233 
1234                 System.out.println("CONNECTION KEYGEN:");
1235 
1236                 // Inputs:
1237                 System.out.println("Client Nonce:");
1238                 printHex(dump, clnt_random.random_bytes);
1239                 System.out.println("Server Nonce:");
1240                 printHex(dump, svr_random.random_bytes);
1241                 System.out.println("Master Secret:");
1242                 printHex(dump, masterKey.getEncoded());
1243 
1244                 // Outputs:
1245                 if (clntMacSecret != null) {
1246                     System.out.println("Client MAC write Secret:");
1247                     printHex(dump, clntMacSecret.getEncoded());
1248                     System.out.println("Server MAC write Secret:");
1249                     printHex(dump, svrMacSecret.getEncoded());
1250                 } else {
1251                     System.out.println("... no MAC keys used for this cipher");
1252                 }
1253 
1254                 if (clntWriteKey != null) {
1255                     System.out.println("Client write key:");
1256                     printHex(dump, clntWriteKey.getEncoded());
1257                     System.out.println("Server write key:");
1258                     printHex(dump, svrWriteKey.getEncoded());
1259                 } else {
1260                     System.out.println("... no encryption keys used");
1261                 }
1262 
1263                 if (clntWriteIV != null) {
1264                     System.out.println("Client write IV:");
1265                     printHex(dump, clntWriteIV.getIV());
1266                     System.out.println("Server write IV:");
1267                     printHex(dump, svrWriteIV.getIV());
1268                 } else {
1269                     if (protocolVersion.v >= ProtocolVersion.TLS11.v) {
1270                         System.out.println(
1271                                 "... no IV derived for this protocol");
1272                     } else {
1273                         System.out.println("... no IV used for this cipher");
1274                     }
1275                 }
1276                 System.out.flush();
1277             }
1278         }
1279     }
1280 
1281     private static void printHex(HexDumpEncoder dump, byte[] bytes) {
1282         if (bytes == null) {
1283             System.out.println("(key bytes not available)");
1284         } else {
1285             try {
1286                 dump.encodeBuffer(bytes, System.out);
1287             } catch (IOException e) {
1288                 // just for debugging, ignore this
1289             }
1290         }
1291     }
1292 
1293     /**
1294      * Throw an SSLException with the specified message and cause.
1295      * Shorthand until a new SSLException constructor is added.
1296      * This method never returns.
1297      */
1298     static void throwSSLException(String msg, Throwable cause)
1299             throws SSLException {
1300         SSLException e = new SSLException(msg);
1301         e.initCause(cause);
1302         throw e;
1303     }
1304 
1305 
1306     /*
1307      * Implement a simple task delegator.
1308      *
1309      * We are currently implementing this as a single delegator, may
1310      * try for parallel tasks later.  Client Authentication could
1311      * benefit from this, where ClientKeyExchange/CertificateVerify
1312      * could be carried out in parallel.
1313      */
1314     class DelegatedTask<E> implements Runnable {
1315 
1316         private PrivilegedExceptionAction<E> pea;
1317 
1318         DelegatedTask(PrivilegedExceptionAction<E> pea) {
1319             this.pea = pea;
1320         }
1321 
1322         public void run() {
1323             synchronized (engine) {
1324                 try {
1325                     AccessController.doPrivileged(pea, engine.getAcc());
1326                 } catch (PrivilegedActionException pae) {
1327                     thrown = pae.getException();
1328                 } catch (RuntimeException rte) {
1329                     thrown = rte;
1330                 }
1331                 delegatedTask = null;
1332                 taskDelegated = false;
1333             }
1334         }
1335     }
1336 
1337     private <T> void delegateTask(PrivilegedExceptionAction<T> pea) {
1338         delegatedTask = new DelegatedTask<T>(pea);
1339         taskDelegated = false;
1340         thrown = null;
1341     }
1342 
1343     DelegatedTask<?> getTask() {
1344         if (!taskDelegated) {
1345             taskDelegated = true;
1346             return delegatedTask;
1347         } else {
1348             return null;
1349         }
1350     }
1351 
1352     /*
1353      * See if there are any tasks which need to be delegated
1354      *
1355      * Locked by SSLEngine.this.
1356      */
1357     boolean taskOutstanding() {
1358         return (delegatedTask != null);
1359     }
1360 
1361     /*
1362      * The previous caller failed for some reason, report back the
1363      * Exception.  We won't worry about Error's.
1364      *
1365      * Locked by SSLEngine.this.
1366      */
1367     void checkThrown() throws SSLException {
1368         synchronized (thrownLock) {
1369             if (thrown != null) {
1370 
1371                 String msg = thrown.getMessage();
1372 
1373                 if (msg == null) {
1374                     msg = "Delegated task threw Exception/Error";
1375                 }
1376 
1377                 /*
1378                  * See what the underlying type of exception is.  We should
1379                  * throw the same thing.  Chain thrown to the new exception.
1380                  */
1381                 Exception e = thrown;
1382                 thrown = null;
1383 
1384                 if (e instanceof RuntimeException) {
1385                     throw new RuntimeException(msg, e);
1386                 } else if (e instanceof SSLHandshakeException) {
1387                     throw (SSLHandshakeException)
1388                         new SSLHandshakeException(msg).initCause(e);
1389                 } else if (e instanceof SSLKeyException) {
1390                     throw (SSLKeyException)
1391                         new SSLKeyException(msg).initCause(e);
1392                 } else if (e instanceof SSLPeerUnverifiedException) {
1393                     throw (SSLPeerUnverifiedException)
1394                         new SSLPeerUnverifiedException(msg).initCause(e);
1395                 } else if (e instanceof SSLProtocolException) {
1396                     throw (SSLProtocolException)
1397                         new SSLProtocolException(msg).initCause(e);
1398                 } else {
1399                     /*
1400                      * If it's SSLException or any other Exception,
1401                      * we'll wrap it in an SSLException.
1402                      */
1403                     throw new SSLException(msg, e);
1404                 }
1405             }
1406         }
1407     }
1408 }