diff --git a/src/pkcs11/pkcs11-session.c b/src/pkcs11/pkcs11-session.c index 00ee05fc..1732353b 100644 --- a/src/pkcs11/pkcs11-session.c +++ b/src/pkcs11/pkcs11-session.c @@ -192,7 +192,56 @@ out: CK_RV C_SessionCancel(CK_SESSION_HANDLE hSession, /* the session's handle */ CK_FLAGS flags) /* flags control which sessions are cancelled */ { - return CKR_FUNCTION_NOT_SUPPORTED; + struct sc_pkcs11_session *session; + CK_RV rv; + + rv = sc_pkcs11_lock(); + if (rv != CKR_OK) + return rv; + + rv = get_session(hSession, &session); + if (rv != CKR_OK) + goto out; + + /* Ignore return value of the cancel operation as it is valid to + * cancel not started operation and it can not fail for other reasons */ + if (flags & CKF_ENCRYPT) { + /* unused */ + } + if (flags & CKF_DECRYPT) { + session_stop_operation(session, SC_PKCS11_OPERATION_DECRYPT); + } + if (flags & CKF_DIGEST) { + session_stop_operation(session, SC_PKCS11_OPERATION_DIGEST); + } + if (flags & CKF_SIGN) { + session_stop_operation(session, SC_PKCS11_OPERATION_SIGN); + } + if (flags & CKF_SIGN_RECOVER) { + /* unused */ + } + if (flags & CKF_VERIFY) { + session_stop_operation(session, SC_PKCS11_OPERATION_VERIFY); + } + if (flags & CKF_VERIFY_RECOVER) { + /* unused */ + } + if (flags & CKF_GENERATE || flags & CKF_GENERATE_KEY_PAIR) { + /* unused */ + } + if (flags & CKF_WRAP) { + session_stop_operation(session, SC_PKCS11_OPERATION_WRAP); + } + if (flags & CKF_UNWRAP) { + session_stop_operation(session, SC_PKCS11_OPERATION_UNWRAP); + } + if (flags & CKF_DERIVE) { + session_stop_operation(session, SC_PKCS11_OPERATION_DERIVE); + } + +out: + sc_pkcs11_unlock(); + return rv; } CK_RV C_GetSessionInfo(CK_SESSION_HANDLE hSession, /* the session's handle */