Blame testcases/include/regress.h

Packit 8681c6
/*
Packit 8681c6
 * COPYRIGHT (c) International Business Machines Corp. 2005-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
#ifndef _REGRESS_H
Packit 8681c6
#define _REGRESS_H
Packit 8681c6
Packit 8681c6
#if !defined(TRUE)
Packit 8681c6
#define TRUE 1
Packit 8681c6
#endif
Packit 8681c6
Packit 8681c6
#if !defined(FALSE)
Packit 8681c6
#define FALSE 0
Packit 8681c6
#endif
Packit 8681c6
Packit 8681c6
#define DES_BLOCK_SIZE  8
Packit 8681c6
#define DES_KEY_LEN     8
Packit 8681c6
Packit 8681c6
#define SHA1_HASH_LEN   20
Packit 8681c6
#define MD2_HASH_LEN    16
Packit 8681c6
#define MD5_HASH_LEN    16
Packit 8681c6
Packit 8681c6
#define BIG_REQUEST     4096
Packit 8681c6
Packit 8681c6
#define MIN(a, b)       ( (a) < (b) ? (a) : (b) )
Packit 8681c6
Packit Service 8aa27d
#include <sys/time.h>
Packit Service 8aa27d
#define SYSTEMTIME   struct timeval
Packit Service 8aa27d
#define GetSystemTime(x) gettimeofday((x), NULL)
Packit 8681c6
Packit 8681c6
#include <sys/time.h>
Packit 8681c6
Packit 8681c6
#pragma GCC system_header
Packit 8681c6
static struct timeval timev1;
Packit 8681c6
static struct timeval timev2;
Packit 8681c6
static struct timeval timev3;
Packit 8681c6
static struct timeval timev4;
Packit 8681c6
static struct timeval timevr;
Packit 8681c6
Packit 8681c6
#ifndef timersub
Packit 8681c6
/* We just need timersub, so instead of requiring _BSD_SOURCE, *
Packit 8681c6
 * define it just like glibc does                              */
Packit 8681c6
#define timersub(t1, t2, tr)                            \
Packit 8681c6
    do {                                                \
Packit 8681c6
        (tr)->tv_sec = (t1)->tv_sec - (t2)->tv_sec;     \
Packit 8681c6
        (tr)->tv_usec = (t1)->tv_usec - (t2)->tv_usec;  \
Packit 8681c6
        if ((tr)->tv_usec < 0) {                        \
Packit 8681c6
            --(tr)->tv_sec;                             \
Packit 8681c6
            (tr)->tv_usec += 1000000;                   \
Packit 8681c6
        }                                               \
Packit 8681c6
    } while (0)
Packit 8681c6
#endif
Packit 8681c6
Packit 8681c6
#include "p11util.h"
Packit 8681c6
Packit 8681c6
extern CK_ULONG t_total;        // total test assertions
Packit 8681c6
extern CK_ULONG t_ran;          // number of assertions ran
Packit 8681c6
extern CK_ULONG t_passed;       // number of assertions passed
Packit 8681c6
extern CK_ULONG t_failed;       // number of assertions failed
Packit 8681c6
extern CK_ULONG t_skipped;      // number of assertions skipped
Packit 8681c6
extern CK_ULONG t_errors;       // number of errors
Packit 8681c6
Packit 8681c6
void process_time(SYSTEMTIME t1, SYSTEMTIME t2);
Packit 8681c6
void show_error(char *str, CK_RV rc);
Packit 8681c6
void print_hex(CK_BYTE * buf, CK_ULONG len);
Packit 8681c6
Packit Service 8aa27d
CK_BBOOL do_GetFunctionList(void);
Packit 8681c6
Packit 8681c6
void init_coprocessor(void);
Packit 8681c6
Packit 8681c6
CK_RV C_GetFunctionList(CK_FUNCTION_LIST **);
Packit 8681c6
CK_RV DummyFunction(CK_SLOT_ID id);
Packit 8681c6
Packit 8681c6
int digest_functions(void);
Packit 8681c6
Packit 8681c6
extern CK_FUNCTION_LIST *funcs;
Packit Service 8aa27d
extern CK_FUNCTION_LIST_3_0 *funcs3;
Packit Service 8aa27d
extern CK_INTERFACE *ifs;
Packit 8681c6
extern CK_SLOT_ID SLOT_ID;
Packit 8681c6
Packit 8681c6
void usage(char *fct);
Packit 8681c6
int do_ParseArgs(int argc, char **argv);
Packit 8681c6
Packit 8681c6
// these values are required when generating a PKCS DSA value.  they were
Packit 8681c6
// obtained by generating a DSA key pair on the 4758 with the default (random)
Packit 8681c6
// values.  these values are in big-endian format
Packit 8681c6
//
Packit 8681c6
extern CK_BYTE DSA_PUBL_PRIME[128];
Packit 8681c6
extern CK_BYTE DSA_PUBL_SUBPRIME[20];
Packit 8681c6
extern CK_BYTE DSA_PUBL_BASE[128];
Packit 8681c6
Packit 8681c6
extern CK_BBOOL skip_token_obj;
Packit 8681c6
extern CK_BBOOL no_stop;
Packit 8681c6
extern CK_BBOOL no_init;
Packit 8681c6
extern CK_BBOOL securekey;
Packit 8681c6
Packit 8681c6
int get_so_pin(CK_BYTE_PTR);
Packit 8681c6
int get_user_pin(CK_BYTE_PTR);
Packit 8681c6
Packit 8681c6
#define PKCS11_MAX_PIN_LEN 128
Packit 8681c6
#define PKCS11_SO_PIN_ENV_VAR   "PKCS11_SO_PIN"
Packit 8681c6
#define PKCS11_USER_PIN_ENV_VAR "PKCS11_USER_PIN"
Packit 8681c6
Packit 8681c6
#define PRINT_ERR(fmt, ...)     \
Packit 8681c6
    fprintf(stderr, "%s:%d " fmt "\n", __FILE__, __LINE__, ## __VA_ARGS__)
Packit 8681c6
#define PRINT(fmt, ...)         \
Packit 8681c6
    printf("%s:%d " fmt "\n", __FILE__, __LINE__, ## __VA_ARGS__)
Packit 8681c6
Packit 8681c6
Packit 8681c6
/* show_error(char *_str, unsigned long _rc); */
Packit 8681c6
#define show_error(_str, _rc)                                  \
Packit 8681c6
    fprintf(stderr, "%s:%d: %s returned %lu (0x%lx) %s\n",     \
Packit 8681c6
            __FILE__, __LINE__, _str, _rc, _rc,                \
Packit 8681c6
            p11_get_ckr(_rc))
Packit 8681c6
Packit 8681c6
#define testcase_setup(total)                                   \
Packit 8681c6
    do {                                                        \
Packit 8681c6
        t_total = 0;                                            \
Packit 8681c6
        t_errors = 0;                                           \
Packit 8681c6
        gettimeofday(&timev3, NULL);                            \
Packit 8681c6
    } while (0)
Packit 8681c6
Packit 8681c6
#define testsuite_begin(_fmt, ...)                              \
Packit 8681c6
    do {                                                        \
Packit 8681c6
        printf("------\n* TESTSUITE %s BEGIN " _fmt "\n",       \
Packit 8681c6
                __func__, ## __VA_ARGS__);                      \
Packit 8681c6
    } while (0)
Packit 8681c6
Packit 8681c6
#define testcase_begin(_fmt, ...)                               \
Packit 8681c6
    do {                                                        \
Packit 8681c6
        printf("------\n* TESTCASE %s BEGIN " _fmt "\n",        \
Packit 8681c6
                __func__, ## __VA_ARGS__);                      \
Packit 8681c6
        gettimeofday(&timev1, NULL);                            \
Packit 8681c6
    } while (0)
Packit 8681c6
Packit 8681c6
#define testcase_begin_f(_func, _fmt, ...)                      \
Packit 8681c6
    do {                                                        \
Packit 8681c6
        printf("------\n* TESTCASE %s BEGIN " _fmt "\n",        \
Packit 8681c6
                _func, ## __VA_ARGS__);                         \
Packit 8681c6
        gettimeofday(&timev1, NULL);                            \
Packit 8681c6
    } while (0)
Packit 8681c6
Packit 8681c6
#define testcase_new_assertion()    \
Packit 8681c6
		t_ran++;
Packit 8681c6
Packit 8681c6
#define testcase_pass(_fmt, ...)                                            \
Packit 8681c6
    do {                                                                    \
Packit 8681c6
        gettimeofday(&timev2, NULL);                                        \
Packit 8681c6
        timersub(&timev2, &timev1, &timevr);                                \
Packit 8681c6
        printf("* TESTCASE %s PASS (elapsed time %lds %ldus) " _fmt "\n\n", \
Packit 8681c6
                __func__, timevr.tv_sec, timevr.tv_usec, ## __VA_ARGS__);   \
Packit 8681c6
		t_passed++;                                                         \
Packit 8681c6
    } while (0)
Packit 8681c6
Packit 8681c6
#define testcase_pass_f(_func, _fmt, ...)                                   \
Packit 8681c6
    do {                                                                    \
Packit 8681c6
        gettimeofday(&timev2, NULL);                                        \
Packit 8681c6
        timersub(&timev2, &timev1, &timevr);                                \
Packit 8681c6
        printf("* TESTCASE %s PASS (elapsed time %lds %ldus) " _fmt "\n\n", \
Packit 8681c6
                _func, timevr.tv_sec, timevr.tv_usec, ## __VA_ARGS__);      \
Packit 8681c6
        t_passed++;                                                         \
Packit 8681c6
    } while (0)
Packit 8681c6
Packit 8681c6
#define testsuite_skip(_n,_fmt, ...)                    \
Packit 8681c6
    do {                                                \
Packit 8681c6
        printf("* TESTSUITE %s SKIP " _fmt "\n\n",      \
Packit 8681c6
                __func__, ## __VA_ARGS__);              \
Packit 8681c6
        t_skipped+= _n;                                 \
Packit 8681c6
    } while (0)
Packit 8681c6
Packit 8681c6
#define testcase_skip(_fmt, ...)                        \
Packit 8681c6
    do {                                                \
Packit 8681c6
        printf("* TESTCASE %s SKIP " _fmt "\n\n",       \
Packit 8681c6
                __func__, ## __VA_ARGS__);              \
Packit 8681c6
        t_skipped++;                                    \
Packit 8681c6
    } while (0)
Packit 8681c6
Packit 8681c6
#define testcase_skip_f(_func, _fmt, ...)               \
Packit 8681c6
    do {                                                \
Packit 8681c6
        printf("* TESTCASE %s SKIP " _fmt "\n\n",       \
Packit 8681c6
                _func, ## __VA_ARGS__);                 \
Packit 8681c6
        t_skipped++;                                    \
Packit 8681c6
    } while (0)
Packit 8681c6
Packit 8681c6
#define testcase_notice(_fmt, ...)                      \
Packit 8681c6
    do {                                                \
Packit 8681c6
        printf("* TESTCASE %s NOTICE " _fmt "\n",       \
Packit 8681c6
                __func__, ## __VA_ARGS__);              \
Packit 8681c6
    } while (0)
Packit 8681c6
Packit 8681c6
#define testcase_notice_f(_func, _fmt, ...)             \
Packit 8681c6
    do {                                                \
Packit 8681c6
        printf("* TESTCASE %s NOTICE " _fmt "\n",       \
Packit 8681c6
                __func, ## __VA_ARGS__);                \
Packit 8681c6
    } while (0)
Packit 8681c6
Packit 8681c6
#define testcase_fail(_fmt, ...)                                  \
Packit 8681c6
    do {                                                          \
Packit 8681c6
        printf("* TESTCASE %s FAIL (%s:%d) " _fmt "\n",           \
Packit 8681c6
                __func__, __FILE__, __LINE__, ## __VA_ARGS__);    \
Packit 8681c6
        t_failed++;                                               \
Packit 8681c6
    } while (0)
Packit 8681c6
Packit 8681c6
#define testcase_fail_f(_func, _fmt, ...)                     \
Packit 8681c6
    do {                                                      \
Packit 8681c6
        printf("* TESTCASE %s FAIL (%s:%d) " _fmt "\n",       \
Packit 8681c6
                _func, __FILE__, __LINE__, ## __VA_ARGS__);   \
Packit 8681c6
        t_failed++;                                           \
Packit 8681c6
    } while (0)
Packit 8681c6
Packit 8681c6
#define testcase_error(_fmt, ...)                               \
Packit 8681c6
    do {                                                        \
Packit 8681c6
        printf("* TESTCASE %s ERROR (%s:%d)) " _fmt "\n",       \
Packit 8681c6
                __func__, __FILE__, __LINE__, ## __VA_ARGS__);  \
Packit 8681c6
        t_errors++;                                             \
Packit 8681c6
    } while (0)
Packit 8681c6
Packit 8681c6
#define testcase_error_f(_func, _fmt, ...)                      \
Packit 8681c6
    do {                                                        \
Packit 8681c6
        printf("* TESTCASE %s ERROR (%s:%d)) " _fmt "\n",       \
Packit 8681c6
                _func, __FILE__, __LINE__, ## __VA_ARGS__);     \
Packit 8681c6
		t_errors++;                                             \
Packit 8681c6
	} while (0)
Packit 8681c6
Packit 8681c6
#define testcase_print_result()                                 \
Packit 8681c6
    do {                                                        \
Packit 8681c6
        gettimeofday(&timev4, NULL);                            \
Packit 8681c6
        timersub(&timev4, &timev3, &timevr);                    \
Packit 8681c6
        printf("Total=%lu, Ran=%lu, Passed=%lu, Failed=%lu, "   \
Packit 8681c6
               "Skipped=%lu, Errors=%lu (total elapsed time "   \
Packit 8681c6
               "%lds %ldus)\n",                                 \
Packit 8681c6
               (t_ran + t_skipped), t_ran, t_passed, t_failed,  \
Packit 8681c6
               t_skipped, t_errors, timevr.tv_sec,              \
Packit 8681c6
               timevr.tv_usec);                                 \
Packit 8681c6
    } while (0)
Packit 8681c6
Packit 8681c6
#define testcase_rw_session()                                             \
Packit 8681c6
    do {                                                                  \
Packit 8681c6
        flags = CKF_SERIAL_SESSION | CKF_RW_SESSION;                      \
Packit 8681c6
        rc = funcs->C_OpenSession(SLOT_ID, flags, NULL, NULL, &session ); \
Packit 8681c6
        if (rc != CKR_OK) {                                               \
Packit 8681c6
            testcase_error("C_OpenSession() rc = %s", p11_get_ckr(rc));   \
Packit 8681c6
            session = CK_INVALID_HANDLE;                                  \
Packit 8681c6
            goto testcase_cleanup;                                        \
Packit 8681c6
        }                                                                 \
Packit 8681c6
    } while (0)
Packit 8681c6
Packit 8681c6
#define testcase_ro_session()                                              \
Packit 8681c6
    do {                                                                   \
Packit 8681c6
        flags = CKF_SERIAL_SESSION;                                        \
Packit 8681c6
        rc = funcs->C_OpenSession(SLOT_ID, flags, NULL, NULL, &session );  \
Packit 8681c6
        if (rc != CKR_OK) {                                                \
Packit 8681c6
            testcase_error("C_OpenSession() rc = %s", p11_get_ckr(rc));    \
Packit 8681c6
            session = CK_INVALID_HANDLE;                                   \
Packit 8681c6
            goto testcase_cleanup;                                         \
Packit 8681c6
        }                                                                  \
Packit 8681c6
    } while (0)
Packit 8681c6
Packit 8681c6
#define testcase_close_session()                                            \
Packit 8681c6
    do {                                                                    \
Packit 8681c6
        if (session != CK_INVALID_HANDLE) {                                 \
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
    } while (0)
Packit 8681c6
Packit 8681c6
#define testcase_closeall_session()                                         \
Packit 8681c6
    do {                                                                    \
Packit 8681c6
        rc = funcs->C_CloseAllSessions(SLOT_ID);                            \
Packit 8681c6
        if (rc != CKR_OK) {                                                 \
Packit 8681c6
            testcase_error("C_CloseAllSessions() rc = %s", p11_get_ckr(rc));\
Packit 8681c6
        }                                                                   \
Packit 8681c6
    } while (0)
Packit 8681c6
Packit 8681c6
Packit 8681c6
#define testcase_user_login()                                           \
Packit 8681c6
    do {                                                                \
Packit 8681c6
        if (get_user_pin(user_pin)) {                                   \
Packit 8681c6
            testcase_error("get_user_pin() failed");                    \
Packit 8681c6
            testcase_closeall_session();                                \
Packit 8681c6
            exit(-1);                                                   \
Packit 8681c6
        }                                                               \
Packit 8681c6
        user_pin_len = (CK_ULONG) strlen( (char *) user_pin);           \
Packit 8681c6
        rc = funcs->C_Login(session, CKU_USER, user_pin, user_pin_len); \
Packit 8681c6
        if (rc != CKR_OK) {                                             \
Packit 8681c6
            testcase_error("C_Login() rc = %s", p11_get_ckr(rc));       \
Packit 8681c6
            goto testcase_cleanup;                                      \
Packit 8681c6
        }                                                               \
Packit 8681c6
    } while (0)
Packit 8681c6
Packit 8681c6
#define testcase_user_logout()                                          \
Packit 8681c6
    do {                                                                \
Packit 8681c6
        if (session != CK_INVALID_HANDLE) {                             \
Packit 8681c6
            rc = funcs->C_Logout(session);                              \
Packit 8681c6
            if (rc != CKR_OK) {                                         \
Packit 8681c6
                testcase_error("C_Logout() rc = %s", p11_get_ckr(rc));  \
Packit 8681c6
            }                                                           \
Packit 8681c6
        }                                                               \
Packit 8681c6
    } while (0)
Packit 8681c6
Packit 8681c6
Packit 8681c6
#define testcase_so_login()                                          \
Packit 8681c6
    do {                                                             \
Packit 8681c6
        if (get_so_pin(so_pin)) {                                    \
Packit 8681c6
            testcase_error("get_so_pin() failed");                   \
Packit 8681c6
            rc = -1;                                                 \
Packit 8681c6
            goto testcase_cleanup;                                   \
Packit 8681c6
        }                                                            \
Packit 8681c6
        so_pin_len = (CK_ULONG) strlen( (char *) so_pin);            \
Packit 8681c6
        rc = funcs->C_Login(session, CKU_SO, so_pin, so_pin_len);    \
Packit 8681c6
        if (rc != CKR_OK) {                                          \
Packit 8681c6
            testcase_error("C_Login() rc = %s", p11_get_ckr(rc));    \
Packit 8681c6
            goto testcase_cleanup;                                   \
Packit 8681c6
        }                                                            \
Packit 8681c6
    } while (0)
Packit 8681c6
Packit 8681c6
#endif