Class SecureNioChannel

  • All Implemented Interfaces:
    java.io.Closeable, java.lang.AutoCloseable, java.nio.channels.ByteChannel, java.nio.channels.Channel, java.nio.channels.GatheringByteChannel, java.nio.channels.ReadableByteChannel, java.nio.channels.ScatteringByteChannel, java.nio.channels.WritableByteChannel

    public class SecureNioChannel
    extends NioChannel
    Implementation of a secure socket channel
    • Field Summary

      Fields 
      Modifier and Type Field Description
      protected boolean closed
      True when the channel is closed
      protected boolean closing
      True when the channel is in the process of closing
      protected boolean handshakeComplete
      True when the SSL handshake is complete
      protected javax.net.ssl.SSLEngineResult.HandshakeStatus handshakeStatus
      Current handshake status, updated during handshake processing
      protected boolean needHandshakeWrap
      True when a handshake wrap is pending
      protected java.nio.ByteBuffer netInBuffer
      Network input buffer for encrypted data
      protected java.nio.ByteBuffer netOutBuffer
      Network output buffer for encrypted data
      protected boolean sniComplete
      True when SNI processing is complete
      protected javax.net.ssl.SSLEngine sslEngine
      SSL engine for this channel
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      void close()
      Sends an SSL close message, will not physically close the connection here.
      void close​(boolean force)
      Close the connection.
      protected boolean flush​(java.nio.ByteBuffer buf)
      Flushes the buffer to the network, non-blocking
      boolean flushOutbound()
      Return true if the buffer wrote data.
      void free()
      Free the channel memory
      java.nio.ByteBuffer getEmptyBuf()
      Returns an empty byte buffer used for SSL wrap operations.
      int getOutboundRemaining()
      Returns the number of bytes remaining in the outbound buffer.
      javax.net.ssl.SSLEngine getSslEngine()
      Returns the SSL engine for this channel.
      SSLSupport getSSLSupport()
      Returns the SSL support object for this channel, or null if the SSL engine has not been initialized.
      int handshake​(boolean read, boolean write)
      Performs SSL handshake, non-blocking, but performs NEED_TASK on the same thread.
      protected javax.net.ssl.SSLEngineResult handshakeUnwrap​(boolean doread)
      Perform handshake unwrap
      protected javax.net.ssl.SSLEngineResult handshakeWrap​(boolean doWrite)
      Performs the WRAP function
      boolean isClosing()
      Indicates whether the channel is in the process of closing.
      boolean isHandshakeComplete()
      Indicates whether the SSL handshake is complete.
      int read​(java.nio.ByteBuffer dst)
      Reads a sequence of bytes from this channel into the given buffer.
      long read​(java.nio.ByteBuffer[] dsts, int offset, int length)  
      void rehandshake​(long timeout)
      Force a blocking handshake to take place for this key.
      void reset​(java.nio.channels.SocketChannel channel, NioEndpoint.NioSocketWrapper socketWrapper)
      Reset the channel
      protected javax.net.ssl.SSLEngineResult.HandshakeStatus tasks()
      Executes all the tasks needed on the same thread.
      int write​(java.nio.ByteBuffer src)
      Writes a sequence of bytes to this channel from the given buffer.
      long write​(java.nio.ByteBuffer[] srcs, int offset, int length)  
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
    • Field Detail

      • netInBuffer

        protected java.nio.ByteBuffer netInBuffer
        Network input buffer for encrypted data
      • netOutBuffer

        protected java.nio.ByteBuffer netOutBuffer
        Network output buffer for encrypted data
      • sslEngine

        protected javax.net.ssl.SSLEngine sslEngine
        SSL engine for this channel
      • sniComplete

        protected boolean sniComplete
        True when SNI processing is complete
      • handshakeComplete

        protected boolean handshakeComplete
        True when the SSL handshake is complete
      • needHandshakeWrap

        protected boolean needHandshakeWrap
        True when a handshake wrap is pending
      • handshakeStatus

        protected javax.net.ssl.SSLEngineResult.HandshakeStatus handshakeStatus
        Current handshake status, updated during handshake processing
      • closed

        protected boolean closed
        True when the channel is closed
      • closing

        protected boolean closing
        True when the channel is in the process of closing
    • Constructor Detail

      • SecureNioChannel

        public SecureNioChannel​(SocketBufferHandler bufHandler,
                                NioEndpoint endpoint)
        Creates a new secure NIO channel.
        Parameters:
        bufHandler - Buffer handler for the application buffers
        endpoint - The NIO endpoint managing this channel
    • Method Detail

      • reset

        public void reset​(java.nio.channels.SocketChannel channel,
                          NioEndpoint.NioSocketWrapper socketWrapper)
                   throws java.io.IOException
        Description copied from class: NioChannel
        Reset the channel
        Overrides:
        reset in class NioChannel
        Parameters:
        channel - the socket channel
        socketWrapper - the socket wrapper
        Throws:
        java.io.IOException - If a problem was encountered resetting the channel
      • free

        public void free()
        Description copied from class: NioChannel
        Free the channel memory
        Overrides:
        free in class NioChannel
      • flush

        protected boolean flush​(java.nio.ByteBuffer buf)
                         throws java.io.IOException
        Flushes the buffer to the network, non-blocking
        Parameters:
        buf - ByteBuffer
        Returns:
        boolean true if the buffer has been emptied out, false otherwise
        Throws:
        java.io.IOException - An IO error occurred writing data
      • handshake

        public int handshake​(boolean read,
                             boolean write)
                      throws java.io.IOException
        Performs SSL handshake, non-blocking, but performs NEED_TASK on the same thread. Hence, you should never call this method using your Acceptor thread, as you would slow down your system significantly. If the return value from this method is positive, the selection key should be registered interestOps given by the return value.
        Overrides:
        handshake in class NioChannel
        Parameters:
        read - boolean - true if the underlying channel is readable
        write - boolean - true if the underlying channel is writable
        Returns:
        0 if handshake is complete, -1 if an error (other than an IOException) occurred, otherwise it returns a SelectionKey interestOps value
        Throws:
        java.io.IOException - If an I/O error occurs during the handshake or if the handshake fails during wrapping or unwrapping
      • rehandshake

        public void rehandshake​(long timeout)
                         throws java.io.IOException
        Force a blocking handshake to take place for this key. This requires that both network and application buffers have been emptied out prior to this call taking place, or a IOException will be thrown.
        Parameters:
        timeout - - timeout in milliseconds for each socket operation
        Throws:
        java.io.IOException - - if an IO exception occurs or if application or network buffers contain data
        java.net.SocketTimeoutException - - if a socket operation timed out
      • tasks

        protected javax.net.ssl.SSLEngineResult.HandshakeStatus tasks()
        Executes all the tasks needed on the same thread.
        Returns:
        the status
      • handshakeWrap

        protected javax.net.ssl.SSLEngineResult handshakeWrap​(boolean doWrite)
                                                       throws java.io.IOException
        Performs the WRAP function
        Parameters:
        doWrite - boolean
        Returns:
        the result
        Throws:
        java.io.IOException - An IO error occurred
      • handshakeUnwrap

        protected javax.net.ssl.SSLEngineResult handshakeUnwrap​(boolean doread)
                                                         throws java.io.IOException
        Perform handshake unwrap
        Parameters:
        doread - boolean
        Returns:
        the result
        Throws:
        java.io.IOException - An IO error occurred
      • getSSLSupport

        public SSLSupport getSSLSupport()
        Returns the SSL support object for this channel, or null if the SSL engine has not been initialized.
        Returns:
        the SSL support object, or null
      • close

        public void close()
                   throws java.io.IOException
        Sends an SSL close message, will not physically close the connection here.
        To close the connection, you could do something like
         
           close();
           while (isOpen() && !myTimeoutFunction()) Thread.sleep(25);
           if ( isOpen() ) close(true); //forces a close if you timed out
         
         
        Specified by:
        close in interface java.lang.AutoCloseable
        Specified by:
        close in interface java.nio.channels.Channel
        Specified by:
        close in interface java.io.Closeable
        Overrides:
        close in class NioChannel
        Throws:
        java.io.IOException - if an I/O error occurs
        java.io.IOException - if there is data on the outgoing network buffer, and we are unable to flush it
      • close

        public void close​(boolean force)
                   throws java.io.IOException
        Description copied from class: NioChannel
        Close the connection.
        Overrides:
        close in class NioChannel
        Parameters:
        force - Should the underlying socket be forcibly closed?
        Throws:
        java.io.IOException - If closing the secure channel fails.
      • read

        public int read​(java.nio.ByteBuffer dst)
                 throws java.io.IOException
        Reads a sequence of bytes from this channel into the given buffer.
        Specified by:
        read in interface java.nio.channels.ReadableByteChannel
        Overrides:
        read in class NioChannel
        Parameters:
        dst - The buffer into which bytes are to be transferred
        Returns:
        The number of bytes read, possibly zero, or -1 if the channel has reached end-of-stream
        Throws:
        java.io.IOException - If some other I/O error occurs
        java.lang.IllegalStateException - if the handshake was not completed
      • read

        public long read​(java.nio.ByteBuffer[] dsts,
                         int offset,
                         int length)
                  throws java.io.IOException
        Specified by:
        read in interface java.nio.channels.ScatteringByteChannel
        Overrides:
        read in class NioChannel
        Throws:
        java.io.IOException
      • write

        public int write​(java.nio.ByteBuffer src)
                  throws java.io.IOException
        Writes a sequence of bytes to this channel from the given buffer.
        Specified by:
        write in interface java.nio.channels.WritableByteChannel
        Overrides:
        write in class NioChannel
        Parameters:
        src - The buffer from which bytes are to be retrieved
        Returns:
        The number of bytes written, possibly zero
        Throws:
        java.io.IOException - If some other I/O error occurs
      • write

        public long write​(java.nio.ByteBuffer[] srcs,
                          int offset,
                          int length)
                   throws java.io.IOException
        Specified by:
        write in interface java.nio.channels.GatheringByteChannel
        Overrides:
        write in class NioChannel
        Throws:
        java.io.IOException
      • getOutboundRemaining

        public int getOutboundRemaining()
        Description copied from class: NioChannel
        Returns the number of bytes remaining in the outbound buffer.
        Overrides:
        getOutboundRemaining in class NioChannel
        Returns:
        Always returns 0 for non-secure channels
      • flushOutbound

        public boolean flushOutbound()
                              throws java.io.IOException
        Description copied from class: NioChannel
        Return true if the buffer wrote data. NO-OP for non-secure channel.
        Overrides:
        flushOutbound in class NioChannel
        Returns:
        Always returns false for non-secure channel
        Throws:
        java.io.IOException - Never for non-secure channel
      • isHandshakeComplete

        public boolean isHandshakeComplete()
        Description copied from class: NioChannel
        Indicates whether the SSL handshake is complete.
        Overrides:
        isHandshakeComplete in class NioChannel
        Returns:
        true for non-secure channels (no handshake required)
      • isClosing

        public boolean isClosing()
        Description copied from class: NioChannel
        Indicates whether the channel is in the process of closing.
        Overrides:
        isClosing in class NioChannel
        Returns:
        false for non-secure channels
      • getSslEngine

        public javax.net.ssl.SSLEngine getSslEngine()
        Returns the SSL engine for this channel.
        Returns:
        the SSL engine, or null if not yet created
      • getEmptyBuf

        public java.nio.ByteBuffer getEmptyBuf()
        Returns an empty byte buffer used for SSL wrap operations.
        Returns:
        an empty byte buffer