summaryrefslogtreecommitdiff
path: root/src/key.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/key.c')
-rw-r--r--src/key.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/key.c b/src/key.c
index 0d2826e..0fa4c4b 100644
--- a/src/key.c
+++ b/src/key.c
@@ -575,3 +575,32 @@ p11t_key_export_public_rsa(CK_SESSION_HANDLE session, CK_OBJECT_HANDLE key)
return rsa;
}
+CK_RV
+p11t_key_login_context_specific (CK_SESSION_HANDLE session, CK_OBJECT_HANDLE key)
+{
+ CK_SESSION_INFO info;
+ CK_ATTRIBUTE attr;
+ CK_BBOOL always;
+ CK_UTF8CHAR_PTR pin;
+ CK_ULONG n_pin;
+ CK_RV rv;
+
+ assert(session != CK_INVALID);
+ assert(p11t_module_funcs);
+
+ attr.type = CKA_ALWAYS_AUTHENTICATE;
+ attr.ulValueLen = sizeof (always);
+ attr.pValue = &always;
+
+ if (!p11t_object_get (session, key, &attr, 1) || !always) {
+ p11t_check_fail ("Key wants context specific login, but CKA_ALWAYS_AUTHENTICATE not set");
+ return CKR_ATTRIBUTE_VALUE_INVALID;
+ }
+
+ rv = (p11t_module_funcs->C_GetSessionInfo)(session, &info);
+ if (rv != CKR_OK)
+ return rv;
+
+ pin = p11t_session_get_pin (info.slotID, CKU_CONTEXT_SPECIFIC, &n_pin);
+ return (p11t_module_funcs->C_Login)(session, CKU_CONTEXT_SPECIFIC, pin, n_pin);
+}