summaryrefslogtreecommitdiff
path: root/src/session.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/session.c')
-rw-r--r--src/session.c72
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;