Esempio n. 1
0
void ICard::debug_RAPDU(const char *label, const RAPDU& rapdu) const
{
	eCardCore_info(DEBUG_LEVEL_APDU, "%s%sR-APDU:  SW=%04X  Nr=%u",
			label, label ? " " : "", rapdu.getSW(), rapdu.getData().size());
	if (!rapdu.getData().empty())
		hexdump(DEBUG_LEVEL_APDU, NULL,
				DATA(rapdu.getData()), rapdu.getData().size());
}
Esempio n. 2
0
void ICard::debug_CAPDU(const char *label, const CAPDU& capdu) const
{
	eCardCore_info(DEBUG_LEVEL_APDU, "%s%sC-APDU:  CLA=%02X  INS=%02X  P1=%02X  P2=%02X  Nc=%-5u  Ne=%u",
			label, label ? " " : "", capdu.getCLA(), capdu.getINS(), capdu.getP1(),
			capdu.getP2(), capdu.getData().size(), capdu.getNe());
	hexdump(DEBUG_LEVEL_APDU, NULL,
			DATA(capdu.getData()), capdu.getData().size());
}
bool ExternalReader::supportsPACEnative(void)
{
	bool r = false;

	if (m_hSupportsPACE
		   	&& ECARD_SUCCESS == m_hSupportsPACE(m_hCardReader)) {
		r = true;
		eCardCore_info(DEBUG_LEVEL_CARD, "Reader supports PACE");
	}

    return r;
}
Esempio n. 4
0
PCSCReader::PCSCReader(
	const string &readerName,
	vector<ICardDetector *>& detector) : IReader(readerName, detector),
	m_hCard(0x0),
#if defined(_WIN32)
	m_dwProtocol(SCARD_PROTOCOL_UNDEFINED),
#else
	m_dwProtocol(SCARD_PROTOCOL_UNSET),
#endif
	m_hScardContext(0x0)
{
	DWORD retValue = SCARD_S_SUCCESS;
	BYTE sendbuf[] = {
		FUNCTION_GetReadersPACECapabilities,
		0x00,              /* lengthInputData */
		0x00,              /* lengthInputData */
	};

	if ((retValue = SCardEstablishContext(/*SCARD_SCOPE_USER*/ SCARD_SCOPE_SYSTEM,
					0x0, 0x0, &m_hScardContext)) != SCARD_S_SUCCESS)
		eCardCore_warn(DEBUG_LEVEL_CARD,  "SCardEstablishContext failed. 0x%08X (%s:%d)", retValue,
					   __FILE__, __LINE__);

#if defined(UNICODE) || defined(_UNICODE)
	WCHAR *_readerName = new WCHAR[m_readerName.size() + 1];
	mbstowcs(_readerName, m_readerName.c_str(), m_readerName.size());
	_readerName[m_readerName.size()] = 0;
	retValue = SCardConnect(m_hScardContext, _readerName, SCARD_SHARE_DIRECT,
							m_dwProtocol, &m_hCard, &m_dwProtocol);
	delete [] _readerName;
#else
	retValue = SCardConnect(m_hScardContext, m_readerName.c_str(), SCARD_SHARE_DIRECT,
							m_dwProtocol, &m_hCard, &m_dwProtocol);
#endif

	if (retValue != SCARD_S_SUCCESS) {
		eCardCore_warn(DEBUG_LEVEL_CARD,  "SCardConnect for %s failed. 0x%08X (%s:%d)",
					   m_readerName.c_str(), retValue,  __FILE__, __LINE__);
	}

	/* does the reader support PACE? */
	m_ioctl_pace = 0;
#if ENABLE_PACE
	BYTE recvbuf[1024];
	DWORD recvlen = sizeof(recvbuf);
	retValue = SCardControl(m_hCard, CM_IOCTL_GET_FEATURE_REQUEST, NULL, 0,
							recvbuf, sizeof(recvbuf), &recvlen);

	if (retValue != SCARD_S_SUCCESS) {
		eCardCore_warn(DEBUG_LEVEL_CARD,  "SCardControl for the reader's features failed. 0x%08X (%s:%d)",
					   retValue,  __FILE__, __LINE__);

	} else {
		for (size_t i = 0; i + PCSC_TLV_ELEMENT_SIZE <= recvlen; i += PCSC_TLV_ELEMENT_SIZE)
			if (recvbuf[i] == FEATURE_EXECUTE_PACE)
				memcpy(&m_ioctl_pace, recvbuf + i + 2, 4);
	}

	if (0 == m_ioctl_pace) {
		eCardCore_info(DEBUG_LEVEL_CARD, "Reader does not support PACE");

	} else {
		/* convert to host byte order to use for SCardControl */
		m_ioctl_pace = ntohl(m_ioctl_pace);
		hexdump(DEBUG_LEVEL_CARD, "Execute PACE Input Data (FUNCTION=GetReadersPACECapabilities)", sendbuf, sizeof sendbuf);
		recvlen = sizeof(recvbuf);
		retValue = SCardControl(m_hCard, m_ioctl_pace, sendbuf, sizeof sendbuf,
								recvbuf, sizeof(recvbuf), &recvlen);
		hexdump(DEBUG_LEVEL_CARD, "Execute PACE Output Data (FUNCTION=GetReadersPACECapabilities)", recvbuf, recvlen);

		if (retValue == SCARD_S_SUCCESS
			&& recvlen == 7
			&& recvbuf[0] == 0 && recvbuf[1] == 0
			&& recvbuf[2] == 0 && recvbuf[3] == 0) {
			if (recvbuf[6] & BITMAP_Qualified_Signature)
				eCardCore_info(DEBUG_LEVEL_CARD, "Reader supports qualified signature");

			if (recvbuf[6] & BITMAP_German_eID)
				eCardCore_info(DEBUG_LEVEL_CARD, "Reader supports German eID");

			if (recvbuf[6] & BITMAP_PACE) {
				eCardCore_info(DEBUG_LEVEL_CARD, "Reader supports PACE");

			} else
				m_ioctl_pace = 0;

			if (recvbuf[6] & BITMAP_DestroyPACEChannel)
				eCardCore_info(DEBUG_LEVEL_CARD, "Reader supports DestroyPACEChannel");

		} else {
			eCardCore_warn(DEBUG_LEVEL_CARD, "Error executing GetReadersPACECapabilities");
			m_ioctl_pace = 0;
		}
	}

#endif
}