diff --git a/lib/ykpiv.c b/lib/ykpiv.c index ac8a357..0e40c7d 100644 --- a/lib/ykpiv.c +++ b/lib/ykpiv.c @@ -57,10 +57,25 @@ ykpiv_rc ykpiv_init(ykpiv_state **state, int verbose) { } ykpiv_rc ykpiv_done(ykpiv_state *state) { + ykpiv_disconnect(state); free(state); return YKPIV_OK; } +ykpiv_rc ykpiv_disconnect(ykpiv_state *state) { + if(state->card) { + SCardDisconnect(state->card, SCARD_RESET_CARD); + state->card = 0; + } + + if(state->context) { + SCardReleaseContext(state->context); + state->context = 0; + } + + return YKPIV_OK; +} + ykpiv_rc ykpiv_connect(ykpiv_state *state, const char *wanted) { unsigned long num_readers = 0; unsigned long active_protocol; diff --git a/lib/ykpiv.h b/lib/ykpiv.h index 87433a0..054accf 100644 --- a/lib/ykpiv.h +++ b/lib/ykpiv.h @@ -58,6 +58,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_disconnect(ykpiv_state *state); 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); diff --git a/lib/ykpiv.map b/lib/ykpiv.map index 34ab3fd..1cbdfb9 100644 --- a/lib/ykpiv.map +++ b/lib/ykpiv.map @@ -33,6 +33,7 @@ global: ykpiv_init; ykpiv_done; ykpiv_connect; + ykpiv_disconnect; ykpiv_send_data; ykpiv_transfer_data; ykpiv_authenticate;