SunPKCS11 connection lost after Decrypt doFinal (noPadding) openjdk 8_232
Seán Coffey
sean.coffey at oracle.com
Wed Dec 4 13:34:33 UTC 2019
Also,
which JDK distro version of 8 are you using ? Note that the OpenJDK
version has an extra few pkcs11 fixes in OpenJDK in this area (compared
to the Oracle JDK 8 Updates) - Below being some of those :
https://bugs.openjdk.java.net/browse/JDK-8216597
https://bugs.openjdk.java.net/browse/JDK-6913047
https://bugs.openjdk.java.net/browse/JDK-6946830
Regards,
Sean.
On 03/12/19 00:56, Valerie Peng wrote:
> Hi Hubert,
>
> I've filed https://bugs.openjdk.java.net/browse/JDK-8235215 to keep
> track of this issue.
>
> I have not yet tried if this can be reproduced in house with NSS yet.
>
> Just curious, which HSM vendor did you use? It'd be helpful to include
> in the bug report.
>
> Thanks,
> Valerie
> On 12/2/2019 8:50 AM, DEBORDEAUX Hubert wrote:
>> Hello,
>> Following the update to OpenJDK 8_232, we did face a problem after a
>> DECRYPT with no padding.
>> We use a SunPKCS11 provider linked to a Network HSM.
>> After a DECRYPT command (DES or AES) NOPADDING, we noticed the log :
>> "Killing session
>> (sun.security.pkcs11.P11Cipher.cancelOperation(P11Cipher.java:428))
>> active: 1"
>> All following commands failed with error : CKR_USER_NOT_LOGGED_IN
>>
>> After a quick investigation, it looks like the fix JDK-8228565 done
>> in P11Cipher.java is the root cause of this new behavior.
>> ....
>> // Special handling to match SunJCE provider behavior
>> if (bytesBuffered == 0 && padBufferLen == 0) {
>> return 0;
>> }
>> ....
>> } finally {
>> reset(doCancel); // doCancel is true, so
>> killSession is called.
>> }
>>
>> This is a source code to reproduce the problem:
>> SunPKCS11 p = new SunPKCS11(configName); // config to
>> Network HSM
>> p.setCallbackHandler(handler); // Handler for password
>> Security.addProvider(p);
>> KeyStore.CallbackHandlerProtection chp =
>> new KeyStore.CallbackHandlerProtection(handler);
>> KeyStore.Builder builder =
>> KeyStore.Builder.newInstance("PKCS11", p, chp);
>> KeyStore keystore = builder.getKeyStore();
>> SecretKeyEntry entry = (SecretKeyEntry)
>> keystore.getEntry("MyKeyAlias", null);
>> Cipher cipher =
>> Cipher.getInstance("DESede/CBC/NOPADDING", p.getName());
>> IvParameterSpec ivParameterSpec = new
>> IvParameterSpec(new byte[8]);
>> // cipher a text
>> cipher.init(Cipher.ENCRYPT_MODE, entry.getSecretKey(),
>> ivParameterSpec);
>> byte[] clearData = "clear text111111".getBytes();
>> byte[] cipheredData = cipher.doFinal(clearData);
>> // Decipher the result
>> cipher.init(Cipher.DECRYPT_MODE, entry.getSecretKey(),
>> ivParameterSpec);
>> byte[] clearTextResult = cipher.doFinal(cipheredData);
>> // display the result
>> System.out.println(new String(clearTextResult)); // So far, no
>> problem
>> // Try another cipher
>> cipher.init(Cipher.ENCRYPT_MODE, entry.getSecretKey(),
>> ivParameterSpec);
>> byte[] clearData2 = "clear text222222".getBytes();
>> byte[] cipheredData2 = cipher.doFinal(clearData);
>> // --> Failed with sun.security.pkcs11.wrapper.PKCS11Exception:
>> CKR_USER_NOT_LOGGED_IN
>>
>> Caused by: sun.security.pkcs11.wrapper.PKCS11Exception:
>> CKR_USER_NOT_LOGGED_IN
>> at sun.security.pkcs11.wrapper.PKCS11.C_EncryptUpdate(Native Method)
>> at sun.security.pkcs11.P11Cipher.implUpdate(P11Cipher.java:581)
>>
>> Workarounds:
>> . use the SunPkcs11 jar file from openJDK 8_222
>> . add a login after every decrypt commands
>> . use PKCS5Padding when possible
>>
>> Could you tell me if you can reproduce this problem and what is the
>> best way for me to report it ?
>>
>> Thanks you
>> Best Regards,
>> Hubert
More information about the security-dev
mailing list