|
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
|