示例#1
0
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;
}
示例#2
0
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;
}
示例#3
0
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;
}
示例#4
0
bool silvia_pcsc_card::transmit(bytestring APDU, bytestring& data, unsigned short& sw)
{
	if (!transmit(APDU, data))
	{
		return false;
	}
	
	sw = data[data.size() - 2] << 8;
	sw += data[data.size() - 1];
	
	data.resize(data.size() - 2);
	
	return true;
}