keep one session around for the whole life of the keyset
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@18024 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -41,8 +41,10 @@ RCSID("$Id$");
|
|||||||
struct p11_slot {
|
struct p11_slot {
|
||||||
int flags;
|
int flags;
|
||||||
#define P11_SESSION 1
|
#define P11_SESSION 1
|
||||||
#define P11_LOGIN_REQ 2
|
#define P11_SESSION_IN_USE 2
|
||||||
#define P11_LOGIN_DONE 4
|
#define P11_LOGIN_REQ 4
|
||||||
|
#define P11_LOGIN_DONE 8
|
||||||
|
CK_SESSION_HANDLE session;
|
||||||
CK_SLOT_ID id;
|
CK_SLOT_ID id;
|
||||||
CK_BBOOL token;
|
CK_BBOOL token;
|
||||||
char *name;
|
char *name;
|
||||||
@@ -367,17 +369,22 @@ p11_get_session(hx509_context context,
|
|||||||
hx509_lock lock,
|
hx509_lock lock,
|
||||||
CK_SESSION_HANDLE *psession)
|
CK_SESSION_HANDLE *psession)
|
||||||
{
|
{
|
||||||
CK_SESSION_HANDLE session;
|
|
||||||
CK_RV ret;
|
CK_RV ret;
|
||||||
|
|
||||||
if (slot->flags & P11_SESSION)
|
if (slot->flags & P11_SESSION_IN_USE)
|
||||||
_hx509_abort("slot already in session");
|
_hx509_abort("slot already in session");
|
||||||
|
|
||||||
|
if (slot->flags & P11_SESSION) {
|
||||||
|
slot->flags |= P11_SESSION_IN_USE;
|
||||||
|
*psession = slot->session;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
ret = P11FUNC(p, OpenSession, (slot->id,
|
ret = P11FUNC(p, OpenSession, (slot->id,
|
||||||
CKF_SERIAL_SESSION,
|
CKF_SERIAL_SESSION,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
&session));
|
&slot->session));
|
||||||
if (ret != CKR_OK) {
|
if (ret != CKR_OK) {
|
||||||
if (context)
|
if (context)
|
||||||
hx509_set_error_string(context, 0, EINVAL,
|
hx509_set_error_string(context, 0, EINVAL,
|
||||||
@@ -436,7 +443,7 @@ p11_get_session(hx509_context context,
|
|||||||
strlcpy(pin, slot->pin, sizeof(pin));
|
strlcpy(pin, slot->pin, sizeof(pin));
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = P11FUNC(p, Login, (session, CKU_USER,
|
ret = P11FUNC(p, Login, (slot->session, CKU_USER,
|
||||||
(unsigned char*)pin, strlen(pin)));
|
(unsigned char*)pin, strlen(pin)));
|
||||||
if (ret != CKR_OK) {
|
if (ret != CKR_OK) {
|
||||||
if (context)
|
if (context)
|
||||||
@@ -444,7 +451,7 @@ p11_get_session(hx509_context context,
|
|||||||
"Failed to login on slot id %d "
|
"Failed to login on slot id %d "
|
||||||
"with error: 0x%08x",
|
"with error: 0x%08x",
|
||||||
(int)slot->id, ret);
|
(int)slot->id, ret);
|
||||||
p11_put_session(p, slot, session);
|
p11_put_session(p, slot, slot->session);
|
||||||
return EINVAL;
|
return EINVAL;
|
||||||
}
|
}
|
||||||
if (slot->pin == NULL) {
|
if (slot->pin == NULL) {
|
||||||
@@ -453,14 +460,16 @@ p11_get_session(hx509_context context,
|
|||||||
if (context)
|
if (context)
|
||||||
hx509_set_error_string(context, 0, ENOMEM,
|
hx509_set_error_string(context, 0, ENOMEM,
|
||||||
"out of memory");
|
"out of memory");
|
||||||
p11_put_session(p, slot, session);
|
p11_put_session(p, slot, slot->session);
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
slot->flags |= P11_LOGIN_DONE;
|
slot->flags |= P11_LOGIN_DONE;
|
||||||
|
|
||||||
*psession = session;
|
slot->flags |= P11_SESSION_IN_USE;
|
||||||
|
|
||||||
|
*psession = slot->session;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -470,15 +479,9 @@ p11_put_session(struct p11_module *p,
|
|||||||
struct p11_slot *slot,
|
struct p11_slot *slot,
|
||||||
CK_SESSION_HANDLE session)
|
CK_SESSION_HANDLE session)
|
||||||
{
|
{
|
||||||
int ret;
|
if ((slot->flags & P11_SESSION_IN_USE) == 0)
|
||||||
|
|
||||||
if ((slot->flags & P11_SESSION) == 0)
|
|
||||||
_hx509_abort("slot not in session");
|
_hx509_abort("slot not in session");
|
||||||
slot->flags &= ~P11_SESSION;
|
slot->flags &= ~P11_SESSION_IN_USE;
|
||||||
|
|
||||||
ret = P11FUNC(p, CloseSession, (session));
|
|
||||||
if (ret != CKR_OK)
|
|
||||||
return EINVAL;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -926,6 +929,16 @@ p11_release_module(struct p11_module *p)
|
|||||||
dlclose(p->dl_handle);
|
dlclose(p->dl_handle);
|
||||||
|
|
||||||
for (i = 0; i < p->num_slots; i++) {
|
for (i = 0; i < p->num_slots; i++) {
|
||||||
|
if (p->slot->flags & P11_SESSION_IN_USE)
|
||||||
|
_hx509_abort("pkcs11 module release while session in use");
|
||||||
|
if (p->slot->flags & P11_SESSION) {
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = P11FUNC(p, CloseSession, (p->slot->session));
|
||||||
|
if (ret != CKR_OK)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
if (p->slot[i].certs)
|
if (p->slot[i].certs)
|
||||||
hx509_certs_free(&p->slot[i].certs);
|
hx509_certs_free(&p->slot[i].certs);
|
||||||
if (p->slot[i].name)
|
if (p->slot[i].name)
|
||||||
|
Reference in New Issue
Block a user