<div dir="ltr">Hi,<div><br></div><div>In Netty we've been trying to design some safer APIs, and attempted to make more use of read-only ByteBuffers.</div><div><br></div><div>We discovered that SSLEngine.unwrap does not like read-only input buffers, even though the input buffers should in theory only be read from. We obviously make sure that the output buffers are writable.</div><div><br></div><div>By my reading of the javadoc, and the code, I believe this was intended to work - or at least not intended to not work - but probably wasn't tested directly.</div><div><br></div><div>When we try we get this stack trace on adopt-openjdk-11.0.7:</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">javax.net.ssl.SSLProtocolException: null<br>      at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:129)<br>        at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:326)<br>       at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:269)<br>       at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:264)<br>       at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:118)<br>      at java.base/sun.security.ssl.SSLEngineImpl.decode(SSLEngineImpl.java:668)<br>    at java.base/sun.security.ssl.SSLEngineImpl.readRecord(SSLEngineImpl.java:623)<br>        at java.base/sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:441)<br>    at java.base/sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:420)<br>    at java.base/javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:674)<br>       at io.netty5.handler.ssl.EngineWrapper.unwrap(EngineWrapper.java:100)<br> at io.netty5.handler.ssl.SslHandler.unwrap(SslHandler.java:1227)<br>      at io.netty5.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1105)<br> at io.netty5.handler.ssl.SslHandler.decode(SslHandler.java:1165)<br>      at io.netty5.handler.codec.ByteToMessageDecoderForBuffer.decodeRemovalReentryProtection(ByteToMessageDecoderForBuffer.java:384)<br>       at io.netty5.handler.codec.ByteToMessageDecoderForBuffer.callDecode(ByteToMessageDecoderForBuffer.java:327)<br>   ... 20 common frames omitted<br>Caused by: java.nio.ReadOnlyBufferException: null<br>       at java.base/javax.crypto.Cipher.doFinal(Cipher.java:2493)<br>    at java.base/sun.security.ssl.SSLCipher$T12GcmReadCipherGenerator$GcmReadCipher.decrypt(SSLCipher.java:1629)<br>  at java.base/sun.security.ssl.SSLEngineInputRecord.decodeInputRecord(SSLEngineInputRecord.java:240)<br>   at java.base/sun.security.ssl.SSLEngineInputRecord.decode(SSLEngineInputRecord.java:197)<br>      at java.base/sun.security.ssl.SSLEngineInputRecord.decode(SSLEngineInputRecord.java:160)<br>      at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:108)<br>      ... 31 common frames omitted</blockquote><div><br></div><div>I also tried this on a panama-preview snapshot JDK I have, and got a similar stack trace:</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">% java -version<br>openjdk version "19-internal" 2022-09-20<br>OpenJDK Runtime Environment (fastdebug build 19-internal-adhoc.chris.panama-foreign)<br>OpenJDK 64-Bit Server VM (fastdebug build 19-internal-adhoc.chris.panama-foreign, mixed mode)</blockquote><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">% git show<br>commit 144af9f43cd2d6f88b675b8c85e4034e5b9d6695 (HEAD -> foreign-preview, origin/foreign-preview)</blockquote><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">javax.net.ssl.SSLProtocolException: null<br>      at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:129)<br>        at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:371)<br>       at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:314)<br>       at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:309)<br>       at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:121)<br>      at java.base/sun.security.ssl.SSLEngineImpl.decode(SSLEngineImpl.java:736)<br>    at java.base/sun.security.ssl.SSLEngineImpl.readRecord(SSLEngineImpl.java:691)<br>        at java.base/sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:506)<br>    at java.base/sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:482)<br>    at java.base/javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:719)<br>       at io.netty5.handler.ssl.EngineWrapper.unwrap(EngineWrapper.java:100)<br> at io.netty5.handler.ssl.SslHandler.unwrap(SslHandler.java:1227)<br>      at io.netty5.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1105)<br> at io.netty5.handler.ssl.SslHandler.decode(SslHandler.java:1165)<br>      at io.netty5.handler.codec.ByteToMessageDecoderForBuffer.decodeRemovalReentryProtection(ByteToMessageDecoderForBuffer.java:384)<br>       at io.netty5.handler.codec.ByteToMessageDecoderForBuffer.callDecode(ByteToMessageDecoderForBuffer.java:327)<br>   ... 20 common frames omitted<br>Caused by: java.nio.ReadOnlyBufferException: null<br>       at java.base/javax.crypto.Cipher.doFinal(Cipher.java:2497)<br>    at java.base/sun.security.ssl.SSLCipher$T13GcmReadCipherGenerator$GcmReadCipher.decrypt(SSLCipher.java:1933)<br>  at java.base/sun.security.ssl.SSLEngineInputRecord.decodeInputRecord(SSLEngineInputRecord.java:239)<br>   at java.base/sun.security.ssl.SSLEngineInputRecord.decode(SSLEngineInputRecord.java:196)<br>      at java.base/sun.security.ssl.SSLEngineInputRecord.decode(SSLEngineInputRecord.java:159)<br>      at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:111)<br>      ... 31 common frames omitted</blockquote><div><br></div><div>We can work around this in Netty since we need to support JDK versions that has this issue anyway, but I think it's a bug that should be fixed at some point.</div><div><br></div><div>Thanks,</div><div>Chris</div><div><br></div></div>