CK_RV pkcs11h_token_login ( IN const pkcs11h_token_id_t token_id, IN const PKCS11H_BOOL readonly, IN const char * const pin ) { #if defined(ENABLE_PKCS11H_THREADING) PKCS11H_BOOL mutex_locked = FALSE; #endif CK_SLOT_ID slot = _PKCS11H_INVALID_SLOT_ID; CK_ULONG pin_size = 0; CK_RV rv = CKR_FUNCTION_FAILED; _pkcs11h_session_t session = NULL; _PKCS11H_ASSERT (token_id!=NULL); /*_PKCS11H_ASSERT (pin!=NULL); NOT NEEDED*/ _PKCS11H_DEBUG ( PKCS11H_LOG_DEBUG2, "PKCS#11: pkcs11h_token_login entry token_id=%p, readonly=%d\n", (void *)token_id, readonly ? 1 : 0 ); if (pin != NULL) { pin_size = strlen (pin); } if ( (rv = _pkcs11h_session_getSessionByTokenId ( token_id, &session )) != CKR_OK ) { goto cleanup; } #if defined(ENABLE_PKCS11H_THREADING) if ((rv = _pkcs11h_threading_mutexLock (&session->mutex)) != CKR_OK) { goto cleanup; } mutex_locked = TRUE; #endif if ( (rv = _pkcs11h_session_logout (session)) != CKR_OK || (rv = _pkcs11h_session_reset (session, NULL, 0, &slot)) != CKR_OK || (rv = __pkcs11h_session_touch (session)) != CKR_OK || (rv = session->provider->f->C_OpenSession ( slot, ( CKF_SERIAL_SESSION | (readonly ? 0 : CKF_RW_SESSION) ), NULL_PTR, NULL_PTR, &session->session_handle )) != CKR_OK ) { goto cleanup; } if ( (rv = session->provider->f->C_Login ( session->session_handle, CKU_USER, (CK_UTF8CHAR_PTR)pin, pin_size )) != CKR_OK ) { if (rv != CKR_USER_ALREADY_LOGGED_IN) { goto cleanup; } } rv = CKR_OK; cleanup: #if defined(ENABLE_PKCS11H_THREADING) if (mutex_locked) { _pkcs11h_threading_mutexRelease (&session->mutex); mutex_locked = FALSE; } #endif if (session != NULL) { _pkcs11h_session_release (session); session = NULL; } _PKCS11H_DEBUG ( PKCS11H_LOG_DEBUG2, "PKCS#11: pkcs11h_token_login return rv=%lu-'%s'", rv, pkcs11h_getMessage (rv) ); return rv; }
CK_RV pkcs11h_logout (void) { _pkcs11h_session_t current_session = NULL; CK_RV rv = CKR_OK; _PKCS11H_DEBUG ( PKCS11H_LOG_DEBUG2, "PKCS#11: pkcs11h_logout entry" ); if (_g_pkcs11h_data == NULL || !_g_pkcs11h_data->initialized) { goto cleanup; } for ( current_session = _g_pkcs11h_data->sessions; current_session != NULL; current_session = current_session->next ) { CK_RV _rv; #if defined(ENABLE_PKCS11H_THREADING) if ((_rv = _pkcs11h_threading_mutexLock (¤t_session->mutex)) == CKR_OK) { #else { #endif _rv = _pkcs11h_session_logout (current_session); #if defined(ENABLE_PKCS11H_THREADING) _pkcs11h_threading_mutexRelease (¤t_session->mutex); #endif } if (_rv != CKR_OK) { rv = _rv; } } cleanup: _PKCS11H_DEBUG ( PKCS11H_LOG_DEBUG2, "PKCS#11: pkcs11h_logout return rv=%lu-'%s'", rv, pkcs11h_getMessage (rv) ); return rv; } /*======================================================================* * COMMON INTERNAL INTERFACE *======================================================================*/ void _pkcs11h_log ( IN const unsigned flags, IN const char * const format, IN ... ) { va_list args; _PKCS11H_ASSERT (format!=NULL); va_start (args, format); if ( _g_pkcs11h_data != NULL && _g_pkcs11h_data->initialized ) { if (__PKCS11H_MSG_LEVEL_TEST (flags)) { if (_g_pkcs11h_data->hooks.log == NULL) { __pkcs11h_hooks_default_log ( NULL, flags, format, args ); } else { _g_pkcs11h_data->hooks.log ( _g_pkcs11h_data->hooks.log_data, flags, format, args ); } } } va_end (args); }
CK_RV pkcs11h_token_logout ( IN const pkcs11h_token_id_t token_id ) { #if defined(ENABLE_PKCS11H_THREADING) PKCS11H_BOOL mutex_locked = FALSE; #endif CK_RV rv = CKR_FUNCTION_FAILED; _pkcs11h_session_t session = NULL; _PKCS11H_ASSERT (token_id!=NULL); _PKCS11H_DEBUG ( PKCS11H_LOG_DEBUG2, "PKCS#11: pkcs11h_token_logout entry token_id=%p\n", (void *)token_id ); if ( (rv = _pkcs11h_session_getSessionByTokenId ( token_id, &session )) != CKR_OK ) { goto cleanup; } #if defined(ENABLE_PKCS11H_THREADING) if ((rv = _pkcs11h_threading_mutexLock (&session->mutex)) != CKR_OK) { goto cleanup; } mutex_locked = TRUE; #endif if ( (rv = _pkcs11h_session_logout (session)) != CKR_OK ) { goto cleanup; } rv = CKR_OK; cleanup: #if defined(ENABLE_PKCS11H_THREADING) if (mutex_locked) { _pkcs11h_threading_mutexRelease (&session->mutex); mutex_locked = FALSE; } #endif if (session != NULL) { _pkcs11h_session_release (session); session = NULL; } _PKCS11H_DEBUG ( PKCS11H_LOG_DEBUG2, "PKCS#11: pkcs11h_token_logout return rv=%lu-'%s'", rv, pkcs11h_getMessage (rv) ); return rv; }