opensc/src/tests/p11test/p11test.c

149 lines
4.4 KiB
C

/*
* p11test.c: Test suite for PKCS#11 API
*
* Copyright (C) 2016 Martin Strhársky <strharsky.martin@gmail.com>
* Copyright (C) 2016, 2017 Red Hat, Inc.
*
* Author: Jakub Jelen <jjelen@redhat.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <getopt.h>
#include "p11test_helpers.h"
#include "p11test_case_readonly.h"
#include "p11test_case_multipart.h"
#include "p11test_case_ec_sign.h"
#include "p11test_case_ec_derive.h"
#include "p11test_case_usage.h"
#include "p11test_case_mechs.h"
#include "p11test_case_wait.h"
#include "p11test_case_pss_oaep.h"
#include "p11test_case_interface.h"
#define DEFAULT_P11LIB "../../pkcs11/.libs/opensc-pkcs11.so"
/* Global variable keeping information about token we are using */
token_info_t token;
int debug_flag = 0;
void display_usage() {
fprintf(stdout,
" Usage:\n"
" ./p11test [-m module_path] [-s slot_id] [-p pin]\n"
" -m module_path Path to tested module (e.g. /usr/lib64/opensc-pkcs11.so)\n"
" Default is "DEFAULT_P11LIB"\n"
" -p pin Application PIN\n"
" -s slot_id Slot ID with the card\n"
" -i Wait for the card before running the test (interactive)\n"
" -o File to write a log in JSON\n"
" -h This help\n"
"\n");
}
int main(int argc, char** argv) {
signed char command;
const struct CMUnitTest readonly_tests_without_initialization[] = {
/* Test card events on slot */
cmocka_unit_test_setup_teardown(wait_test,
token_initialize, token_cleanup),
/* Check all the mechanisms provided by the token */
cmocka_unit_test_setup_teardown(supported_mechanisms_test,
token_setup, token_cleanup),
/* Check the PKCS #11 3.0 Interface to access new functions */
cmocka_unit_test(interface_test),
/* Complex readonly test of all objects on the card */
cmocka_unit_test_setup_teardown(readonly_tests,
user_login_setup, after_test_cleanup),
/* Multipart signatures and encryption */
cmocka_unit_test_setup_teardown(multipart_tests,
user_login_setup, after_test_cleanup),
/* Regression test Sign&Verify with various data lengths */
cmocka_unit_test_setup_teardown(ec_sign_size_test,
user_login_setup, after_test_cleanup),
/* Verify that the Usage flags on the objects are sane */
cmocka_unit_test_setup_teardown(usage_test,
user_login_setup, after_test_cleanup),
/* Verify that RSA-PSS and RSA-OAEP functions if supported */
cmocka_unit_test_setup_teardown(pss_oaep_test,
user_login_setup, after_test_cleanup),
/* Verify that ECDH key derivation works */
cmocka_unit_test_setup_teardown(derive_tests,
user_login_setup, after_test_cleanup),
};
token.library_path = NULL;
token.pin = NULL;
token.pin_length = 0;
token.interactive = 0;
token.slot_id = (unsigned long) -1;
token.log.outfile = NULL;
while ((command = getopt(argc, argv, "?hm:s:p:io:v")) != -1) {
switch (command) {
case 'o':
token.log.outfile = strdup(optarg);
break;
case 'm':
token.library_path = strdup(optarg);
break;
case 's':
token.slot_id = atol(optarg);
break;
case 'p':
token.pin = (CK_UTF8CHAR*) strdup(optarg);
token.pin_length = strlen(optarg);
break;
case 'i':
token.interactive = 1;
break;
case 'h':
case '?':
display_usage();
return 0;
case 'v':
debug_flag = 1;
break;
default:
break;
}
}
if (token.library_path == NULL) {
debug_print("Falling back to the default library " DEFAULT_P11LIB);
token.library_path = strdup(DEFAULT_P11LIB);
}
if (token.pin == NULL || token.pin_length == 0) {
printf("No PIN specified. Please, specify it on command-line using -p switch\n");
return -1;
}
debug_print("Card info:\n\tPIN %s\n\tPIN LENGTH %lu\n\t",
token.pin, token.pin_length);
return cmocka_run_group_tests(readonly_tests_without_initialization,
group_setup, group_teardown);
}