1 /* 2 * Copyright (c) 2003, 2010, 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 package javax.net.ssl; 27 28 import java.nio.ByteBuffer; 29 import java.nio.ReadOnlyBufferException; 30 31 32 /** 33 * A class which enables secure communications using protocols such as 34 * the Secure Sockets Layer (SSL) or 35 * <A HREF="http://www.ietf.org/rfc/rfc2246.txt"> IETF RFC 2246 "Transport 36 * Layer Security" (TLS) </A> protocols, but is transport independent. 37 * <P> 38 * The secure communications modes include: <UL> 39 * 40 * <LI> <em>Integrity Protection</em>. SSL/TLS protects against 41 * modification of messages by an active wiretapper. 42 * 43 * <LI> <em>Authentication</em>. In most modes, SSL/TLS provides 44 * peer authentication. Servers are usually authenticated, and 45 * clients may be authenticated as requested by servers. 46 * 47 * <LI> <em>Confidentiality (Privacy Protection)</em>. In most 48 * modes, SSL/TLS encrypts data being sent between client and 49 * server. This protects the confidentiality of data, so that 50 * passive wiretappers won't see sensitive data such as financial 51 * information or personal information of many kinds. 52 * 53 * </UL> 54 * 55 * These kinds of protection are specified by a "cipher suite", which 56 * is a combination of cryptographic algorithms used by a given SSL 57 * connection. During the negotiation process, the two endpoints must 58 * agree on a cipher suite that is available in both environments. If 59 * there is no such suite in common, no SSL connection can be 60 * established, and no data can be exchanged. 61 * <P> 62 * The cipher suite used is established by a negotiation process called 63 * "handshaking". The goal of this process is to create or rejoin a 64 * "session", which may protect many connections over time. After 65 * handshaking has completed, you can access session attributes by 66 * using the {@link #getSession()} method. 67 * <P> 68 * The <code>SSLSocket</code> class provides much of the same security 69 * functionality, but all of the inbound and outbound data is 70 * automatically transported using the underlying {@link 71 * java.net.Socket Socket}, which by design uses a blocking model. 72 * While this is appropriate for many applications, this model does not 73 * provide the scalability required by large servers. 74 * <P> 75 * The primary distinction of an <code>SSLEngine</code> is that it 76 * operates on inbound and outbound byte streams, independent of the 77 * transport mechanism. It is the responsibility of the 78 * <code>SSLEngine</code> user to arrange for reliable I/O transport to 79 * the peer. By separating the SSL/TLS abstraction from the I/O 80 * transport mechanism, the <code>SSLEngine</code> can be used for a 81 * wide variety of I/O types, such as {@link 82 * java.nio.channels.spi.AbstractSelectableChannel#configureBlocking(boolean) 83 * non-blocking I/O (polling)}, {@link java.nio.channels.Selector 84 * selectable non-blocking I/O}, {@link java.net.Socket Socket} and the 85 * traditional Input/OutputStreams, local {@link java.nio.ByteBuffer 86 * ByteBuffers} or byte arrays, <A 87 * HREF="http://www.jcp.org/en/jsr/detail?id=203"> future asynchronous 88 * I/O models </A>, and so on. 89 * <P> 90 * At a high level, the <code>SSLEngine</code> appears thus: 91 * 92 * <pre> 93 * app data 94 * 95 * | ^ 96 * | | | 97 * v | | 98 * +----+-----|-----+----+ 99 * | | | 100 * | SSL|Engine | 101 * wrap() | | | unwrap() 102 * | OUTBOUND | INBOUND | 103 * | | | 104 * +----+-----|-----+----+ 105 * | | ^ 106 * | | | 107 * v | 108 * 109 * net data 110 * </pre> 111 * Application data (also known as plaintext or cleartext) is data which 112 * is produced or consumed by an application. Its counterpart is 113 * network data, which consists of either handshaking and/or ciphertext 114 * (encrypted) data, and destined to be transported via an I/O 115 * mechanism. Inbound data is data which has been received from the 116 * peer, and outbound data is destined for the peer. 117 * <P> 118 * (In the context of an <code>SSLEngine</code>, the term "handshake 119 * data" is taken to mean any data exchanged to establish and control a 120 * secure connection. Handshake data includes the SSL/TLS messages 121 * "alert", "change_cipher_spec," and "handshake.") 122 * <P> 123 * There are five distinct phases to an <code>SSLEngine</code>. 124 * 125 * <OL> 126 * <li> Creation - The <code>SSLEngine</code> has been created and 127 * initialized, but has not yet been used. During this phase, an 128 * application may set any <code>SSLEngine</code>-specific settings 129 * (enabled cipher suites, whether the <code>SSLEngine</code> should 130 * handshake in client or server mode, and so on). Once 131 * handshaking has begun, though, any new settings (except 132 * client/server mode, see below) will be used for 133 * the next handshake. 134 * 135 * <li> Initial Handshake - The initial handshake is a procedure by 136 * which the two peers exchange communication parameters until an 137 * SSLSession is established. Application data can not be sent during 138 * this phase. 139 * 140 * <li> Application Data - Once the communication parameters have 141 * been established and the handshake is complete, application data 142 * may flow through the <code>SSLEngine</code>. Outbound 143 * application messages are encrypted and integrity protected, 144 * and inbound messages reverse the process. 145 * 146 * <li> Rehandshaking - Either side may request a renegotiation of 147 * the session at any time during the Application Data phase. New 148 * handshaking data can be intermixed among the application data. 149 * Before starting the rehandshake phase, the application may 150 * reset the SSL/TLS communication parameters such as the list of 151 * enabled ciphersuites and whether to use client authentication, 152 * but can not change between client/server modes. As before, once 153 * handshaking has begun, any new <code>SSLEngine</code> 154 * configuration settings will not be used until the next 155 * handshake. 156 * 157 * <li> Closure - When the connection is no longer needed, the 158 * application should close the <code>SSLEngine</code> and should 159 * send/receive any remaining messages to the peer before 160 * closing the underlying transport mechanism. Once an engine is 161 * closed, it is not reusable: a new <code>SSLEngine</code> must 162 * be created. 163 * </OL> 164 * An <code>SSLEngine</code> is created by calling {@link 165 * SSLContext#createSSLEngine()} from an initialized 166 * <code>SSLContext</code>. Any configuration 167 * parameters should be set before making the first call to 168 * <code>wrap()</code>, <code>unwrap()</code>, or 169 * <code>beginHandshake()</code>. These methods all trigger the 170 * initial handshake. 171 * <P> 172 * Data moves through the engine by calling {@link #wrap(ByteBuffer, 173 * ByteBuffer) wrap()} or {@link #unwrap(ByteBuffer, ByteBuffer) 174 * unwrap()} on outbound or inbound data, respectively. Depending on 175 * the state of the <code>SSLEngine</code>, a <code>wrap()</code> call 176 * may consume application data from the source buffer and may produce 177 * network data in the destination buffer. The outbound data 178 * may contain application and/or handshake data. A call to 179 * <code>unwrap()</code> will examine the source buffer and may 180 * advance the handshake if the data is handshaking information, or 181 * may place application data in the destination buffer if the data 182 * is application. The state of the underlying SSL/TLS algorithm 183 * will determine when data is consumed and produced. 184 * <P> 185 * Calls to <code>wrap()</code> and <code>unwrap()</code> return an 186 * <code>SSLEngineResult</code> which indicates the status of the 187 * operation, and (optionally) how to interact with the engine to make 188 * progress. 189 * <P> 190 * The <code>SSLEngine</code> produces/consumes complete SSL/TLS 191 * packets only, and does not store application data internally between 192 * calls to <code>wrap()/unwrap()</code>. Thus input and output 193 * <code>ByteBuffer</code>s must be sized appropriately to hold the 194 * maximum record that can be produced. Calls to {@link 195 * SSLSession#getPacketBufferSize()} and {@link 196 * SSLSession#getApplicationBufferSize()} should be used to determine 197 * the appropriate buffer sizes. The size of the outbound application 198 * data buffer generally does not matter. If buffer conditions do not 199 * allow for the proper consumption/production of data, the application 200 * must determine (via {@link SSLEngineResult}) and correct the 201 * problem, and then try the call again. 202 * <P> 203 * For example, <code>unwrap()</code> will return a {@link 204 * SSLEngineResult.Status#BUFFER_OVERFLOW} result if the engine 205 * determines that there is not enough destination buffer space available. 206 * Applications should call {@link SSLSession#getApplicationBufferSize()} 207 * and compare that value with the space available in the destination buffer, 208 * enlarging the buffer if necessary. Similarly, if <code>unwrap()</code> 209 * were to return a {@link SSLEngineResult.Status#BUFFER_UNDERFLOW}, the 210 * application should call {@link SSLSession#getPacketBufferSize()} to ensure 211 * that the source buffer has enough room to hold a record (enlarging if 212 * necessary), and then obtain more inbound data. 213 * 214 * <pre> 215 * SSLEngineResult r = engine.unwrap(src, dst); 216 * switch (r.getStatus()) { 217 * BUFFER_OVERFLOW: 218 * // Could attempt to drain the dst buffer of any already obtained 219 * // data, but we'll just increase it to the size needed. 220 * int appSize = engine.getSession().getApplicationBufferSize(); 221 * ByteBuffer b = ByteBuffer.allocate(appSize + dst.position()); 222 * dst.flip(); 223 * b.put(dst); 224 * dst = b; 225 * // retry the operation. 226 * break; 227 * BUFFER_UNDERFLOW: 228 * int netSize = engine.getSession().getPacketBufferSize(); 229 * // Resize buffer if needed. 230 * if (netSize > dst.capacity()) { 231 * ByteBuffer b = ByteBuffer.allocate(netSize); 232 * src.flip(); 233 * b.put(src); 234 * src = b; 235 * } 236 * // Obtain more inbound network data for src, 237 * // then retry the operation. 238 * break; 239 * // other cases: CLOSED, OK. 240 * } 241 * </pre> 242 * 243 * <P> 244 * Unlike <code>SSLSocket</code>, all methods of SSLEngine are 245 * non-blocking. <code>SSLEngine</code> implementations may 246 * require the results of tasks that may take an extended period of 247 * time to complete, or may even block. For example, a TrustManager 248 * may need to connect to a remote certificate validation service, 249 * or a KeyManager might need to prompt a user to determine which 250 * certificate to use as part of client authentication. Additionally, 251 * creating cryptographic signatures and verifying them can be slow, 252 * seemingly blocking. 253 * <P> 254 * For any operation which may potentially block, the 255 * <code>SSLEngine</code> will create a {@link java.lang.Runnable} 256 * delegated task. When <code>SSLEngineResult</code> indicates that a 257 * delegated task result is needed, the application must call {@link 258 * #getDelegatedTask()} to obtain an outstanding delegated task and 259 * call its {@link java.lang.Runnable#run() run()} method (possibly using 260 * a different thread depending on the compute strategy). The 261 * application should continue obtaining delegated tasks until no more 262 * exist, and try the original operation again. 263 * <P> 264 * At the end of a communication session, applications should properly 265 * close the SSL/TLS link. The SSL/TLS protocols have closure handshake 266 * messages, and these messages should be communicated to the peer 267 * before releasing the <code>SSLEngine</code> and closing the 268 * underlying transport mechanism. A close can be initiated by one of: 269 * an SSLException, an inbound closure handshake message, or one of the 270 * close methods. In all cases, closure handshake messages are 271 * generated by the engine, and <code>wrap()</code> should be repeatedly 272 * called until the resulting <code>SSLEngineResult</code>'s status 273 * returns "CLOSED", or {@link #isOutboundDone()} returns true. All 274 * data obtained from the <code>wrap()</code> method should be sent to the 275 * peer. 276 * <P> 277 * {@link #closeOutbound()} is used to signal the engine that the 278 * application will not be sending any more data. 279 * <P> 280 * A peer will signal its intent to close by sending its own closure 281 * handshake message. After this message has been received and 282 * processed by the local <code>SSLEngine</code>'s <code>unwrap()</code> 283 * call, the application can detect the close by calling 284 * <code>unwrap()</code> and looking for a <code>SSLEngineResult</code> 285 * with status "CLOSED", or if {@link #isInboundDone()} returns true. 286 * If for some reason the peer closes the communication link without 287 * sending the proper SSL/TLS closure message, the application can 288 * detect the end-of-stream and can signal the engine via {@link 289 * #closeInbound()} that there will no more inbound messages to 290 * process. Some applications might choose to require orderly shutdown 291 * messages from a peer, in which case they can check that the closure 292 * was generated by a handshake message and not by an end-of-stream 293 * condition. 294 * <P> 295 * There are two groups of cipher suites which you will need to know 296 * about when managing cipher suites: 297 * 298 * <UL> 299 * <LI> <em>Supported</em> cipher suites: all the suites which are 300 * supported by the SSL implementation. This list is reported 301 * using {@link #getSupportedCipherSuites()}. 302 * 303 * <LI> <em>Enabled</em> cipher suites, which may be fewer than 304 * the full set of supported suites. This group is set using the 305 * {@link #setEnabledCipherSuites(String [])} method, and 306 * queried using the {@link #getEnabledCipherSuites()} method. 307 * Initially, a default set of cipher suites will be enabled on a 308 * new engine that represents the minimum suggested 309 * configuration. 310 * </UL> 311 * 312 * Implementation defaults require that only cipher suites which 313 * authenticate servers and provide confidentiality be enabled by 314 * default. Only if both sides explicitly agree to unauthenticated 315 * and/or non-private (unencrypted) communications will such a 316 * cipher suite be selected. 317 * <P> 318 * Each SSL/TLS connection must have one client and one server, thus 319 * each endpoint must decide which role to assume. This choice determines 320 * who begins the handshaking process as well as which type of messages 321 * should be sent by each party. The method {@link 322 * #setUseClientMode(boolean)} configures the mode. Once the initial 323 * handshaking has started, an <code>SSLEngine</code> can not switch 324 * between client and server modes, even when performing renegotiations. 325 * <P> 326 * Applications might choose to process delegated tasks in different 327 * threads. When an <code>SSLEngine</code> 328 * is created, the current {@link java.security.AccessControlContext} 329 * is saved. All future delegated tasks will be processed using this 330 * context: that is, all access control decisions will be made using the 331 * context captured at engine creation. 332 * <P> 333 * <HR> 334 * 335 * <B>Concurrency Notes</B>: 336 * There are two concurrency issues to be aware of: 337 * 338 * <OL> 339 * <li>The <code>wrap()</code> and <code>unwrap()</code> methods 340 * may execute concurrently of each other. 341 * 342 * <li> The SSL/TLS protocols employ ordered packets. 343 * Applications must take care to ensure that generated packets 344 * are delivered in sequence. If packets arrive 345 * out-of-order, unexpected or fatal results may occur. 346 * <P> 347 * For example: 348 * <P> 349 * <pre> 350 * synchronized (outboundLock) { 351 * sslEngine.wrap(src, dst); 352 * outboundQueue.put(dst); 353 * } 354 * </pre> 355 * 356 * As a corollary, two threads must not attempt to call the same method 357 * (either <code>wrap()</code> or <code>unwrap()</code>) concurrently, 358 * because there is no way to guarantee the eventual packet ordering. 359 * </OL> 360 * 361 * @see SSLContext 362 * @see SSLSocket 363 * @see SSLServerSocket 364 * @see SSLSession 365 * @see java.net.Socket 366 * 367 * @since 1.5 368 * @author Brad R. Wetmore 369 */ 370 371 public abstract class SSLEngine { 372 373 private String peerHost = null; 374 private int peerPort = -1; 375 376 /** 377 * Constructor for an <code>SSLEngine</code> providing no hints 378 * for an internal session reuse strategy. 379 * 380 * @see SSLContext#createSSLEngine() 381 * @see SSLSessionContext 382 */ 383 protected SSLEngine() { 384 } 385 386 /** 387 * Constructor for an <code>SSLEngine</code>. 388 * <P> 389 * <code>SSLEngine</code> implementations may use the 390 * <code>peerHost</code> and <code>peerPort</code> parameters as hints 391 * for their internal session reuse strategy. 392 * <P> 393 * Some cipher suites (such as Kerberos) require remote hostname 394 * information. Implementations of this class should use this 395 * constructor to use Kerberos. 396 * <P> 397 * The parameters are not authenticated by the 398 * <code>SSLEngine</code>. 399 * 400 * @param peerHost the name of the peer host 401 * @param peerPort the port number of the peer 402 * @see SSLContext#createSSLEngine(String, int) 403 * @see SSLSessionContext 404 */ 405 protected SSLEngine(String peerHost, int peerPort) { 406 this.peerHost = peerHost; 407 this.peerPort = peerPort; 408 } 409 410 /** 411 * Returns the host name of the peer. 412 * <P> 413 * Note that the value is not authenticated, and should not be 414 * relied upon. 415 * 416 * @return the host name of the peer, or null if nothing is 417 * available. 418 */ 419 public String getPeerHost() { 420 return peerHost; 421 } 422 423 /** 424 * Returns the port number of the peer. 425 * <P> 426 * Note that the value is not authenticated, and should not be 427 * relied upon. 428 * 429 * @return the port number of the peer, or -1 if nothing is 430 * available. 431 */ 432 public int getPeerPort() { 433 return peerPort; 434 } 435 436 /** 437 * Attempts to encode a buffer of plaintext application data into 438 * SSL/TLS network data. 439 * <P> 440 * An invocation of this method behaves in exactly the same manner 441 * as the invocation: 442 * <blockquote><pre> 443 * {@link #wrap(ByteBuffer [], int, int, ByteBuffer) 444 * engine.wrap(new ByteBuffer [] { src }, 0, 1, dst);} 445 * </pre</blockquote> 446 * 447 * @param src 448 * a <code>ByteBuffer</code> containing outbound application data 449 * @param dst 450 * a <code>ByteBuffer</code> to hold outbound network data 451 * @return an <code>SSLEngineResult</code> describing the result 452 * of this operation. 453 * @throws SSLException 454 * A problem was encountered while processing the 455 * data that caused the <code>SSLEngine</code> to abort. 456 * See the class description for more information on 457 * engine closure. 458 * @throws ReadOnlyBufferException 459 * if the <code>dst</code> buffer is read-only. 460 * @throws IllegalArgumentException 461 * if either <code>src</code> or <code>dst</code> 462 * is null. 463 * @throws IllegalStateException if the client/server mode 464 * has not yet been set. 465 * @see #wrap(ByteBuffer [], int, int, ByteBuffer) 466 */ 467 public SSLEngineResult wrap(ByteBuffer src, 468 ByteBuffer dst) throws SSLException { 469 return wrap(new ByteBuffer [] { src }, 0, 1, dst); 470 } 471 472 /** 473 * Attempts to encode plaintext bytes from a sequence of data 474 * buffers into SSL/TLS network data. 475 * <P> 476 * An invocation of this method behaves in exactly the same manner 477 * as the invocation: 478 * <blockquote><pre> 479 * {@link #wrap(ByteBuffer [], int, int, ByteBuffer) 480 * engine.wrap(srcs, 0, srcs.length, dst);} 481 * </pre</blockquote> 482 * 483 * @param srcs 484 * an array of <code>ByteBuffers</code> containing the 485 * outbound application data 486 * @param dst 487 * a <code>ByteBuffer</code> to hold outbound network data 488 * @return an <code>SSLEngineResult</code> describing the result 489 * of this operation. 490 * @throws SSLException 491 * A problem was encountered while processing the 492 * data that caused the <code>SSLEngine</code> to abort. 493 * See the class description for more information on 494 * engine closure. 495 * @throws ReadOnlyBufferException 496 * if the <code>dst</code> buffer is read-only. 497 * @throws IllegalArgumentException 498 * if either <code>srcs</code> or <code>dst</code> 499 * is null, or if any element in <code>srcs</code> is null. 500 * @throws IllegalStateException if the client/server mode 501 * has not yet been set. 502 * @see #wrap(ByteBuffer [], int, int, ByteBuffer) 503 */ 504 public SSLEngineResult wrap(ByteBuffer [] srcs, 505 ByteBuffer dst) throws SSLException { 506 if (srcs == null) { 507 throw new IllegalArgumentException("src == null"); 508 } 509 return wrap(srcs, 0, srcs.length, dst); 510 } 511 512 513 /** 514 * Attempts to encode plaintext bytes from a subsequence of data 515 * buffers into SSL/TLS network data. This <i>"gathering"</i> 516 * operation encodes, in a single invocation, a sequence of bytes 517 * from one or more of a given sequence of buffers. Gathering 518 * wraps are often useful when implementing network protocols or 519 * file formats that, for example, group data into segments 520 * consisting of one or more fixed-length headers followed by a 521 * variable-length body. See 522 * {@link java.nio.channels.GatheringByteChannel} for more 523 * information on gathering, and {@link 524 * java.nio.channels.GatheringByteChannel#write(ByteBuffer[], 525 * int, int)} for more information on the subsequence 526 * behavior. 527 * <P> 528 * Depending on the state of the SSLEngine, this method may produce 529 * network data without consuming any application data (for example, 530 * it may generate handshake data.) 531 * <P> 532 * The application is responsible for reliably transporting the 533 * network data to the peer, and for ensuring that data created by 534 * multiple calls to wrap() is transported in the same order in which 535 * it was generated. The application must properly synchronize 536 * multiple calls to this method. 537 * <P> 538 * If this <code>SSLEngine</code> has not yet started its initial 539 * handshake, this method will automatically start the handshake. 540 * <P> 541 * This method will attempt to produce one SSL/TLS packet, and will 542 * consume as much source data as possible, but will never consume 543 * more than the sum of the bytes remaining in each buffer. Each 544 * <code>ByteBuffer</code>'s position is updated to reflect the 545 * amount of data consumed or produced. The limits remain the 546 * same. 547 * <P> 548 * The underlying memory used by the <code>srcs</code> and 549 * <code>dst ByteBuffer</code>s must not be the same. 550 * <P> 551 * See the class description for more information on engine closure. 552 * 553 * @param srcs 554 * an array of <code>ByteBuffers</code> containing the 555 * outbound application data 556 * @param offset 557 * The offset within the buffer array of the first buffer from 558 * which bytes are to be retrieved; it must be non-negative 559 * and no larger than <code>srcs.length</code> 560 * @param length 561 * The maximum number of buffers to be accessed; it must be 562 * non-negative and no larger than 563 * <code>srcs.length</code> - <code>offset</code> 564 * @param dst 565 * a <code>ByteBuffer</code> to hold outbound network data 566 * @return an <code>SSLEngineResult</code> describing the result 567 * of this operation. 568 * @throws SSLException 569 * A problem was encountered while processing the 570 * data that caused the <code>SSLEngine</code> to abort. 571 * See the class description for more information on 572 * engine closure. 573 * @throws IndexOutOfBoundsException 574 * if the preconditions on the <code>offset</code> and 575 * <code>length</code> parameters do not hold. 576 * @throws ReadOnlyBufferException 577 * if the <code>dst</code> buffer is read-only. 578 * @throws IllegalArgumentException 579 * if either <code>srcs</code> or <code>dst</code> 580 * is null, or if any element in the <code>srcs</code> 581 * subsequence specified is null. 582 * @throws IllegalStateException if the client/server mode 583 * has not yet been set. 584 * @see java.nio.channels.GatheringByteChannel 585 * @see java.nio.channels.GatheringByteChannel#write( 586 * ByteBuffer[], int, int) 587 */ 588 public abstract SSLEngineResult wrap(ByteBuffer [] srcs, int offset, 589 int length, ByteBuffer dst) throws SSLException; 590 591 /** 592 * Attempts to decode SSL/TLS network data into a plaintext 593 * application data buffer. 594 * <P> 595 * An invocation of this method behaves in exactly the same manner 596 * as the invocation: 597 * <blockquote><pre> 598 * {@link #unwrap(ByteBuffer, ByteBuffer [], int, int) 599 * engine.unwrap(src, new ByteBuffer [] { dst }, 0, 1);} 600 * </pre</blockquote> 601 * 602 * @param src 603 * a <code>ByteBuffer</code> containing inbound network data. 604 * @param dst 605 * a <code>ByteBuffer</code> to hold inbound application data. 606 * @return an <code>SSLEngineResult</code> describing the result 607 * of this operation. 608 * @throws SSLException 609 * A problem was encountered while processing the 610 * data that caused the <code>SSLEngine</code> to abort. 611 * See the class description for more information on 612 * engine closure. 613 * @throws ReadOnlyBufferException 614 * if the <code>dst</code> buffer is read-only. 615 * @throws IllegalArgumentException 616 * if either <code>src</code> or <code>dst</code> 617 * is null. 618 * @throws IllegalStateException if the client/server mode 619 * has not yet been set. 620 * @see #unwrap(ByteBuffer, ByteBuffer [], int, int) 621 */ 622 public SSLEngineResult unwrap(ByteBuffer src, 623 ByteBuffer dst) throws SSLException { 624 return unwrap(src, new ByteBuffer [] { dst }, 0, 1); 625 } 626 627 /** 628 * Attempts to decode SSL/TLS network data into a sequence of plaintext 629 * application data buffers. 630 * <P> 631 * An invocation of this method behaves in exactly the same manner 632 * as the invocation: 633 * <blockquote><pre> 634 * {@link #unwrap(ByteBuffer, ByteBuffer [], int, int) 635 * engine.unwrap(src, dsts, 0, dsts.length);} 636 * </pre</blockquote> 637 * 638 * @param src 639 * a <code>ByteBuffer</code> containing inbound network data. 640 * @param dsts 641 * an array of <code>ByteBuffer</code>s to hold inbound 642 * application data. 643 * @return an <code>SSLEngineResult</code> describing the result 644 * of this operation. 645 * @throws SSLException 646 * A problem was encountered while processing the 647 * data that caused the <code>SSLEngine</code> to abort. 648 * See the class description for more information on 649 * engine closure. 650 * @throws ReadOnlyBufferException 651 * if any of the <code>dst</code> buffers are read-only. 652 * @throws IllegalArgumentException 653 * if either <code>src</code> or <code>dsts</code> 654 * is null, or if any element in <code>dsts</code> is null. 655 * @throws IllegalStateException if the client/server mode 656 * has not yet been set. 657 * @see #unwrap(ByteBuffer, ByteBuffer [], int, int) 658 */ 659 public SSLEngineResult unwrap(ByteBuffer src, 660 ByteBuffer [] dsts) throws SSLException { 661 if (dsts == null) { 662 throw new IllegalArgumentException("dsts == null"); 663 } 664 return unwrap(src, dsts, 0, dsts.length); 665 } 666 667 /** 668 * Attempts to decode SSL/TLS network data into a subsequence of 669 * plaintext application data buffers. This <i>"scattering"</i> 670 * operation decodes, in a single invocation, a sequence of bytes 671 * into one or more of a given sequence of buffers. Scattering 672 * unwraps are often useful when implementing network protocols or 673 * file formats that, for example, group data into segments 674 * consisting of one or more fixed-length headers followed by a 675 * variable-length body. See 676 * {@link java.nio.channels.ScatteringByteChannel} for more 677 * information on scattering, and {@link 678 * java.nio.channels.ScatteringByteChannel#read(ByteBuffer[], 679 * int, int)} for more information on the subsequence 680 * behavior. 681 * <P> 682 * Depending on the state of the SSLEngine, this method may consume 683 * network data without producing any application data (for example, 684 * it may consume handshake data.) 685 * <P> 686 * The application is responsible for reliably obtaining the network 687 * data from the peer, and for invoking unwrap() on the data in the 688 * order it was received. The application must properly synchronize 689 * multiple calls to this method. 690 * <P> 691 * If this <code>SSLEngine</code> has not yet started its initial 692 * handshake, this method will automatically start the handshake. 693 * <P> 694 * This method will attempt to consume one complete SSL/TLS network 695 * packet, but will never consume more than the sum of the bytes 696 * remaining in the buffers. Each <code>ByteBuffer</code>'s 697 * position is updated to reflect the amount of data consumed or 698 * produced. The limits remain the same. 699 * <P> 700 * The underlying memory used by the <code>src</code> and 701 * <code>dsts ByteBuffer</code>s must not be the same. 702 * <P> 703 * The inbound network buffer may be modified as a result of this 704 * call: therefore if the network data packet is required for some 705 * secondary purpose, the data should be duplicated before calling this 706 * method. Note: the network data will not be useful to a second 707 * SSLEngine, as each SSLEngine contains unique random state which 708 * influences the SSL/TLS messages. 709 * <P> 710 * See the class description for more information on engine closure. 711 * 712 * @param src 713 * a <code>ByteBuffer</code> containing inbound network data. 714 * @param dsts 715 * an array of <code>ByteBuffer</code>s to hold inbound 716 * application data. 717 * @param offset 718 * The offset within the buffer array of the first buffer from 719 * which bytes are to be transferred; it must be non-negative 720 * and no larger than <code>dsts.length</code>. 721 * @param length 722 * The maximum number of buffers to be accessed; it must be 723 * non-negative and no larger than 724 * <code>dsts.length</code> - <code>offset</code>. 725 * @return an <code>SSLEngineResult</code> describing the result 726 * of this operation. 727 * @throws SSLException 728 * A problem was encountered while processing the 729 * data that caused the <code>SSLEngine</code> to abort. 730 * See the class description for more information on 731 * engine closure. 732 * @throws IndexOutOfBoundsException 733 * If the preconditions on the <code>offset</code> and 734 * <code>length</code> parameters do not hold. 735 * @throws ReadOnlyBufferException 736 * if any of the <code>dst</code> buffers are read-only. 737 * @throws IllegalArgumentException 738 * if either <code>src</code> or <code>dsts</code> 739 * is null, or if any element in the <code>dsts</code> 740 * subsequence specified is null. 741 * @throws IllegalStateException if the client/server mode 742 * has not yet been set. 743 * @see java.nio.channels.ScatteringByteChannel 744 * @see java.nio.channels.ScatteringByteChannel#read( 745 * ByteBuffer[], int, int) 746 */ 747 public abstract SSLEngineResult unwrap(ByteBuffer src, 748 ByteBuffer [] dsts, int offset, int length) throws SSLException; 749 750 751 /** 752 * Returns a delegated <code>Runnable</code> task for 753 * this <code>SSLEngine</code>. 754 * <P> 755 * <code>SSLEngine</code> operations may require the results of 756 * operations that block, or may take an extended period of time to 757 * complete. This method is used to obtain an outstanding {@link 758 * java.lang.Runnable} operation (task). Each task must be assigned 759 * a thread (possibly the current) to perform the {@link 760 * java.lang.Runnable#run() run} operation. Once the 761 * <code>run</code> method returns, the <code>Runnable</code> object 762 * is no longer needed and may be discarded. 763 * <P> 764 * Delegated tasks run in the <code>AccessControlContext</code> 765 * in place when this object was created. 766 * <P> 767 * A call to this method will return each outstanding task 768 * exactly once. 769 * <P> 770 * Multiple delegated tasks can be run in parallel. 771 * 772 * @return a delegated <code>Runnable</code> task, or null 773 * if none are available. 774 */ 775 public abstract Runnable getDelegatedTask(); 776 777 778 /** 779 * Signals that no more inbound network data will be sent 780 * to this <code>SSLEngine</code>. 781 * <P> 782 * If the application initiated the closing process by calling 783 * {@link #closeOutbound()}, under some circumstances it is not 784 * required that the initiator wait for the peer's corresponding 785 * close message. (See section 7.2.1 of the TLS specification (<A 786 * HREF="http://www.ietf.org/rfc/rfc2246.txt">RFC 2246</A>) for more 787 * information on waiting for closure alerts.) In such cases, this 788 * method need not be called. 789 * <P> 790 * But if the application did not initiate the closure process, or 791 * if the circumstances above do not apply, this method should be 792 * called whenever the end of the SSL/TLS data stream is reached. 793 * This ensures closure of the inbound side, and checks that the 794 * peer followed the SSL/TLS close procedure properly, thus 795 * detecting possible truncation attacks. 796 * <P> 797 * This method is idempotent: if the inbound side has already 798 * been closed, this method does not do anything. 799 * <P> 800 * {@link #wrap(ByteBuffer, ByteBuffer) wrap()} should be 801 * called to flush any remaining handshake data. 802 * 803 * @throws SSLException 804 * if this engine has not received the proper SSL/TLS close 805 * notification message from the peer. 806 * 807 * @see #isInboundDone() 808 * @see #isOutboundDone() 809 */ 810 public abstract void closeInbound() throws SSLException; 811 812 813 /** 814 * Returns whether {@link #unwrap(ByteBuffer, ByteBuffer)} will 815 * accept any more inbound data messages. 816 * 817 * @return true if the <code>SSLEngine</code> will not 818 * consume anymore network data (and by implication, 819 * will not produce any more application data.) 820 * @see #closeInbound() 821 */ 822 public abstract boolean isInboundDone(); 823 824 825 /** 826 * Signals that no more outbound application data will be sent 827 * on this <code>SSLEngine</code>. 828 * <P> 829 * This method is idempotent: if the outbound side has already 830 * been closed, this method does not do anything. 831 * <P> 832 * {@link #wrap(ByteBuffer, ByteBuffer)} should be 833 * called to flush any remaining handshake data. 834 * 835 * @see #isOutboundDone() 836 */ 837 public abstract void closeOutbound(); 838 839 840 /** 841 * Returns whether {@link #wrap(ByteBuffer, ByteBuffer)} will 842 * produce any more outbound data messages. 843 * <P> 844 * Note that during the closure phase, a <code>SSLEngine</code> may 845 * generate handshake closure data that must be sent to the peer. 846 * <code>wrap()</code> must be called to generate this data. When 847 * this method returns true, no more outbound data will be created. 848 * 849 * @return true if the <code>SSLEngine</code> will not produce 850 * any more network data 851 * 852 * @see #closeOutbound() 853 * @see #closeInbound() 854 */ 855 public abstract boolean isOutboundDone(); 856 857 858 /** 859 * Returns the names of the cipher suites which could be enabled for use 860 * on this engine. Normally, only a subset of these will actually 861 * be enabled by default, since this list may include cipher suites which 862 * do not meet quality of service requirements for those defaults. Such 863 * cipher suites might be useful in specialized applications. 864 * 865 * @return an array of cipher suite names 866 * @see #getEnabledCipherSuites() 867 * @see #setEnabledCipherSuites(String []) 868 */ 869 public abstract String [] getSupportedCipherSuites(); 870 871 872 /** 873 * Returns the names of the SSL cipher suites which are currently 874 * enabled for use on this engine. When an SSLEngine is first 875 * created, all enabled cipher suites support a minimum quality of 876 * service. Thus, in some environments this value might be empty. 877 * <P> 878 * Even if a suite has been enabled, it might never be used. (For 879 * example, the peer does not support it, the requisite 880 * certificates/private keys for the suite are not available, or an 881 * anonymous suite is enabled but authentication is required.) 882 * 883 * @return an array of cipher suite names 884 * @see #getSupportedCipherSuites() 885 * @see #setEnabledCipherSuites(String []) 886 */ 887 public abstract String [] getEnabledCipherSuites(); 888 889 890 /** 891 * Sets the cipher suites enabled for use on this engine. 892 * <P> 893 * Each cipher suite in the <code>suites</code> parameter must have 894 * been listed by getSupportedCipherSuites(), or the method will 895 * fail. Following a successful call to this method, only suites 896 * listed in the <code>suites</code> parameter are enabled for use. 897 * <P> 898 * See {@link #getEnabledCipherSuites()} for more information 899 * on why a specific cipher suite may never be used on a engine. 900 * 901 * @param suites Names of all the cipher suites to enable 902 * @throws IllegalArgumentException when one or more of the ciphers 903 * named by the parameter is not supported, or when the 904 * parameter is null. 905 * @see #getSupportedCipherSuites() 906 * @see #getEnabledCipherSuites() 907 */ 908 public abstract void setEnabledCipherSuites(String suites []); 909 910 911 /** 912 * Returns the names of the protocols which could be enabled for use 913 * with this <code>SSLEngine</code>. 914 * 915 * @return an array of protocols supported 916 */ 917 public abstract String [] getSupportedProtocols(); 918 919 920 /** 921 * Returns the names of the protocol versions which are currently 922 * enabled for use with this <code>SSLEngine</code>. 923 * 924 * @return an array of protocols 925 * @see #setEnabledProtocols(String []) 926 */ 927 public abstract String [] getEnabledProtocols(); 928 929 930 /** 931 * Set the protocol versions enabled for use on this engine. 932 * <P> 933 * The protocols must have been listed by getSupportedProtocols() 934 * as being supported. Following a successful call to this method, 935 * only protocols listed in the <code>protocols</code> parameter 936 * are enabled for use. 937 * 938 * @param protocols Names of all the protocols to enable. 939 * @throws IllegalArgumentException when one or more of 940 * the protocols named by the parameter is not supported or 941 * when the protocols parameter is null. 942 * @see #getEnabledProtocols() 943 */ 944 public abstract void setEnabledProtocols(String protocols[]); 945 946 947 /** 948 * Returns the <code>SSLSession</code> in use in this 949 * <code>SSLEngine</code>. 950 * <P> 951 * These can be long lived, and frequently correspond to an entire 952 * login session for some user. The session specifies a particular 953 * cipher suite which is being actively used by all connections in 954 * that session, as well as the identities of the session's client 955 * and server. 956 * <P> 957 * Unlike {@link SSLSocket#getSession()} 958 * this method does not block until handshaking is complete. 959 * <P> 960 * Until the initial handshake has completed, this method returns 961 * a session object which reports an invalid cipher suite of 962 * "SSL_NULL_WITH_NULL_NULL". 963 * 964 * @return the <code>SSLSession</code> for this <code>SSLEngine</code> 965 * @see SSLSession 966 */ 967 public abstract SSLSession getSession(); 968 969 970 /** 971 * Returns the {@code SSLSession} being constructed during a SSL/TLS 972 * handshake. 973 * <p> 974 * TLS protocols may negotiate parameters that are needed when using 975 * an instance of this class, but before the {@code SSLSession} has 976 * been completely initialized and made available via {@code getSession}. 977 * For example, the list of valid signature algorithms may restrict 978 * the type of certificates that can used during TrustManager 979 * decisions, or the maximum TLS fragment packet sizes can be 980 * resized to better support the network environment. 981 * <p> 982 * This method provides early access to the {@code SSLSession} being 983 * constructed. Depending on how far the handshake has progressed, 984 * some data may not yet be available for use. For example, if a 985 * remote server will be sending a Certificate chain, but that chain 986 * has yet not been processed, the {@code getPeerCertificates} 987 * method of {@code SSLSession} will throw a 988 * SSLPeerUnverifiedException. Once that chain has been processed, 989 * {@code getPeerCertificates} will return the proper value. 990 * 991 * @see SSLSocket 992 * @see SSLSession 993 * @see ExtendedSSLSession 994 * @see X509ExtendedKeyManager 995 * @see X509ExtendedTrustManager 996 * 997 * @return null if this instance is not currently handshaking, or 998 * if the current handshake has not progressed far enough to 999 * create a basic SSLSession. Otherwise, this method returns the 1000 * {@code SSLSession} currently being negotiated. 1001 * @throws UnsupportedOperationException if the underlying provider 1002 * does not implement the operation. 1003 * 1004 * @since 1.7 1005 */ 1006 public SSLSession getHandshakeSession() { 1007 throw new UnsupportedOperationException(); 1008 } 1009 1010 1011 /** 1012 * Initiates handshaking (initial or renegotiation) on this SSLEngine. 1013 * <P> 1014 * This method is not needed for the initial handshake, as the 1015 * <code>wrap()</code> and <code>unwrap()</code> methods will 1016 * implicitly call this method if handshaking has not already begun. 1017 * <P> 1018 * Note that the peer may also request a session renegotiation with 1019 * this <code>SSLEngine</code> by sending the appropriate 1020 * session renegotiate handshake message. 1021 * <P> 1022 * Unlike the {@link SSLSocket#startHandshake() 1023 * SSLSocket#startHandshake()} method, this method does not block 1024 * until handshaking is completed. 1025 * <P> 1026 * To force a complete SSL/TLS session renegotiation, the current 1027 * session should be invalidated prior to calling this method. 1028 * <P> 1029 * Some protocols may not support multiple handshakes on an existing 1030 * engine and may throw an <code>SSLException</code>. 1031 * 1032 * @throws SSLException 1033 * if a problem was encountered while signaling the 1034 * <code>SSLEngine</code> to begin a new handshake. 1035 * See the class description for more information on 1036 * engine closure. 1037 * @throws IllegalStateException if the client/server mode 1038 * has not yet been set. 1039 * @see SSLSession#invalidate() 1040 */ 1041 public abstract void beginHandshake() throws SSLException; 1042 1043 1044 /** 1045 * Returns the current handshake status for this <code>SSLEngine</code>. 1046 * 1047 * @return the current <code>SSLEngineResult.HandshakeStatus</code>. 1048 */ 1049 public abstract SSLEngineResult.HandshakeStatus getHandshakeStatus(); 1050 1051 1052 /** 1053 * Configures the engine to use client (or server) mode when 1054 * handshaking. 1055 * <P> 1056 * This method must be called before any handshaking occurs. 1057 * Once handshaking has begun, the mode can not be reset for the 1058 * life of this engine. 1059 * <P> 1060 * Servers normally authenticate themselves, and clients 1061 * are not required to do so. 1062 * 1063 * @param mode true if the engine should start its handshaking 1064 * in "client" mode 1065 * @throws IllegalArgumentException if a mode change is attempted 1066 * after the initial handshake has begun. 1067 * @see #getUseClientMode() 1068 */ 1069 public abstract void setUseClientMode(boolean mode); 1070 1071 1072 /** 1073 * Returns true if the engine is set to use client mode when 1074 * handshaking. 1075 * 1076 * @return true if the engine should do handshaking 1077 * in "client" mode 1078 * @see #setUseClientMode(boolean) 1079 */ 1080 public abstract boolean getUseClientMode(); 1081 1082 1083 /** 1084 * Configures the engine to <i>require</i> client authentication. This 1085 * option is only useful for engines in the server mode. 1086 * <P> 1087 * An engine's client authentication setting is one of the following: 1088 * <ul> 1089 * <li> client authentication required 1090 * <li> client authentication requested 1091 * <li> no client authentication desired 1092 * </ul> 1093 * <P> 1094 * Unlike {@link #setWantClientAuth(boolean)}, if this option is set and 1095 * the client chooses not to provide authentication information 1096 * about itself, <i>the negotiations will stop and the engine will 1097 * begin its closure procedure</i>. 1098 * <P> 1099 * Calling this method overrides any previous setting made by 1100 * this method or {@link #setWantClientAuth(boolean)}. 1101 * 1102 * @param need set to true if client authentication is required, 1103 * or false if no client authentication is desired. 1104 * @see #getNeedClientAuth() 1105 * @see #setWantClientAuth(boolean) 1106 * @see #getWantClientAuth() 1107 * @see #setUseClientMode(boolean) 1108 */ 1109 public abstract void setNeedClientAuth(boolean need); 1110 1111 1112 /** 1113 * Returns true if the engine will <i>require</i> client authentication. 1114 * This option is only useful to engines in the server mode. 1115 * 1116 * @return true if client authentication is required, 1117 * or false if no client authentication is desired. 1118 * @see #setNeedClientAuth(boolean) 1119 * @see #setWantClientAuth(boolean) 1120 * @see #getWantClientAuth() 1121 * @see #setUseClientMode(boolean) 1122 */ 1123 public abstract boolean getNeedClientAuth(); 1124 1125 1126 /** 1127 * Configures the engine to <i>request</i> client authentication. 1128 * This option is only useful for engines in the server mode. 1129 * <P> 1130 * An engine's client authentication setting is one of the following: 1131 * <ul> 1132 * <li> client authentication required 1133 * <li> client authentication requested 1134 * <li> no client authentication desired 1135 * </ul> 1136 * <P> 1137 * Unlike {@link #setNeedClientAuth(boolean)}, if this option is set and 1138 * the client chooses not to provide authentication information 1139 * about itself, <i>the negotiations will continue</i>. 1140 * <P> 1141 * Calling this method overrides any previous setting made by 1142 * this method or {@link #setNeedClientAuth(boolean)}. 1143 * 1144 * @param want set to true if client authentication is requested, 1145 * or false if no client authentication is desired. 1146 * @see #getWantClientAuth() 1147 * @see #setNeedClientAuth(boolean) 1148 * @see #getNeedClientAuth() 1149 * @see #setUseClientMode(boolean) 1150 */ 1151 public abstract void setWantClientAuth(boolean want); 1152 1153 1154 /** 1155 * Returns true if the engine will <i>request</i> client authentication. 1156 * This option is only useful for engines in the server mode. 1157 * 1158 * @return true if client authentication is requested, 1159 * or false if no client authentication is desired. 1160 * @see #setNeedClientAuth(boolean) 1161 * @see #getNeedClientAuth() 1162 * @see #setWantClientAuth(boolean) 1163 * @see #setUseClientMode(boolean) 1164 */ 1165 public abstract boolean getWantClientAuth(); 1166 1167 1168 /** 1169 * Controls whether new SSL sessions may be established by this engine. 1170 * If session creations are not allowed, and there are no 1171 * existing sessions to resume, there will be no successful 1172 * handshaking. 1173 * 1174 * @param flag true indicates that sessions may be created; this 1175 * is the default. false indicates that an existing session 1176 * must be resumed 1177 * @see #getEnableSessionCreation() 1178 */ 1179 public abstract void setEnableSessionCreation(boolean flag); 1180 1181 1182 /** 1183 * Returns true if new SSL sessions may be established by this engine. 1184 * 1185 * @return true indicates that sessions may be created; this 1186 * is the default. false indicates that an existing session 1187 * must be resumed 1188 * @see #setEnableSessionCreation(boolean) 1189 */ 1190 public abstract boolean getEnableSessionCreation(); 1191 1192 /** 1193 * Returns the SSLParameters in effect for this SSLEngine. 1194 * The ciphersuites and protocols of the returned SSLParameters 1195 * are always non-null. 1196 * 1197 * @return the SSLParameters in effect for this SSLEngine. 1198 * @since 1.6 1199 */ 1200 public SSLParameters getSSLParameters() { 1201 SSLParameters params = new SSLParameters(); 1202 params.setCipherSuites(getEnabledCipherSuites()); 1203 params.setProtocols(getEnabledProtocols()); 1204 if (getNeedClientAuth()) { 1205 params.setNeedClientAuth(true); 1206 } else if (getWantClientAuth()) { 1207 params.setWantClientAuth(true); 1208 } 1209 return params; 1210 } 1211 1212 /** 1213 * Applies SSLParameters to this engine. 1214 * 1215 * <p>This means: 1216 * <ul> 1217 * <li>if <code>params.getCipherSuites()</code> is non-null, 1218 * <code>setEnabledCipherSuites()</code> is called with that value 1219 * <li>if <code>params.getProtocols()</code> is non-null, 1220 * <code>setEnabledProtocols()</code> is called with that value 1221 * <li>if <code>params.getNeedClientAuth()</code> or 1222 * <code>params.getWantClientAuth()</code> return <code>true</code>, 1223 * <code>setNeedClientAuth(true)</code> and 1224 * <code>setWantClientAuth(true)</code> are called, respectively; 1225 * otherwise <code>setWantClientAuth(false)</code> is called. 1226 * </ul> 1227 * 1228 * @param params the parameters 1229 * @throws IllegalArgumentException if the setEnabledCipherSuites() or 1230 * the setEnabledProtocols() call fails 1231 * @since 1.6 1232 */ 1233 public void setSSLParameters(SSLParameters params) { 1234 String[] s; 1235 s = params.getCipherSuites(); 1236 if (s != null) { 1237 setEnabledCipherSuites(s); 1238 } 1239 s = params.getProtocols(); 1240 if (s != null) { 1241 setEnabledProtocols(s); 1242 } 1243 if (params.getNeedClientAuth()) { 1244 setNeedClientAuth(true); 1245 } else if (params.getWantClientAuth()) { 1246 setWantClientAuth(true); 1247 } else { 1248 setWantClientAuth(false); 1249 } 1250 } 1251 1252 }