diff options
Diffstat (limited to 'src/key.c')
-rw-r--r-- | src/key.c | 29 |
1 files changed, 29 insertions, 0 deletions
@@ -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); +} |