drop ykpiv_connect2() and add ykpiv_list_readers()

This commit is contained in:
Klas Lindfors
2015-09-07 15:54:57 +02:00
parent 984a124508
commit 1a9e62cec8
4 changed files with 69 additions and 53 deletions
+55 -43
View File
@@ -128,17 +128,13 @@ 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;
if(SCardIsValidContext(state->context) != SCARD_S_SUCCESS) {
rc = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &state->context);
if (rc != SCARD_S_SUCCESS) {
if(state->verbose) {
@@ -146,6 +142,7 @@ ykpiv_rc ykpiv_connect2(ykpiv_state *state, const char *wanted, unsigned char **
}
return YKPIV_PCSC_ERROR;
}
}
rc = SCardListReaders(state->context, NULL, NULL, &num_readers);
if (rc != SCARD_S_SUCCESS) {
@@ -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;
}
+1 -2
View File
@@ -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,
+2 -2
View File
@@ -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;
+6 -1
View File
@@ -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;
}