From bf3fcc77fececdcf59ab3b5356d63530b2f8422c Mon Sep 17 00:00:00 2001 From: Klas Lindfors Date: Fri, 8 May 2015 09:57:51 +0200 Subject: [PATCH] use a transation while sending and receiving data --- lib/ykpiv.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/lib/ykpiv.c b/lib/ykpiv.c index 73a886f..0ea9517 100644 --- a/lib/ykpiv.c +++ b/lib/ykpiv.c @@ -230,8 +230,16 @@ ykpiv_rc ykpiv_transfer_data(ykpiv_state *state, const unsigned char *templ, const unsigned char *in_ptr = in_data; unsigned long max_out = *out_len; ykpiv_rc res; + long rc; *out_len = 0; + rc = SCardBeginTransaction(state->card); + if(rc != SCARD_S_SUCCESS) { + if(state->verbose) { + fprintf(stderr, "error: Failed to being pcsc transaction, rc=%08lx\n", rc); + } + return YKPIV_PCSC_ERROR; + } do { size_t this_size = 0xff; unsigned long recv_len = 0xff; @@ -291,6 +299,13 @@ ykpiv_rc ykpiv_transfer_data(ykpiv_state *state, const unsigned char *templ, out_data += recv_len - 2; *out_len += recv_len - 2; } + rc = SCardEndTransaction(state->card, SCARD_LEAVE_CARD); + if(rc != SCARD_S_SUCCESS) { + if(state->verbose) { + fprintf(stderr, "error: Failed to end pcsc transaction, rc=%08lx\n", rc); + } + return YKPIV_PCSC_ERROR; + } return YKPIV_OK; }