Blame testcases/pkcs11/findobjects.c

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
/* API Routines exercised:
Packit 8681c6
 * C_FindObjectsInit
Packit 8681c6
 * C_FindObjects
Packit 8681c6
 * C_CreateObject
Packit 8681c6
 *
Packit 8681c6
 * 3 TestCases
Packit 8681c6
 * Setup: Create 2 3des objects and 2 aes private objects
Packit 8681c6
 * Testcase 1: Find only the 3des key objects.
Packit 8681c6
 * Testcase 2: Find only the aes session objects that were created.
Packit 8681c6
 * Testcase 3: Find all the objects.
Packit 8681c6
 */
Packit 8681c6
CK_RV do_FindObjects(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
Packit 8681c6
    CK_ULONG find_count;
Packit 8681c6
    CK_OBJECT_HANDLE keyobj[4];
Packit 8681c6
    CK_OBJECT_HANDLE obj_list[10];
Packit 8681c6
Packit 8681c6
    CK_ULONG not_found = 0;
Packit 8681c6
    CK_ULONG num_objs = 0;
Packit 8681c6
    CK_ULONG i;
Packit 8681c6
Packit 8681c6
    CK_OBJECT_CLASS key_class = CKO_SECRET_KEY;
Packit 8681c6
    CK_KEY_TYPE aes_type = CKK_AES;
Packit 8681c6
    CK_KEY_TYPE des3_type = CKK_DES3;
Packit 8681c6
    CK_BBOOL false = FALSE;
Packit 8681c6
    CK_CHAR aes_value[] = "This is a fake aes key.";
Packit 8681c6
    CK_CHAR des3_value[] = "This is a fake des key.";
Packit 8681c6
    CK_CHAR test1_id[] = "My Testcase 1 keys.";
Packit 8681c6
    CK_CHAR test2_id[] = "My Testcase 2 keys.";
Packit 8681c6
Packit 8681c6
    CK_ATTRIBUTE des3_tmpl[] = {
Packit 8681c6
        {CKA_CLASS, &key_class, sizeof(key_class)},
Packit 8681c6
        {CKA_KEY_TYPE, &des3_type, sizeof(des3_type)},
Packit 8681c6
        {CKA_ID, &test1_id, sizeof(test1_id)},
Packit 8681c6
        {CKA_VALUE, &des3_value, sizeof(des3_value)}
Packit 8681c6
    };
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_PRIVATE, &false, sizeof(false)},
Packit 8681c6
        {CKA_ID, &test2_id, sizeof(test2_id)},
Packit 8681c6
        {CKA_VALUE, &aes_value, sizeof(aes_value)}
Packit 8681c6
    };
Packit 8681c6
Packit 8681c6
    CK_ATTRIBUTE search_des3_tmpl[] = {
Packit 8681c6
        {CKA_KEY_TYPE, &des3_type, sizeof(des3_type)},
Packit 8681c6
        {CKA_ID, &test1_id, sizeof(test1_id)}
Packit 8681c6
    };
Packit 8681c6
Packit 8681c6
    CK_ATTRIBUTE search_tmpl[] = {
Packit 8681c6
        {CKA_KEY_TYPE, &aes_type, sizeof(aes_type)},
Packit 8681c6
        {CKA_ID, &test2_id, sizeof(test2_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 2 des3 session key objects */
Packit 8681c6
    rc = funcs->C_CreateObject(session, des3_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
        return rc;
Packit 8681c6
    }
Packit 8681c6
    num_objs++;
Packit 8681c6
Packit 8681c6
    rc = funcs->C_CreateObject(session, des3_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
    /* Create 2 aes private session key objects */
Packit 8681c6
    rc = funcs->C_CreateObject(session, aes_tmpl, 5, &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
    rc = funcs->C_CreateObject(session, aes_tmpl, 5, &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
Packit 8681c6
    /* Testcase 1: Now find the the 2 des3 key objects */
Packit 8681c6
    testcase_new_assertion();
Packit 8681c6
Packit 8681c6
    rc = funcs->C_FindObjectsInit(session, search_des3_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
    /* We should have gotten back 2 des3 key objects */
Packit 8681c6
    if (find_count != 2) {
Packit 8681c6
        testcase_fail("Should have found 2 des3 key objects, found %d",
Packit 8681c6
                      (int) find_count);
Packit 8681c6
        goto testcase_cleanup;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    /* Examine the 2 objects... */
Packit 8681c6
    for (i = 0; i < find_count; i++) {
Packit 8681c6
        if ((obj_list[i] != keyobj[0]) && (obj_list[i] != keyobj[1]))
Packit 8681c6
            not_found++;
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 (not_found) {
Packit 8681c6
        testcase_fail("Wrong objects found!");
Packit 8681c6
        goto testcase_cleanup;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    testcase_pass("Found the 2 des3 key objects.");
Packit 8681c6
Packit 8681c6
    /* Testcase 2: Now find 2 aes keys with aes_id. */
Packit 8681c6
    /* Note in ICSF, all secret keys are marked private by default. */
Packit 8681c6
    testcase_new_assertion();
Packit 8681c6
Packit 8681c6
    not_found = 0;
Packit 8681c6
    find_count = 0;
Packit 8681c6
Packit 8681c6
    rc = funcs->C_FindObjectsInit(session, search_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
    /* We should have gotten back 2 key objects */
Packit 8681c6
    if (find_count != 2) {
Packit 8681c6
        testcase_fail("Should have found 2 key objects, found %d",
Packit 8681c6
                      (int) find_count);
Packit 8681c6
        goto testcase_cleanup;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    /* Examine the 2 objects... */
Packit 8681c6
    for (i = 0; i < find_count; i++) {
Packit 8681c6
        if ((obj_list[i] != keyobj[2]) && (obj_list[i] != keyobj[3]))
Packit 8681c6
            not_found++;
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 (not_found) {
Packit 8681c6
        testcase_fail("Wrong objects found!");
Packit 8681c6
        goto testcase_cleanup;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    testcase_pass("Found the 2 non-private objects.");
Packit 8681c6
Packit 8681c6
    /* Testcase 3: Find all the objects */
Packit 8681c6
    testcase_new_assertion();
Packit 8681c6
Packit 8681c6
    not_found = 0;
Packit 8681c6
    find_count = 0;
Packit 8681c6
Packit 8681c6
    rc = funcs->C_FindObjectsInit(session, NULL, 0);
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
    /* We should have gotten back 4 key objects
Packit 8681c6
     * testing for more than 4 just in case some other pkcs#11 app is
Packit 8681c6
     * running.
Packit 8681c6
     */
Packit 8681c6
    if (find_count < 4) {
Packit 8681c6
        testcase_fail("Should have found at least 6 objects, found %d",
Packit 8681c6
                      (int) find_count);
Packit 8681c6
        goto testcase_cleanup;
Packit 8681c6
    }
Packit 8681c6
Packit 8681c6
    testcase_pass("Found all the objects.");
Packit 8681c6
Packit 8681c6
testcase_cleanup:
Packit 8681c6
/*	for (i=0; 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_FindObjects();
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
}