RESPONSECODE IFDHTransmitToICC (DWORD Lun, SCARD_IO_HEADER SendPci, PUCHAR TxBuffer, DWORD TxLength, PUCHAR RxBuffer, PDWORD RxLength, PSCARD_IO_HEADER RecvPci) { unsigned char *rapdu = NULL; ssize_t size; RESPONSECODE r = IFD_COMMUNICATION_ERROR; size_t slot = Lun & 0xffff; if (slot >= vicc_max_slots) { goto err; } if (!RxLength || !RecvPci) { Log1(PCSC_LOG_ERROR, "Invalid input data"); goto err; } size = vicc_transmit(ctx[slot], TxLength, TxBuffer, &rapdu); if (size < 0) { Log1(PCSC_LOG_ERROR, "could not send apdu or receive rapdu"); goto err; } if (*RxLength < size) { Log1(PCSC_LOG_ERROR, "Not enough memory for rapdu"); goto err; } *RxLength = size; memcpy(RxBuffer, rapdu, size); RecvPci->Protocol = 1; r = IFD_SUCCESS; err: if (r != IFD_SUCCESS && RxLength) *RxLength = 0; free(rapdu); return r; }
ssize_t vicc_getatr(struct vicc_ctx *ctx, unsigned char **atr) { unsigned char i = VPCD_CTRL_ATR; return vicc_transmit(ctx, VPCD_CTRL_LEN, &i, atr); }