Package io.netty.handler.ssl
Class ReferenceCountedOpenSslEngine
- java.lang.Object
-
- javax.net.ssl.SSLEngine
-
- io.netty.handler.ssl.ReferenceCountedOpenSslEngine
-
- All Implemented Interfaces:
ApplicationProtocolAccessor,ReferenceCounted
- Direct Known Subclasses:
OpenSslEngine
public class ReferenceCountedOpenSslEngine extends javax.net.ssl.SSLEngine implements ReferenceCounted, ApplicationProtocolAccessor
Implements aSSLEngineusing OpenSSL BIO abstractions.Instances of this class must be
releasedor else native memory will leak!Instances of this class must be released before the
ReferenceCountedOpenSslContextthe instance depends upon are released. Otherwise if any method of this class is called which uses the theReferenceCountedOpenSslContextJNI resources the JVM may crash.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private classReferenceCountedOpenSslEngine.AsyncTaskDecoratorprivate classReferenceCountedOpenSslEngine.DefaultOpenSslSessionprivate static classReferenceCountedOpenSslEngine.HandshakeStateprivate static interfaceReferenceCountedOpenSslEngine.NativeSslExceptionprivate static classReferenceCountedOpenSslEngine.OpenSslExceptionprivate static classReferenceCountedOpenSslEngine.OpenSslHandshakeExceptionprivate classReferenceCountedOpenSslEngine.TaskDecorator<R extends java.lang.Runnable>
-
Field Summary
Fields Modifier and Type Field Description private java.lang.ObjectalgorithmConstraints(package private) ByteBufAllocatorallocprivate OpenSslApplicationProtocolNegotiatorapnprivate java.lang.StringapplicationProtocolprivate ClientAuthclientAuthprivate booleanclientModeprivate static javax.net.ssl.SSLEngineResultCLOSED_NOT_HANDSHAKINGprivate booleandestroyedprivate java.util.Set<java.lang.String>enabledProtocolsprivate booleanenableOcspprivate java.lang.StringendpointIdentificationAlgorithmprivate OpenSslEngineMapengineMapprivate ReferenceCountedOpenSslEngine.HandshakeStatehandshakeStateprivate booleanhasTLSv13Cipherprivate booleanisInboundDoneprivate static javax.security.cert.X509Certificate[]JAVAX_CERTS_NOT_SUPPORTED(package private) booleanjdkCompatibilityModeprivate ResourceLeakTracker<ReferenceCountedOpenSslEngine>leakprivate static ResourceLeakDetector<ReferenceCountedOpenSslEngine>leakDetectorprivate static InternalLoggerloggerprivate java.util.Collection<?>matchers(package private) static intMAX_PLAINTEXT_LENGTHDepends upon tcnative ...(package private) static intMAX_RECORD_SIZEDepends upon tcnative ...private intmaxWrapBufferSizeprivate intmaxWrapOverheadprivate 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 booleanneedTaskprivate longnetworkBIOprivate static intOPENSSL_OP_NO_PROTOCOL_INDEX_SSLV2private static intOPENSSL_OP_NO_PROTOCOL_INDEX_SSLV3private static intOPENSSL_OP_NO_PROTOCOL_INDEX_TLSv1private static intOPENSSL_OP_NO_PROTOCOL_INDEX_TLSv1_1private static intOPENSSL_OP_NO_PROTOCOL_INDEX_TLSv1_2private static intOPENSSL_OP_NO_PROTOCOL_INDEX_TLSv1_3private static int[]OPENSSL_OP_NO_PROTOCOLSprivate booleanoutboundClosedprivate ReferenceCountedOpenSslContextparentContextprivate java.lang.ThrowablependingExceptionprivate booleanreceivedShutdownprivate AbstractReferenceCountedrefCntprivate OpenSslInternalSessionsessionprivate booleansessionSetprivate java.nio.ByteBuffer[]singleDstBufferprivate java.nio.ByteBuffer[]singleSrcBufferprivate java.util.List<java.lang.String>sniHostNamesprivate longssl
-
Constructor Summary
Constructors Constructor Description ReferenceCountedOpenSslEngine(ReferenceCountedOpenSslContext context, ByteBufAllocator alloc, java.lang.String peerHost, int peerPort, boolean jdkCompatibilityMode, boolean leakDetection, java.lang.String endpointIdentificationAlgorithm)Create a new instance.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description (package private) java.lang.String[]authMethods()voidbeginHandshake()(package private) voidbioSetFd(int fd)private static longbufferAddress(java.nio.ByteBuffer b)(package private) intcalculateMaxLengthForWrap(int plaintextLength, int numComponents)This method is intentionally not synchronized, only use if you know you are in the EventLoop thread and visibility onmaxWrapBufferSizeandmaxWrapOverheadis achieved via other synchronized blocks.private voidcalculateMaxWrapOverhead()It is assumed this method is called in a synchronized block (or the constructor)!(package private) intcalculateOutNetBufSize(int plaintextLength, int numComponents)This method is intentionally not synchronized, only use if you know you are in the EventLoop thread and visibility onmaxWrapOverheadis achieved via other synchronized blocks.private voidcheckEngineClosed()(package private) booleancheckSniHostnameMatch(byte[] hostname)private voidcloseAll()voidcloseInbound()voidcloseOutbound()private voidconfigureEndpointVerification(java.lang.String endpointIdentificationAlgorithm)private booleandoSSLShutdown()Attempt to callSSL.shutdownSSL(long).java.lang.StringgetApplicationProtocol()java.lang.RunnablegetDelegatedTask()java.lang.String[]getEnabledCipherSuites()java.lang.String[]getEnabledProtocols()booleangetEnableSessionCreation()java.lang.StringgetHandshakeApplicationProtocol()javax.net.ssl.SSLSessiongetHandshakeSession()javax.net.ssl.SSLEngineResult.HandshakeStatusgetHandshakeStatus()private javax.net.ssl.SSLEngineResult.HandshakeStatusgetHandshakeStatus(int pending)booleangetNeedClientAuth()java.lang.StringgetNegotiatedApplicationProtocol()Returns the name of the negotiated application-level protocol.byte[]getOcspResponse()Returns the OCSP response ornullif the server didn't provide a stapled OCSP response.javax.net.ssl.SSLSessiongetSession()javax.net.ssl.SSLParametersgetSSLParameters()java.lang.String[]getSupportedCipherSuites()java.lang.String[]getSupportedProtocols()booleangetUseClientMode()booleangetWantClientAuth()private javax.net.ssl.SSLEngineResulthandleUnwrapException(int bytesConsumed, int bytesProduced, javax.net.ssl.SSLException e)private javax.net.ssl.SSLEngineResult.HandshakeStatushandshake()private javax.net.ssl.SSLEngineResult.HandshakeStatushandshakeException()(package private) voidinitHandshakeException(java.lang.Throwable cause)Should be called if the handshake will be failed due a callback that throws an exception.private booleanisBytesAvailableEnoughForWrap(int bytesAvailable, int plaintextLength, int numComponents)private booleanisDestroyed()private static booleanisEmpty(byte[] cert)private static booleanisEmpty(java.lang.Object[] arr)private static booleanisEndPointVerificationEnabled(java.lang.String endPointIdentificationAlgorithm)booleanisInboundDone()booleanisOutboundDone()private static booleanisProtocolEnabled(int opts, int disableMask, java.lang.String protocolString)(package private) booleanisSessionReused()(package private) javax.crypto.spec.SecretKeySpecmasterKey()(package private) intmaxEncryptedPacketLength()Visible only for testing!(package private) intmaxEncryptedPacketLength0()This method is intentionally not synchronized, only use if you know you are in the EventLoop thread and visibility onmaxWrapOverheadis achieved via other synchronized blocks.(package private) intmaxWrapOverhead()Visible only for testing!private javax.net.ssl.SSLEngineResult.HandshakeStatusmayFinishHandshake(javax.net.ssl.SSLEngineResult.HandshakeStatus status)private javax.net.ssl.SSLEngineResult.HandshakeStatusmayFinishHandshake(javax.net.ssl.SSLEngineResult.HandshakeStatus hs, int bytesConsumed, int bytesProduced)private booleanneedPendingStatus()private booleanneedWrapAgain(int stackError)private javax.net.ssl.SSLEngineResultnewResult(javax.net.ssl.SSLEngineResult.HandshakeStatus hs, int bytesConsumed, int bytesProduced)private javax.net.ssl.SSLEngineResultnewResult(javax.net.ssl.SSLEngineResult.Status status, javax.net.ssl.SSLEngineResult.HandshakeStatus hs, int bytesConsumed, int bytesProduced)private javax.net.ssl.SSLEngineResultnewResultMayFinishHandshake(javax.net.ssl.SSLEngineResult.HandshakeStatus hs, int bytesConsumed, int bytesProduced)private javax.net.ssl.SSLEngineResultnewResultMayFinishHandshake(javax.net.ssl.SSLEngineResult.Status status, javax.net.ssl.SSLEngineResult.HandshakeStatus hs, int bytesConsumed, int bytesProduced)private javax.net.ssl.SSLExceptionnewSSLExceptionForError(int stackError)private static javax.net.ssl.SSLEngineResult.HandshakeStatuspendingStatus(int pendingStatus)private intreadPlaintextData(java.nio.ByteBuffer dst)Read plaintext data from the OpenSSL internal BIOintrefCnt()Returns the reference count of this object.private voidrejectRemoteInitiatedRenegotiation()booleanrelease()Decreases the reference count by1and deallocates this object if the reference count reaches at0.booleanrelease(int decrement)Decreases the reference count by the specifieddecrementand deallocates this object if the reference count reaches at0.private voidresetSingleDstBuffer()private voidresetSingleSrcBuffer()ReferenceCountedretain()Increases the reference count by1.ReferenceCountedretain(int increment)Increases the reference count by the specifiedincrement.private voidrunAndResetNeedTask(java.lang.Runnable task)private voidselectApplicationProtocol()Select the application protocol used.private java.lang.StringselectApplicationProtocol(java.util.List<java.lang.String> protocols, ApplicationProtocolConfig.SelectedListenerFailureBehavior behavior, java.lang.String applicationProtocol)private voidsetClientAuth(ClientAuth mode)voidsetEnabledCipherSuites(java.lang.String[] cipherSuites)voidsetEnabledProtocols(java.lang.String[] protocols)TLS doesn't support a way to advertise non-contiguous versions from the client's perspective, and the client just advertises the max supported version.private voidsetEnabledProtocols0(java.lang.String[] protocols, boolean explicitDisableTLSv13)voidsetEnableSessionCreation(boolean b)(package private) booleansetKeyMaterial(OpenSslKeyMaterial keyMaterial)voidsetNeedClientAuth(boolean b)voidsetOcspResponse(byte[] response)Sets the OCSP response.voidsetSSLParameters(javax.net.ssl.SSLParameters sslParameters)voidsetUseClientMode(boolean clientMode)voidsetVerify(int verifyMode, int depth)See SSL_set_verify andSSL.setVerify(long, int, int).voidsetWantClientAuth(boolean b)private static booleanshouldAddSuppressed(java.lang.Throwable target, int errorCode)voidshutdown()Destroys this engine.private javax.net.ssl.SSLExceptionshutdownWithError(java.lang.String operation, int sslError, int error)Log the error, shutdown the engine and throw an exception.private java.nio.ByteBuffer[]singleDstBuffer(java.nio.ByteBuffer src)private java.nio.ByteBuffer[]singleSrcBuffer(java.nio.ByteBuffer src)(package private) intsslPending()private intsslPending0()longsslPointer()Returns the pointer to theSSLobject for thisReferenceCountedOpenSslEngine.private javax.net.ssl.SSLEngineResultsslReadErrorResult(int error, int stackError, int bytesConsumed, int bytesProduced)private java.lang.StringtoJavaCipherSuite(java.lang.String openSslCipherSuite)Converts the specified OpenSSL cipher suite to the Java cipher suite.private static java.lang.StringtoJavaCipherSuitePrefix(java.lang.String protocolVersion)Converts the protocol version string returned bySSL.getVersion(long)to protocol family string.ReferenceCountedtouch()Records the current access location of this object for debugging purposes.ReferenceCountedtouch(java.lang.Object hint)Records the current access location of this object with an additional arbitrary information for debugging purposes.javax.net.ssl.SSLEngineResultunwrap(java.nio.ByteBuffer[] srcs, int srcsOffset, int srcsLength, java.nio.ByteBuffer[] dsts, int dstsOffset, int dstsLength)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)javax.net.ssl.SSLEngineResultwrap(java.nio.ByteBuffer[] srcs, int offset, int length, java.nio.ByteBuffer dst)javax.net.ssl.SSLEngineResultwrap(java.nio.ByteBuffer src, java.nio.ByteBuffer dst)private ByteBufwriteEncryptedData(java.nio.ByteBuffer src, int len)Write encrypted data to the OpenSSL network BIO.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.
-
-
-
Field Detail
-
logger
private static final InternalLogger logger
-
leakDetector
private static final ResourceLeakDetector<ReferenceCountedOpenSslEngine> leakDetector
-
OPENSSL_OP_NO_PROTOCOL_INDEX_SSLV2
private static final int OPENSSL_OP_NO_PROTOCOL_INDEX_SSLV2
- See Also:
- Constant Field Values
-
OPENSSL_OP_NO_PROTOCOL_INDEX_SSLV3
private static final int OPENSSL_OP_NO_PROTOCOL_INDEX_SSLV3
- See Also:
- Constant Field Values
-
OPENSSL_OP_NO_PROTOCOL_INDEX_TLSv1
private static final int OPENSSL_OP_NO_PROTOCOL_INDEX_TLSv1
- See Also:
- Constant Field Values
-
OPENSSL_OP_NO_PROTOCOL_INDEX_TLSv1_1
private static final int OPENSSL_OP_NO_PROTOCOL_INDEX_TLSv1_1
- See Also:
- Constant Field Values
-
OPENSSL_OP_NO_PROTOCOL_INDEX_TLSv1_2
private static final int OPENSSL_OP_NO_PROTOCOL_INDEX_TLSv1_2
- See Also:
- Constant Field Values
-
OPENSSL_OP_NO_PROTOCOL_INDEX_TLSv1_3
private static final int OPENSSL_OP_NO_PROTOCOL_INDEX_TLSv1_3
- See Also:
- Constant Field Values
-
OPENSSL_OP_NO_PROTOCOLS
private static final int[] OPENSSL_OP_NO_PROTOCOLS
-
MAX_PLAINTEXT_LENGTH
static final int MAX_PLAINTEXT_LENGTH
Depends upon tcnative ... only use if tcnative is available!
-
MAX_RECORD_SIZE
static final int MAX_RECORD_SIZE
Depends upon tcnative ... only use if tcnative is available!
-
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
-
ssl
private long ssl
-
networkBIO
private long networkBIO
-
handshakeState
private ReferenceCountedOpenSslEngine.HandshakeState handshakeState
-
receivedShutdown
private boolean receivedShutdown
-
destroyed
private volatile boolean destroyed
-
applicationProtocol
private volatile java.lang.String applicationProtocol
-
needTask
private volatile boolean needTask
-
hasTLSv13Cipher
private boolean hasTLSv13Cipher
-
sessionSet
private boolean sessionSet
-
leak
private final ResourceLeakTracker<ReferenceCountedOpenSslEngine> leak
-
refCnt
private final AbstractReferenceCounted refCnt
-
enabledProtocols
private final java.util.Set<java.lang.String> enabledProtocols
-
clientAuth
private volatile ClientAuth clientAuth
-
endpointIdentificationAlgorithm
private java.lang.String endpointIdentificationAlgorithm
-
algorithmConstraints
private java.lang.Object algorithmConstraints
-
sniHostNames
private java.util.List<java.lang.String> sniHostNames
-
matchers
private volatile java.util.Collection<?> matchers
-
isInboundDone
private boolean isInboundDone
-
outboundClosed
private boolean outboundClosed
-
jdkCompatibilityMode
final boolean jdkCompatibilityMode
-
clientMode
private final boolean clientMode
-
alloc
final ByteBufAllocator alloc
-
engineMap
private final OpenSslEngineMap engineMap
-
apn
private final OpenSslApplicationProtocolNegotiator apn
-
parentContext
private final ReferenceCountedOpenSslContext parentContext
-
session
private final OpenSslInternalSession session
-
singleSrcBuffer
private final java.nio.ByteBuffer[] singleSrcBuffer
-
singleDstBuffer
private final java.nio.ByteBuffer[] singleDstBuffer
-
enableOcsp
private final boolean enableOcsp
-
maxWrapOverhead
private int maxWrapOverhead
-
maxWrapBufferSize
private int maxWrapBufferSize
-
pendingException
private java.lang.Throwable pendingException
-
JAVAX_CERTS_NOT_SUPPORTED
private static final javax.security.cert.X509Certificate[] JAVAX_CERTS_NOT_SUPPORTED
-
-
Constructor Detail
-
ReferenceCountedOpenSslEngine
ReferenceCountedOpenSslEngine(ReferenceCountedOpenSslContext context, ByteBufAllocator alloc, java.lang.String peerHost, int peerPort, boolean jdkCompatibilityMode, boolean leakDetection, java.lang.String endpointIdentificationAlgorithm)
Create a new instance.- Parameters:
context- Reference count release responsibility is not transferred! The callee still owns this object.alloc- The allocator to use.peerHost- The peer host name.peerPort- The peer port.jdkCompatibilityMode-trueto behave like described in https://docs.oracle.com/javase/7/docs/api/javax/net/ssl/SSLEngine.html.falseallows for partial and/or multiple packets to be process in a single wrap or unwrap call.leakDetection-trueto enable leak detection of this object.
-
-
Method Detail
-
authMethods
final java.lang.String[] authMethods()
-
setKeyMaterial
final boolean setKeyMaterial(OpenSslKeyMaterial keyMaterial) throws java.lang.Exception
- Throws:
java.lang.Exception
-
masterKey
final javax.crypto.spec.SecretKeySpec masterKey()
-
isSessionReused
boolean isSessionReused()
-
setOcspResponse
@UnstableApi public void setOcspResponse(byte[] response)
Sets the OCSP response.
-
getOcspResponse
@UnstableApi public byte[] getOcspResponse()
Returns the OCSP response ornullif the server didn't provide a stapled OCSP response.
-
refCnt
public final int refCnt()
Description copied from interface:ReferenceCountedReturns the reference count of this object. If0, it means this object has been deallocated.- Specified by:
refCntin interfaceReferenceCounted
-
retain
public final ReferenceCounted retain()
Description copied from interface:ReferenceCountedIncreases the reference count by1.- Specified by:
retainin interfaceReferenceCounted
-
retain
public final ReferenceCounted retain(int increment)
Description copied from interface:ReferenceCountedIncreases the reference count by the specifiedincrement.- Specified by:
retainin interfaceReferenceCounted
-
touch
public final ReferenceCounted touch()
Description copied from interface:ReferenceCountedRecords the current access location of this object for debugging purposes. If this object is determined to be leaked, the information recorded by this operation will be provided to you viaResourceLeakDetector. This method is a shortcut totouch(null).- Specified by:
touchin interfaceReferenceCounted
-
touch
public final ReferenceCounted touch(java.lang.Object hint)
Description copied from interface:ReferenceCountedRecords the current access location of this object with an additional arbitrary information for debugging purposes. If this object is determined to be leaked, the information recorded by this operation will be provided to you viaResourceLeakDetector.- Specified by:
touchin interfaceReferenceCounted
-
release
public final boolean release()
Description copied from interface:ReferenceCountedDecreases the reference count by1and deallocates this object if the reference count reaches at0.- Specified by:
releasein interfaceReferenceCounted- Returns:
trueif and only if the reference count became0and this object has been deallocated
-
release
public final boolean release(int decrement)
Description copied from interface:ReferenceCountedDecreases the reference count by the specifieddecrementand deallocates this object if the reference count reaches at0.- Specified by:
releasein interfaceReferenceCounted- Returns:
trueif and only if the reference count became0and this object has been deallocated
-
getApplicationProtocol
public java.lang.String getApplicationProtocol()
- Overrides:
getApplicationProtocolin classjavax.net.ssl.SSLEngine
-
getHandshakeApplicationProtocol
public java.lang.String getHandshakeApplicationProtocol()
- Overrides:
getHandshakeApplicationProtocolin classjavax.net.ssl.SSLEngine
-
getHandshakeSession
public final javax.net.ssl.SSLSession getHandshakeSession()
- Overrides:
getHandshakeSessionin classjavax.net.ssl.SSLEngine
-
sslPointer
public final long sslPointer()
Returns the pointer to theSSLobject for thisReferenceCountedOpenSslEngine. Be aware that it is freed as soon as therelease()orshutdown()methods are called. At this point0will be returned.
-
shutdown
public final void shutdown()
Destroys this engine.
-
writePlaintextData
private int writePlaintextData(java.nio.ByteBuffer src, int len)Write plaintext data to the OpenSSL internal BIO Calling this function with src.remaining == 0 is undefined.
-
bioSetFd
void bioSetFd(int fd)
-
writeEncryptedData
private ByteBuf 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
-
readPlaintextData
private int readPlaintextData(java.nio.ByteBuffer dst) throws javax.net.ssl.SSLExceptionRead plaintext data from the OpenSSL internal BIO- Throws:
javax.net.ssl.SSLException
-
maxWrapOverhead
final int maxWrapOverhead()
Visible only for testing!
-
maxEncryptedPacketLength
final int maxEncryptedPacketLength()
Visible only for testing!
-
maxEncryptedPacketLength0
final int maxEncryptedPacketLength0()
This method is intentionally not synchronized, only use if you know you are in the EventLoop thread and visibility onmaxWrapOverheadis achieved via other synchronized blocks.
-
calculateMaxLengthForWrap
final int calculateMaxLengthForWrap(int plaintextLength, int numComponents)This method is intentionally not synchronized, only use if you know you are in the EventLoop thread and visibility onmaxWrapBufferSizeandmaxWrapOverheadis achieved via other synchronized blocks.
Calculates the max size of a single wrap operation for the given plaintextLength and numComponents.
-
calculateOutNetBufSize
final int calculateOutNetBufSize(int plaintextLength, int numComponents)This method is intentionally not synchronized, only use if you know you are in the EventLoop thread and visibility onmaxWrapOverheadis achieved via other synchronized blocks.
Calculates the size of the out net buf to create for the given plaintextLength and numComponents. This is not related to the max size per wrap, as we can wrap chunks at a time into one out net buf.
-
sslPending
final int sslPending()
-
calculateMaxWrapOverhead
private void calculateMaxWrapOverhead()
It is assumed this method is called in a synchronized block (or the constructor)!
-
sslPending0
private int sslPending0()
-
isBytesAvailableEnoughForWrap
private boolean isBytesAvailableEnoughForWrap(int bytesAvailable, int plaintextLength, int numComponents)
-
wrap
public final javax.net.ssl.SSLEngineResult wrap(java.nio.ByteBuffer[] srcs, int offset, int length, java.nio.ByteBuffer dst) throws javax.net.ssl.SSLException- Specified by:
wrapin classjavax.net.ssl.SSLEngine- Throws:
javax.net.ssl.SSLException
-
newResult
private javax.net.ssl.SSLEngineResult newResult(javax.net.ssl.SSLEngineResult.HandshakeStatus hs, int bytesConsumed, int bytesProduced)
-
newResult
private javax.net.ssl.SSLEngineResult newResult(javax.net.ssl.SSLEngineResult.Status status, javax.net.ssl.SSLEngineResult.HandshakeStatus hs, int bytesConsumed, int bytesProduced)
-
newResultMayFinishHandshake
private javax.net.ssl.SSLEngineResult newResultMayFinishHandshake(javax.net.ssl.SSLEngineResult.HandshakeStatus hs, int bytesConsumed, int bytesProduced) throws javax.net.ssl.SSLException- Throws:
javax.net.ssl.SSLException
-
newResultMayFinishHandshake
private javax.net.ssl.SSLEngineResult newResultMayFinishHandshake(javax.net.ssl.SSLEngineResult.Status status, javax.net.ssl.SSLEngineResult.HandshakeStatus hs, int bytesConsumed, int bytesProduced) throws javax.net.ssl.SSLException- Throws:
javax.net.ssl.SSLException
-
shutdownWithError
private javax.net.ssl.SSLException shutdownWithError(java.lang.String operation, int sslError, int error)Log the error, shutdown the engine and throw an exception.
-
handleUnwrapException
private javax.net.ssl.SSLEngineResult handleUnwrapException(int bytesConsumed, int bytesProduced, javax.net.ssl.SSLException e) throws javax.net.ssl.SSLException- Throws:
javax.net.ssl.SSLException
-
unwrap
public final 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- Throws:
javax.net.ssl.SSLException
-
needWrapAgain
private boolean needWrapAgain(int stackError)
-
newSSLExceptionForError
private javax.net.ssl.SSLException newSSLExceptionForError(int stackError)
-
shouldAddSuppressed
private static boolean shouldAddSuppressed(java.lang.Throwable target, int errorCode)
-
sslReadErrorResult
private javax.net.ssl.SSLEngineResult sslReadErrorResult(int error, int stackError, int bytesConsumed, int bytesProduced) throws javax.net.ssl.SSLException- Throws:
javax.net.ssl.SSLException
-
closeAll
private void closeAll() throws javax.net.ssl.SSLException- Throws:
javax.net.ssl.SSLException
-
rejectRemoteInitiatedRenegotiation
private void rejectRemoteInitiatedRenegotiation() throws javax.net.ssl.SSLHandshakeException- Throws:
javax.net.ssl.SSLHandshakeException
-
unwrap
public final javax.net.ssl.SSLEngineResult unwrap(java.nio.ByteBuffer[] srcs, java.nio.ByteBuffer[] dsts) throws javax.net.ssl.SSLException- Throws:
javax.net.ssl.SSLException
-
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()
-
unwrap
public final 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 classjavax.net.ssl.SSLEngine- Throws:
javax.net.ssl.SSLException
-
wrap
public final javax.net.ssl.SSLEngineResult wrap(java.nio.ByteBuffer src, java.nio.ByteBuffer dst) throws javax.net.ssl.SSLException- Overrides:
wrapin classjavax.net.ssl.SSLEngine- Throws:
javax.net.ssl.SSLException
-
unwrap
public final javax.net.ssl.SSLEngineResult unwrap(java.nio.ByteBuffer src, java.nio.ByteBuffer dst) throws javax.net.ssl.SSLException- Overrides:
unwrapin classjavax.net.ssl.SSLEngine- Throws:
javax.net.ssl.SSLException
-
unwrap
public final javax.net.ssl.SSLEngineResult unwrap(java.nio.ByteBuffer src, java.nio.ByteBuffer[] dsts) throws javax.net.ssl.SSLException- Overrides:
unwrapin classjavax.net.ssl.SSLEngine- Throws:
javax.net.ssl.SSLException
-
runAndResetNeedTask
private void runAndResetNeedTask(java.lang.Runnable task)
-
getDelegatedTask
public final java.lang.Runnable getDelegatedTask()
- Specified by:
getDelegatedTaskin classjavax.net.ssl.SSLEngine
-
closeInbound
public final void closeInbound() throws javax.net.ssl.SSLException- Specified by:
closeInboundin classjavax.net.ssl.SSLEngine- Throws:
javax.net.ssl.SSLException
-
isInboundDone
public final boolean isInboundDone()
- Specified by:
isInboundDonein classjavax.net.ssl.SSLEngine
-
closeOutbound
public final void closeOutbound()
- Specified by:
closeOutboundin classjavax.net.ssl.SSLEngine
-
doSSLShutdown
private boolean doSSLShutdown()
Attempt to callSSL.shutdownSSL(long).- Returns:
falseif the call toSSL.shutdownSSL(long)was not attempted or returned an error.
-
isOutboundDone
public final boolean isOutboundDone()
- Specified by:
isOutboundDonein classjavax.net.ssl.SSLEngine
-
getSupportedCipherSuites
public final java.lang.String[] getSupportedCipherSuites()
- Specified by:
getSupportedCipherSuitesin classjavax.net.ssl.SSLEngine
-
getEnabledCipherSuites
public final java.lang.String[] getEnabledCipherSuites()
- Specified by:
getEnabledCipherSuitesin classjavax.net.ssl.SSLEngine
-
setEnabledCipherSuites
public final void setEnabledCipherSuites(java.lang.String[] cipherSuites)
- Specified by:
setEnabledCipherSuitesin classjavax.net.ssl.SSLEngine
-
getSupportedProtocols
public final java.lang.String[] getSupportedProtocols()
- Specified by:
getSupportedProtocolsin classjavax.net.ssl.SSLEngine
-
getEnabledProtocols
public final java.lang.String[] getEnabledProtocols()
- Specified by:
getEnabledProtocolsin classjavax.net.ssl.SSLEngine
-
isProtocolEnabled
private static boolean isProtocolEnabled(int opts, int disableMask, java.lang.String protocolString)
-
setEnabledProtocols
public final void setEnabledProtocols(java.lang.String[] protocols)
TLS doesn't support a way to advertise non-contiguous versions from the client's perspective, and the client just advertises the max supported version. The TLS protocol also doesn't support all different combinations of discrete protocols, and instead assumes contiguous ranges. OpenSSL has some unexpected behavior (e.g. handshake failures) if non-contiguous protocols are used even where there is a compatible set of protocols and ciphers. For these reasons this method will determine the minimum protocol and the maximum protocol and enabled a contiguous range from [min protocol, max protocol] in OpenSSL.- Specified by:
setEnabledProtocolsin classjavax.net.ssl.SSLEngine
-
setEnabledProtocols0
private void setEnabledProtocols0(java.lang.String[] protocols, boolean explicitDisableTLSv13)
-
getSession
public final javax.net.ssl.SSLSession getSession()
- Specified by:
getSessionin classjavax.net.ssl.SSLEngine
-
beginHandshake
public final void beginHandshake() throws javax.net.ssl.SSLException- Specified by:
beginHandshakein classjavax.net.ssl.SSLEngine- Throws:
javax.net.ssl.SSLException
-
checkEngineClosed
private void checkEngineClosed() throws javax.net.ssl.SSLException- Throws:
javax.net.ssl.SSLException
-
pendingStatus
private static javax.net.ssl.SSLEngineResult.HandshakeStatus pendingStatus(int pendingStatus)
-
isEmpty
private static boolean isEmpty(java.lang.Object[] arr)
-
isEmpty
private static boolean isEmpty(byte[] cert)
-
handshakeException
private javax.net.ssl.SSLEngineResult.HandshakeStatus handshakeException() throws javax.net.ssl.SSLException- Throws:
javax.net.ssl.SSLException
-
initHandshakeException
final void initHandshakeException(java.lang.Throwable cause)
Should be called if the handshake will be failed due a callback that throws an exception. This cause will then be used to give more details as part of theSSLHandshakeException.
-
handshake
private javax.net.ssl.SSLEngineResult.HandshakeStatus handshake() throws javax.net.ssl.SSLException- Throws:
javax.net.ssl.SSLException
-
mayFinishHandshake
private javax.net.ssl.SSLEngineResult.HandshakeStatus mayFinishHandshake(javax.net.ssl.SSLEngineResult.HandshakeStatus hs, int bytesConsumed, int bytesProduced) throws javax.net.ssl.SSLException- Throws:
javax.net.ssl.SSLException
-
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
public final javax.net.ssl.SSLEngineResult.HandshakeStatus getHandshakeStatus()
- Specified by:
getHandshakeStatusin classjavax.net.ssl.SSLEngine
-
getHandshakeStatus
private javax.net.ssl.SSLEngineResult.HandshakeStatus getHandshakeStatus(int pending)
-
needPendingStatus
private boolean needPendingStatus()
-
toJavaCipherSuite
private java.lang.String toJavaCipherSuite(java.lang.String openSslCipherSuite)
Converts the specified OpenSSL cipher suite to the Java cipher suite.
-
toJavaCipherSuitePrefix
private static java.lang.String toJavaCipherSuitePrefix(java.lang.String protocolVersion)
Converts the protocol version string returned bySSL.getVersion(long)to protocol family string.
-
setUseClientMode
public final void setUseClientMode(boolean clientMode)
- Specified by:
setUseClientModein classjavax.net.ssl.SSLEngine
-
getUseClientMode
public final boolean getUseClientMode()
- Specified by:
getUseClientModein classjavax.net.ssl.SSLEngine
-
setNeedClientAuth
public final void setNeedClientAuth(boolean b)
- Specified by:
setNeedClientAuthin classjavax.net.ssl.SSLEngine
-
getNeedClientAuth
public final boolean getNeedClientAuth()
- Specified by:
getNeedClientAuthin classjavax.net.ssl.SSLEngine
-
setWantClientAuth
public final void setWantClientAuth(boolean b)
- Specified by:
setWantClientAuthin classjavax.net.ssl.SSLEngine
-
getWantClientAuth
public final boolean getWantClientAuth()
- Specified by:
getWantClientAuthin classjavax.net.ssl.SSLEngine
-
setVerify
@UnstableApi public final void setVerify(int verifyMode, int depth)
See SSL_set_verify andSSL.setVerify(long, int, int).
-
setClientAuth
private void setClientAuth(ClientAuth mode)
-
setEnableSessionCreation
public final void setEnableSessionCreation(boolean b)
- Specified by:
setEnableSessionCreationin classjavax.net.ssl.SSLEngine
-
getEnableSessionCreation
public final boolean getEnableSessionCreation()
- Specified by:
getEnableSessionCreationin classjavax.net.ssl.SSLEngine
-
getSSLParameters
public final javax.net.ssl.SSLParameters getSSLParameters()
- Overrides:
getSSLParametersin classjavax.net.ssl.SSLEngine
-
setSSLParameters
public final void setSSLParameters(javax.net.ssl.SSLParameters sslParameters)
- Overrides:
setSSLParametersin classjavax.net.ssl.SSLEngine
-
configureEndpointVerification
private void configureEndpointVerification(java.lang.String endpointIdentificationAlgorithm)
-
isEndPointVerificationEnabled
private static boolean isEndPointVerificationEnabled(java.lang.String endPointIdentificationAlgorithm)
-
isDestroyed
private boolean isDestroyed()
-
checkSniHostnameMatch
final boolean checkSniHostnameMatch(byte[] hostname)
-
getNegotiatedApplicationProtocol
public java.lang.String getNegotiatedApplicationProtocol()
Description copied from interface:ApplicationProtocolAccessorReturns the name of the negotiated application-level protocol.- Specified by:
getNegotiatedApplicationProtocolin interfaceApplicationProtocolAccessor- Returns:
- the application-level protocol name or
nullif the negotiation failed or the client does not have ALPN/NPN extension
-
bufferAddress
private static long bufferAddress(java.nio.ByteBuffer b)
-
selectApplicationProtocol
private void selectApplicationProtocol() throws javax.net.ssl.SSLExceptionSelect the application protocol used.- Throws:
javax.net.ssl.SSLException
-
selectApplicationProtocol
private java.lang.String selectApplicationProtocol(java.util.List<java.lang.String> protocols, ApplicationProtocolConfig.SelectedListenerFailureBehavior behavior, java.lang.String applicationProtocol) throws javax.net.ssl.SSLException- Throws:
javax.net.ssl.SSLException
-
-