reset `login_user` with `reset_login_state`

This commit is contained in:
Frank Morgner 2015-12-02 10:24:50 +01:00
parent b43ea19320
commit 3384113616
4 changed files with 24 additions and 81 deletions

View File

@ -154,14 +154,21 @@ CK_RV restore_login_state(struct sc_pkcs11_slot *slot)
return r;
}
CK_RV reset_login_state(struct sc_pkcs11_slot *slot)
CK_RV reset_login_state(struct sc_pkcs11_slot *slot, CK_RV rv)
{
if (sc_pkcs11_conf.atomic
&& slot && slot->p11card && slot->p11card->framework) {
slot->p11card->framework->logout(slot);
if (slot) {
if (sc_pkcs11_conf.atomic
&& slot->p11card && slot->p11card->framework) {
slot->p11card->framework->logout(slot);
}
if (rv == CKR_USER_NOT_LOGGED_IN) {
slot->login_user = -1;
pop_all_login_states(slot);
}
}
return CKR_OK;
return rv;
}
CK_RV push_login_state(struct sc_pkcs11_slot *slot,

View File

@ -690,13 +690,7 @@ C_Sign(CK_SESSION_HANDLE hSession, /* the session's handle */
rv = restore_login_state(session->slot);
if (rv == CKR_OK)
rv = sc_pkcs11_sign_final(session, pSignature, pulSignatureLen);
if (rv == CKR_OK) {
rv = reset_login_state(session->slot);
} else {
reset_login_state(session->slot);
}
if (rv == CKR_USER_NOT_LOGGED_IN)
session->slot->login_user = -1;
rv = reset_login_state(session->slot, rv);
}
out:
@ -760,13 +754,7 @@ C_SignFinal(CK_SESSION_HANDLE hSession, /* the session's handle */
rv = restore_login_state(session->slot);
if (rv == CKR_OK)
rv = sc_pkcs11_sign_final(session, pSignature, pulSignatureLen);
if (rv == CKR_OK) {
rv = reset_login_state(session->slot);
} else {
reset_login_state(session->slot);
}
if (rv == CKR_USER_NOT_LOGGED_IN)
session->slot->login_user = -1;
rv = reset_login_state(session->slot, rv);
}
out:
@ -905,13 +893,7 @@ CK_RV C_Decrypt(CK_SESSION_HANDLE hSession, /* the session's handle */
rv = sc_pkcs11_decr(session, pEncryptedData,
ulEncryptedDataLen, pData, pulDataLen);
}
if (rv == CKR_OK) {
rv = reset_login_state(session->slot);
} else {
reset_login_state(session->slot);
}
if (rv == CKR_USER_NOT_LOGGED_IN)
session->slot->login_user = -1;
rv = reset_login_state(session->slot, rv);
}
sc_log(context, "C_Decrypt() = %s", lookup_enum ( RV_T, rv ));
@ -1024,13 +1006,7 @@ CK_RV C_GenerateKeyPair(CK_SESSION_HANDLE hSession, /* the session's handle */
pPublicKeyTemplate, ulPublicKeyAttributeCount,
pPrivateKeyTemplate, ulPrivateKeyAttributeCount,
phPublicKey, phPrivateKey);
if (rv == CKR_OK) {
rv = reset_login_state(session->slot);
} else {
reset_login_state(session->slot);
}
if (rv == CKR_USER_NOT_LOGGED_IN)
session->slot->login_user = -1;
rv = reset_login_state(session->slot, rv);
}
out:
@ -1131,13 +1107,7 @@ CK_RV C_DeriveKey(CK_SESSION_HANDLE hSession, /* the session's handle */
rv = sc_pkcs11_deri(session, pMechanism, object, key_type,
hSession, *phKey, key_object);
/* TODO if (rv != CK_OK) need to destroy the object */
if (rv == CKR_OK) {
rv = reset_login_state(session->slot);
} else {
reset_login_state(session->slot);
}
if (rv == CKR_USER_NOT_LOGGED_IN)
session->slot->login_user = -1;
rv = reset_login_state(session->slot, rv);
break;
default:
@ -1258,13 +1228,7 @@ CK_RV C_Verify(CK_SESSION_HANDLE hSession, /* the session's handle */
rv = restore_login_state(session->slot);
if (rv == CKR_OK)
rv = sc_pkcs11_verif_final(session, pSignature, ulSignatureLen);
if (rv == CKR_OK) {
rv = reset_login_state(session->slot);
} else {
reset_login_state(session->slot);
}
if (rv == CKR_USER_NOT_LOGGED_IN)
session->slot->login_user = -1;
rv = reset_login_state(session->slot, rv);
}
out:
@ -1317,13 +1281,7 @@ CK_RV C_VerifyFinal(CK_SESSION_HANDLE hSession, /* the session's handle */
rv = restore_login_state(session->slot);
if (rv == CKR_OK)
rv = sc_pkcs11_verif_final(session, pSignature, ulSignatureLen);
if (rv == CKR_OK) {
rv = reset_login_state(session->slot);
} else {
reset_login_state(session->slot);
}
if (rv == CKR_USER_NOT_LOGGED_IN)
session->slot->login_user = -1;
rv = reset_login_state(session->slot, rv);
}
sc_log(context, "C_VerifyFinal() = %s", lookup_enum ( RV_T, rv ));

View File

@ -278,13 +278,7 @@ CK_RV C_Login(CK_SESSION_HANDLE hSession, /* the session's handle */
rv = restore_login_state(slot);
if (rv == CKR_OK)
rv = slot->p11card->framework->login(slot, userType, pPin, ulPinLen);
if (rv == CKR_OK) {
rv = reset_login_state(slot);
} else {
reset_login_state(slot);
}
if (rv == CKR_USER_NOT_LOGGED_IN)
slot->login_user = -1;
rv = reset_login_state(slot, rv);
}
}
else {
@ -307,12 +301,8 @@ CK_RV C_Login(CK_SESSION_HANDLE hSession, /* the session's handle */
rv = push_login_state(slot, userType, pPin, ulPinLen);
if (rv == CKR_OK) {
slot->login_user = userType;
rv = reset_login_state(slot);
} else {
reset_login_state(slot);
}
if (rv == CKR_USER_NOT_LOGGED_IN)
slot->login_user = -1;
rv = reset_login_state(slot, rv);
}
out:
@ -390,13 +380,7 @@ CK_RV C_InitPIN(CK_SESSION_HANDLE hSession, CK_CHAR_PTR pPin, CK_ULONG ulPinLen)
rv = slot->p11card->framework->init_pin(slot, pPin, ulPinLen);
sc_log(context, "C_InitPIN() init-pin result %li", rv);
}
if (rv == CKR_OK) {
rv = reset_login_state(slot);
} else {
reset_login_state(slot);
}
if (rv == CKR_USER_NOT_LOGGED_IN)
slot->login_user = -1;
rv = reset_login_state(slot, rv);
}
out:
@ -435,13 +419,7 @@ CK_RV C_SetPIN(CK_SESSION_HANDLE hSession,
rv = restore_login_state(slot);
if (rv == CKR_OK)
rv = slot->p11card->framework->change_pin(slot, pOldPin, ulOldLen, pNewPin, ulNewLen);
if (rv == CKR_OK) {
rv = reset_login_state(slot);
} else {
reset_login_state(slot);
}
if (rv == CKR_USER_NOT_LOGGED_IN)
slot->login_user = -1;
rv = reset_login_state(slot, rv);
out:
sc_pkcs11_unlock();

View File

@ -352,7 +352,7 @@ CK_RV slot_find_changed(CK_SLOT_ID_PTR idp, int mask);
/* Login tracking functions */
CK_RV restore_login_state(struct sc_pkcs11_slot *slot);
CK_RV reset_login_state(struct sc_pkcs11_slot *slot);
CK_RV reset_login_state(struct sc_pkcs11_slot *slot, CK_RV rv);
CK_RV push_login_state(struct sc_pkcs11_slot *slot,
CK_USER_TYPE userType, CK_CHAR_PTR pPin, CK_ULONG ulPinLen);
void pop_login_state(struct sc_pkcs11_slot *slot);