bool silvia_pcsc_card::transmit(bytestring APDU, bytestring& data_sw) { if (!connected) return false; data_sw.resize(65536); DWORD out_len = 65536; SCARD_IO_REQUEST recv_req; LONG rv = SCardTransmit( card_handle, protocol == SCARD_PROTOCOL_T0 ? SCARD_PCI_T0 : SCARD_PCI_T1, APDU.byte_str(), APDU.size(), &recv_req, data_sw.byte_str(), &out_len); if (rv != SCARD_S_SUCCESS) { return false; } data_sw.resize(out_len); if (data_sw.size() < 2) { return false; } return true; }
bool silvia_nfc_card::transmit(bytestring APDU, bytestring& data_sw) { if (!connected) return false; data_sw.resize(65536); int out_len = nfc_initiator_transceive_bytes(device, APDU.byte_str(), APDU.size(), data_sw.byte_str(), data_sw.size(), 0); if (out_len < 2) { return false; } data_sw.resize(out_len); if (data_sw.size() < 2) { return false; } return true; }
bool edna_emulator::transceive_control(SCARDHANDLE reader, const bytestring& cmd, bytestring& rdata) { DWORD pcsc_rv; DWORD rlen; rdata.resize(512); if ((pcsc_rv = SCardControl(reader, IOCTL_CCID_ESCAPE_DIRECT, cmd.const_byte_str(), cmd.size(), rdata.byte_str(), 512, &rlen)) != SCARD_S_SUCCESS) { ERROR_MSG("Failed to exchange control command (0x%08X)", pcsc_rv); SCardDisconnect(reader, SCARD_UNPOWER_CARD); SCardReleaseContext(pcsc_context); return false; } rdata.resize(rlen); return true; }