From 1a9e62cec8bc42a5ba5d614080ad3f78a6959132 Mon Sep 17 00:00:00 2001 From: Klas Lindfors Date: Mon, 7 Sep 2015 15:54:57 +0200 Subject: [PATCH] drop ykpiv_connect2() and add ykpiv_list_readers() --- lib/ykpiv.c | 108 +++++++++++++++++++++++++++--------------------- lib/ykpiv.h | 3 +- lib/ykpiv.map | 4 +- ykcs11/ykcs11.c | 7 +++- 4 files changed, 69 insertions(+), 53 deletions(-) diff --git a/lib/ykpiv.c b/lib/ykpiv.c index fc60d47..aac931b 100644 --- a/lib/ykpiv.c +++ b/lib/ykpiv.c @@ -128,23 +128,20 @@ ykpiv_rc ykpiv_disconnect(ykpiv_state *state) { } ykpiv_rc ykpiv_connect(ykpiv_state *state, const char *wanted) { - return ykpiv_connect2(state, wanted, NULL, 0); -} - -ykpiv_rc ykpiv_connect2(ykpiv_state *state, const char *wanted, unsigned char **readers, unsigned long *len) { unsigned long num_readers = 0; unsigned long active_protocol; char reader_buf[1024]; long rc; - int i; char *reader_ptr; - rc = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &state->context); - if (rc != SCARD_S_SUCCESS) { - if(state->verbose) { - fprintf (stderr, "error: SCardEstablishContext failed, rc=%08lx\n", rc); + if(SCardIsValidContext(state->context) != SCARD_S_SUCCESS) { + rc = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &state->context); + if (rc != SCARD_S_SUCCESS) { + if(state->verbose) { + fprintf (stderr, "error: SCardEstablishContext failed, rc=%08lx\n", rc); + } + return YKPIV_PCSC_ERROR; } - return YKPIV_PCSC_ERROR; } rc = SCardListReaders(state->context, NULL, NULL, &num_readers); @@ -170,20 +167,6 @@ ykpiv_rc ykpiv_connect2(ykpiv_state *state, const char *wanted, unsigned char ** return YKPIV_PCSC_ERROR; } - // Save available readers (aka PKCS11 slots) - if (readers != NULL) { - *readers = malloc(sizeof(char) * num_readers); - if (*readers == NULL) { - if(state->verbose) { - fprintf (stderr, "error: malloc failed"); - } - SCardReleaseContext(state->context); - return YKPIV_MEMORY_ERROR; - } - memcpy(*readers, reader_buf, num_readers); - *len = num_readers; - } - for(reader_ptr = reader_buf; *reader_ptr != '\0'; reader_ptr += strlen(reader_ptr) + 1) { if(wanted) { if(!strstr(reader_ptr, wanted)) { @@ -245,6 +228,59 @@ ykpiv_rc ykpiv_connect2(ykpiv_state *state, const char *wanted, unsigned char ** return YKPIV_GENERIC_ERROR; } +ykpiv_rc ykpiv_list_readers(ykpiv_state *state, unsigned char **readers, unsigned long *len) { + unsigned long num_readers = 0; + char reader_buf[1024]; + long rc; + + if(SCardIsValidContext(state->context) != SCARD_S_SUCCESS) { + rc = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &state->context); + if (rc != SCARD_S_SUCCESS) { + if(state->verbose) { + fprintf (stderr, "error: SCardEstablishContext failed, rc=%08lx\n", rc); + } + return YKPIV_PCSC_ERROR; + } + } + + rc = SCardListReaders(state->context, NULL, NULL, &num_readers); + if (rc != SCARD_S_SUCCESS) { + if(state->verbose) { + fprintf (stderr, "error: SCardListReaders failed, rc=%08lx\n", rc); + } + SCardReleaseContext(state->context); + return YKPIV_PCSC_ERROR; + } + + if (num_readers > sizeof(reader_buf)) { + num_readers = sizeof(reader_buf); + } + + rc = SCardListReaders(state->context, NULL, reader_buf, &num_readers); + if (rc != SCARD_S_SUCCESS) + { + if(state->verbose) { + fprintf (stderr, "error: SCardListReaders failed, rc=%08lx\n", rc); + } + SCardReleaseContext(state->context); + return YKPIV_PCSC_ERROR; + } + + // Save available readers (aka PKCS11 slots) + *readers = malloc(sizeof(char) * num_readers); + if (*readers == NULL) { + if(state->verbose) { + fprintf (stderr, "error: malloc failed"); + } + SCardReleaseContext(state->context); + return YKPIV_MEMORY_ERROR; + } + memcpy(*readers, reader_buf, num_readers); + *len = num_readers; + + return YKPIV_OK; +} + ykpiv_rc ykpiv_transfer_data(ykpiv_state *state, const unsigned char *templ, const unsigned char *in_data, long in_len, unsigned char *out_data, unsigned long *out_len, int *sw) { @@ -788,27 +824,3 @@ ykpiv_rc ykpiv_save_object(ykpiv_state *state, int object_id, return YKPIV_GENERIC_ERROR; } } - -ykpiv_rc ykpiv_get_reader_slot_number(ykpiv_state *state, unsigned long *slots, unsigned long *total) { - if (state == NULL) - return YKPIV_MEMORY_ERROR; - - *slots = state->n_readers; - *total = state->tot_readers_len; - - return YKPIV_OK; - -} - -ykpiv_rc ykpiv_get_reader_slot(ykpiv_state *state, unsigned long slot, char *reader) { - if (state == NULL) - return YKPIV_MEMORY_ERROR; - - if (slot >= state->n_readers) - return YKPIV_SIZE_ERROR; - - strcpy(reader, state->readers[slot]); - - return YKPIV_OK; - -} diff --git a/lib/ykpiv.h b/lib/ykpiv.h index 3de24c4..d832283 100644 --- a/lib/ykpiv.h +++ b/lib/ykpiv.h @@ -65,8 +65,7 @@ extern "C" ykpiv_rc ykpiv_init(ykpiv_state **state, int verbose); ykpiv_rc ykpiv_done(ykpiv_state *state); ykpiv_rc ykpiv_connect(ykpiv_state *state, const char *wanted); - ykpiv_rc ykpiv_connect2(ykpiv_state *state, const char *wanted, - unsigned char **readers, unsigned long *len); // Allow to return a reader string + ykpiv_rc ykpiv_list_readers(ykpiv_state *state, unsigned char **readers, unsigned long *len); ykpiv_rc ykpiv_disconnect(ykpiv_state *state); ykpiv_rc ykpiv_transfer_data(ykpiv_state *state, const unsigned char *templ, const unsigned char *in_data, long in_len, diff --git a/lib/ykpiv.map b/lib/ykpiv.map index 0a09fa6..dd817b2 100644 --- a/lib/ykpiv.map +++ b/lib/ykpiv.map @@ -53,12 +53,12 @@ YKPIV_0.2.0 { global: ykpiv_decipher_data; - ykpiv_connect2; - ykpiv_sign_data2; } YKPIV_0.1.0; YKPIV_1.1.0 { global: ykpiv_set_mgmkey2; + ykpiv_list_readers; + ykpiv_sign_data2; } YKPIV_0.1.0; diff --git a/ykcs11/ykcs11.c b/ykcs11/ykcs11.c index c795d17..4997329 100644 --- a/ykcs11/ykcs11.c +++ b/ykcs11/ykcs11.c @@ -60,7 +60,12 @@ CK_DEFINE_FUNCTION(CK_RV, C_Initialize)( return CKR_FUNCTION_FAILED; // TODO: better error? } - if(ykpiv_connect2(piv_state, NULL, &readers, &len) != YKPIV_OK) { + if (ykpiv_list_readers(piv_state, &readers, &len) != YKPIV_OK) { + DBG(("Unable to list readers")); + return CKR_FUNCTION_FAILED; + } + + if(ykpiv_connect(piv_state, NULL) != YKPIV_OK) { DBG(("Unable to connect to reader")); return CKR_FUNCTION_FAILED; }