On Tue, 12 Jan 2021 23:20:11 GMT, Martin Balao <mba...@openjdk.org> wrote:
>> I understand that the intention/design is to trigger the error condition on >> various code paths causing the active session to be returned to pool and >> verify if this issue is fixed or not. What I don't get is that why >> AES/ECB/NoPadding cipher encrypting a byte[1] w/ an update (where more input >> could still be given) would trigger an error. The stack trace for the >> encryption update call (which is the first test, the session should be >> freshly allocated and not a reused one with active state) is below: >> >> java.security.ProviderException: update() failed >> at >> jdk.crypto.cryptoki/sun.security.pkcs11.P11Cipher.implUpdate(P11Cipher.java:632) >> at >> jdk.crypto.cryptoki/sun.security.pkcs11.P11Cipher.engineUpdate(P11Cipher.java:529) >> at >> jdk.crypto.cryptoki/sun.security.pkcs11.P11Cipher.engineUpdate(P11Cipher.java:517) >> at java.base/javax.crypto.Cipher.update(Cipher.java:1832) >> at >> CancelMultipart$LeakByteArray.doOperation(CancelMultipart.java:125) >> at CancelMultipart$SessionLeaker.leakAndTry(CancelMultipart.java:63) >> at CancelMultipart.executeTest(CancelMultipart.java:158) >> at CancelMultipart.main(CancelMultipart.java:140) >> at PKCS11Test.premain(PKCS11Test.java:171) >> at PKCS11Test.testNSS(PKCS11Test.java:568) >> at PKCS11Test.main(PKCS11Test.java:207) >> at CancelMultipart.main(CancelMultipart.java:131) >> at >> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native >> Method) >> at >> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78) >> at >> java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) >> at java.base/java.lang.reflect.Method.invoke(Method.java:567) >> at >> com.sun.javatest.regtest.agent.MainWrapper$MainThread.run(MainWrapper.java:127) >> at java.base/java.lang.Thread.run(Thread.java:831) >> Caused by: sun.security.pkcs11.wrapper.PKCS11Exception: CKR_DATA_LEN_RANGE >> at >> jdk.crypto.cryptoki/sun.security.pkcs11.wrapper.PKCS11.C_EncryptUpdate(Native >> Method) >> at >> jdk.crypto.cryptoki/sun.security.pkcs11.P11Cipher.implUpdate(P11Cipher.java:584) >> ... 17 more > > The update fails because the native mechanism (CKM_AES_ECB) has no padding > and OpenJDK does not buffer data in the Java side for encryption [1] (this is > a bug that I'll address soon). As a result, there is a PKCS#11 call with an > invalid length and we get the error that ends up returning the session to the > Session Manager. I just realized that when we fix the previous padding-bug, > this test path won't work anymore. CKR_BUFFER_TOO_SMALL errors on updates do > not lead to a reset call in the OpenJDK side (contrary to doFinal), so they > wouldn't be useful for the test. I'll investigate if there is a way to > trigger the path. Otherwise we should keep the doFinal path only. I'd still > force a reset if there is an error other than CKR_BUFFER_TOO_SMALL in the > update. > > -- > [1] - > https://github.com/openjdk/jdk/blob/1cc09ccaef9a3695dd2862e3ee121e141e0a8a13/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/P11Cipher.java#L583 It's an update call, isn't padding occur when doFinal() is called for encryption? In any case, it's best for the test case to not have this bug dependency. I am ok if you can only test doFinal path only. ------------- PR: https://git.openjdk.java.net/jdk/pull/1901