Use credential sets to load smartcard keys

This commit is contained in:
Martin Willi
2010-08-04 09:26:21 +02:00
parent 70789d28a1
commit 0556667dca
3 changed files with 151 additions and 53 deletions
@@ -335,29 +335,38 @@ static bool find_key(private_pkcs11_private_key_t *this, chunk_t keyid)
*/
static bool login(private_pkcs11_private_key_t *this, chunk_t keyid, int slot)
{
enumerator_t *enumerator;
identification_t *id;
shared_key_t *shared;
chunk_t pin;
CK_RV rv;
bool found = FALSE, success = FALSE;
id = identification_create_from_encoding(ID_KEY_ID, keyid);
shared = lib->credmgr->get_shared(lib->credmgr, SHARED_PIN, id, NULL);
id->destroy(id);
if (!shared)
{
DBG1(DBG_CFG, "no PIN found for PKCS#11 key %#B", keyid);
return FALSE;
}
pin = shared->get_key(shared);
rv = this->lib->f->C_Login(this->session, CKU_USER, pin.ptr, pin.len);
shared->destroy(shared);
if (rv != CKR_OK)
enumerator = lib->credmgr->create_shared_enumerator(lib->credmgr,
SHARED_PIN, id, NULL);
while (enumerator->enumerate(enumerator, &shared, NULL, NULL))
{
found = TRUE;
pin = shared->get_key(shared);
rv = this->lib->f->C_Login(this->session, CKU_USER, pin.ptr, pin.len);
if (rv == CKR_OK)
{
success = TRUE;
break;
}
DBG1(DBG_CFG, "login to '%s':%d failed: %N",
this->lib->get_name(this->lib), slot, ck_rv_names, rv);
}
enumerator->destroy(enumerator);
id->destroy(id);
if (!found)
{
DBG1(DBG_CFG, "no PIN found for PKCS#11 key %#B", &keyid);
return FALSE;
}
return TRUE;
return success;
}
/**