std::vector<uint8_t> NFCReaderUnit::transmitBits(const uint8_t *pbtTx, const size_t szTxBits)
	{
        const int MAX_FRAME_LEN = 264;
        uint8_t abtRx[MAX_FRAME_LEN];
        int szRxBits;

        // Transmit the bit frame command, we don't use the arbitrary parity feature
        if ((szRxBits = nfc_initiator_transceive_bits(d_device, pbtTx, szTxBits, NULL, abtRx, sizeof(abtRx), NULL)) < 0)
        {
            LOG(ERRORS) << "NFC write bits error: " << std::string(nfc_strerror(d_device));
        //    THROW_EXCEPTION_WITH_LOG(LibLogicalAccessException,
        //                             "Writing bits to NFC reader failed: " + std::string(nfc_strerror(d_device)));
            return {};
        }

        return std::vector<uint8_t>(std::begin(abtRx), std::begin(abtRx) + szRxBits / 8 + 1);
    }
Example #2
0
const char *
freefare_strerror (FreefareTag tag)
{
    const char *p = "Unknown error";
    if (nfc_device_get_last_error (tag->device) < 0) {
        p = nfc_strerror (tag->device);
    } else {
        if (tag->tag_info->type == MIFARE_DESFIRE) {
            if (MIFARE_DESFIRE (tag)->last_pcd_error) {
                p = mifare_desfire_error_lookup (MIFARE_DESFIRE (tag)->last_pcd_error);
            } else if (MIFARE_DESFIRE (tag)->last_picc_error) {
                p = mifare_desfire_error_lookup (MIFARE_DESFIRE (tag)->last_picc_error);
            }
        }
    }
    return p;
}
    bool NFCReaderUnit::connect()
    {
		if (isConnected())
		{
			LOG(LogLevel::ERRORS) << EXCEPTION_MSG_CONNECTED;
            disconnect();
		}

		bool connected = d_chip_connected = false;

		if (d_insertedChip && d_chips.find(d_insertedChip) != d_chips.end())
		{
			if (d_chips[d_insertedChip].nm.nmt == NMT_ISO14443A)
			{
				nfc_target pnti;
				nfc_modulation modulation;
				modulation.nmt = NMT_ISO14443A;
				modulation.nbr = NBR_106;

                // prevent infinite wait. Setting this in connectToReader() did not work
                // for unkown reason.
				nfc_safe_call(nfc_device_set_property_bool, d_device, NP_INFINITE_SELECT, false);

                int ret = nfc_initiator_select_passive_target(d_device,
                                                              modulation,
                                                              d_chips[d_insertedChip].nti.nai.abtUid,
                                                              d_chips[d_insertedChip].nti.nai.szUidLen,
                                                              &pnti);
                if (ret > 0)
				{
                    LOG(DEBUGS) << "Selected passive target.";
					d_chip_connected = connected = true;
                    d_insertedChip->setChipIdentifier(getCardSerialNumber(d_chips[d_insertedChip]));
				}
                else if (ret == 0)
                {
                    LOG(DEBUGS) << "No target found when selecting passive NFC target.";
                }
                else
                {
                    LOG(ERRORS) << "NFC Error: " << nfc_strerror(d_device);
                }
			}
		}
		return connected;
    }
/**
 * @brief Display the PCD error a-la perror
 */
void
nfc_perror (const nfc_device_t * pnd, const char *pcString)
{
  fprintf (stderr, "%s: %s\n", pcString, nfc_strerror (pnd));
}
/**
 * @brief Renders the PCD error in pcStrErrBuf for a maximum size of szBufLen chars
 * @return Returns 0 upon success
 */
int
nfc_strerror_r (const nfc_device_t * pnd, char *pcStrErrBuf, size_t szBufLen)
{
  return (snprintf (pcStrErrBuf, szBufLen, "%s", nfc_strerror (pnd)) < 0) ? -1 : 0;
}