Package org.conscrypt
Class ConscryptEngine
- java.lang.Object
-
- javax.net.ssl.SSLEngine
-
- org.conscrypt.AbstractConscryptEngine
-
- org.conscrypt.ConscryptEngine
-
- All Implemented Interfaces:
NativeCrypto.SSLHandshakeCallbacks,SSLParametersImpl.AliasChooser,SSLParametersImpl.PSKCallbacks
final class ConscryptEngine extends AbstractConscryptEngine implements NativeCrypto.SSLHandshakeCallbacks, SSLParametersImpl.AliasChooser, SSLParametersImpl.PSKCallbacks
Implements theSSLEngineAPI using OpenSSL's non-blocking interfaces.
-
-
Field Summary
Fields Modifier and Type Field Description private ActiveSessionactiveSessionSet during startHandshake.private BufferAllocatorbufferAllocatorprivate OpenSSLKeychannelIdPrivateKeyPrivate key for the TLS Channel ID extension.private static javax.net.ssl.SSLEngineResultCLOSED_NOT_HANDSHAKINGprivate SessionSnapshotclosedSessionA snapshot of the active session when the engine was closed.private static BufferAllocatordefaultBufferAllocatorprivate javax.net.ssl.SSLSessionexternalSessionThe session object exposed externally from this class.private booleanhandshakeFinishedprivate HandshakeListenerhandshakeListenerprivate java.nio.ByteBufferlazyDirectBufferA lazy-created direct buffer used as a bridge between heap buffers provided by the application and JNI.private intmaxSealOverheadprivate static javax.net.ssl.SSLEngineResultNEED_UNWRAP_CLOSEDprivate static javax.net.ssl.SSLEngineResultNEED_UNWRAP_OKprivate static javax.net.ssl.SSLEngineResultNEED_WRAP_CLOSEDprivate static javax.net.ssl.SSLEngineResultNEED_WRAP_OKprivate NativeSsl.BioWrappernetworkBioThe BIO used for reading/writing encrypted bytes.private java.lang.StringpeerHostnameHostname used with the TLS extension SNI hostname.private PeerInfoProviderpeerInfoProviderprivate java.nio.ByteBuffer[]singleDstBufferprivate java.nio.ByteBuffer[]singleSrcBufferprivate NativeSslsslWrapper around the underlying SSL object.private SSLParametersImplsslParametersprivate intstate
-
Constructor Summary
Constructors Constructor Description ConscryptEngine(java.lang.String host, int port, SSLParametersImpl sslParameters)ConscryptEngine(SSLParametersImpl sslParameters)ConscryptEngine(SSLParametersImpl sslParameters, PeerInfoProvider peerInfoProvider, SSLParametersImpl.AliasChooser aliasChooser)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description voidbeginHandshake()private voidbeginHandshakeInternal()private static intcalcDstsLength(java.nio.ByteBuffer[] dsts, int dstsOffset, int dstsLength)private static longcalcSrcsLength(java.nio.ByteBuffer[] srcs, int srcsOffset, int srcsEndOffset)java.lang.StringchooseClientAlias(javax.net.ssl.X509KeyManager keyManager, javax.security.auth.x500.X500Principal[] issuers, java.lang.String[] keyTypes)java.lang.StringchooseClientPSKIdentity(PSKKeyManager keyManager, java.lang.String identityHint)java.lang.StringchooseServerAlias(javax.net.ssl.X509KeyManager keyManager, java.lang.String keyType)java.lang.StringchooseServerPSKIdentityHint(PSKKeyManager keyManager)voidclientCertificateRequested(byte[] keyTypeBytes, int[] signatureAlgs, byte[][] asn1DerEncodedPrincipals)Called on an SSL client when the server requests (or requires a certificate).intclientPSKKeyRequested(java.lang.String identityHint, byte[] identity, byte[] key)Gets the key to be used in client mode for this connection in Pre-Shared Key (PSK) key exchange.private ClientSessionContextclientSessionContext()private voidcloseAll()private voidcloseAndFreeResources()voidcloseInbound()voidcloseOutbound()private javax.net.ssl.SSLExceptionconvertException(java.lang.Throwable e)private longdirectByteBufferAddress(java.nio.ByteBuffer directBuffer, int pos)(package private) byte[]exportKeyingMaterial(java.lang.String label, byte[] context, int length)Exports a value derived from the TLS master secret as described in RFC 5705.protected voidfinalize()private voidfinishHandshake()private voidfreeIfDone()java.lang.StringgetApplicationProtocol()(package private) java.lang.String[]getApplicationProtocols()Returns the list of supported ALPN protocols.(package private) byte[]getChannelId()Gets the TLS Channel ID for this server engine.(package private) static BufferAllocatorgetDefaultBufferAllocator()Returns the defaultBufferAllocator, which may benullif no default has been explicitly set.java.lang.RunnablegetDelegatedTask()java.lang.String[]getEnabledCipherSuites()java.lang.String[]getEnabledProtocols()booleangetEnableSessionCreation()private javax.net.ssl.SSLEngineResult.StatusgetEngineStatus()java.lang.StringgetHandshakeApplicationProtocol()javax.net.ssl.SSLEngineResult.HandshakeStatusgetHandshakeStatus()private javax.net.ssl.SSLEngineResult.HandshakeStatusgetHandshakeStatus(int pending)private javax.net.ssl.SSLEngineResult.HandshakeStatusgetHandshakeStatusInternal()(package private) java.lang.StringgetHostname()Returns the hostname fromsetHostname(String)or supplied by thePeerInfoProviderupon creation.booleangetNeedClientAuth()private java.nio.ByteBuffergetOrCreateLazyDirectBuffer()java.lang.StringgetPeerHost()intgetPeerPort()javax.crypto.SecretKeygetPSKKey(PSKKeyManager keyManager, java.lang.String identityHint, java.lang.String identity)javax.net.ssl.SSLSessiongetSession()javax.net.ssl.SSLParametersgetSSLParameters()java.lang.String[]getSupportedCipherSuites()java.lang.String[]getSupportedProtocols()(package private) byte[]getTlsUnique()Returns the tls-unique channel binding value for this connection, per RFC 5929.booleangetUseClientMode()booleangetWantClientAuth()private javax.net.ssl.SSLEngineResult.HandshakeStatushandshake()(package private) javax.net.ssl.SSLSessionhandshakeSession()Work-around to allow this method to be called on older versions of Android.private booleanisHandshakeStarted()booleanisInboundDone()booleanisOutboundDone()(package private) intmaxSealOverhead()Returns the maximum overhead, in bytes, of sealing a record with SSL.private javax.net.ssl.SSLEngineResult.HandshakeStatusmayFinishHandshake(javax.net.ssl.SSLEngineResult.HandshakeStatus status)private javax.net.ssl.SSLEngineResultnewResult(int bytesConsumed, int bytesProduced, javax.net.ssl.SSLEngineResult.HandshakeStatus status)private static NativeSslnewSsl(SSLParametersImpl sslParameters, ConscryptEngine engine, SSLParametersImpl.AliasChooser aliasChooser)private javax.net.ssl.SSLExceptionnewSslExceptionWithMessage(java.lang.String err)voidonNewSessionEstablished(long sslSessionNativePtr)Called when a new session has been established and may be added to the session cache.voidonSSLStateChange(int type, int val)Called when SSL state changes.private intpendingInboundCleartextBytes()(package private) intpendingOutboundEncryptedBytes()private static javax.net.ssl.SSLEngineResult.HandshakeStatuspendingStatus(int pendingOutboundBytes)private ConscryptSessionprovideAfterHandshakeSession()private ConscryptSessionprovideHandshakeSession()private ConscryptSessionprovideSession()private intreadEncryptedData(java.nio.ByteBuffer dst, int pending)Read encrypted data from the OpenSSL network BIOprivate intreadEncryptedDataDirect(java.nio.ByteBuffer dst, int pos, int len)private intreadEncryptedDataHeap(java.nio.ByteBuffer dst, int len)private javax.net.ssl.SSLEngineResultreadPendingBytesFromBIO(java.nio.ByteBuffer dst, int bytesConsumed, int bytesProduced, javax.net.ssl.SSLEngineResult.HandshakeStatus status)private intreadPlaintextData(java.nio.ByteBuffer dst)Read plaintext data from the OpenSSL internal BIOprivate intreadPlaintextDataDirect(java.nio.ByteBuffer dst, int pos, int len)private intreadPlaintextDataHeap(java.nio.ByteBuffer dst, int len)private voidresetSingleDstBuffer()private voidresetSingleSrcBuffer()intselectApplicationProtocol(byte[] protocols)Called when acting as a server, the socket has anApplicationProtocolSelectorAdapterassociated with it, and the application protocol needs to be selected.private voidsendSSLShutdown()voidserverCertificateRequested()Called when acting as a server during ClientHello processing before a decision to resume a session is made.intserverPSKKeyRequested(java.lang.String identityHint, java.lang.String identity, byte[] key)Gets the key to be used in server mode for this connection in Pre-Shared Key (PSK) key exchange.longserverSessionRequested(byte[] id)Called for servers where TLS < 1.3 (TLS 1.3 uses session tickets rather than application session caches).private AbstractSessionContextsessionContext()(package private) voidsetApplicationProtocols(java.lang.String[] protocols)Sets the list of ALPN protocols.(package private) voidsetApplicationProtocolSelector(ApplicationProtocolSelector selector)Sets an application-provided ALPN protocol selector.(package private) voidsetApplicationProtocolSelector(ApplicationProtocolSelectorAdapter adapter)(package private) voidsetBufferAllocator(BufferAllocator bufferAllocator)(package private) voidsetChannelIdEnabled(boolean enabled)Enables/disables TLS Channel ID for this server engine.(package private) voidsetChannelIdPrivateKey(java.security.PrivateKey privateKey)Sets thePrivateKeyto be used for TLS Channel ID by this client engine.(package private) static voidsetDefaultBufferAllocator(BufferAllocator bufferAllocator)Configures the defaultBufferAllocatorto be used by all futureSSLEngineandConscryptEngineSocketinstances from this provider.voidsetEnabledCipherSuites(java.lang.String[] suites)voidsetEnabledProtocols(java.lang.String[] protocols)voidsetEnableSessionCreation(boolean flag)(package private) voidsetHandshakeListener(HandshakeListener handshakeListener)Sets the listener for the completion of the TLS handshake.(package private) voidsetHostname(java.lang.String hostname)This method enables Server Name Indication (SNI) and overrides thePeerInfoProvidersupplied during engine creation.voidsetNeedClientAuth(boolean need)voidsetSSLParameters(javax.net.ssl.SSLParameters p)voidsetUseClientMode(boolean mode)(package private) voidsetUseSessionTickets(boolean useSessionTickets)This method enables session ticket support.voidsetWantClientAuth(boolean want)private java.nio.ByteBuffer[]singleDstBuffer(java.nio.ByteBuffer src)private java.nio.ByteBuffer[]singleSrcBuffer(java.nio.ByteBuffer src)private voidtransitionTo(int newState)(package private) javax.net.ssl.SSLEngineResultunwrap(java.nio.ByteBuffer[] srcs, int srcsOffset, int srcsLength, java.nio.ByteBuffer[] dsts, int dstsOffset, int dstsLength)(package private) javax.net.ssl.SSLEngineResultunwrap(java.nio.ByteBuffer[] srcs, java.nio.ByteBuffer[] dsts)javax.net.ssl.SSLEngineResultunwrap(java.nio.ByteBuffer src, java.nio.ByteBuffer dst)javax.net.ssl.SSLEngineResultunwrap(java.nio.ByteBuffer src, java.nio.ByteBuffer[] dsts)javax.net.ssl.SSLEngineResultunwrap(java.nio.ByteBuffer src, java.nio.ByteBuffer[] dsts, int offset, int length)voidverifyCertificateChain(byte[][] certChain, java.lang.String authMethod)Verify that the certificate chain is trusted.javax.net.ssl.SSLEngineResultwrap(java.nio.ByteBuffer[] srcs, int srcsOffset, int srcsLength, java.nio.ByteBuffer dst)javax.net.ssl.SSLEngineResultwrap(java.nio.ByteBuffer src, java.nio.ByteBuffer dst)private intwriteEncryptedData(java.nio.ByteBuffer src, int len)Write encrypted data to the OpenSSL network BIO.private intwriteEncryptedDataDirect(java.nio.ByteBuffer src, int pos, int len)private intwriteEncryptedDataHeap(java.nio.ByteBuffer src, int pos, int len)private intwritePlaintextData(java.nio.ByteBuffer src, int len)Write plaintext data to the OpenSSL internal BIO Calling this function with src.remaining == 0 is undefined.private intwritePlaintextDataDirect(java.nio.ByteBuffer src, int pos, int len)private intwritePlaintextDataHeap(java.nio.ByteBuffer src, int pos, int len)-
Methods inherited from class org.conscrypt.AbstractConscryptEngine
getHandshakeSession
-
-
-
-
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
-
sslParameters
private final SSLParametersImpl sslParameters
-
bufferAllocator
private BufferAllocator bufferAllocator
-
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 nobufferAllocatorhas 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
-
handshakeListener
private HandshakeListener handshakeListener
-
singleSrcBuffer
private final java.nio.ByteBuffer[] singleSrcBuffer
-
singleDstBuffer
private final java.nio.ByteBuffer[] singleDstBuffer
-
peerInfoProvider
private final PeerInfoProvider peerInfoProvider
-
-
Constructor Detail
-
ConscryptEngine
ConscryptEngine(SSLParametersImpl sslParameters)
-
ConscryptEngine
ConscryptEngine(java.lang.String host, int port, SSLParametersImpl sslParameters)
-
ConscryptEngine
ConscryptEngine(SSLParametersImpl sslParameters, PeerInfoProvider peerInfoProvider, SSLParametersImpl.AliasChooser aliasChooser)
-
-
Method Detail
-
newSsl
private static NativeSsl newSsl(SSLParametersImpl sslParameters, ConscryptEngine engine, SSLParametersImpl.AliasChooser aliasChooser)
-
setDefaultBufferAllocator
static void setDefaultBufferAllocator(BufferAllocator bufferAllocator)
Configures the defaultBufferAllocatorto be used by all futureSSLEngineandConscryptEngineSocketinstances from this provider.
-
getDefaultBufferAllocator
static BufferAllocator getDefaultBufferAllocator()
Returns the defaultBufferAllocator, which may benullif no default has been explicitly set.
-
setBufferAllocator
void setBufferAllocator(BufferAllocator bufferAllocator)
- Specified by:
setBufferAllocatorin classAbstractConscryptEngine
-
maxSealOverhead
int maxSealOverhead()
Returns the maximum overhead, in bytes, of sealing a record with SSL.- Specified by:
maxSealOverheadin classAbstractConscryptEngine
-
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:
setChannelIdEnabledin classAbstractConscryptEngine- Throws:
java.lang.IllegalStateException- if this is a client engine or if the handshake has already started.
-
getChannelId
byte[] getChannelId() throws javax.net.ssl.SSLExceptionGets the TLS Channel ID for this server engine. Channel ID is only available once the handshake completes.- Specified by:
getChannelIdin classAbstractConscryptEngine- Returns:
- channel ID or
nullif 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 thePrivateKeyto be used for TLS Channel ID by this client engine.This method needs to be invoked before the handshake starts.
- Specified by:
setChannelIdPrivateKeyin classAbstractConscryptEngine- Parameters:
privateKey- private key (enables TLS Channel ID) ornullfor 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.
-
setHandshakeListener
void setHandshakeListener(HandshakeListener handshakeListener)
Sets the listener for the completion of the TLS handshake.- Specified by:
setHandshakeListenerin classAbstractConscryptEngine
-
isHandshakeStarted
private boolean isHandshakeStarted()
-
setHostname
void setHostname(java.lang.String hostname)
This method enables Server Name Indication (SNI) and overrides thePeerInfoProvidersupplied during engine creation. If the hostname is not a valid SNI hostname, the SNI extension will be omitted from the handshake.- Specified by:
setHostnamein classAbstractConscryptEngine
-
getHostname
java.lang.String getHostname()
Returns the hostname fromsetHostname(String)or supplied by thePeerInfoProviderupon creation. No DNS resolution is attempted before returning the hostname.- Specified by:
getHostnamein classAbstractConscryptEngine
-
getPeerHost
public java.lang.String getPeerHost()
- Specified by:
getPeerHostin classAbstractConscryptEngine
-
getPeerPort
public int getPeerPort()
- Specified by:
getPeerPortin classAbstractConscryptEngine
-
beginHandshake
public void beginHandshake() throws javax.net.ssl.SSLException- Specified by:
beginHandshakein classjavax.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:
closeInboundin classjavax.net.ssl.SSLEngine
-
closeOutbound
public void closeOutbound()
- Specified by:
closeOutboundin classjavax.net.ssl.SSLEngine
-
getDelegatedTask
public java.lang.Runnable getDelegatedTask()
- Specified by:
getDelegatedTaskin classjavax.net.ssl.SSLEngine
-
getEnabledCipherSuites
public java.lang.String[] getEnabledCipherSuites()
- Specified by:
getEnabledCipherSuitesin classjavax.net.ssl.SSLEngine
-
getEnabledProtocols
public java.lang.String[] getEnabledProtocols()
- Specified by:
getEnabledProtocolsin classjavax.net.ssl.SSLEngine
-
getEnableSessionCreation
public boolean getEnableSessionCreation()
- Specified by:
getEnableSessionCreationin classjavax.net.ssl.SSLEngine
-
getSSLParameters
public javax.net.ssl.SSLParameters getSSLParameters()
- Overrides:
getSSLParametersin classjavax.net.ssl.SSLEngine
-
setSSLParameters
public void setSSLParameters(javax.net.ssl.SSLParameters p)
- Overrides:
setSSLParametersin classjavax.net.ssl.SSLEngine
-
getHandshakeStatus
public javax.net.ssl.SSLEngineResult.HandshakeStatus getHandshakeStatus()
- Specified by:
getHandshakeStatusin classjavax.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:
getNeedClientAuthin classjavax.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:
handshakeSessionin classAbstractConscryptEngine
-
getSession
public javax.net.ssl.SSLSession getSession()
- Specified by:
getSessionin classjavax.net.ssl.SSLEngine
-
provideSession
private ConscryptSession provideSession()
-
provideHandshakeSession
private ConscryptSession provideHandshakeSession()
-
provideAfterHandshakeSession
private ConscryptSession provideAfterHandshakeSession()
-
getSupportedCipherSuites
public java.lang.String[] getSupportedCipherSuites()
- Specified by:
getSupportedCipherSuitesin classjavax.net.ssl.SSLEngine
-
getSupportedProtocols
public java.lang.String[] getSupportedProtocols()
- Specified by:
getSupportedProtocolsin classjavax.net.ssl.SSLEngine
-
getUseClientMode
public boolean getUseClientMode()
- Specified by:
getUseClientModein classjavax.net.ssl.SSLEngine
-
getWantClientAuth
public boolean getWantClientAuth()
- Specified by:
getWantClientAuthin classjavax.net.ssl.SSLEngine
-
isInboundDone
public boolean isInboundDone()
- Specified by:
isInboundDonein classjavax.net.ssl.SSLEngine
-
isOutboundDone
public boolean isOutboundDone()
- Specified by:
isOutboundDonein classjavax.net.ssl.SSLEngine
-
setEnabledCipherSuites
public void setEnabledCipherSuites(java.lang.String[] suites)
- Specified by:
setEnabledCipherSuitesin classjavax.net.ssl.SSLEngine
-
setEnabledProtocols
public void setEnabledProtocols(java.lang.String[] protocols)
- Specified by:
setEnabledProtocolsin classjavax.net.ssl.SSLEngine
-
setEnableSessionCreation
public void setEnableSessionCreation(boolean flag)
- Specified by:
setEnableSessionCreationin classjavax.net.ssl.SSLEngine
-
setNeedClientAuth
public void setNeedClientAuth(boolean need)
- Specified by:
setNeedClientAuthin classjavax.net.ssl.SSLEngine
-
setUseClientMode
public void setUseClientMode(boolean mode)
- Specified by:
setUseClientModein classjavax.net.ssl.SSLEngine
-
setWantClientAuth
public void setWantClientAuth(boolean want)
- Specified by:
setWantClientAuthin classjavax.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:
unwrapin classAbstractConscryptEngine- 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:
unwrapin classAbstractConscryptEngine- 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:
unwrapin classAbstractConscryptEngine- 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:
unwrapin classAbstractConscryptEngine- 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:
unwrapin classAbstractConscryptEngine- 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.SSLExceptionWrite 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.IOExceptionRead 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.IOExceptionjava.security.cert.CertificateException
-
readPlaintextDataHeap
private int readPlaintextDataHeap(java.nio.ByteBuffer dst, int len) throws java.io.IOException, java.security.cert.CertificateException- Throws:
java.io.IOExceptionjava.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.SSLExceptionWrite 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.SSLExceptionRead 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:
wrapin classAbstractConscryptEngine- 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:
wrapin classAbstractConscryptEngine- Throws:
javax.net.ssl.SSLException
-
clientPSKKeyRequested
public int clientPSKKeyRequested(java.lang.String identityHint, byte[] identity, byte[] key)Description copied from interface:NativeCrypto.SSLHandshakeCallbacksGets the key to be used in client mode for this connection in Pre-Shared Key (PSK) key exchange.- Specified by:
clientPSKKeyRequestedin interfaceNativeCrypto.SSLHandshakeCallbacks- Parameters:
identityHint- PSK identity hint provided by the server ornullif 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
keybuffer or0if 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.SSLHandshakeCallbacksGets the key to be used in server mode for this connection in Pre-Shared Key (PSK) key exchange.- Specified by:
serverPSKKeyRequestedin interfaceNativeCrypto.SSLHandshakeCallbacks- Parameters:
identityHint- PSK identity hint provided by this server to the client ornullif 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
keybuffer or0if an error occurred in which case the handshake will be aborted.
-
onSSLStateChange
public void onSSLStateChange(int type, int val)Description copied from interface:NativeCrypto.SSLHandshakeCallbacksCalled when SSL state changes. This could be handshake completion.- Specified by:
onSSLStateChangein interfaceNativeCrypto.SSLHandshakeCallbacks
-
serverCertificateRequested
public void serverCertificateRequested() throws java.io.IOExceptionDescription copied from interface:NativeCrypto.SSLHandshakeCallbacksCalled 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:
serverCertificateRequestedin interfaceNativeCrypto.SSLHandshakeCallbacks- Throws:
java.io.IOException- if there was an error during certificate selection.
-
onNewSessionEstablished
public void onNewSessionEstablished(long sslSessionNativePtr)
Description copied from interface:NativeCrypto.SSLHandshakeCallbacksCalled when a new session has been established and may be added to the session cache. The callee is responsible for incrementing the reference count on the returned session.- Specified by:
onNewSessionEstablishedin interfaceNativeCrypto.SSLHandshakeCallbacks
-
serverSessionRequested
public long serverSessionRequested(byte[] id)
Description copied from interface:NativeCrypto.SSLHandshakeCallbacksCalled 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:
serverSessionRequestedin interfaceNativeCrypto.SSLHandshakeCallbacks- Parameters:
id- the ID of the session to find.- Returns:
- the cached session or
0if no session was found matching the given ID.
-
verifyCertificateChain
public void verifyCertificateChain(byte[][] certChain, java.lang.String authMethod) throws java.security.cert.CertificateExceptionDescription copied from interface:NativeCrypto.SSLHandshakeCallbacksVerify that the certificate chain is trusted.- Specified by:
verifyCertificateChainin interfaceNativeCrypto.SSLHandshakeCallbacks- Parameters:
certChain- chain of X.509 certificates in their encoded formauthMethod- 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.SSLExceptionDescription copied from interface:NativeCrypto.SSLHandshakeCallbacksCalled 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:
clientCertificateRequestedin interfaceNativeCrypto.SSLHandshakeCallbacks- Parameters:
keyTypeBytes- key types supported by the server, convertible to strings with #keyTypeasn1DerEncodedPrincipals- CAs known to the server- Throws:
java.security.cert.CertificateEncodingExceptionjavax.net.ssl.SSLException
-
sendSSLShutdown
private void sendSSLShutdown()
-
closeAndFreeResources
private void closeAndFreeResources()
-
finalize
protected void finalize() throws java.lang.Throwable- Overrides:
finalizein classjava.lang.Object- Throws:
java.lang.Throwable
-
chooseServerAlias
public java.lang.String chooseServerAlias(javax.net.ssl.X509KeyManager keyManager, java.lang.String keyType)- Specified by:
chooseServerAliasin interfaceSSLParametersImpl.AliasChooser
-
chooseClientAlias
public java.lang.String chooseClientAlias(javax.net.ssl.X509KeyManager keyManager, javax.security.auth.x500.X500Principal[] issuers, java.lang.String[] keyTypes)- Specified by:
chooseClientAliasin interfaceSSLParametersImpl.AliasChooser
-
chooseServerPSKIdentityHint
public java.lang.String chooseServerPSKIdentityHint(PSKKeyManager keyManager)
- Specified by:
chooseServerPSKIdentityHintin interfaceSSLParametersImpl.PSKCallbacks
-
chooseClientPSKIdentity
public java.lang.String chooseClientPSKIdentity(PSKKeyManager keyManager, java.lang.String identityHint)
- Specified by:
chooseClientPSKIdentityin interfaceSSLParametersImpl.PSKCallbacks
-
getPSKKey
public javax.crypto.SecretKey getPSKKey(PSKKeyManager keyManager, java.lang.String identityHint, java.lang.String identity)
- Specified by:
getPSKKeyin interfaceSSLParametersImpl.PSKCallbacks
-
setUseSessionTickets
void setUseSessionTickets(boolean useSessionTickets)
This method enables session ticket support.- Specified by:
setUseSessionTicketsin classAbstractConscryptEngine- Parameters:
useSessionTickets- True to enable session tickets
-
getApplicationProtocols
java.lang.String[] getApplicationProtocols()
Description copied from class:AbstractConscryptEngineReturns the list of supported ALPN protocols.- Specified by:
getApplicationProtocolsin classAbstractConscryptEngine
-
setApplicationProtocols
void setApplicationProtocols(java.lang.String[] protocols)
Description copied from class:AbstractConscryptEngineSets the list of ALPN protocols.- Specified by:
setApplicationProtocolsin classAbstractConscryptEngine- Parameters:
protocols- the list of ALPN protocols
-
setApplicationProtocolSelector
void setApplicationProtocolSelector(ApplicationProtocolSelector selector)
Description copied from class:AbstractConscryptEngineSets an application-provided ALPN protocol selector. If provided, this will override the list of protocols set byAbstractConscryptEngine.setApplicationProtocols(String[]).- Specified by:
setApplicationProtocolSelectorin classAbstractConscryptEngine
-
getTlsUnique
byte[] getTlsUnique()
Description copied from class:AbstractConscryptEngineReturns the tls-unique channel binding value for this connection, per RFC 5929. This will returnnullif there is no such value available, such as if the handshake has not yet completed or this connection is closed.- Specified by:
getTlsUniquein classAbstractConscryptEngine
-
exportKeyingMaterial
byte[] exportKeyingMaterial(java.lang.String label, byte[] context, int length) throws javax.net.ssl.SSLExceptionDescription copied from class:AbstractConscryptEngineExports a value derived from the TLS master secret as described in RFC 5705.- Specified by:
exportKeyingMaterialin classAbstractConscryptEngine- 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 benullto 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
nullif the handshake has not yet completed or the connection has been closed. - Throws:
javax.net.ssl.SSLException- if the value could not be exported.
-
setApplicationProtocolSelector
void setApplicationProtocolSelector(ApplicationProtocolSelectorAdapter adapter)
-
selectApplicationProtocol
public int selectApplicationProtocol(byte[] protocols)
Description copied from interface:NativeCrypto.SSLHandshakeCallbacksCalled when acting as a server, the socket has anApplicationProtocolSelectorAdapterassociated with it, and the application protocol needs to be selected.- Specified by:
selectApplicationProtocolin interfaceNativeCrypto.SSLHandshakeCallbacks- Parameters:
protocols- list of application protocols in length-prefix format- Returns:
- the index offset of the selected protocol
-
getApplicationProtocol
public java.lang.String getApplicationProtocol()
- Specified by:
getApplicationProtocolin classAbstractConscryptEngine
-
getHandshakeApplicationProtocol
public java.lang.String getHandshakeApplicationProtocol()
- Specified by:
getHandshakeApplicationProtocolin classAbstractConscryptEngine
-
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()
-
clientSessionContext
private ClientSessionContext clientSessionContext()
-
sessionContext
private AbstractSessionContext sessionContext()
-
transitionTo
private void transitionTo(int newState)
-
-