Проблема с авторизацией. PKCS11. Многопоточность

Здравствуйте. Пытаюсь реализовать ЭЦП с использованием многопоточности в приложении. Изучил документацию PKCS11 и нашёл там, что для безопасного использования многопоточности необходимо определить аргументы для функции C_Initialize, что я и сделал:

        CK_C_INITIALIZE_ARGS initArgs =
        {
            CK_CREATEMUTEX(), /* CreateMutex */
            CK_DESTROYMUTEX(), /* DestroyMutex */
            CK_LOCKMUTEX(), /* LockMutex */
            CK_UNLOCKMUTEX(), /* UnlockMutex */
            CKF_OS_LOCKING_OK, /* flags */
            NULL_PTR, /* pReserved */
        };

        if (m_functionList->C_Initialize(&initArgs) != CKR_OK)
        {
            log_err(INIT_PKCS11_FAILED);
            return FALSE;
        }

Далее пытаюсь вызвать функцию ЭЦП по вашему примеру из SDK. В первом потоке авторизация проходит успешно, далее в каждом потоке при попытке залогиниться вылезает ошибка CKR_USER_ALREADY_LOGGED_IN. Стал её игнорировать в приложении, теперь только с использованием сессии, в которой залогинился формируется ЭЦП, во всех остальных потоках при попытке вызвать функцию

m_functionListEx->C_EX_PKCS7Sign(session, pbData, cbData, certificates[0], &signature, &signatureSize, privateKeys[0], NULL_PTR, 0, 0)

вылетает ошибка CKR_USER_NOT_LOGGED_IN.

Получается, при попытке залогиниться библиотека выдаёт мне ошибку, что я уже залогинился, а при вызове функции подписи говорит, что авторизации не было... Что я делаю не так?

Re: Проблема с авторизацией. PKCS11. Многопоточность

Binger, согласно стандарту PKCS#11 у всех сессий одинаковое состояние с точки зрения аутентифицированности:

пункт 6.7.4

In Cryptoki, all sessions that an application has with a token must have the same login/logout status (i.e., for a given application and token, one of the following holds: all sessions are public sessions; all sessions are SO sessions; or all sessions are user sessions). When an application’s session logs into a token, all of that application’s sessions with that token become logged in, and when an application’s session logs out of a token, all of that application’s sessions with that token become logged out. Similarly, for example, if an application already has a R/O user session open with a token, and then opens a R/W session with that token, the R/W session is automatically logged in.

Скорее всего у вас в одной из сессий вызывается C_Logout, что раслогинивает все другие сессии.

Re: Проблема с авторизацией. PKCS11. Многопоточность

Павел Анфимов, Спасибо. Именно в этом и было дело