On Fri, 8 Jan 2021 20:08:57 GMT, Valerie Peng <valer...@openjdk.org> wrote:
>> Because a C_EncryptUpdate call that returns with an error here [1] implies >> that a session (with an active operation) is returned to the Session Manager >> here [2] [3]. For decryption, where we have proper padding on the Java side >> while doing an update, the test exercises the doFinal path. >> Decryption/Encryption is anecdotal here: what the test wants is coverage on >> both update and doFinal paths. >> >> -- >> [1] - >> https://github.com/openjdk/jdk/blob/1cc09ccaef9a3695dd2862e3ee121e141e0a8a13/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/P11Cipher.java#L584 >> [2] - >> https://github.com/openjdk/jdk/blob/1cc09ccaef9a3695dd2862e3ee121e141e0a8a13/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/P11Cipher.java#L631 >> [3] - >> https://github.com/openjdk/jdk/blob/1cc09ccaef9a3695dd2862e3ee121e141e0a8a13/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/P11Cipher.java#L423 > > 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 ------------- PR: https://git.openjdk.java.net/jdk/pull/1901