use a transation while sending and receiving data
This commit is contained in:
+15
@@ -230,8 +230,16 @@ ykpiv_rc ykpiv_transfer_data(ykpiv_state *state, const unsigned char *templ,
|
|||||||
const unsigned char *in_ptr = in_data;
|
const unsigned char *in_ptr = in_data;
|
||||||
unsigned long max_out = *out_len;
|
unsigned long max_out = *out_len;
|
||||||
ykpiv_rc res;
|
ykpiv_rc res;
|
||||||
|
long rc;
|
||||||
*out_len = 0;
|
*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 {
|
do {
|
||||||
size_t this_size = 0xff;
|
size_t this_size = 0xff;
|
||||||
unsigned long recv_len = 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_data += recv_len - 2;
|
||||||
*out_len += 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;
|
return YKPIV_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user