diff options
Diffstat (limited to 'src/session.c')
-rw-r--r-- | src/session.c | 72 |
1 files changed, 40 insertions, 32 deletions
diff --git a/src/session.c b/src/session.c index 1ed0104..20524b9 100644 --- a/src/session.c +++ b/src/session.c @@ -5,7 +5,7 @@ static const char *login_user_pin = NULL; static const char *login_so_pin = NULL; - +static const char *login_context_pin = NULL; void p11t_session_config(const char *name, const char *value) @@ -14,6 +14,8 @@ p11t_session_config(const char *name, const char *value) login_user_pin = value; if(strcmp(name, "login-so-pin") == 0) login_so_pin = value; + if(strcmp(name, "login-context-pin") == 0) + login_context_pin = value; } /* ---------------------------------------------------------------------------------- @@ -52,31 +54,6 @@ test_session_info(CK_SESSION_HANDLE session, CK_SLOT_ID slot, CK_FLAGS flags, CK return CONTINUE; } -static CK_UTF8CHAR_PTR -calculate_pin(CK_SLOT_ID slot, CK_USER_TYPE user, CK_ULONG_PTR n_pin) -{ - CK_TOKEN_INFO_PTR info; - const char *pin; - - *n_pin = 0; - - info = p11t_slot_get_token_info(slot); - if(info && info->flags & CKF_PROTECTED_AUTHENTICATION_PATH) - return NULL; - - if(user == CKU_USER) - pin = login_user_pin; - else if(user == CKU_SO) - pin = login_so_pin; - else - pin = NULL; - - if(pin) - *n_pin = (CK_ULONG)strlen(pin); - - return (CK_UTF8CHAR_PTR)pin; -} - static int test_session_user_login(CK_SLOT_ID slot) { @@ -86,7 +63,7 @@ test_session_user_login(CK_SLOT_ID slot) CK_ULONG n_pin; CK_RV rv; - pin = calculate_pin(slot, CKU_USER, &n_pin); + pin = p11t_session_get_pin (slot, CKU_USER, &n_pin); rv = (p11t_module_funcs->C_OpenSession)(slot, CKF_SERIAL_SESSION, NULL, NULL, &session_ro); P11T_CHECK_RV("C_Login: open RO session", rv, CKR_OK); @@ -144,7 +121,7 @@ test_session_so_login(CK_SLOT_ID slot) CK_ULONG n_pin; CK_RV rv; - pin = calculate_pin(slot, CKU_SO, &n_pin); + pin = p11t_session_get_pin (slot, CKU_SO, &n_pin); rv = (p11t_module_funcs->C_OpenSession)(slot, CKF_SERIAL_SESSION | CKF_RW_SESSION, NULL, NULL, &session_rw); P11T_CHECK_RV("C_OpenSession: open RW session", rv, CKR_OK); @@ -210,8 +187,11 @@ test_session_main(CK_SLOT_ID slot) if(p11t_test_unexpected) { - rv = (p11t_module_funcs->C_OpenSession)((CK_SLOT_ID)-5, CKF_SERIAL_SESSION, NULL, NULL, &session_ro); - P11T_CHECK_RV("Invalid slot", rv, CKR_SLOT_ID_INVALID); + if (!p11t_slot_virtual) + { + rv = (p11t_module_funcs->C_OpenSession)((CK_SLOT_ID)-5, CKF_SERIAL_SESSION, NULL, NULL, &session_ro); + P11T_CHECK_RV("Invalid slot", rv, CKR_SLOT_ID_INVALID); + } rv = (p11t_module_funcs->C_OpenSession)(slot, CKF_SERIAL_SESSION, NULL, NULL, NULL); P11T_CHECK_RV("Null arguments", rv, CKR_ARGUMENTS_BAD); @@ -276,7 +256,7 @@ test_session_main(CK_SLOT_ID slot) P11T_SECTION("C_CloseAllSessions"); - if(p11t_test_unexpected) + if(p11t_test_unexpected && !p11t_slot_virtual) { rv = (p11t_module_funcs->C_CloseAllSessions)((CK_SLOT_ID)-34); P11T_CHECK_RV("Invalid slot id", rv, CKR_SLOT_ID_INVALID); @@ -359,6 +339,34 @@ p11t_session_open(CK_SLOT_ID slot, int readwrite) return session; } +CK_UTF8CHAR_PTR +p11t_session_get_pin(CK_SLOT_ID slot, CK_USER_TYPE user, CK_ULONG_PTR n_pin) +{ + CK_TOKEN_INFO_PTR info; + const char *pin; + + *n_pin = 0; + + info = p11t_slot_get_token_info(slot); + if(info && info->flags & CKF_PROTECTED_AUTHENTICATION_PATH) + return NULL; + + if(user == CKU_USER) + pin = login_user_pin; + else if(user == CKU_SO) + pin = login_so_pin; + else if(user == CKU_CONTEXT_SPECIFIC) + pin = login_context_pin; + else + pin = NULL; + + if(pin) + *n_pin = (CK_ULONG)strlen(pin); + + return (CK_UTF8CHAR_PTR)pin; +} + + int p11t_session_login(CK_SESSION_HANDLE session) { @@ -380,7 +388,7 @@ p11t_session_login(CK_SESSION_HANDLE session) return 1; } - pin = calculate_pin(info.slotID, CKU_USER, &n_pin); + pin = p11t_session_get_pin(info.slotID, CKU_USER, &n_pin); if((p11t_module_funcs->C_Login)(session, CKU_USER, pin, n_pin) != CKR_OK) return 0; |