# HG changeset patch # User valeriep # Date 1293074372 28800 # Node ID ed539cb9eb273ac6f2ea73d0168fce290738b4da # Parent 992bb991857684cf83225682e3accd1f5d4d7168 6924489: sun.security.pkcs11.wrapper.PKCS11Exception: CKR_OPERATION_NOT_INITIALIZED Summary: Reset cipher state to un-initialized wherever necessary. Reviewed-by: weijun diff -r 992bb9918576 -r ed539cb9eb27 jdk/src/share/classes/sun/security/pkcs11/P11Cipher.java --- a/jdk/src/share/classes/sun/security/pkcs11/P11Cipher.java Wed Dec 22 18:30:34 2010 -0800 +++ b/jdk/src/share/classes/sun/security/pkcs11/P11Cipher.java Wed Dec 22 19:19:32 2010 -0800 @@ -395,6 +395,8 @@ } } catch (PKCS11Exception e) { throw new ProviderException("Cancel failed", e); + } finally { + reset(); } } @@ -408,12 +410,18 @@ if (session == null) { session = token.getOpSession(); } - if (encrypt) { - token.p11.C_EncryptInit(session.id(), - new CK_MECHANISM(mechanism, iv), p11Key.keyID); - } else { - token.p11.C_DecryptInit(session.id(), - new CK_MECHANISM(mechanism, iv), p11Key.keyID); + try { + if (encrypt) { + token.p11.C_EncryptInit(session.id(), + new CK_MECHANISM(mechanism, iv), p11Key.keyID); + } else { + token.p11.C_DecryptInit(session.id(), + new CK_MECHANISM(mechanism, iv), p11Key.keyID); + } + } catch (PKCS11Exception ex) { + // release session when initialization failed + session = token.releaseSession(session); + throw ex; } bytesBuffered = 0; padBufferLen = 0; @@ -448,6 +456,16 @@ return result; } + // reset the states to the pre-initialized values + private void reset() { + initialized = false; + bytesBuffered = 0; + padBufferLen = 0; + if (session != null) { + session = token.releaseSession(session); + } + } + // see JCE spec protected byte[] engineUpdate(byte[] in, int inOfs, int inLen) { try { @@ -566,6 +584,7 @@ throw (ShortBufferException) (new ShortBufferException().initCause(e)); } + reset(); throw new ProviderException("update() failed", e); } } @@ -683,6 +702,7 @@ throw (ShortBufferException) (new ShortBufferException().initCause(e)); } + reset(); throw new ProviderException("update() failed", e); } } @@ -729,10 +749,7 @@ handleException(e); throw new ProviderException("doFinal() failed", e); } finally { - initialized = false; - bytesBuffered = 0; - padBufferLen = 0; - session = token.releaseSession(session); + reset(); } } @@ -806,9 +823,7 @@ handleException(e); throw new ProviderException("doFinal() failed", e); } finally { - initialized = false; - bytesBuffered = 0; - session = token.releaseSession(session); + reset(); } }