if (ret == 1) \
memset(&k->sinfo, 0, sizeof(k->sinfo))
+#define CHECK_SHANDLE(rv, key, sinfo) \
+ if (rv == CKR_SESSION_HANDLE_INVALID && sinfo == &key->sinfo) { \
+ if (key->sinfo.init != 0) { \
+ pkcs11_close_session(&key->sinfo); \
+ memset(&key->sinfo, 0, sizeof(key->sinfo)); \
+ } \
+ }
+
struct gnutls_pkcs11_privkey_st {
gnutls_pk_algorithm_t pk_algorithm;
unsigned int flags;
rv = pkcs11_sign_init(sinfo->module, sinfo->pks, &mech, obj);
if (rv != CKR_OK) {
gnutls_assert();
+ CHECK_SHANDLE(rv, key, sinfo);
ret = pkcs11_rv_to_err(rv);
goto cleanup;
}
NULL, &siglen);
if (rv != CKR_OK) {
gnutls_assert();
+ CHECK_SHANDLE(rv, key, sinfo);
ret = pkcs11_rv_to_err(rv);
goto cleanup;
}
tmp.data, &siglen);
if (rv != CKR_OK) {
gnutls_assert();
+ CHECK_SHANDLE(rv, key, sinfo);
ret = pkcs11_rv_to_err(rv);
goto cleanup;
}
rv = (sinfo->module)->C_GetSessionInfo(sinfo->pks, &session_info);
if (rv != CKR_OK) {
+ CHECK_SHANDLE(rv, key, sinfo);
ret = 0;
goto cleanup;
}
rv = pkcs11_decrypt_init(sinfo->module, sinfo->pks, &mech, obj);
if (rv != CKR_OK) {
gnutls_assert();
+ CHECK_SHANDLE(rv, key, sinfo);
ret = pkcs11_rv_to_err(rv);
goto cleanup;
}
ciphertext->size, NULL, &siglen);
if (rv != CKR_OK) {
gnutls_assert();
+ CHECK_SHANDLE(rv, key, sinfo);
ret = pkcs11_rv_to_err(rv);
goto cleanup;
}
if (rv != CKR_OK) {
gnutls_free(plaintext->data);
gnutls_assert();
+ CHECK_SHANDLE(rv, key, sinfo);
ret = pkcs11_rv_to_err(rv);
goto cleanup;
}