Package org.conscrypt

Class ConscryptEngine

    • Field Detail

      • NEED_UNWRAP_OK

        private static final javax.net.ssl.SSLEngineResult NEED_UNWRAP_OK
      • NEED_UNWRAP_CLOSED

        private static final javax.net.ssl.SSLEngineResult NEED_UNWRAP_CLOSED
      • NEED_WRAP_OK

        private static final javax.net.ssl.SSLEngineResult NEED_WRAP_OK
      • NEED_WRAP_CLOSED

        private static final javax.net.ssl.SSLEngineResult NEED_WRAP_CLOSED
      • CLOSED_NOT_HANDSHAKING

        private static final javax.net.ssl.SSLEngineResult CLOSED_NOT_HANDSHAKING
      • defaultBufferAllocator

        private static BufferAllocator defaultBufferAllocator
      • lazyDirectBuffer

        private java.nio.ByteBuffer lazyDirectBuffer
        A lazy-created direct buffer used as a bridge between heap buffers provided by the application and JNI. This avoids the overhead of calling JNI with heap buffers. Used only when no bufferAllocator has been provided.
      • peerHostname

        private java.lang.String peerHostname
        Hostname used with the TLS extension SNI hostname.
      • state

        private int state
      • handshakeFinished

        private boolean handshakeFinished
      • ssl

        private final NativeSsl ssl
        Wrapper around the underlying SSL object.
      • networkBio

        private final NativeSsl.BioWrapper networkBio
        The BIO used for reading/writing encrypted bytes.
      • activeSession

        private ActiveSession activeSession
        Set during startHandshake.
      • closedSession

        private SessionSnapshot closedSession
        A snapshot of the active session when the engine was closed.
      • externalSession

        private final javax.net.ssl.SSLSession externalSession
        The session object exposed externally from this class.
      • channelIdPrivateKey

        private OpenSSLKey channelIdPrivateKey
        Private key for the TLS Channel ID extension. This field is client-side only. Set during startHandshake.
      • maxSealOverhead

        private int maxSealOverhead
      • singleSrcBuffer

        private final java.nio.ByteBuffer[] singleSrcBuffer
      • singleDstBuffer

        private final java.nio.ByteBuffer[] singleDstBuffer
    • Method Detail

      • getDefaultBufferAllocator

        static BufferAllocator getDefaultBufferAllocator()
        Returns the default BufferAllocator, which may be null if no default has been explicitly set.
      • setChannelIdEnabled

        void setChannelIdEnabled​(boolean enabled)
        Enables/disables TLS Channel ID for this server engine.

        This method needs to be invoked before the handshake starts.

        Specified by:
        setChannelIdEnabled in class AbstractConscryptEngine
        Throws:
        java.lang.IllegalStateException - if this is a client engine or if the handshake has already started.
      • getChannelId

        byte[] getChannelId()
                     throws javax.net.ssl.SSLException
        Gets the TLS Channel ID for this server engine. Channel ID is only available once the handshake completes.
        Specified by:
        getChannelId in class AbstractConscryptEngine
        Returns:
        channel ID or null if not available.
        Throws:
        java.lang.IllegalStateException - if this is a client engine or if the handshake has not yet completed.
        javax.net.ssl.SSLException - if channel ID is available but could not be obtained.
      • setChannelIdPrivateKey

        void setChannelIdPrivateKey​(java.security.PrivateKey privateKey)
        Sets the PrivateKey to be used for TLS Channel ID by this client engine.

        This method needs to be invoked before the handshake starts.

        Specified by:
        setChannelIdPrivateKey in class AbstractConscryptEngine
        Parameters:
        privateKey - private key (enables TLS Channel ID) or null for no key (disables TLS Channel ID). The private key must be an Elliptic Curve (EC) key based on the NIST P-256 curve (aka SECG secp256r1 or ANSI X9.62 prime256v1).
        Throws:
        java.lang.IllegalStateException - if this is a server engine or if the handshake has already started.
      • isHandshakeStarted

        private boolean isHandshakeStarted()
      • setHostname

        void setHostname​(java.lang.String hostname)
        This method enables Server Name Indication (SNI) and overrides the PeerInfoProvider supplied during engine creation. If the hostname is not a valid SNI hostname, the SNI extension will be omitted from the handshake.
        Specified by:
        setHostname in class AbstractConscryptEngine
      • beginHandshake

        public void beginHandshake()
                            throws javax.net.ssl.SSLException
        Specified by:
        beginHandshake in class javax.net.ssl.SSLEngine
        Throws:
        javax.net.ssl.SSLException
      • beginHandshakeInternal

        private void beginHandshakeInternal()
                                     throws javax.net.ssl.SSLException
        Throws:
        javax.net.ssl.SSLException
      • closeInbound

        public void closeInbound()
        Specified by:
        closeInbound in class javax.net.ssl.SSLEngine
      • closeOutbound

        public void closeOutbound()
        Specified by:
        closeOutbound in class javax.net.ssl.SSLEngine
      • getDelegatedTask

        public java.lang.Runnable getDelegatedTask()
        Specified by:
        getDelegatedTask in class javax.net.ssl.SSLEngine
      • getEnabledCipherSuites

        public java.lang.String[] getEnabledCipherSuites()
        Specified by:
        getEnabledCipherSuites in class javax.net.ssl.SSLEngine
      • getEnabledProtocols

        public java.lang.String[] getEnabledProtocols()
        Specified by:
        getEnabledProtocols in class javax.net.ssl.SSLEngine
      • getEnableSessionCreation

        public boolean getEnableSessionCreation()
        Specified by:
        getEnableSessionCreation in class javax.net.ssl.SSLEngine
      • getSSLParameters

        public javax.net.ssl.SSLParameters getSSLParameters()
        Overrides:
        getSSLParameters in class javax.net.ssl.SSLEngine
      • setSSLParameters

        public void setSSLParameters​(javax.net.ssl.SSLParameters p)
        Overrides:
        setSSLParameters in class javax.net.ssl.SSLEngine
      • getHandshakeStatus

        public javax.net.ssl.SSLEngineResult.HandshakeStatus getHandshakeStatus()
        Specified by:
        getHandshakeStatus in class javax.net.ssl.SSLEngine
      • getHandshakeStatusInternal

        private javax.net.ssl.SSLEngineResult.HandshakeStatus getHandshakeStatusInternal()
      • pendingOutboundEncryptedBytes

        int pendingOutboundEncryptedBytes()
      • pendingInboundCleartextBytes

        private int pendingInboundCleartextBytes()
      • pendingStatus

        private static javax.net.ssl.SSLEngineResult.HandshakeStatus pendingStatus​(int pendingOutboundBytes)
      • getNeedClientAuth

        public boolean getNeedClientAuth()
        Specified by:
        getNeedClientAuth in class javax.net.ssl.SSLEngine
      • handshakeSession

        javax.net.ssl.SSLSession handshakeSession()
        Work-around to allow this method to be called on older versions of Android.
        Specified by:
        handshakeSession in class AbstractConscryptEngine
      • getSession

        public javax.net.ssl.SSLSession getSession()
        Specified by:
        getSession in class javax.net.ssl.SSLEngine
      • provideAfterHandshakeSession

        private ConscryptSession provideAfterHandshakeSession()
      • getSupportedCipherSuites

        public java.lang.String[] getSupportedCipherSuites()
        Specified by:
        getSupportedCipherSuites in class javax.net.ssl.SSLEngine
      • getSupportedProtocols

        public java.lang.String[] getSupportedProtocols()
        Specified by:
        getSupportedProtocols in class javax.net.ssl.SSLEngine
      • getUseClientMode

        public boolean getUseClientMode()
        Specified by:
        getUseClientMode in class javax.net.ssl.SSLEngine
      • getWantClientAuth

        public boolean getWantClientAuth()
        Specified by:
        getWantClientAuth in class javax.net.ssl.SSLEngine
      • isInboundDone

        public boolean isInboundDone()
        Specified by:
        isInboundDone in class javax.net.ssl.SSLEngine
      • isOutboundDone

        public boolean isOutboundDone()
        Specified by:
        isOutboundDone in class javax.net.ssl.SSLEngine
      • setEnabledCipherSuites

        public void setEnabledCipherSuites​(java.lang.String[] suites)
        Specified by:
        setEnabledCipherSuites in class javax.net.ssl.SSLEngine
      • setEnabledProtocols

        public void setEnabledProtocols​(java.lang.String[] protocols)
        Specified by:
        setEnabledProtocols in class javax.net.ssl.SSLEngine
      • setEnableSessionCreation

        public void setEnableSessionCreation​(boolean flag)
        Specified by:
        setEnableSessionCreation in class javax.net.ssl.SSLEngine
      • setNeedClientAuth

        public void setNeedClientAuth​(boolean need)
        Specified by:
        setNeedClientAuth in class javax.net.ssl.SSLEngine
      • setUseClientMode

        public void setUseClientMode​(boolean mode)
        Specified by:
        setUseClientMode in class javax.net.ssl.SSLEngine
      • setWantClientAuth

        public void setWantClientAuth​(boolean want)
        Specified by:
        setWantClientAuth in class javax.net.ssl.SSLEngine
      • unwrap

        public javax.net.ssl.SSLEngineResult unwrap​(java.nio.ByteBuffer src,
                                                    java.nio.ByteBuffer dst)
                                             throws javax.net.ssl.SSLException
        Specified by:
        unwrap in class AbstractConscryptEngine
        Throws:
        javax.net.ssl.SSLException
      • unwrap

        public javax.net.ssl.SSLEngineResult unwrap​(java.nio.ByteBuffer src,
                                                    java.nio.ByteBuffer[] dsts)
                                             throws javax.net.ssl.SSLException
        Specified by:
        unwrap in class AbstractConscryptEngine
        Throws:
        javax.net.ssl.SSLException
      • unwrap

        public javax.net.ssl.SSLEngineResult unwrap​(java.nio.ByteBuffer src,
                                                    java.nio.ByteBuffer[] dsts,
                                                    int offset,
                                                    int length)
                                             throws javax.net.ssl.SSLException
        Specified by:
        unwrap in class AbstractConscryptEngine
        Throws:
        javax.net.ssl.SSLException
      • unwrap

        javax.net.ssl.SSLEngineResult unwrap​(java.nio.ByteBuffer[] srcs,
                                             java.nio.ByteBuffer[] dsts)
                                      throws javax.net.ssl.SSLException
        Specified by:
        unwrap in class AbstractConscryptEngine
        Throws:
        javax.net.ssl.SSLException
      • unwrap

        javax.net.ssl.SSLEngineResult unwrap​(java.nio.ByteBuffer[] srcs,
                                             int srcsOffset,
                                             int srcsLength,
                                             java.nio.ByteBuffer[] dsts,
                                             int dstsOffset,
                                             int dstsLength)
                                      throws javax.net.ssl.SSLException
        Specified by:
        unwrap in class AbstractConscryptEngine
        Throws:
        javax.net.ssl.SSLException
      • calcDstsLength

        private static int calcDstsLength​(java.nio.ByteBuffer[] dsts,
                                          int dstsOffset,
                                          int dstsLength)
      • calcSrcsLength

        private static long calcSrcsLength​(java.nio.ByteBuffer[] srcs,
                                           int srcsOffset,
                                           int srcsEndOffset)
      • handshake

        private javax.net.ssl.SSLEngineResult.HandshakeStatus handshake()
                                                                 throws javax.net.ssl.SSLException
        Throws:
        javax.net.ssl.SSLException
      • finishHandshake

        private void finishHandshake()
                              throws javax.net.ssl.SSLException
        Throws:
        javax.net.ssl.SSLException
      • writePlaintextData

        private int writePlaintextData​(java.nio.ByteBuffer src,
                                       int len)
                                throws javax.net.ssl.SSLException
        Write plaintext data to the OpenSSL internal BIO Calling this function with src.remaining == 0 is undefined.
        Throws:
        javax.net.ssl.SSLException
      • writePlaintextDataDirect

        private int writePlaintextDataDirect​(java.nio.ByteBuffer src,
                                             int pos,
                                             int len)
                                      throws java.io.IOException
        Throws:
        java.io.IOException
      • writePlaintextDataHeap

        private int writePlaintextDataHeap​(java.nio.ByteBuffer src,
                                           int pos,
                                           int len)
                                    throws java.io.IOException
        Throws:
        java.io.IOException
      • readPlaintextData

        private int readPlaintextData​(java.nio.ByteBuffer dst)
                               throws java.io.IOException
        Read plaintext data from the OpenSSL internal BIO
        Throws:
        java.io.IOException
      • readPlaintextDataDirect

        private int readPlaintextDataDirect​(java.nio.ByteBuffer dst,
                                            int pos,
                                            int len)
                                     throws java.io.IOException,
                                            java.security.cert.CertificateException
        Throws:
        java.io.IOException
        java.security.cert.CertificateException
      • readPlaintextDataHeap

        private int readPlaintextDataHeap​(java.nio.ByteBuffer dst,
                                          int len)
                                   throws java.io.IOException,
                                          java.security.cert.CertificateException
        Throws:
        java.io.IOException
        java.security.cert.CertificateException
      • convertException

        private javax.net.ssl.SSLException convertException​(java.lang.Throwable e)
      • writeEncryptedData

        private int writeEncryptedData​(java.nio.ByteBuffer src,
                                       int len)
                                throws javax.net.ssl.SSLException
        Write encrypted data to the OpenSSL network BIO.
        Throws:
        javax.net.ssl.SSLException
      • writeEncryptedDataDirect

        private int writeEncryptedDataDirect​(java.nio.ByteBuffer src,
                                             int pos,
                                             int len)
                                      throws java.io.IOException
        Throws:
        java.io.IOException
      • writeEncryptedDataHeap

        private int writeEncryptedDataHeap​(java.nio.ByteBuffer src,
                                           int pos,
                                           int len)
                                    throws java.io.IOException
        Throws:
        java.io.IOException
      • getOrCreateLazyDirectBuffer

        private java.nio.ByteBuffer getOrCreateLazyDirectBuffer()
      • directByteBufferAddress

        private long directByteBufferAddress​(java.nio.ByteBuffer directBuffer,
                                             int pos)
      • readPendingBytesFromBIO

        private javax.net.ssl.SSLEngineResult readPendingBytesFromBIO​(java.nio.ByteBuffer dst,
                                                                      int bytesConsumed,
                                                                      int bytesProduced,
                                                                      javax.net.ssl.SSLEngineResult.HandshakeStatus status)
                                                               throws javax.net.ssl.SSLException
        Throws:
        javax.net.ssl.SSLException
      • readEncryptedData

        private int readEncryptedData​(java.nio.ByteBuffer dst,
                                      int pending)
                               throws javax.net.ssl.SSLException
        Read encrypted data from the OpenSSL network BIO
        Throws:
        javax.net.ssl.SSLException
      • readEncryptedDataDirect

        private int readEncryptedDataDirect​(java.nio.ByteBuffer dst,
                                            int pos,
                                            int len)
                                     throws java.io.IOException
        Throws:
        java.io.IOException
      • readEncryptedDataHeap

        private int readEncryptedDataHeap​(java.nio.ByteBuffer dst,
                                          int len)
                                   throws java.io.IOException
        Throws:
        java.io.IOException
      • mayFinishHandshake

        private javax.net.ssl.SSLEngineResult.HandshakeStatus mayFinishHandshake​(javax.net.ssl.SSLEngineResult.HandshakeStatus status)
                                                                          throws javax.net.ssl.SSLException
        Throws:
        javax.net.ssl.SSLException
      • getHandshakeStatus

        private javax.net.ssl.SSLEngineResult.HandshakeStatus getHandshakeStatus​(int pending)
      • getEngineStatus

        private javax.net.ssl.SSLEngineResult.Status getEngineStatus()
      • closeAll

        private void closeAll()
      • freeIfDone

        private void freeIfDone()
      • newSslExceptionWithMessage

        private javax.net.ssl.SSLException newSslExceptionWithMessage​(java.lang.String err)
      • newResult

        private javax.net.ssl.SSLEngineResult newResult​(int bytesConsumed,
                                                        int bytesProduced,
                                                        javax.net.ssl.SSLEngineResult.HandshakeStatus status)
                                                 throws javax.net.ssl.SSLException
        Throws:
        javax.net.ssl.SSLException
      • wrap

        public javax.net.ssl.SSLEngineResult wrap​(java.nio.ByteBuffer src,
                                                  java.nio.ByteBuffer dst)
                                           throws javax.net.ssl.SSLException
        Specified by:
        wrap in class AbstractConscryptEngine
        Throws:
        javax.net.ssl.SSLException
      • wrap

        public javax.net.ssl.SSLEngineResult wrap​(java.nio.ByteBuffer[] srcs,
                                                  int srcsOffset,
                                                  int srcsLength,
                                                  java.nio.ByteBuffer dst)
                                           throws javax.net.ssl.SSLException
        Specified by:
        wrap in class AbstractConscryptEngine
        Throws:
        javax.net.ssl.SSLException
      • clientPSKKeyRequested

        public int clientPSKKeyRequested​(java.lang.String identityHint,
                                         byte[] identity,
                                         byte[] key)
        Description copied from interface: NativeCrypto.SSLHandshakeCallbacks
        Gets the key to be used in client mode for this connection in Pre-Shared Key (PSK) key exchange.
        Specified by:
        clientPSKKeyRequested in interface NativeCrypto.SSLHandshakeCallbacks
        Parameters:
        identityHint - PSK identity hint provided by the server or null if no hint provided.
        identity - buffer to be populated with PSK identity (NULL-terminated modified UTF-8) by this method. This identity will be provided to the server.
        key - buffer to be populated with key material by this method.
        Returns:
        number of bytes this method stored in the key buffer or 0 if an error occurred in which case the handshake will be aborted.
      • serverPSKKeyRequested

        public int serverPSKKeyRequested​(java.lang.String identityHint,
                                         java.lang.String identity,
                                         byte[] key)
        Description copied from interface: NativeCrypto.SSLHandshakeCallbacks
        Gets the key to be used in server mode for this connection in Pre-Shared Key (PSK) key exchange.
        Specified by:
        serverPSKKeyRequested in interface NativeCrypto.SSLHandshakeCallbacks
        Parameters:
        identityHint - PSK identity hint provided by this server to the client or null if no hint was provided.
        identity - PSK identity provided by the client.
        key - buffer to be populated with key material by this method.
        Returns:
        number of bytes this method stored in the key buffer or 0 if an error occurred in which case the handshake will be aborted.
      • serverCertificateRequested

        public void serverCertificateRequested()
                                        throws java.io.IOException
        Description copied from interface: NativeCrypto.SSLHandshakeCallbacks
        Called when acting as a server during ClientHello processing before a decision to resume a session is made. This allows the selection of the correct server certificate based on things like Server Name Indication (SNI).
        Specified by:
        serverCertificateRequested in interface NativeCrypto.SSLHandshakeCallbacks
        Throws:
        java.io.IOException - if there was an error during certificate selection.
      • serverSessionRequested

        public long serverSessionRequested​(byte[] id)
        Description copied from interface: NativeCrypto.SSLHandshakeCallbacks
        Called for servers where TLS < 1.3 (TLS 1.3 uses session tickets rather than application session caches).

        Looks up the session by ID in the application's session cache. If a valid session is returned, this callback is responsible for incrementing the reference count (and any required synchronization).

        Specified by:
        serverSessionRequested in interface NativeCrypto.SSLHandshakeCallbacks
        Parameters:
        id - the ID of the session to find.
        Returns:
        the cached session or 0 if no session was found matching the given ID.
      • verifyCertificateChain

        public void verifyCertificateChain​(byte[][] certChain,
                                           java.lang.String authMethod)
                                    throws java.security.cert.CertificateException
        Description copied from interface: NativeCrypto.SSLHandshakeCallbacks
        Verify that the certificate chain is trusted.
        Specified by:
        verifyCertificateChain in interface NativeCrypto.SSLHandshakeCallbacks
        Parameters:
        certChain - chain of X.509 certificates in their encoded form
        authMethod - auth algorithm name
        Throws:
        java.security.cert.CertificateException - if the certificate is untrusted
      • clientCertificateRequested

        public void clientCertificateRequested​(byte[] keyTypeBytes,
                                               int[] signatureAlgs,
                                               byte[][] asn1DerEncodedPrincipals)
                                        throws java.security.cert.CertificateEncodingException,
                                               javax.net.ssl.SSLException
        Description copied from interface: NativeCrypto.SSLHandshakeCallbacks
        Called on an SSL client when the server requests (or requires a certificate). The client can respond by using SSL_use_certificate and SSL_use_PrivateKey to set a certificate if has an appropriate one available, similar to how the server provides its certificate.
        Specified by:
        clientCertificateRequested in interface NativeCrypto.SSLHandshakeCallbacks
        Parameters:
        keyTypeBytes - key types supported by the server, convertible to strings with #keyType
        asn1DerEncodedPrincipals - CAs known to the server
        Throws:
        java.security.cert.CertificateEncodingException
        javax.net.ssl.SSLException
      • sendSSLShutdown

        private void sendSSLShutdown()
      • closeAndFreeResources

        private void closeAndFreeResources()
      • finalize

        protected void finalize()
                         throws java.lang.Throwable
        Overrides:
        finalize in class java.lang.Object
        Throws:
        java.lang.Throwable
      • chooseClientAlias

        public java.lang.String chooseClientAlias​(javax.net.ssl.X509KeyManager keyManager,
                                                  javax.security.auth.x500.X500Principal[] issuers,
                                                  java.lang.String[] keyTypes)
        Specified by:
        chooseClientAlias in interface SSLParametersImpl.AliasChooser
      • setUseSessionTickets

        void setUseSessionTickets​(boolean useSessionTickets)
        This method enables session ticket support.
        Specified by:
        setUseSessionTickets in class AbstractConscryptEngine
        Parameters:
        useSessionTickets - True to enable session tickets
      • getTlsUnique

        byte[] getTlsUnique()
        Description copied from class: AbstractConscryptEngine
        Returns the tls-unique channel binding value for this connection, per RFC 5929. This will return null if there is no such value available, such as if the handshake has not yet completed or this connection is closed.
        Specified by:
        getTlsUnique in class AbstractConscryptEngine
      • exportKeyingMaterial

        byte[] exportKeyingMaterial​(java.lang.String label,
                                    byte[] context,
                                    int length)
                             throws javax.net.ssl.SSLException
        Description copied from class: AbstractConscryptEngine
        Exports a value derived from the TLS master secret as described in RFC 5705.
        Specified by:
        exportKeyingMaterial in class AbstractConscryptEngine
        Parameters:
        label - the label to use in calculating the exported value. This must be an ASCII-only string.
        context - the application-specific context value to use in calculating the exported value. This may be null to use no application context, which is treated differently than an empty byte array.
        length - the number of bytes of keying material to return.
        Returns:
        a value of the specified length, or null if the handshake has not yet completed or the connection has been closed.
        Throws:
        javax.net.ssl.SSLException - if the value could not be exported.
      • singleSrcBuffer

        private java.nio.ByteBuffer[] singleSrcBuffer​(java.nio.ByteBuffer src)
      • resetSingleSrcBuffer

        private void resetSingleSrcBuffer()
      • singleDstBuffer

        private java.nio.ByteBuffer[] singleDstBuffer​(java.nio.ByteBuffer src)
      • resetSingleDstBuffer

        private void resetSingleDstBuffer()
      • transitionTo

        private void transitionTo​(int newState)