1 /* 2 * Copyright (c) 2003, 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 package javax.net.ssl; 27 28 /** 29 * An encapsulation of the result state produced by 30 * <code>SSLEngine</code> I/O calls. 31 * 32 * <p> A <code>SSLEngine</code> provides a means for establishing 33 * secure communication sessions between two peers. <code>SSLEngine</code> 34 * operations typically consume bytes from an input buffer and produce 35 * bytes in an output buffer. This class provides operational result 36 * values describing the state of the <code>SSLEngine</code>, including 37 * indications of what operations are needed to finish an 38 * ongoing handshake. Lastly, it reports the number of bytes consumed 39 * and produced as a result of this operation. 40 * 41 * @see SSLEngine 42 * @see SSLEngine#wrap(ByteBuffer, ByteBuffer) 43 * @see SSLEngine#unwrap(ByteBuffer, ByteBuffer) 44 * 45 * @author Brad R. Wetmore 46 * @since 1.5 47 */ 48 49 public class SSLEngineResult { 50 51 /** 52 * An <code>SSLEngineResult</code> enum describing the overall result 53 * of the <code>SSLEngine</code> operation. 54 * 55 * The <code>Status</code> value does not reflect the 56 * state of a <code>SSLEngine</code> handshake currently 57 * in progress. The <code>SSLEngineResult's HandshakeStatus</code> 58 * should be consulted for that information. 59 * 60 * @author Brad R. Wetmore 61 * @since 1.5 62 */ 63 public static enum Status { 64 65 /** 66 * The <code>SSLEngine</code> was not able to unwrap the 67 * incoming data because there were not enough source bytes 68 * available to make a complete packet. 69 * 70 * <P> 71 * Repeat the call once more bytes are available. 72 */ 73 BUFFER_UNDERFLOW, 74 75 /** 76 * The <code>SSLEngine</code> was not able to process the 77 * operation because there are not enough bytes available in the 78 * destination buffer to hold the result. 79 * <P> 80 * Repeat the call once more bytes are available. 81 * 82 * @see SSLSession#getPacketBufferSize() 83 * @see SSLSession#getApplicationBufferSize() 84 */ 85 BUFFER_OVERFLOW, 86 87 /** 88 * The <code>SSLEngine</code> completed the operation, and 89 * is available to process similar calls. 90 */ 91 OK, 92 93 /** 94 * The operation just closed this side of the 95 * <code>SSLEngine</code>, or the operation 96 * could not be completed because it was already closed. 97 */ 98 CLOSED; 99 } 100 101 /** 102 * An <code>SSLEngineResult</code> enum describing the current 103 * handshaking state of this <code>SSLEngine</code>. 104 * 105 * @author Brad R. Wetmore 106 * @since 1.5 107 */ 108 public static enum HandshakeStatus { 109 110 /** 111 * The <code>SSLEngine</code> is not currently handshaking. 112 */ 113 NOT_HANDSHAKING, 114 115 /** 116 * The <code>SSLEngine</code> has just finished handshaking. 117 * <P> 118 * This value is only generated by a call to 119 * <code>SSLEngine.wrap()/unwrap()</code> when that call 120 * finishes a handshake. It is never generated by 121 * <code>SSLEngine.getHandshakeStatus()</code>. 122 * 123 * @see SSLEngine#wrap(ByteBuffer, ByteBuffer) 124 * @see SSLEngine#unwrap(ByteBuffer, ByteBuffer) 125 * @see SSLEngine#getHandshakeStatus() 126 */ 127 FINISHED, 128 129 /** 130 * The <code>SSLEngine</code> needs the results of one (or more) 131 * delegated tasks before handshaking can continue. 132 * 133 * @see SSLEngine#getDelegatedTask() 134 */ 135 NEED_TASK, 136 137 /** 138 * The <code>SSLEngine</code> must send data to the remote side 139 * before handshaking can continue, so <code>SSLEngine.wrap()</code> 140 * should be called. 141 * 142 * @see SSLEngine#wrap(ByteBuffer, ByteBuffer) 143 */ 144 NEED_WRAP, 145 146 /** 147 * The <code>SSLEngine</code> needs to receive data from the 148 * remote side before handshaking can continue. 149 */ 150 NEED_UNWRAP; 151 } 152 153 154 private final Status status; 155 private final HandshakeStatus handshakeStatus; 156 private final int bytesConsumed; 157 private final int bytesProduced; 158 159 /** 160 * Initializes a new instance of this class. 161 * 162 * @param status 163 * the return value of the operation. 164 * 165 * @param handshakeStatus 166 * the current handshaking status. 167 * 168 * @param bytesConsumed 169 * the number of bytes consumed from the source ByteBuffer 170 * 171 * @param bytesProduced 172 * the number of bytes placed into the destination ByteBuffer 173 * 174 * @throws IllegalArgumentException 175 * if the <code>status</code> or <code>handshakeStatus</code> 176 * arguments are null, or if <code>bytesConsumed</code> or 177 * <code>bytesProduced</code> is negative. 178 */ 179 public SSLEngineResult(Status status, HandshakeStatus handshakeStatus, 180 int bytesConsumed, int bytesProduced) { 181 182 if ((status == null) || (handshakeStatus == null) || 183 (bytesConsumed < 0) || (bytesProduced < 0)) { 184 throw new IllegalArgumentException("Invalid Parameter(s)"); 185 } 186 187 this.status = status; 188 this.handshakeStatus = handshakeStatus; 189 this.bytesConsumed = bytesConsumed; 190 this.bytesProduced = bytesProduced; 191 } 192 193 /** 194 * Gets the return value of this <code>SSLEngine</code> operation. 195 * 196 * @return the return value 197 */ 198 final public Status getStatus() { 199 return status; 200 } 201 202 /** 203 * Gets the handshake status of this <code>SSLEngine</code> 204 * operation. 205 * 206 * @return the handshake status 207 */ 208 final public HandshakeStatus getHandshakeStatus() { 209 return handshakeStatus; 210 } 211 212 /** 213 * Returns the number of bytes consumed from the input buffer. 214 * 215 * @return the number of bytes consumed. 216 */ 217 final public int bytesConsumed() { 218 return bytesConsumed; 219 } 220 221 /** 222 * Returns the number of bytes written to the output buffer. 223 * 224 * @return the number of bytes produced 225 */ 226 final public int bytesProduced() { 227 return bytesProduced; 228 } 229 230 /** 231 * Returns a String representation of this object. 232 */ 233 @Override 234 public String toString() { 235 return ("Status = " + status + 236 " HandshakeStatus = " + handshakeStatus + 237 "\nbytesConsumed = " + bytesConsumed + 238 " bytesProduced = " + bytesProduced); 239 } 240 } 241