Skip to content

Commit 304e707

Browse files
committed
Improve error handling for C_Login
If a login fails for any reason, it would show `CKR_PIN_INCORRECT`, even if the cause was an object decode error after login succeeded. This commit: * Simplifies the error handling * Uses `CKR_DEVICE_MEMORY` for TPM memory errors * Uses `CKR_DEVICE_ERROR` for all other errors * Logs the original return code in the debug log
1 parent b413280 commit 304e707

1 file changed

Lines changed: 33 additions & 38 deletions

File tree

src/slot.c

Lines changed: 33 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1713,8 +1713,8 @@ CK_RV C_SetOperationState(CK_SESSION_HANDLE hSession,
17131713
CK_RV C_Login(CK_SESSION_HANDLE hSession, CK_USER_TYPE userType,
17141714
CK_UTF8CHAR_PTR pPin, CK_ULONG ulPinLen)
17151715
{
1716-
int ret;
1717-
CK_RV rv;
1716+
int ret = 0;
1717+
CK_RV rv = CKR_OK;
17181718
WP11_Slot* slot;
17191719
WP11_Session* session;
17201720

@@ -1751,44 +1751,9 @@ CK_RV C_Login(CK_SESSION_HANDLE hSession, CK_USER_TYPE userType,
17511751
slot = WP11_Session_GetSlot(session);
17521752
if (userType == CKU_SO) {
17531753
ret = WP11_Slot_SOLogin(slot, (char*)pPin, (int)ulPinLen);
1754-
if (ret == LOGGED_IN_E) {
1755-
rv = CKR_USER_ALREADY_LOGGED_IN;
1756-
WOLFPKCS11_LEAVE("C_Login", rv);
1757-
return rv;
1758-
}
1759-
if (ret == READ_ONLY_E) {
1760-
rv = CKR_SESSION_READ_ONLY_EXISTS;
1761-
WOLFPKCS11_LEAVE("C_Login", rv);
1762-
return rv;
1763-
}
1764-
if (ret == PIN_NOT_SET_E) {
1765-
rv = CKR_USER_PIN_NOT_INITIALIZED;
1766-
WOLFPKCS11_LEAVE("C_Login", rv);
1767-
return rv;
1768-
}
1769-
if (ret != 0) {
1770-
rv = CKR_PIN_INCORRECT;
1771-
WOLFPKCS11_LEAVE("C_Login", rv);
1772-
return rv;
1773-
}
17741754
}
17751755
else if (userType == CKU_USER) {
17761756
ret = WP11_Slot_UserLogin(slot, (char*)pPin, (int)ulPinLen);
1777-
if (ret == LOGGED_IN_E) {
1778-
rv = CKR_USER_ALREADY_LOGGED_IN;
1779-
WOLFPKCS11_LEAVE("C_Login", rv);
1780-
return rv;
1781-
}
1782-
if (ret == PIN_NOT_SET_E) {
1783-
rv = CKR_USER_PIN_NOT_INITIALIZED;
1784-
WOLFPKCS11_LEAVE("C_Login", rv);
1785-
return rv;
1786-
}
1787-
if (ret != 0) {
1788-
rv = CKR_PIN_INCORRECT;
1789-
WOLFPKCS11_LEAVE("C_Login", rv);
1790-
return rv;
1791-
}
17921757
}
17931758
else if (userType == CKU_CONTEXT_SPECIFIC) {
17941759
rv = CKR_OPERATION_NOT_INITIALIZED;
@@ -1801,7 +1766,37 @@ CK_RV C_Login(CK_SESSION_HANDLE hSession, CK_USER_TYPE userType,
18011766
return rv;
18021767
}
18031768

1804-
rv = CKR_OK;
1769+
switch (ret) {
1770+
case LOGGED_IN_E:
1771+
rv = CKR_USER_ALREADY_LOGGED_IN;
1772+
break;
1773+
case PIN_NOT_SET_E:
1774+
rv = CKR_USER_PIN_NOT_INITIALIZED;
1775+
break;
1776+
case PIN_INVALID_E:
1777+
rv = CKR_PIN_INCORRECT;
1778+
break;
1779+
case READ_ONLY_E:
1780+
/* Only possible for SO login */
1781+
rv = CKR_SESSION_READ_ONLY_EXISTS;
1782+
break;
1783+
case 0:
1784+
rv = CKR_OK;
1785+
break;
1786+
#ifdef WOLFPKCS11_TPM
1787+
case TPM_RC_MEMORY:
1788+
case TPM_RC_SESSION_MEMORY:
1789+
case TPM_RC_OBJECT_MEMORY:
1790+
rv = CKR_DEVICE_MEMORY;
1791+
break;
1792+
#endif
1793+
default:
1794+
rv = CKR_DEVICE_ERROR;
1795+
break;
1796+
}
1797+
1798+
WOLFPKCS11_MSG("Login function ret: %d", ret);
1799+
18051800
WOLFPKCS11_LEAVE("C_Login", rv);
18061801
return rv;
18071802
}

0 commit comments

Comments
 (0)