|
Packit |
8681c6 |
/*
|
|
Packit |
8681c6 |
* COPYRIGHT (c) International Business Machines Corp. 2013-2017
|
|
Packit |
8681c6 |
*
|
|
Packit |
8681c6 |
* This program is provided under the terms of the Common Public License,
|
|
Packit |
8681c6 |
* version 1.0 (CPL-1.0). Any use, reproduction or distribution for this
|
|
Packit |
8681c6 |
* software constitutes recipient's acceptance of CPL-1.0 terms which can be
|
|
Packit |
8681c6 |
* found in the file LICENSE file or at
|
|
Packit |
8681c6 |
* https://opensource.org/licenses/cpl1.0.php
|
|
Packit |
8681c6 |
*/
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
#include <stdio.h>
|
|
Packit |
8681c6 |
#include <stdlib.h>
|
|
Packit |
8681c6 |
#include <unistd.h>
|
|
Packit |
8681c6 |
#include <string.h>
|
|
Packit |
8681c6 |
#include <memory.h>
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
#include "pkcs11types.h"
|
|
Packit |
8681c6 |
#include "regress.h"
|
|
Packit |
8681c6 |
#include "common.c"
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
/* API Routines exercised:
|
|
Packit |
8681c6 |
* C_DestroyObject
|
|
Packit |
8681c6 |
*
|
|
Packit |
8681c6 |
* TestCases
|
|
Packit |
8681c6 |
* Setup: Create several key objects and generate several key objects.
|
|
Packit |
8681c6 |
* Testcase 1: Destroy only a few objects. Verify they were deleted.
|
|
Packit |
8681c6 |
* Testcase 2: Verify the other objects were not deleted.
|
|
Packit |
8681c6 |
* Testcase 3: Destroy all objects and verify all were removed.
|
|
Packit |
8681c6 |
*/
|
|
Packit |
8681c6 |
CK_RV do_DestroyObjects(void)
|
|
Packit |
8681c6 |
{
|
|
Packit |
8681c6 |
CK_FLAGS flags;
|
|
Packit |
8681c6 |
CK_SESSION_HANDLE session;
|
|
Packit |
8681c6 |
CK_RV rc = 0;
|
|
Packit |
8681c6 |
CK_BYTE user_pin[PKCS11_MAX_PIN_LEN];
|
|
Packit |
8681c6 |
CK_ULONG user_pin_len;
|
|
Packit |
8681c6 |
CK_OBJECT_HANDLE keyobj[8];
|
|
Packit |
8681c6 |
CK_OBJECT_HANDLE obj_list[10];
|
|
Packit |
8681c6 |
CK_ULONG i, num_objs = 0, find_count, found = 0;
|
|
Packit |
8681c6 |
CK_MECHANISM mech;
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
CK_BBOOL true = TRUE;
|
|
Packit |
8681c6 |
CK_KEY_TYPE aes_type = CKK_AES;
|
|
Packit |
8681c6 |
CK_OBJECT_CLASS key_class = CKO_SECRET_KEY;
|
|
Packit |
8681c6 |
CK_CHAR aes_value[] = "This is a fake aes key.";
|
|
Packit |
8681c6 |
CK_CHAR test_id[5] = "abcde";
|
|
Packit |
8681c6 |
CK_ULONG aesgen_keylen = 32;
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
CK_ATTRIBUTE aes_tmpl[] = {
|
|
Packit |
8681c6 |
{CKA_CLASS, &key_class, sizeof(key_class)},
|
|
Packit |
8681c6 |
{CKA_KEY_TYPE, &aes_type, sizeof(aes_type)},
|
|
Packit |
8681c6 |
{CKA_ID, &test_id, sizeof(test_id)},
|
|
Packit |
8681c6 |
{CKA_VALUE, &aes_value, sizeof(aes_value)}
|
|
Packit |
8681c6 |
};
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
CK_ATTRIBUTE aesgen_tmpl[] = {
|
|
Packit |
8681c6 |
{CKA_CLASS, &key_class, sizeof(key_class)},
|
|
Packit |
8681c6 |
{CKA_KEY_TYPE, &aes_type, sizeof(aes_type)},
|
|
Packit |
8681c6 |
{CKA_ID, &test_id, sizeof(test_id)},
|
|
Packit |
8681c6 |
{CKA_VALUE_LEN, &aesgen_keylen, sizeof(aesgen_keylen)},
|
|
Packit |
8681c6 |
{CKA_TOKEN, &true, sizeof(true)}
|
|
Packit |
8681c6 |
};
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
CK_ATTRIBUTE find_tmpl[] = {
|
|
Packit |
8681c6 |
{CKA_KEY_TYPE, &aes_type, sizeof(aes_type)},
|
|
Packit |
8681c6 |
{CKA_ID, &test_id, sizeof(test_id)}
|
|
Packit |
8681c6 |
};
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
testcase_begin("starting...");
|
|
Packit |
8681c6 |
testcase_rw_session();
|
|
Packit |
8681c6 |
testcase_user_login();
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
/* Create a few session key objects */
|
|
Packit |
8681c6 |
for (i = 0; i < 4; i++) {
|
|
Packit |
8681c6 |
rc = funcs->C_CreateObject(session, aes_tmpl, 4, &keyobj[num_objs]);
|
|
Packit |
8681c6 |
if (rc != CKR_OK) {
|
|
Packit |
8681c6 |
testcase_error("C_CreateObject() rc = %s", p11_get_ckr(rc));
|
|
Packit |
8681c6 |
goto testcase_cleanup;
|
|
Packit |
8681c6 |
}
|
|
Packit |
8681c6 |
num_objs++;
|
|
Packit |
8681c6 |
}
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
/* Generate a few token key objects */
|
|
Packit |
8681c6 |
mech.mechanism = CKM_AES_KEY_GEN;
|
|
Packit |
8681c6 |
mech.ulParameterLen = 0;
|
|
Packit |
8681c6 |
mech.pParameter = NULL;
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
for (i = 4; i < 8; i++) {
|
|
Packit |
8681c6 |
rc = funcs->C_GenerateKey(session, &mech, aesgen_tmpl, 5,
|
|
Packit |
8681c6 |
&keyobj[num_objs]);
|
|
Packit |
8681c6 |
if (rc != CKR_OK) {
|
|
Packit |
8681c6 |
testcase_error("C_GenerateObject() rc = %s", p11_get_ckr(rc));
|
|
Packit |
8681c6 |
goto testcase_cleanup;
|
|
Packit |
8681c6 |
}
|
|
Packit |
8681c6 |
num_objs++;
|
|
Packit |
8681c6 |
}
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
/* Now delete 2 session key objects */
|
|
Packit |
8681c6 |
rc = funcs->C_DestroyObject(session, keyobj[7]);
|
|
Packit |
8681c6 |
if (rc != CKR_OK) {
|
|
Packit |
8681c6 |
testcase_fail("C_FindObjects() rc = %s", p11_get_ckr(rc));
|
|
Packit |
8681c6 |
goto testcase_cleanup;
|
|
Packit |
8681c6 |
}
|
|
Packit |
8681c6 |
num_objs--;
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
rc = funcs->C_DestroyObject(session, keyobj[6]);
|
|
Packit |
8681c6 |
if (rc != CKR_OK) {
|
|
Packit |
8681c6 |
testcase_fail("C_FindObjects() rc = %s", p11_get_ckr(rc));
|
|
Packit |
8681c6 |
goto testcase_cleanup;
|
|
Packit |
8681c6 |
}
|
|
Packit |
8681c6 |
num_objs--;
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
/* Now see if only 2 session key objects were destroyed */
|
|
Packit |
8681c6 |
rc = funcs->C_FindObjectsInit(session, find_tmpl, 2);
|
|
Packit |
8681c6 |
if (rc != CKR_OK) {
|
|
Packit |
8681c6 |
testcase_error("C_FindObjectsInit() rc = %s", p11_get_ckr(rc));
|
|
Packit |
8681c6 |
goto testcase_cleanup;
|
|
Packit |
8681c6 |
}
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
rc = funcs->C_FindObjects(session, obj_list, 10, &find_count);
|
|
Packit |
8681c6 |
if (rc != CKR_OK) {
|
|
Packit |
8681c6 |
testcase_error("C_FindObjects() rc = %s", p11_get_ckr(rc));
|
|
Packit |
8681c6 |
goto testcase_cleanup;
|
|
Packit |
8681c6 |
}
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
rc = funcs->C_FindObjectsFinal(session);
|
|
Packit |
8681c6 |
if (rc != CKR_OK) {
|
|
Packit |
8681c6 |
testcase_error("C_FindObjectsFinal() rc = %s", p11_get_ckr(rc));
|
|
Packit |
8681c6 |
goto testcase_cleanup;
|
|
Packit |
8681c6 |
}
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
/* Testcase 1: step thru and see if objects were deleted. */
|
|
Packit |
8681c6 |
if (find_count != 6) {
|
|
Packit |
8681c6 |
testcase_fail("Did not find 6 objects!");
|
|
Packit |
8681c6 |
goto testcase_cleanup;
|
|
Packit |
8681c6 |
}
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
for (i = 0; i < find_count; i++) {
|
|
Packit |
8681c6 |
if ((obj_list[i] == keyobj[6]) || (obj_list[i] == keyobj[7]))
|
|
Packit |
8681c6 |
found++;
|
|
Packit |
8681c6 |
}
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
if (found) {
|
|
Packit |
8681c6 |
testcase_fail("Objects were not deleted.");
|
|
Packit |
8681c6 |
goto testcase_cleanup;
|
|
Packit |
8681c6 |
}
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
testcase_pass("The 2 objects were successfully deleted.");
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
/* Testcase 2: Now make sure the other objects are still there */
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
for (i = 0; i < find_count; i++) {
|
|
Packit |
8681c6 |
if ((obj_list[i] == keyobj[0]) || (obj_list[i] == keyobj[1]) ||
|
|
Packit |
8681c6 |
(obj_list[i] == keyobj[2]) || (obj_list[i] == keyobj[3]) ||
|
|
Packit |
8681c6 |
(obj_list[i] == keyobj[4]) || (obj_list[i] == keyobj[5]))
|
|
Packit |
8681c6 |
found++;
|
|
Packit |
8681c6 |
}
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
if (found != 6) {
|
|
Packit |
8681c6 |
testcase_fail("Some Objects were not found!");
|
|
Packit |
8681c6 |
goto testcase_cleanup;
|
|
Packit |
8681c6 |
}
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
testcase_pass("The other objects are intact.");
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
/* Testcase 3: Remove all the objects */
|
|
Packit |
8681c6 |
find_count = 0;
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
/* Now delete the rest of the objects */
|
|
Packit |
8681c6 |
for (i = 0; i < num_objs; i++)
|
|
Packit |
8681c6 |
funcs->C_DestroyObject(session, keyobj[i]);
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
/* Now see if all the objects were deleted. */
|
|
Packit |
8681c6 |
rc = funcs->C_FindObjectsInit(session, find_tmpl, 2);
|
|
Packit |
8681c6 |
if (rc != CKR_OK) {
|
|
Packit |
8681c6 |
testcase_fail("C_FindObjectsInit() rc = %s", p11_get_ckr(rc));
|
|
Packit |
8681c6 |
goto testcase_cleanup;
|
|
Packit |
8681c6 |
}
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
rc = funcs->C_FindObjects(session, obj_list, 10, &find_count);
|
|
Packit |
8681c6 |
if (rc != CKR_OK) {
|
|
Packit |
8681c6 |
testcase_fail("C_FindObjects() rc = %s", p11_get_ckr(rc));
|
|
Packit |
8681c6 |
goto testcase_cleanup;
|
|
Packit |
8681c6 |
}
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
rc = funcs->C_FindObjectsFinal(session);
|
|
Packit |
8681c6 |
if (rc != CKR_OK) {
|
|
Packit |
8681c6 |
testcase_fail("C_FindObjectsFinal() rc = %s", p11_get_ckr(rc));
|
|
Packit |
8681c6 |
goto testcase_cleanup;
|
|
Packit |
8681c6 |
}
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
if (find_count) {
|
|
Packit |
8681c6 |
testcase_fail("The remaining objects were not deleted.");
|
|
Packit |
8681c6 |
goto testcase_cleanup;
|
|
Packit |
8681c6 |
}
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
testcase_pass("All objects were deleted.");
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
testcase_cleanup:
|
|
Packit |
8681c6 |
if (num_objs) {
|
|
Packit |
8681c6 |
for (i = 0; i < num_objs; i++)
|
|
Packit |
8681c6 |
funcs->C_DestroyObject(session, keyobj[i]);
|
|
Packit |
8681c6 |
}
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
testcase_user_logout();
|
|
Packit |
8681c6 |
rc = funcs->C_CloseSession(session);
|
|
Packit |
8681c6 |
if (rc != CKR_OK) {
|
|
Packit |
8681c6 |
testcase_error("C_CloseSession rc=%s", p11_get_ckr(rc));
|
|
Packit |
8681c6 |
}
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
return rc;
|
|
Packit |
8681c6 |
}
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
int main(int argc, char **argv)
|
|
Packit |
8681c6 |
{
|
|
Packit |
8681c6 |
int rc;
|
|
Packit |
8681c6 |
CK_C_INITIALIZE_ARGS cinit_args;
|
|
Packit |
8681c6 |
CK_RV rv = 0;
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
rc = do_ParseArgs(argc, argv);
|
|
Packit |
8681c6 |
if (rc != 1)
|
|
Packit |
8681c6 |
return rc;
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
printf("Using slot #%lu...\n\n", SLOT_ID);
|
|
Packit |
8681c6 |
printf("With option: nostop: %d\n", no_stop);
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
rc = do_GetFunctionList();
|
|
Packit |
8681c6 |
if (!rc) {
|
|
Packit |
8681c6 |
testcase_error("do_getFunctionList(), rc=%s", p11_get_ckr(rc));
|
|
Packit |
8681c6 |
return rc;
|
|
Packit |
8681c6 |
}
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
memset(&cinit_args, 0x0, sizeof(cinit_args));
|
|
Packit |
8681c6 |
cinit_args.flags = CKF_OS_LOCKING_OK;
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
funcs->C_Initialize(&cinit_args);
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
{
|
|
Packit |
8681c6 |
CK_SESSION_HANDLE hsess = 0;
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
rc = funcs->C_GetFunctionStatus(hsess);
|
|
Packit |
8681c6 |
if (rc != CKR_FUNCTION_NOT_PARALLEL)
|
|
Packit |
8681c6 |
return rc;
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
rc = funcs->C_CancelFunction(hsess);
|
|
Packit |
8681c6 |
if (rc != CKR_FUNCTION_NOT_PARALLEL)
|
|
Packit |
8681c6 |
return rc;
|
|
Packit |
8681c6 |
}
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
testcase_setup(0);
|
|
Packit |
8681c6 |
rc = do_DestroyObjects();
|
|
Packit |
8681c6 |
testcase_print_result();
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
funcs->C_Finalize(NULL);
|
|
Packit |
8681c6 |
|
|
Packit |
8681c6 |
/* make sure we return non-zero if rv is non-zero */
|
|
Packit |
8681c6 |
return ((rv == 0) || (rv % 256) ? (int)rv : -1);
|
|
Packit |
8681c6 |
}
|