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()); }
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; }
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 }