@@ -16461,6 +16461,67 @@ static CK_RV test_private_object_access(void* args)
1646116461 return ret;
1646216462}
1646316463
16464+ static CK_RV test_private_object_handle_access(void* args)
16465+ {
16466+ CK_SESSION_HANDLE session = *(CK_SESSION_HANDLE*)args;
16467+ CK_RV ret;
16468+ CK_OBJECT_HANDLE obj = CK_INVALID_HANDLE;
16469+ static byte keyData[] = { 0x01, 0x02, 0x03, 0x04 };
16470+ CK_BBOOL isPrivate = CK_TRUE;
16471+ CK_ATTRIBUTE tmpl[] = {
16472+ { CKA_CLASS, &secretKeyClass, sizeof(secretKeyClass) },
16473+ { CKA_KEY_TYPE, &genericKeyType, sizeof(genericKeyType) },
16474+ { CKA_VALUE, keyData, sizeof(keyData) },
16475+ { CKA_PRIVATE, &isPrivate, sizeof(isPrivate) },
16476+ { CKA_TOKEN, &ckTrue, sizeof(ckTrue) },
16477+ };
16478+ CK_ULONG tmplCnt = sizeof(tmpl) / sizeof(*tmpl);
16479+ CK_ULONG valueLen = 0;
16480+ CK_ATTRIBUTE getValueTmpl = { CKA_VALUE_LEN, &valueLen, sizeof(valueLen) };
16481+ byte iv[16];
16482+ CK_MECHANISM mech;
16483+
16484+ memset(iv, 9, sizeof(iv));
16485+ mech.mechanism = CKM_SHA256_HMAC;
16486+ mech.ulParameterLen = 0;
16487+ mech.pParameter = NULL;
16488+
16489+ /* Create a private token object while logged in */
16490+ ret = funcList->C_CreateObject(session, tmpl, tmplCnt, &obj);
16491+ CHECK_CKR(ret, "Create Private Object for handle test");
16492+
16493+ if (ret == CKR_OK) {
16494+ ret = funcList->C_Logout(session);
16495+ CHECK_CKR(ret, "Logout for handle test");
16496+ }
16497+
16498+ /* Try direct handle access via C_GetAttributeValue — should fail */
16499+ if (ret == CKR_OK) {
16500+ ret = funcList->C_GetAttributeValue(session, obj, &getValueTmpl, 1);
16501+ CHECK_CKR_FAIL(ret, CKR_OBJECT_HANDLE_INVALID,
16502+ "GetAttributeValue on private obj when not logged in");
16503+ }
16504+
16505+ /* Try direct handle access via C_SignInit — should fail */
16506+ if (ret == CKR_OK) {
16507+ ret = funcList->C_SignInit(session, &mech, obj);
16508+ CHECK_CKR_FAIL(ret, CKR_OBJECT_HANDLE_INVALID,
16509+ "SignInit on private obj when not logged in");
16510+ }
16511+
16512+ /* Re-login and clean up */
16513+ if (ret == CKR_OK) {
16514+ ret = funcList->C_Login(session, CKU_USER, userPin, userPinLen);
16515+ CHECK_CKR(ret, "Re-login after handle test");
16516+ }
16517+
16518+ if (obj != CK_INVALID_HANDLE) {
16519+ funcList->C_DestroyObject(session, obj);
16520+ }
16521+
16522+ return ret;
16523+ }
16524+
1646416525/* C_GetAttributeValue must process all attributes in the template even when one
1646516526 * returns an error, setting ulValueLen to (CK_ULONG)-1 for invalid types and
1646616527 * returning the accumulated error. */
@@ -16994,6 +17055,7 @@ static TEST_FUNC testFunc[] = {
1699417055 PKCS11TEST_FUNC_SESS_DECL(test_get_attr_value_all_processed),
1699517056 PKCS11TEST_FUNC_SESS_DECL(test_find_objects),
1699617057 PKCS11TEST_FUNC_SESS_DECL(test_private_object_access),
17058+ PKCS11TEST_FUNC_SESS_DECL(test_private_object_handle_access),
1699717059 PKCS11TEST_FUNC_SESS_DECL(test_encrypt_decrypt),
1699817060#ifndef NO_AES
1699917061 PKCS11TEST_FUNC_SESS_DECL(test_encrypt_decrypt_op_not_supported),
0 commit comments