1 /* 2 * Copyright (c) 1996, 2013, 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.cert.*; 33 import java.security.interfaces.*; 34 import java.security.spec.ECParameterSpec; 35 36 import javax.crypto.SecretKey; 37 import javax.crypto.spec.SecretKeySpec; 38 39 import javax.net.ssl.*; 40 41 import javax.security.auth.Subject; 42 43 import sun.security.util.KeyUtil; 44 import sun.security.action.GetPropertyAction; 45 import sun.security.ssl.HandshakeMessage.*; 46 import sun.security.ssl.CipherSuite.*; 47 import sun.security.ssl.SignatureAndHashAlgorithm.*; 48 import static sun.security.ssl.CipherSuite.KeyExchange.*; 49 50 /** 51 * ServerHandshaker does the protocol handshaking from the point 52 * of view of a server. It is driven asychronously by handshake messages 53 * as delivered by the parent Handshaker class, and also uses 54 * common functionality (e.g. key generation) that is provided there. 55 * 56 * @author David Brownell 57 */ 58 final class ServerHandshaker extends Handshaker { 59 60 // is the server going to require the client to authenticate? 61 private byte doClientAuth; 62 63 // our authentication info 64 private X509Certificate[] certs; 65 private PrivateKey privateKey; 66 67 private Object serviceCreds; 68 69 // flag to check for clientCertificateVerify message 70 private boolean needClientVerify = false; 71 72 /* 73 * For exportable ciphersuites using non-exportable key sizes, we use 74 * ephemeral RSA keys. We could also do anonymous RSA in the same way 75 * but there are no such ciphersuites currently defined. 76 */ 77 private PrivateKey tempPrivateKey; 78 private PublicKey tempPublicKey; 79 80 /* 81 * For anonymous and ephemeral Diffie-Hellman key exchange, we use 82 * ephemeral Diffie-Hellman keys. 83 */ 84 private DHCrypt dh; 85 86 // Helper for ECDH based key exchanges 87 private ECDHCrypt ecdh; 88 89 // version request by the client in its ClientHello 90 // we remember it for the RSA premaster secret version check 91 private ProtocolVersion clientRequestedVersion; 92 93 private SupportedEllipticCurvesExtension supportedCurves; 94 95 // the preferable signature algorithm used by ServerKeyExchange message 96 SignatureAndHashAlgorithm preferableSignatureAlgorithm; 97 98 // Flag to use smart ephemeral DH key which size matches the corresponding 99 // authentication key 100 private static final boolean useSmartEphemeralDHKeys; 101 102 // Flag to use legacy ephemeral DH key which size is 512 bits for 103 // exportable cipher suites, and 768 bits for others 104 private static final boolean useLegacyEphemeralDHKeys; 105 106 // The customized ephemeral DH key size for non-exportable cipher suites. 107 private static final int customizedDHKeySize; 108 109 static { 110 String property = AccessController.doPrivileged( 111 new GetPropertyAction("jdk.tls.ephemeralDHKeySize")); 112 if (property == null || property.length() == 0) { 113 useLegacyEphemeralDHKeys = false; 114 useSmartEphemeralDHKeys = false; 115 customizedDHKeySize = -1; 116 } else if ("matched".equals(property)) { 117 useLegacyEphemeralDHKeys = false; 118 useSmartEphemeralDHKeys = true; 119 customizedDHKeySize = -1; 120 } else if ("legacy".equals(property)) { 121 useLegacyEphemeralDHKeys = true; 122 useSmartEphemeralDHKeys = false; 123 customizedDHKeySize = -1; 124 } else { 125 useLegacyEphemeralDHKeys = false; 126 useSmartEphemeralDHKeys = false; 127 128 try { 129 customizedDHKeySize = Integer.parseUnsignedInt(property); 130 if (customizedDHKeySize < 1024 || customizedDHKeySize > 2048) { 131 throw new IllegalArgumentException( 132 "Customized DH key size should be positive integer " + 133 "between 1024 and 2048 bits, inclusive"); 134 } 135 } catch (NumberFormatException nfe) { 136 throw new IllegalArgumentException( 137 "Invalid system property jdk.tls.ephemeralDHKeySize"); 138 } 139 } 140 } 141 142 /* 143 * Constructor ... use the keys found in the auth context. 144 */ 145 ServerHandshaker(SSLSocketImpl socket, SSLContextImpl context, 146 ProtocolList enabledProtocols, byte clientAuth, 147 ProtocolVersion activeProtocolVersion, boolean isInitialHandshake, 148 boolean secureRenegotiation, 149 byte[] clientVerifyData, byte[] serverVerifyData) { 150 151 super(socket, context, enabledProtocols, 152 (clientAuth != SSLEngineImpl.clauth_none), false, 153 activeProtocolVersion, isInitialHandshake, secureRenegotiation, 154 clientVerifyData, serverVerifyData); 155 doClientAuth = clientAuth; 156 } 157 158 /* 159 * Constructor ... use the keys found in the auth context. 160 */ 161 ServerHandshaker(SSLEngineImpl engine, SSLContextImpl context, 162 ProtocolList enabledProtocols, byte clientAuth, 163 ProtocolVersion activeProtocolVersion, 164 boolean isInitialHandshake, boolean secureRenegotiation, 165 byte[] clientVerifyData, byte[] serverVerifyData) { 166 167 super(engine, context, enabledProtocols, 168 (clientAuth != SSLEngineImpl.clauth_none), false, 169 activeProtocolVersion, isInitialHandshake, secureRenegotiation, 170 clientVerifyData, serverVerifyData); 171 doClientAuth = clientAuth; 172 } 173 174 /* 175 * As long as handshaking has not started, we can change 176 * whether client authentication is required. Otherwise, 177 * we will need to wait for the next handshake. 178 */ 179 void setClientAuth(byte clientAuth) { 180 doClientAuth = clientAuth; 181 } 182 183 /* 184 * This routine handles all the server side handshake messages, one at 185 * a time. Given the message type (and in some cases the pending cipher 186 * spec) it parses the type-specific message. Then it calls a function 187 * that handles that specific message. 188 * 189 * It updates the state machine as each message is processed, and writes 190 * responses as needed using the connection in the constructor. 191 */ 192 @Override 193 void processMessage(byte type, int message_len) 194 throws IOException { 195 // 196 // In SSLv3 and TLS, messages follow strictly increasing 197 // numerical order _except_ for one annoying special case. 198 // 199 if ((state >= type) 200 && (state != HandshakeMessage.ht_client_key_exchange 201 && type != HandshakeMessage.ht_certificate_verify)) { 202 throw new SSLProtocolException( 203 "Handshake message sequence violation, state = " + state 204 + ", type = " + type); 205 } 206 207 switch (type) { 208 case HandshakeMessage.ht_client_hello: 209 ClientHello ch = new ClientHello(input, message_len); 210 /* 211 * send it off for processing. 212 */ 213 this.clientHello(ch); 214 break; 215 216 case HandshakeMessage.ht_certificate: 217 if (doClientAuth == SSLEngineImpl.clauth_none) { 218 fatalSE(Alerts.alert_unexpected_message, 219 "client sent unsolicited cert chain"); 220 // NOTREACHED 221 } 222 this.clientCertificate(new CertificateMsg(input)); 223 break; 224 225 case HandshakeMessage.ht_client_key_exchange: 226 SecretKey preMasterSecret; 227 switch (keyExchange) { 228 case K_RSA: 229 case K_RSA_EXPORT: 230 /* 231 * The client's pre-master secret is decrypted using 232 * either the server's normal private RSA key, or the 233 * temporary one used for non-export or signing-only 234 * certificates/keys. 235 */ 236 RSAClientKeyExchange pms = new RSAClientKeyExchange( 237 protocolVersion, clientRequestedVersion, 238 sslContext.getSecureRandom(), input, 239 message_len, privateKey); 240 preMasterSecret = this.clientKeyExchange(pms); 241 break; 242 case K_KRB5: 243 case K_KRB5_EXPORT: 244 preMasterSecret = this.clientKeyExchange( 245 new KerberosClientKeyExchange(protocolVersion, 246 clientRequestedVersion, 247 sslContext.getSecureRandom(), 248 input, 249 this.getAccSE(), 250 serviceCreds)); 251 break; 252 case K_DHE_RSA: 253 case K_DHE_DSS: 254 case K_DH_ANON: 255 /* 256 * The pre-master secret is derived using the normal 257 * Diffie-Hellman calculation. Note that the main 258 * protocol difference in these five flavors is in how 259 * the ServerKeyExchange message was constructed! 260 */ 261 preMasterSecret = this.clientKeyExchange( 262 new DHClientKeyExchange(input)); 263 break; 264 case K_ECDH_RSA: 265 case K_ECDH_ECDSA: 266 case K_ECDHE_RSA: 267 case K_ECDHE_ECDSA: 268 case K_ECDH_ANON: 269 preMasterSecret = this.clientKeyExchange 270 (new ECDHClientKeyExchange(input)); 271 break; 272 default: 273 throw new SSLProtocolException 274 ("Unrecognized key exchange: " + keyExchange); 275 } 276 277 // 278 // All keys are calculated from the premaster secret 279 // and the exchanged nonces in the same way. 280 // 281 calculateKeys(preMasterSecret, clientRequestedVersion); 282 break; 283 284 case HandshakeMessage.ht_certificate_verify: 285 this.clientCertificateVerify(new CertificateVerify(input, 286 localSupportedSignAlgs, protocolVersion)); 287 break; 288 289 case HandshakeMessage.ht_finished: 290 this.clientFinished( 291 new Finished(protocolVersion, input, cipherSuite)); 292 break; 293 294 default: 295 throw new SSLProtocolException( 296 "Illegal server handshake msg, " + type); 297 } 298 299 // 300 // Move state machine forward if the message handling 301 // code didn't already do so 302 // 303 if (state < type) { 304 if(type == HandshakeMessage.ht_certificate_verify) { 305 state = type + 2; // an annoying special case 306 } else { 307 state = type; 308 } 309 } 310 } 311 312 313 /* 314 * ClientHello presents the server with a bunch of options, to which the 315 * server replies with a ServerHello listing the ones which this session 316 * will use. If needed, it also writes its Certificate plus in some cases 317 * a ServerKeyExchange message. It may also write a CertificateRequest, 318 * to elicit a client certificate. 319 * 320 * All these messages are terminated by a ServerHelloDone message. In 321 * most cases, all this can be sent in a single Record. 322 */ 323 private void clientHello(ClientHello mesg) throws IOException { 324 if (debug != null && Debug.isOn("handshake")) { 325 mesg.print(System.out); 326 } 327 328 // Reject client initiated renegotiation? 329 // 330 // If server side should reject client-initiated renegotiation, 331 // send an alert_handshake_failure fatal alert, not a no_renegotiation 332 // warning alert (no_renegotiation must be a warning: RFC 2246). 333 // no_renegotiation might seem more natural at first, but warnings 334 // are not appropriate because the sending party does not know how 335 // the receiving party will behave. This state must be treated as 336 // a fatal server condition. 337 // 338 // This will not have any impact on server initiated renegotiation. 339 if (rejectClientInitiatedRenego && !isInitialHandshake && 340 state != HandshakeMessage.ht_hello_request) { 341 fatalSE(Alerts.alert_handshake_failure, 342 "Client initiated renegotiation is not allowed"); 343 } 344 345 // check the server name indication if required 346 ServerNameExtension clientHelloSNIExt = (ServerNameExtension) 347 mesg.extensions.get(ExtensionType.EXT_SERVER_NAME); 348 if (!sniMatchers.isEmpty()) { 349 // we do not reject client without SNI extension 350 if (clientHelloSNIExt != null && 351 !clientHelloSNIExt.isMatched(sniMatchers)) { 352 fatalSE(Alerts.alert_unrecognized_name, 353 "Unrecognized server name indication"); 354 } 355 } 356 357 // Does the message include security renegotiation indication? 358 boolean renegotiationIndicated = false; 359 360 // check the TLS_EMPTY_RENEGOTIATION_INFO_SCSV 361 CipherSuiteList cipherSuites = mesg.getCipherSuites(); 362 if (cipherSuites.contains(CipherSuite.C_SCSV)) { 363 renegotiationIndicated = true; 364 if (isInitialHandshake) { 365 secureRenegotiation = true; 366 } else { 367 // abort the handshake with a fatal handshake_failure alert 368 if (secureRenegotiation) { 369 fatalSE(Alerts.alert_handshake_failure, 370 "The SCSV is present in a secure renegotiation"); 371 } else { 372 fatalSE(Alerts.alert_handshake_failure, 373 "The SCSV is present in a insecure renegotiation"); 374 } 375 } 376 } 377 378 // check the "renegotiation_info" extension 379 RenegotiationInfoExtension clientHelloRI = (RenegotiationInfoExtension) 380 mesg.extensions.get(ExtensionType.EXT_RENEGOTIATION_INFO); 381 if (clientHelloRI != null) { 382 renegotiationIndicated = true; 383 if (isInitialHandshake) { 384 // verify the length of the "renegotiated_connection" field 385 if (!clientHelloRI.isEmpty()) { 386 // abort the handshake with a fatal handshake_failure alert 387 fatalSE(Alerts.alert_handshake_failure, 388 "The renegotiation_info field is not empty"); 389 } 390 391 secureRenegotiation = true; 392 } else { 393 if (!secureRenegotiation) { 394 // unexpected RI extension for insecure renegotiation, 395 // abort the handshake with a fatal handshake_failure alert 396 fatalSE(Alerts.alert_handshake_failure, 397 "The renegotiation_info is present in a insecure " + 398 "renegotiation"); 399 } 400 401 // verify the client_verify_data value 402 if (!Arrays.equals(clientVerifyData, 403 clientHelloRI.getRenegotiatedConnection())) { 404 fatalSE(Alerts.alert_handshake_failure, 405 "Incorrect verify data in ClientHello " + 406 "renegotiation_info message"); 407 } 408 } 409 } else if (!isInitialHandshake && secureRenegotiation) { 410 // if the connection's "secure_renegotiation" flag is set to TRUE 411 // and the "renegotiation_info" extension is not present, abort 412 // the handshake. 413 fatalSE(Alerts.alert_handshake_failure, 414 "Inconsistent secure renegotiation indication"); 415 } 416 417 // if there is no security renegotiation indication or the previous 418 // handshake is insecure. 419 if (!renegotiationIndicated || !secureRenegotiation) { 420 if (isInitialHandshake) { 421 if (!allowLegacyHelloMessages) { 422 // abort the handshake with a fatal handshake_failure alert 423 fatalSE(Alerts.alert_handshake_failure, 424 "Failed to negotiate the use of secure renegotiation"); 425 } 426 427 // continue with legacy ClientHello 428 if (debug != null && Debug.isOn("handshake")) { 429 System.out.println("Warning: No renegotiation " + 430 "indication in ClientHello, allow legacy ClientHello"); 431 } 432 } else if (!allowUnsafeRenegotiation) { 433 // abort the handshake 434 if (activeProtocolVersion.v >= ProtocolVersion.TLS10.v) { 435 // respond with a no_renegotiation warning 436 warningSE(Alerts.alert_no_renegotiation); 437 438 // invalidate the handshake so that the caller can 439 // dispose this object. 440 invalidated = true; 441 442 // If there is still unread block in the handshake 443 // input stream, it would be truncated with the disposal 444 // and the next handshake message will become incomplete. 445 // 446 // However, according to SSL/TLS specifications, no more 447 // handshake message could immediately follow ClientHello 448 // or HelloRequest. But in case of any improper messages, 449 // we'd better check to ensure there is no remaining bytes 450 // in the handshake input stream. 451 if (input.available() > 0) { 452 fatalSE(Alerts.alert_unexpected_message, 453 "ClientHello followed by an unexpected " + 454 "handshake message"); 455 } 456 457 return; 458 } else { 459 // For SSLv3, send the handshake_failure fatal error. 460 // Note that SSLv3 does not define a no_renegotiation 461 // alert like TLSv1. However we cannot ignore the message 462 // simply, otherwise the other side was waiting for a 463 // response that would never come. 464 fatalSE(Alerts.alert_handshake_failure, 465 "Renegotiation is not allowed"); 466 } 467 } else { // !isInitialHandshake && allowUnsafeRenegotiation 468 // continue with unsafe renegotiation. 469 if (debug != null && Debug.isOn("handshake")) { 470 System.out.println( 471 "Warning: continue with insecure renegotiation"); 472 } 473 } 474 } 475 476 /* 477 * Always make sure this entire record has been digested before we 478 * start emitting output, to ensure correct digesting order. 479 */ 480 input.digestNow(); 481 482 /* 483 * FIRST, construct the ServerHello using the options and priorities 484 * from the ClientHello. Update the (pending) cipher spec as we do 485 * so, and save the client's version to protect against rollback 486 * attacks. 487 * 488 * There are a bunch of minor tasks here, and one major one: deciding 489 * if the short or the full handshake sequence will be used. 490 */ 491 ServerHello m1 = new ServerHello(); 492 493 clientRequestedVersion = mesg.protocolVersion; 494 495 // select a proper protocol version. 496 ProtocolVersion selectedVersion = 497 selectProtocolVersion(clientRequestedVersion); 498 if (selectedVersion == null || 499 selectedVersion.v == ProtocolVersion.SSL20Hello.v) { 500 fatalSE(Alerts.alert_handshake_failure, 501 "Client requested protocol " + clientRequestedVersion + 502 " not enabled or not supported"); 503 } 504 505 handshakeHash.protocolDetermined(selectedVersion); 506 setVersion(selectedVersion); 507 508 m1.protocolVersion = protocolVersion; 509 510 // 511 // random ... save client and server values for later use 512 // in computing the master secret (from pre-master secret) 513 // and thence the other crypto keys. 514 // 515 // NOTE: this use of three inputs to generating _each_ set 516 // of ciphers slows things down, but it does increase the 517 // security since each connection in the session can hold 518 // its own authenticated (and strong) keys. One could make 519 // creation of a session a rare thing... 520 // 521 clnt_random = mesg.clnt_random; 522 svr_random = new RandomCookie(sslContext.getSecureRandom()); 523 m1.svr_random = svr_random; 524 525 session = null; // forget about the current session 526 // 527 // Here we go down either of two paths: (a) the fast one, where 528 // the client's asked to rejoin an existing session, and the server 529 // permits this; (b) the other one, where a new session is created. 530 // 531 if (mesg.sessionId.length() != 0) { 532 // client is trying to resume a session, let's see... 533 534 SSLSessionImpl previous = ((SSLSessionContextImpl)sslContext 535 .engineGetServerSessionContext()) 536 .get(mesg.sessionId.getId()); 537 // 538 // Check if we can use the fast path, resuming a session. We 539 // can do so iff we have a valid record for that session, and 540 // the cipher suite for that session was on the list which the 541 // client requested, and if we're not forgetting any needed 542 // authentication on the part of the client. 543 // 544 if (previous != null) { 545 resumingSession = previous.isRejoinable(); 546 547 if (resumingSession) { 548 ProtocolVersion oldVersion = previous.getProtocolVersion(); 549 // cannot resume session with different version 550 if (oldVersion != protocolVersion) { 551 resumingSession = false; 552 } 553 } 554 555 // cannot resume session with different server name indication 556 if (resumingSession) { 557 List<SNIServerName> oldServerNames = 558 previous.getRequestedServerNames(); 559 if (clientHelloSNIExt != null) { 560 if (!clientHelloSNIExt.isIdentical(oldServerNames)) { 561 resumingSession = false; 562 } 563 } else if (!oldServerNames.isEmpty()) { 564 resumingSession = false; 565 } 566 567 if (!resumingSession && 568 debug != null && Debug.isOn("handshake")) { 569 System.out.println( 570 "The requested server name indication " + 571 "is not identical to the previous one"); 572 } 573 } 574 575 if (resumingSession && 576 (doClientAuth == SSLEngineImpl.clauth_required)) { 577 try { 578 previous.getPeerPrincipal(); 579 } catch (SSLPeerUnverifiedException e) { 580 resumingSession = false; 581 } 582 } 583 584 // validate subject identity 585 if (resumingSession) { 586 CipherSuite suite = previous.getSuite(); 587 if (suite.keyExchange == K_KRB5 || 588 suite.keyExchange == K_KRB5_EXPORT) { 589 Principal localPrincipal = previous.getLocalPrincipal(); 590 591 Subject subject = null; 592 try { 593 subject = AccessController.doPrivileged( 594 new PrivilegedExceptionAction<Subject>() { 595 @Override 596 public Subject run() throws Exception { 597 return 598 Krb5Helper.getServerSubject(getAccSE()); 599 }}); 600 } catch (PrivilegedActionException e) { 601 subject = null; 602 if (debug != null && Debug.isOn("session")) { 603 System.out.println("Attempt to obtain" + 604 " subject failed!"); 605 } 606 } 607 608 if (subject != null) { 609 // Eliminate dependency on KerberosPrincipal 610 if (Krb5Helper.isRelated(subject, localPrincipal)) { 611 if (debug != null && Debug.isOn("session")) 612 System.out.println("Subject can" + 613 " provide creds for princ"); 614 } else { 615 resumingSession = false; 616 if (debug != null && Debug.isOn("session")) 617 System.out.println("Subject cannot" + 618 " provide creds for princ"); 619 } 620 } else { 621 resumingSession = false; 622 if (debug != null && Debug.isOn("session")) 623 System.out.println("Kerberos credentials are" + 624 " not present in the current Subject;" + 625 " check if " + 626 " javax.security.auth.useSubjectAsCreds" + 627 " system property has been set to false"); 628 } 629 } 630 } 631 632 if (resumingSession) { 633 CipherSuite suite = previous.getSuite(); 634 // verify that the ciphersuite from the cached session 635 // is in the list of client requested ciphersuites and 636 // we have it enabled 637 if ((isNegotiable(suite) == false) || 638 (mesg.getCipherSuites().contains(suite) == false)) { 639 resumingSession = false; 640 } else { 641 // everything looks ok, set the ciphersuite 642 // this should be done last when we are sure we 643 // will resume 644 setCipherSuite(suite); 645 } 646 } 647 648 if (resumingSession) { 649 session = previous; 650 if (debug != null && 651 (Debug.isOn("handshake") || Debug.isOn("session"))) { 652 System.out.println("%% Resuming " + session); 653 } 654 } 655 } 656 } // else client did not try to resume 657 658 // 659 // If client hasn't specified a session we can resume, start a 660 // new one and choose its cipher suite and compression options. 661 // Unless new session creation is disabled for this connection! 662 // 663 if (session == null) { 664 if (!enableNewSession) { 665 throw new SSLException("Client did not resume a session"); 666 } 667 668 supportedCurves = (SupportedEllipticCurvesExtension) 669 mesg.extensions.get(ExtensionType.EXT_ELLIPTIC_CURVES); 670 671 // We only need to handle the "signature_algorithm" extension 672 // for full handshakes and TLS 1.2 or later. 673 if (protocolVersion.v >= ProtocolVersion.TLS12.v) { 674 SignatureAlgorithmsExtension signAlgs = 675 (SignatureAlgorithmsExtension)mesg.extensions.get( 676 ExtensionType.EXT_SIGNATURE_ALGORITHMS); 677 if (signAlgs != null) { 678 Collection<SignatureAndHashAlgorithm> peerSignAlgs = 679 signAlgs.getSignAlgorithms(); 680 if (peerSignAlgs == null || peerSignAlgs.isEmpty()) { 681 throw new SSLHandshakeException( 682 "No peer supported signature algorithms"); 683 } 684 685 Collection<SignatureAndHashAlgorithm> 686 supportedPeerSignAlgs = 687 SignatureAndHashAlgorithm.getSupportedAlgorithms( 688 peerSignAlgs); 689 if (supportedPeerSignAlgs.isEmpty()) { 690 throw new SSLHandshakeException( 691 "No supported signature and hash algorithm " + 692 "in common"); 693 } 694 695 setPeerSupportedSignAlgs(supportedPeerSignAlgs); 696 } // else, need to use peer implicit supported signature algs 697 } 698 699 session = new SSLSessionImpl(protocolVersion, CipherSuite.C_NULL, 700 getLocalSupportedSignAlgs(), 701 sslContext.getSecureRandom(), 702 getHostAddressSE(), getPortSE()); 703 704 if (protocolVersion.v >= ProtocolVersion.TLS12.v) { 705 if (peerSupportedSignAlgs != null) { 706 session.setPeerSupportedSignatureAlgorithms( 707 peerSupportedSignAlgs); 708 } // else, we will set the implicit peer supported signature 709 // algorithms in chooseCipherSuite() 710 } 711 712 // set the server name indication in the session 713 List<SNIServerName> clientHelloSNI = 714 Collections.<SNIServerName>emptyList(); 715 if (clientHelloSNIExt != null) { 716 clientHelloSNI = clientHelloSNIExt.getServerNames(); 717 } 718 session.setRequestedServerNames(clientHelloSNI); 719 720 // set the handshake session 721 setHandshakeSessionSE(session); 722 723 // choose cipher suite and corresponding private key 724 chooseCipherSuite(mesg); 725 726 session.setSuite(cipherSuite); 727 session.setLocalPrivateKey(privateKey); 728 729 // chooseCompression(mesg); 730 } else { 731 // set the handshake session 732 setHandshakeSessionSE(session); 733 } 734 735 if (protocolVersion.v >= ProtocolVersion.TLS12.v) { 736 handshakeHash.setFinishedAlg(cipherSuite.prfAlg.getPRFHashAlg()); 737 } 738 739 m1.cipherSuite = cipherSuite; 740 m1.sessionId = session.getSessionId(); 741 m1.compression_method = session.getCompression(); 742 743 if (secureRenegotiation) { 744 // For ServerHellos that are initial handshakes, then the 745 // "renegotiated_connection" field in "renegotiation_info" 746 // extension is of zero length. 747 // 748 // For ServerHellos that are renegotiating, this field contains 749 // the concatenation of client_verify_data and server_verify_data. 750 // 751 // Note that for initial handshakes, both the clientVerifyData 752 // variable and serverVerifyData variable are of zero length. 753 HelloExtension serverHelloRI = new RenegotiationInfoExtension( 754 clientVerifyData, serverVerifyData); 755 m1.extensions.add(serverHelloRI); 756 } 757 758 if (!sniMatchers.isEmpty() && clientHelloSNIExt != null) { 759 // When resuming a session, the server MUST NOT include a 760 // server_name extension in the server hello. 761 if (!resumingSession) { 762 ServerNameExtension serverHelloSNI = new ServerNameExtension(); 763 m1.extensions.add(serverHelloSNI); 764 } 765 } 766 767 if (debug != null && Debug.isOn("handshake")) { 768 m1.print(System.out); 769 System.out.println("Cipher suite: " + session.getSuite()); 770 } 771 m1.write(output); 772 773 // 774 // If we are resuming a session, we finish writing handshake 775 // messages right now and then finish. 776 // 777 if (resumingSession) { 778 calculateConnectionKeys(session.getMasterSecret()); 779 sendChangeCipherAndFinish(false); 780 return; 781 } 782 783 784 /* 785 * SECOND, write the server Certificate(s) if we need to. 786 * 787 * NOTE: while an "anonymous RSA" mode is explicitly allowed by 788 * the protocol, we can't support it since all of the SSL flavors 789 * defined in the protocol spec are explicitly stated to require 790 * using RSA certificates. 791 */ 792 if (keyExchange == K_KRB5 || keyExchange == K_KRB5_EXPORT) { 793 // Server certificates are omitted for Kerberos ciphers 794 795 } else if ((keyExchange != K_DH_ANON) && (keyExchange != K_ECDH_ANON)) { 796 if (certs == null) { 797 throw new RuntimeException("no certificates"); 798 } 799 800 CertificateMsg m2 = new CertificateMsg(certs); 801 802 /* 803 * Set local certs in the SSLSession, output 804 * debug info, and then actually write to the client. 805 */ 806 session.setLocalCertificates(certs); 807 if (debug != null && Debug.isOn("handshake")) { 808 m2.print(System.out); 809 } 810 m2.write(output); 811 812 // XXX has some side effects with OS TCP buffering, 813 // leave it out for now 814 815 // let client verify chain in the meantime... 816 // output.flush(); 817 } else { 818 if (certs != null) { 819 throw new RuntimeException("anonymous keyexchange with certs"); 820 } 821 } 822 823 /* 824 * THIRD, the ServerKeyExchange message ... iff it's needed. 825 * 826 * It's usually needed unless there's an encryption-capable 827 * RSA cert, or a D-H cert. The notable exception is that 828 * exportable ciphers used with big RSA keys need to downgrade 829 * to use short RSA keys, even when the key/cert encrypts OK. 830 */ 831 832 ServerKeyExchange m3; 833 switch (keyExchange) { 834 case K_RSA: 835 case K_KRB5: 836 case K_KRB5_EXPORT: 837 // no server key exchange for RSA or KRB5 ciphersuites 838 m3 = null; 839 break; 840 case K_RSA_EXPORT: 841 if (JsseJce.getRSAKeyLength(certs[0].getPublicKey()) > 512) { 842 try { 843 m3 = new RSA_ServerKeyExchange( 844 tempPublicKey, privateKey, 845 clnt_random, svr_random, 846 sslContext.getSecureRandom()); 847 privateKey = tempPrivateKey; 848 } catch (GeneralSecurityException e) { 849 throwSSLException 850 ("Error generating RSA server key exchange", e); 851 m3 = null; // make compiler happy 852 } 853 } else { 854 // RSA_EXPORT with short key, don't need ServerKeyExchange 855 m3 = null; 856 } 857 break; 858 case K_DHE_RSA: 859 case K_DHE_DSS: 860 try { 861 m3 = new DH_ServerKeyExchange(dh, 862 privateKey, 863 clnt_random.random_bytes, 864 svr_random.random_bytes, 865 sslContext.getSecureRandom(), 866 preferableSignatureAlgorithm, 867 protocolVersion); 868 } catch (GeneralSecurityException e) { 869 throwSSLException("Error generating DH server key exchange", e); 870 m3 = null; // make compiler happy 871 } 872 break; 873 case K_DH_ANON: 874 m3 = new DH_ServerKeyExchange(dh, protocolVersion); 875 break; 876 case K_ECDHE_RSA: 877 case K_ECDHE_ECDSA: 878 case K_ECDH_ANON: 879 try { 880 m3 = new ECDH_ServerKeyExchange(ecdh, 881 privateKey, 882 clnt_random.random_bytes, 883 svr_random.random_bytes, 884 sslContext.getSecureRandom(), 885 preferableSignatureAlgorithm, 886 protocolVersion); 887 } catch (GeneralSecurityException e) { 888 throwSSLException( 889 "Error generating ECDH server key exchange", e); 890 m3 = null; // make compiler happy 891 } 892 break; 893 case K_ECDH_RSA: 894 case K_ECDH_ECDSA: 895 // ServerKeyExchange not used for fixed ECDH 896 m3 = null; 897 break; 898 default: 899 throw new RuntimeException("internal error: " + keyExchange); 900 } 901 if (m3 != null) { 902 if (debug != null && Debug.isOn("handshake")) { 903 m3.print(System.out); 904 } 905 m3.write(output); 906 } 907 908 // 909 // FOURTH, the CertificateRequest message. The details of 910 // the message can be affected by the key exchange algorithm 911 // in use. For example, certs with fixed Diffie-Hellman keys 912 // are only useful with the DH_DSS and DH_RSA key exchange 913 // algorithms. 914 // 915 // Needed only if server requires client to authenticate self. 916 // Illegal for anonymous flavors, so we need to check that. 917 // 918 // CertificateRequest is omitted for Kerberos ciphers 919 if (doClientAuth != SSLEngineImpl.clauth_none && 920 keyExchange != K_DH_ANON && keyExchange != K_ECDH_ANON && 921 keyExchange != K_KRB5 && keyExchange != K_KRB5_EXPORT) { 922 923 CertificateRequest m4; 924 X509Certificate caCerts[]; 925 926 Collection<SignatureAndHashAlgorithm> localSignAlgs = null; 927 if (protocolVersion.v >= ProtocolVersion.TLS12.v) { 928 // We currently use all local upported signature and hash 929 // algorithms. However, to minimize the computation cost 930 // of requested hash algorithms, we may use a restricted 931 // set of signature algorithms in the future. 932 localSignAlgs = getLocalSupportedSignAlgs(); 933 if (localSignAlgs.isEmpty()) { 934 throw new SSLHandshakeException( 935 "No supported signature algorithm"); 936 } 937 938 Set<String> localHashAlgs = 939 SignatureAndHashAlgorithm.getHashAlgorithmNames( 940 localSignAlgs); 941 if (localHashAlgs.isEmpty()) { 942 throw new SSLHandshakeException( 943 "No supported signature algorithm"); 944 } 945 } 946 947 caCerts = sslContext.getX509TrustManager().getAcceptedIssuers(); 948 m4 = new CertificateRequest(caCerts, keyExchange, 949 localSignAlgs, protocolVersion); 950 951 if (debug != null && Debug.isOn("handshake")) { 952 m4.print(System.out); 953 } 954 m4.write(output); 955 } 956 957 /* 958 * FIFTH, say ServerHelloDone. 959 */ 960 ServerHelloDone m5 = new ServerHelloDone(); 961 962 if (debug != null && Debug.isOn("handshake")) { 963 m5.print(System.out); 964 } 965 m5.write(output); 966 967 /* 968 * Flush any buffered messages so the client will see them. 969 * Ideally, all the messages above go in a single network level 970 * message to the client. Without big Certificate chains, it's 971 * going to be the common case. 972 */ 973 output.flush(); 974 } 975 976 /* 977 * Choose cipher suite from among those supported by client. Sets 978 * the cipherSuite and keyExchange variables. 979 */ 980 private void chooseCipherSuite(ClientHello mesg) throws IOException { 981 CipherSuiteList prefered; 982 CipherSuiteList proposed; 983 if (preferLocalCipherSuites) { 984 prefered = getActiveCipherSuites(); 985 proposed = mesg.getCipherSuites(); 986 } else { 987 prefered = mesg.getCipherSuites(); 988 proposed = getActiveCipherSuites(); 989 } 990 991 for (CipherSuite suite : prefered.collection()) { 992 if (isNegotiable(proposed, suite) == false) { 993 continue; 994 } 995 996 if (doClientAuth == SSLEngineImpl.clauth_required) { 997 if ((suite.keyExchange == K_DH_ANON) || 998 (suite.keyExchange == K_ECDH_ANON)) { 999 continue; 1000 } 1001 } 1002 if (trySetCipherSuite(suite) == false) { 1003 continue; 1004 } 1005 return; 1006 } 1007 fatalSE(Alerts.alert_handshake_failure, "no cipher suites in common"); 1008 } 1009 1010 /** 1011 * Set the given CipherSuite, if possible. Return the result. 1012 * The call succeeds if the CipherSuite is available and we have 1013 * the necessary certificates to complete the handshake. We don't 1014 * check if the CipherSuite is actually enabled. 1015 * 1016 * If successful, this method also generates ephemeral keys if 1017 * required for this ciphersuite. This may take some time, so this 1018 * method should only be called if you really want to use the 1019 * CipherSuite. 1020 * 1021 * This method is called from chooseCipherSuite() in this class. 1022 */ 1023 boolean trySetCipherSuite(CipherSuite suite) { 1024 /* 1025 * If we're resuming a session we know we can 1026 * support this key exchange algorithm and in fact 1027 * have already cached the result of it in 1028 * the session state. 1029 */ 1030 if (resumingSession) { 1031 return true; 1032 } 1033 1034 if (suite.isNegotiable() == false) { 1035 return false; 1036 } 1037 1038 // must not negotiate the obsoleted weak cipher suites. 1039 if (protocolVersion.v >= suite.obsoleted) { 1040 return false; 1041 } 1042 1043 // must not negotiate unsupported cipher suites. 1044 if (protocolVersion.v < suite.supported) { 1045 return false; 1046 } 1047 1048 KeyExchange keyExchange = suite.keyExchange; 1049 1050 // null out any existing references 1051 privateKey = null; 1052 certs = null; 1053 dh = null; 1054 tempPrivateKey = null; 1055 tempPublicKey = null; 1056 1057 Collection<SignatureAndHashAlgorithm> supportedSignAlgs = null; 1058 if (protocolVersion.v >= ProtocolVersion.TLS12.v) { 1059 if (peerSupportedSignAlgs != null) { 1060 supportedSignAlgs = peerSupportedSignAlgs; 1061 } else { 1062 SignatureAndHashAlgorithm algorithm = null; 1063 1064 // we may optimize the performance 1065 switch (keyExchange) { 1066 // If the negotiated key exchange algorithm is one of 1067 // (RSA, DHE_RSA, DH_RSA, RSA_PSK, ECDH_RSA, ECDHE_RSA), 1068 // behave as if client had sent the value {sha1,rsa}. 1069 case K_RSA: 1070 case K_DHE_RSA: 1071 case K_DH_RSA: 1072 // case K_RSA_PSK: 1073 case K_ECDH_RSA: 1074 case K_ECDHE_RSA: 1075 algorithm = SignatureAndHashAlgorithm.valueOf( 1076 HashAlgorithm.SHA1.value, 1077 SignatureAlgorithm.RSA.value, 0); 1078 break; 1079 // If the negotiated key exchange algorithm is one of 1080 // (DHE_DSS, DH_DSS), behave as if the client had 1081 // sent the value {sha1,dsa}. 1082 case K_DHE_DSS: 1083 case K_DH_DSS: 1084 algorithm = SignatureAndHashAlgorithm.valueOf( 1085 HashAlgorithm.SHA1.value, 1086 SignatureAlgorithm.DSA.value, 0); 1087 break; 1088 // If the negotiated key exchange algorithm is one of 1089 // (ECDH_ECDSA, ECDHE_ECDSA), behave as if the client 1090 // had sent value {sha1,ecdsa}. 1091 case K_ECDH_ECDSA: 1092 case K_ECDHE_ECDSA: 1093 algorithm = SignatureAndHashAlgorithm.valueOf( 1094 HashAlgorithm.SHA1.value, 1095 SignatureAlgorithm.ECDSA.value, 0); 1096 break; 1097 default: 1098 // no peer supported signature algorithms 1099 } 1100 1101 if (algorithm == null) { 1102 supportedSignAlgs = 1103 Collections.<SignatureAndHashAlgorithm>emptySet(); 1104 } else { 1105 supportedSignAlgs = 1106 new ArrayList<SignatureAndHashAlgorithm>(1); 1107 supportedSignAlgs.add(algorithm); 1108 } 1109 1110 // Sets the peer supported signature algorithm to use in KM 1111 // temporarily. 1112 session.setPeerSupportedSignatureAlgorithms(supportedSignAlgs); 1113 } 1114 } 1115 1116 switch (keyExchange) { 1117 case K_RSA: 1118 // need RSA certs for authentication 1119 if (setupPrivateKeyAndChain("RSA") == false) { 1120 return false; 1121 } 1122 break; 1123 case K_RSA_EXPORT: 1124 // need RSA certs for authentication 1125 if (setupPrivateKeyAndChain("RSA") == false) { 1126 return false; 1127 } 1128 1129 try { 1130 if (JsseJce.getRSAKeyLength(certs[0].getPublicKey()) > 512) { 1131 if (!setupEphemeralRSAKeys(suite.exportable)) { 1132 return false; 1133 } 1134 } 1135 } catch (RuntimeException e) { 1136 // could not determine keylength, ignore key 1137 return false; 1138 } 1139 break; 1140 case K_DHE_RSA: 1141 // need RSA certs for authentication 1142 if (setupPrivateKeyAndChain("RSA") == false) { 1143 return false; 1144 } 1145 1146 // get preferable peer signature algorithm for server key exchange 1147 if (protocolVersion.v >= ProtocolVersion.TLS12.v) { 1148 preferableSignatureAlgorithm = 1149 SignatureAndHashAlgorithm.getPreferableAlgorithm( 1150 supportedSignAlgs, "RSA", privateKey); 1151 if (preferableSignatureAlgorithm == null) { 1152 return false; 1153 } 1154 } 1155 1156 setupEphemeralDHKeys(suite.exportable, privateKey); 1157 break; 1158 case K_ECDHE_RSA: 1159 // need RSA certs for authentication 1160 if (setupPrivateKeyAndChain("RSA") == false) { 1161 return false; 1162 } 1163 1164 // get preferable peer signature algorithm for server key exchange 1165 if (protocolVersion.v >= ProtocolVersion.TLS12.v) { 1166 preferableSignatureAlgorithm = 1167 SignatureAndHashAlgorithm.getPreferableAlgorithm( 1168 supportedSignAlgs, "RSA", privateKey); 1169 if (preferableSignatureAlgorithm == null) { 1170 return false; 1171 } 1172 } 1173 1174 if (setupEphemeralECDHKeys() == false) { 1175 return false; 1176 } 1177 break; 1178 case K_DHE_DSS: 1179 // get preferable peer signature algorithm for server key exchange 1180 if (protocolVersion.v >= ProtocolVersion.TLS12.v) { 1181 preferableSignatureAlgorithm = 1182 SignatureAndHashAlgorithm.getPreferableAlgorithm( 1183 supportedSignAlgs, "DSA"); 1184 if (preferableSignatureAlgorithm == null) { 1185 return false; 1186 } 1187 } 1188 1189 // need DSS certs for authentication 1190 if (setupPrivateKeyAndChain("DSA") == false) { 1191 return false; 1192 } 1193 1194 setupEphemeralDHKeys(suite.exportable, privateKey); 1195 break; 1196 case K_ECDHE_ECDSA: 1197 // get preferable peer signature algorithm for server key exchange 1198 if (protocolVersion.v >= ProtocolVersion.TLS12.v) { 1199 preferableSignatureAlgorithm = 1200 SignatureAndHashAlgorithm.getPreferableAlgorithm( 1201 supportedSignAlgs, "ECDSA"); 1202 if (preferableSignatureAlgorithm == null) { 1203 return false; 1204 } 1205 } 1206 1207 // need EC cert signed using EC 1208 if (setupPrivateKeyAndChain("EC_EC") == false) { 1209 return false; 1210 } 1211 if (setupEphemeralECDHKeys() == false) { 1212 return false; 1213 } 1214 break; 1215 case K_ECDH_RSA: 1216 // need EC cert signed using RSA 1217 if (setupPrivateKeyAndChain("EC_RSA") == false) { 1218 return false; 1219 } 1220 setupStaticECDHKeys(); 1221 break; 1222 case K_ECDH_ECDSA: 1223 // need EC cert signed using EC 1224 if (setupPrivateKeyAndChain("EC_EC") == false) { 1225 return false; 1226 } 1227 setupStaticECDHKeys(); 1228 break; 1229 case K_KRB5: 1230 case K_KRB5_EXPORT: 1231 // need Kerberos Key 1232 if (!setupKerberosKeys()) { 1233 return false; 1234 } 1235 break; 1236 case K_DH_ANON: 1237 // no certs needed for anonymous 1238 setupEphemeralDHKeys(suite.exportable, null); 1239 break; 1240 case K_ECDH_ANON: 1241 // no certs needed for anonymous 1242 if (setupEphemeralECDHKeys() == false) { 1243 return false; 1244 } 1245 break; 1246 default: 1247 // internal error, unknown key exchange 1248 throw new RuntimeException("Unrecognized cipherSuite: " + suite); 1249 } 1250 setCipherSuite(suite); 1251 1252 // set the peer implicit supported signature algorithms 1253 if (protocolVersion.v >= ProtocolVersion.TLS12.v) { 1254 if (peerSupportedSignAlgs == null) { 1255 setPeerSupportedSignAlgs(supportedSignAlgs); 1256 // we had alreay update the session 1257 } 1258 } 1259 return true; 1260 } 1261 1262 /* 1263 * Get some "ephemeral" RSA keys for this context. This means 1264 * generating them if it's not already been done. 1265 * 1266 * Note that we currently do not implement any ciphersuites that use 1267 * strong ephemeral RSA. (We do not support the EXPORT1024 ciphersuites 1268 * and standard RSA ciphersuites prohibit ephemeral mode for some reason) 1269 * This means that export is always true and 512 bit keys are generated. 1270 */ 1271 private boolean setupEphemeralRSAKeys(boolean export) { 1272 KeyPair kp = sslContext.getEphemeralKeyManager(). 1273 getRSAKeyPair(export, sslContext.getSecureRandom()); 1274 if (kp == null) { 1275 return false; 1276 } else { 1277 tempPublicKey = kp.getPublic(); 1278 tempPrivateKey = kp.getPrivate(); 1279 return true; 1280 } 1281 } 1282 1283 /* 1284 * Acquire some "ephemeral" Diffie-Hellman keys for this handshake. 1285 * We don't reuse these, for improved forward secrecy. 1286 */ 1287 private void setupEphemeralDHKeys(boolean export, Key key) { 1288 /* 1289 * 768 bits ephemeral DH private keys were used to be used in 1290 * ServerKeyExchange except that exportable ciphers max out at 512 1291 * bits modulus values. We still adhere to this behavior in legacy 1292 * mode (system property "jdk.tls.ephemeralDHKeySize" is defined 1293 * as "legacy"). 1294 * 1295 * Old JDK (JDK 7 and previous) releases don't support DH keys bigger 1296 * than 1024 bits. We have to consider the compatibility requirement. 1297 * 1024 bits DH key is always used for non-exportable cipher suites 1298 * in default mode (system property "jdk.tls.ephemeralDHKeySize" 1299 * is not defined). 1300 * 1301 * However, if applications want more stronger strength, setting 1302 * system property "jdk.tls.ephemeralDHKeySize" to "matched" 1303 * is a workaround to use ephemeral DH key which size matches the 1304 * corresponding authentication key. For example, if the public key 1305 * size of an authentication certificate is 2048 bits, then the 1306 * ephemeral DH key size should be 2048 bits accordingly unless 1307 * the cipher suite is exportable. This key sizing scheme keeps 1308 * the cryptographic strength consistent between authentication 1309 * keys and key-exchange keys. 1310 * 1311 * Applications may also want to customize the ephemeral DH key size 1312 * to a fixed length for non-exportable cipher suites. This can be 1313 * approached by setting system property "jdk.tls.ephemeralDHKeySize" 1314 * to a valid positive integer between 1024 and 2048 bits, inclusive. 1315 * 1316 * Note that the minimum acceptable key size is 1024 bits except 1317 * exportable cipher suites or legacy mode. 1318 * 1319 * Note that the maximum acceptable key size is 2048 bits because 1320 * DH keys bigger than 2048 are not always supported by underlying 1321 * JCE providers. 1322 * 1323 * Note that per RFC 2246, the key size limit of DH is 512 bits for 1324 * exportable cipher suites. Because of the weakness, exportable 1325 * cipher suites are deprecated since TLS v1.1 and they are not 1326 * enabled by default in Oracle provider. The legacy behavior is 1327 * reserved and 512 bits DH key is always used for exportable 1328 * cipher suites. 1329 */ 1330 int keySize = export ? 512 : 1024; // default mode 1331 if (!export) { 1332 if (useLegacyEphemeralDHKeys) { // legacy mode 1333 keySize = 768; 1334 } else if (useSmartEphemeralDHKeys) { // matched mode 1335 if (key != null) { 1336 int ks = KeyUtil.getKeySize(key); 1337 // Note that SunJCE provider only supports 2048 bits DH 1338 // keys bigger than 1024. Please DON'T use value other 1339 // than 1024 and 2048 at present. We may improve the 1340 // underlying providers and key size here in the future. 1341 // 1342 // keySize = ks <= 1024 ? 1024 : (ks >= 2048 ? 2048 : ks); 1343 keySize = ks <= 1024 ? 1024 : 2048; 1344 } // Otherwise, anonymous cipher suites, 1024-bit is used. 1345 } else if (customizedDHKeySize > 0) { // customized mode 1346 keySize = customizedDHKeySize; 1347 } 1348 } 1349 1350 dh = new DHCrypt(keySize, sslContext.getSecureRandom()); 1351 } 1352 1353 // Setup the ephemeral ECDH parameters. 1354 // If we cannot continue because we do not support any of the curves that 1355 // the client requested, return false. Otherwise (all is well), return true. 1356 private boolean setupEphemeralECDHKeys() { 1357 int index = -1; 1358 if (supportedCurves != null) { 1359 // if the client sent the supported curves extension, pick the 1360 // first one that we support; 1361 for (int curveId : supportedCurves.curveIds()) { 1362 if (SupportedEllipticCurvesExtension.isSupported(curveId)) { 1363 index = curveId; 1364 break; 1365 } 1366 } 1367 if (index < 0) { 1368 // no match found, cannot use this ciphersuite 1369 return false; 1370 } 1371 } else { 1372 // pick our preference 1373 index = SupportedEllipticCurvesExtension.DEFAULT.curveIds()[0]; 1374 } 1375 String oid = SupportedEllipticCurvesExtension.getCurveOid(index); 1376 ecdh = new ECDHCrypt(oid, sslContext.getSecureRandom()); 1377 return true; 1378 } 1379 1380 private void setupStaticECDHKeys() { 1381 // don't need to check whether the curve is supported, already done 1382 // in setupPrivateKeyAndChain(). 1383 ecdh = new ECDHCrypt(privateKey, certs[0].getPublicKey()); 1384 } 1385 1386 /** 1387 * Retrieve the server key and certificate for the specified algorithm 1388 * from the KeyManager and set the instance variables. 1389 * 1390 * @return true if successful, false if not available or invalid 1391 */ 1392 private boolean setupPrivateKeyAndChain(String algorithm) { 1393 X509ExtendedKeyManager km = sslContext.getX509KeyManager(); 1394 String alias; 1395 if (conn != null) { 1396 alias = km.chooseServerAlias(algorithm, null, conn); 1397 } else { 1398 alias = km.chooseEngineServerAlias(algorithm, null, engine); 1399 } 1400 if (alias == null) { 1401 return false; 1402 } 1403 PrivateKey tempPrivateKey = km.getPrivateKey(alias); 1404 if (tempPrivateKey == null) { 1405 return false; 1406 } 1407 X509Certificate[] tempCerts = km.getCertificateChain(alias); 1408 if ((tempCerts == null) || (tempCerts.length == 0)) { 1409 return false; 1410 } 1411 String keyAlgorithm = algorithm.split("_")[0]; 1412 PublicKey publicKey = tempCerts[0].getPublicKey(); 1413 if ((tempPrivateKey.getAlgorithm().equals(keyAlgorithm) == false) 1414 || (publicKey.getAlgorithm().equals(keyAlgorithm) == false)) { 1415 return false; 1416 } 1417 // For ECC certs, check whether we support the EC domain parameters. 1418 // If the client sent a SupportedEllipticCurves ClientHello extension, 1419 // check against that too. 1420 if (keyAlgorithm.equals("EC")) { 1421 if (publicKey instanceof ECPublicKey == false) { 1422 return false; 1423 } 1424 ECParameterSpec params = ((ECPublicKey)publicKey).getParams(); 1425 int index = SupportedEllipticCurvesExtension.getCurveIndex(params); 1426 if (SupportedEllipticCurvesExtension.isSupported(index) == false) { 1427 return false; 1428 } 1429 if ((supportedCurves != null) && !supportedCurves.contains(index)) { 1430 return false; 1431 } 1432 } 1433 this.privateKey = tempPrivateKey; 1434 this.certs = tempCerts; 1435 return true; 1436 } 1437 1438 /** 1439 * Retrieve the Kerberos key for the specified server principal 1440 * from the JAAS configuration file. 1441 * 1442 * @return true if successful, false if not available or invalid 1443 */ 1444 private boolean setupKerberosKeys() { 1445 if (serviceCreds != null) { 1446 return true; 1447 } 1448 try { 1449 final AccessControlContext acc = getAccSE(); 1450 serviceCreds = AccessController.doPrivileged( 1451 // Eliminate dependency on KerberosKey 1452 new PrivilegedExceptionAction<Object>() { 1453 @Override 1454 public Object run() throws Exception { 1455 // get kerberos key for the default principal 1456 return Krb5Helper.getServiceCreds(acc); 1457 }}); 1458 1459 // check permission to access and use the secret key of the 1460 // Kerberized "host" service 1461 if (serviceCreds != null) { 1462 if (debug != null && Debug.isOn("handshake")) { 1463 System.out.println("Using Kerberos creds"); 1464 } 1465 String serverPrincipal = 1466 Krb5Helper.getServerPrincipalName(serviceCreds); 1467 if (serverPrincipal != null) { 1468 // When service is bound, we check ASAP. Otherwise, 1469 // will check after client request is received 1470 // in in Kerberos ClientKeyExchange 1471 SecurityManager sm = System.getSecurityManager(); 1472 try { 1473 if (sm != null) { 1474 // Eliminate dependency on ServicePermission 1475 sm.checkPermission(Krb5Helper.getServicePermission( 1476 serverPrincipal, "accept"), acc); 1477 } 1478 } catch (SecurityException se) { 1479 serviceCreds = null; 1480 // Do not destroy keys. Will affect Subject 1481 if (debug != null && Debug.isOn("handshake")) { 1482 System.out.println("Permission to access Kerberos" 1483 + " secret key denied"); 1484 } 1485 return false; 1486 } 1487 } 1488 } 1489 return serviceCreds != null; 1490 } catch (PrivilegedActionException e) { 1491 // Likely exception here is LoginExceptin 1492 if (debug != null && Debug.isOn("handshake")) { 1493 System.out.println("Attempt to obtain Kerberos key failed: " 1494 + e.toString()); 1495 } 1496 return false; 1497 } 1498 } 1499 1500 /* 1501 * For Kerberos ciphers, the premaster secret is encrypted using 1502 * the session key. See RFC 2712. 1503 */ 1504 private SecretKey clientKeyExchange(KerberosClientKeyExchange mesg) 1505 throws IOException { 1506 1507 if (debug != null && Debug.isOn("handshake")) { 1508 mesg.print(System.out); 1509 } 1510 1511 // Record the principals involved in exchange 1512 session.setPeerPrincipal(mesg.getPeerPrincipal()); 1513 session.setLocalPrincipal(mesg.getLocalPrincipal()); 1514 1515 byte[] b = mesg.getUnencryptedPreMasterSecret(); 1516 return new SecretKeySpec(b, "TlsPremasterSecret"); 1517 } 1518 1519 /* 1520 * Diffie Hellman key exchange is used when the server presented 1521 * D-H parameters in its certificate (signed using RSA or DSS/DSA), 1522 * or else the server presented no certificate but sent D-H params 1523 * in a ServerKeyExchange message. Use of D-H is specified by the 1524 * cipher suite chosen. 1525 * 1526 * The message optionally contains the client's D-H public key (if 1527 * it wasn't not sent in a client certificate). As always with D-H, 1528 * if a client and a server have each other's D-H public keys and 1529 * they use common algorithm parameters, they have a shared key 1530 * that's derived via the D-H calculation. That key becomes the 1531 * pre-master secret. 1532 */ 1533 private SecretKey clientKeyExchange(DHClientKeyExchange mesg) 1534 throws IOException { 1535 1536 if (debug != null && Debug.isOn("handshake")) { 1537 mesg.print(System.out); 1538 } 1539 return dh.getAgreedSecret(mesg.getClientPublicKey(), false); 1540 } 1541 1542 private SecretKey clientKeyExchange(ECDHClientKeyExchange mesg) 1543 throws IOException { 1544 1545 if (debug != null && Debug.isOn("handshake")) { 1546 mesg.print(System.out); 1547 } 1548 return ecdh.getAgreedSecret(mesg.getEncodedPoint()); 1549 } 1550 1551 /* 1552 * Client wrote a message to verify the certificate it sent earlier. 1553 * 1554 * Note that this certificate isn't involved in key exchange. Client 1555 * authentication messages are included in the checksums used to 1556 * validate the handshake (e.g. Finished messages). Other than that, 1557 * the _exact_ identity of the client is less fundamental to protocol 1558 * security than its role in selecting keys via the pre-master secret. 1559 */ 1560 private void clientCertificateVerify(CertificateVerify mesg) 1561 throws IOException { 1562 1563 if (debug != null && Debug.isOn("handshake")) { 1564 mesg.print(System.out); 1565 } 1566 1567 if (protocolVersion.v >= ProtocolVersion.TLS12.v) { 1568 SignatureAndHashAlgorithm signAlg = 1569 mesg.getPreferableSignatureAlgorithm(); 1570 if (signAlg == null) { 1571 throw new SSLHandshakeException( 1572 "Illegal CertificateVerify message"); 1573 } 1574 1575 String hashAlg = 1576 SignatureAndHashAlgorithm.getHashAlgorithmName(signAlg); 1577 if (hashAlg == null || hashAlg.length() == 0) { 1578 throw new SSLHandshakeException( 1579 "No supported hash algorithm"); 1580 } 1581 } 1582 1583 try { 1584 PublicKey publicKey = 1585 session.getPeerCertificates()[0].getPublicKey(); 1586 1587 boolean valid = mesg.verify(protocolVersion, handshakeHash, 1588 publicKey, session.getMasterSecret()); 1589 if (valid == false) { 1590 fatalSE(Alerts.alert_bad_certificate, 1591 "certificate verify message signature error"); 1592 } 1593 } catch (GeneralSecurityException e) { 1594 fatalSE(Alerts.alert_bad_certificate, 1595 "certificate verify format error", e); 1596 } 1597 1598 // reset the flag for clientCertificateVerify message 1599 needClientVerify = false; 1600 } 1601 1602 1603 /* 1604 * Client writes "finished" at the end of its handshake, after cipher 1605 * spec is changed. We verify it and then send ours. 1606 * 1607 * When we're resuming a session, we'll have already sent our own 1608 * Finished message so just the verification is needed. 1609 */ 1610 private void clientFinished(Finished mesg) throws IOException { 1611 if (debug != null && Debug.isOn("handshake")) { 1612 mesg.print(System.out); 1613 } 1614 1615 /* 1616 * Verify if client did send the certificate when client 1617 * authentication was required, otherwise server should not proceed 1618 */ 1619 if (doClientAuth == SSLEngineImpl.clauth_required) { 1620 // get X500Principal of the end-entity certificate for X509-based 1621 // ciphersuites, or Kerberos principal for Kerberos ciphersuites 1622 session.getPeerPrincipal(); 1623 } 1624 1625 /* 1626 * Verify if client did send clientCertificateVerify message following 1627 * the client Certificate, otherwise server should not proceed 1628 */ 1629 if (needClientVerify) { 1630 fatalSE(Alerts.alert_handshake_failure, 1631 "client did not send certificate verify message"); 1632 } 1633 1634 /* 1635 * Verify the client's message with the "before" digest of messages, 1636 * and forget about continuing to use that digest. 1637 */ 1638 boolean verified = mesg.verify(handshakeHash, Finished.CLIENT, 1639 session.getMasterSecret()); 1640 1641 if (!verified) { 1642 fatalSE(Alerts.alert_handshake_failure, 1643 "client 'finished' message doesn't verify"); 1644 // NOTREACHED 1645 } 1646 1647 /* 1648 * save client verify data for secure renegotiation 1649 */ 1650 if (secureRenegotiation) { 1651 clientVerifyData = mesg.getVerifyData(); 1652 } 1653 1654 /* 1655 * OK, it verified. If we're doing the full handshake, add that 1656 * "Finished" message to the hash of handshake messages, then send 1657 * the change_cipher_spec and Finished message. 1658 */ 1659 if (!resumingSession) { 1660 input.digestNow(); 1661 sendChangeCipherAndFinish(true); 1662 } 1663 1664 /* 1665 * Update the session cache only after the handshake completed, else 1666 * we're open to an attack against a partially completed handshake. 1667 */ 1668 session.setLastAccessedTime(System.currentTimeMillis()); 1669 if (!resumingSession && session.isRejoinable()) { 1670 ((SSLSessionContextImpl)sslContext.engineGetServerSessionContext()) 1671 .put(session); 1672 if (debug != null && Debug.isOn("session")) { 1673 System.out.println( 1674 "%% Cached server session: " + session); 1675 } 1676 } else if (!resumingSession && 1677 debug != null && Debug.isOn("session")) { 1678 System.out.println( 1679 "%% Didn't cache non-resumable server session: " 1680 + session); 1681 } 1682 } 1683 1684 /* 1685 * Compute finished message with the "server" digest (and then forget 1686 * about that digest, it can't be used again). 1687 */ 1688 private void sendChangeCipherAndFinish(boolean finishedTag) 1689 throws IOException { 1690 1691 output.flush(); 1692 1693 Finished mesg = new Finished(protocolVersion, handshakeHash, 1694 Finished.SERVER, session.getMasterSecret(), cipherSuite); 1695 1696 /* 1697 * Send the change_cipher_spec record; then our Finished handshake 1698 * message will be the last handshake message. Flush, and now we 1699 * are ready for application data!! 1700 */ 1701 sendChangeCipherSpec(mesg, finishedTag); 1702 1703 /* 1704 * save server verify data for secure renegotiation 1705 */ 1706 if (secureRenegotiation) { 1707 serverVerifyData = mesg.getVerifyData(); 1708 } 1709 1710 /* 1711 * Update state machine so client MUST send 'finished' next 1712 * The update should only take place if it is not in the fast 1713 * handshake mode since the server has to wait for a finished 1714 * message from the client. 1715 */ 1716 if (finishedTag) { 1717 state = HandshakeMessage.ht_finished; 1718 } 1719 } 1720 1721 1722 /* 1723 * Returns a HelloRequest message to kickstart renegotiations 1724 */ 1725 @Override 1726 HandshakeMessage getKickstartMessage() { 1727 return new HelloRequest(); 1728 } 1729 1730 1731 /* 1732 * Fault detected during handshake. 1733 */ 1734 @Override 1735 void handshakeAlert(byte description) throws SSLProtocolException { 1736 1737 String message = Alerts.alertDescription(description); 1738 1739 if (debug != null && Debug.isOn("handshake")) { 1740 System.out.println("SSL -- handshake alert: " 1741 + message); 1742 } 1743 1744 /* 1745 * It's ok to get a no_certificate alert from a client of which 1746 * we *requested* authentication information. 1747 * However, if we *required* it, then this is not acceptable. 1748 * 1749 * Anyone calling getPeerCertificates() on the 1750 * session will get an SSLPeerUnverifiedException. 1751 */ 1752 if ((description == Alerts.alert_no_certificate) && 1753 (doClientAuth == SSLEngineImpl.clauth_requested)) { 1754 return; 1755 } 1756 1757 throw new SSLProtocolException("handshake alert: " + message); 1758 } 1759 1760 /* 1761 * RSA key exchange is normally used. The client encrypts a "pre-master 1762 * secret" with the server's public key, from the Certificate (or else 1763 * ServerKeyExchange) message that was sent to it by the server. That's 1764 * decrypted using the private key before we get here. 1765 */ 1766 private SecretKey clientKeyExchange(RSAClientKeyExchange mesg) 1767 throws IOException { 1768 1769 if (debug != null && Debug.isOn("handshake")) { 1770 mesg.print(System.out); 1771 } 1772 return mesg.preMaster; 1773 } 1774 1775 /* 1776 * Verify the certificate sent by the client. We'll only get one if we 1777 * sent a CertificateRequest to request client authentication. If we 1778 * are in TLS mode, the client may send a message with no certificates 1779 * to indicate it does not have an appropriate chain. (In SSLv3 mode, 1780 * it would send a no certificate alert). 1781 */ 1782 private void clientCertificate(CertificateMsg mesg) throws IOException { 1783 if (debug != null && Debug.isOn("handshake")) { 1784 mesg.print(System.out); 1785 } 1786 1787 X509Certificate[] peerCerts = mesg.getCertificateChain(); 1788 1789 if (peerCerts.length == 0) { 1790 /* 1791 * If the client authentication is only *REQUESTED* (e.g. 1792 * not *REQUIRED*, this is an acceptable condition.) 1793 */ 1794 if (doClientAuth == SSLEngineImpl.clauth_requested) { 1795 return; 1796 } else { 1797 fatalSE(Alerts.alert_bad_certificate, 1798 "null cert chain"); 1799 } 1800 } 1801 1802 // ask the trust manager to verify the chain 1803 X509TrustManager tm = sslContext.getX509TrustManager(); 1804 1805 try { 1806 // find out the types of client authentication used 1807 PublicKey key = peerCerts[0].getPublicKey(); 1808 String keyAlgorithm = key.getAlgorithm(); 1809 String authType; 1810 if (keyAlgorithm.equals("RSA")) { 1811 authType = "RSA"; 1812 } else if (keyAlgorithm.equals("DSA")) { 1813 authType = "DSA"; 1814 } else if (keyAlgorithm.equals("EC")) { 1815 authType = "EC"; 1816 } else { 1817 // unknown public key type 1818 authType = "UNKNOWN"; 1819 } 1820 1821 if (tm instanceof X509ExtendedTrustManager) { 1822 if (conn != null) { 1823 ((X509ExtendedTrustManager)tm).checkClientTrusted( 1824 peerCerts.clone(), 1825 authType, 1826 conn); 1827 } else { 1828 ((X509ExtendedTrustManager)tm).checkClientTrusted( 1829 peerCerts.clone(), 1830 authType, 1831 engine); 1832 } 1833 } else { 1834 // Unlikely to happen, because we have wrapped the old 1835 // X509TrustManager with the new X509ExtendedTrustManager. 1836 throw new CertificateException( 1837 "Improper X509TrustManager implementation"); 1838 } 1839 } catch (CertificateException e) { 1840 // This will throw an exception, so include the original error. 1841 fatalSE(Alerts.alert_certificate_unknown, e); 1842 } 1843 // set the flag for clientCertificateVerify message 1844 needClientVerify = true; 1845 1846 session.setPeerCertificates(peerCerts); 1847 } 1848 }