mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-01-07 16:48:15 +08:00
printandlogs..
This commit is contained in:
parent
8d9bd81020
commit
27003904ce
9 changed files with 86 additions and 57 deletions
|
@ -1973,13 +1973,13 @@ int FSKToNRZ(int *data, int *dataLen, int clk, int LowToneFC, int HighToneFC) {
|
|||
int firstClockEdge = 0;
|
||||
ans = fskClocks((uint8_t *) &LowToneFC, (uint8_t *) &HighToneFC, (uint8_t *) &clk, &firstClockEdge);
|
||||
if (g_debugMode > 1) {
|
||||
PrintAndLog("DEBUG FSKtoNRZ: detected clocks: fc_low %i, fc_high %i, clk %i, firstClockEdge %i, ans %u", LowToneFC, HighToneFC, clk, firstClockEdge, ans);
|
||||
PrintAndLogEx(NORMAL, "DEBUG FSKtoNRZ: detected clocks: fc_low %i, fc_high %i, clk %i, firstClockEdge %i, ans %u", LowToneFC, HighToneFC, clk, firstClockEdge, ans);
|
||||
}
|
||||
}
|
||||
// currently only know fsk modulations with field clocks < 10 samples and > 4 samples. filter out to remove false positives (and possibly destroying ask/psk modulated waves...)
|
||||
if (ans == 0 || clk == 0 || LowToneFC == 0 || HighToneFC == 0 || LowToneFC > 10 || HighToneFC < 4) {
|
||||
if (g_debugMode > 1) {
|
||||
PrintAndLog("DEBUG FSKtoNRZ: no fsk clocks found");
|
||||
PrintAndLogEx(NORMAL,"DEBUG FSKtoNRZ: no fsk clocks found");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -238,30 +238,30 @@ int Hf14443_4aGetCardData(iso14a_card_select_t *card) {
|
|||
uint64_t select_status = resp.arg[0]; // 0: couldn't read, 1: OK, with ATS, 2: OK, no ATS, 3: proprietary Anticollision
|
||||
|
||||
if (select_status == 0) {
|
||||
PrintAndLog("E->iso14443a card select failed");
|
||||
PrintAndLogEx(ERR, "E->iso14443a card select failed");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (select_status == 2) {
|
||||
PrintAndLog("E->Card doesn't support iso14443-4 mode");
|
||||
PrintAndLogEx(ERR, "E->Card doesn't support iso14443-4 mode");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (select_status == 3) {
|
||||
PrintAndLog("E->Card doesn't support standard iso14443-3 anticollision");
|
||||
PrintAndLog("\tATQA : %02x %02x", card->atqa[1], card->atqa[0]);
|
||||
PrintAndLogEx(NORMAL, "E->Card doesn't support standard iso14443-3 anticollision");
|
||||
PrintAndLogEx(NORMAL, "\tATQA : %02x %02x", card->atqa[1], card->atqa[0]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
PrintAndLog(" UID: %s", sprint_hex(card->uid, card->uidlen));
|
||||
PrintAndLog("ATQA: %02x %02x", card->atqa[1], card->atqa[0]);
|
||||
PrintAndLog(" SAK: %02x [%" PRIu64 "]", card->sak, resp.arg[0]);
|
||||
PrintAndLogEx(NORMAL, " UID: %s", sprint_hex(card->uid, card->uidlen));
|
||||
PrintAndLogEx(NORMAL, "ATQA: %02x %02x", card->atqa[1], card->atqa[0]);
|
||||
PrintAndLogEx(NORMAL, " SAK: %02x [%" PRIu64 "]", card->sak, resp.arg[0]);
|
||||
if (card->ats_len < 3) { // a valid ATS consists of at least the length byte (TL) and 2 CRC bytes
|
||||
PrintAndLog("E-> Error ATS length(%d) : %s", card->ats_len, sprint_hex(card->ats, card->ats_len));
|
||||
PrintAndLogEx(NORMAL, "E-> Error ATS length(%d) : %s", card->ats_len, sprint_hex(card->ats, card->ats_len));
|
||||
return 1;
|
||||
}
|
||||
PrintAndLog(" ATS: %s", sprint_hex(card->ats, card->ats_len));
|
||||
|
||||
|
||||
PrintAndLogEx(NORMAL, " ATS: %s", sprint_hex(card->ats, card->ats_len));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -385,7 +385,7 @@ int CmdHFMFPRdbl(const char *cmd) {
|
|||
}
|
||||
|
||||
if (blocksCount > 1 && mfIsSectorTrailer(blockn)) {
|
||||
PrintAndLog("WARNING: trailer!");
|
||||
PrintAndLogEx(WARNING, "WARNING: trailer!");
|
||||
}
|
||||
|
||||
uint8_t sectorNum = mfSectorNum(blockn & 0xff);
|
||||
|
|
|
@ -34,24 +34,24 @@ typedef struct {
|
|||
|
||||
static const TAIDList AIDlist [] = {
|
||||
// Visa International
|
||||
{ CV_VISA, "A00000000305076010"}, // VISA ELO Credit
|
||||
{ CV_VISA, "A0000000031010" }, // VISA Debit/Credit (Classic)
|
||||
{ CV_VISA, "A000000003101001" }, // VISA Credit
|
||||
{ CV_VISA, "A000000003101002" }, // VISA Debit
|
||||
{ CV_VISA, "A0000000032010" }, // VISA Electron
|
||||
{ CV_VISA, "A0000000032020" }, // VISA
|
||||
{ CV_VISA, "A0000000033010" }, // VISA Interlink
|
||||
{ CV_VISA, "A0000000034010" }, // VISA Specific
|
||||
{ CV_VISA, "A0000000035010" }, // VISA Specific
|
||||
{ CV_VISA, "A0000000036010" }, // Domestic Visa Cash Stored Value
|
||||
{ CV_VISA, "A0000000036020" }, // International Visa Cash Stored Value
|
||||
{ CV_VISA, "A0000000038002" }, // VISA Auth, VisaRemAuthen EMV-CAP (DPA)
|
||||
{ CV_VISA, "A0000000038010" }, // VISA Plus
|
||||
{ CV_VISA, "A0000000039010" }, // VISA Loyalty
|
||||
{ CV_VISA, "A000000003999910" }, // VISA Proprietary ATM
|
||||
{ CV_VISA, "A00000000305076010" }, // VISA ELO Credit
|
||||
{ CV_VISA, "A0000000031010" }, // VISA Debit/Credit (Classic)
|
||||
{ CV_VISA, "A000000003101001" }, // VISA Credit
|
||||
{ CV_VISA, "A000000003101002" }, // VISA Debit
|
||||
{ CV_VISA, "A0000000032010" }, // VISA Electron
|
||||
{ CV_VISA, "A0000000032020" }, // VISA
|
||||
{ CV_VISA, "A0000000033010" }, // VISA Interlink
|
||||
{ CV_VISA, "A0000000034010" }, // VISA Specific
|
||||
{ CV_VISA, "A0000000035010" }, // VISA Specific
|
||||
{ CV_VISA, "A0000000036010" }, // Domestic Visa Cash Stored Value
|
||||
{ CV_VISA, "A0000000036020" }, // International Visa Cash Stored Value
|
||||
{ CV_VISA, "A0000000038002" }, // VISA Auth, VisaRemAuthen EMV-CAP (DPA)
|
||||
{ CV_VISA, "A0000000038010" }, // VISA Plus
|
||||
{ CV_VISA, "A0000000039010" }, // VISA Loyalty
|
||||
{ CV_VISA, "A000000003999910" }, // VISA Proprietary ATM
|
||||
// Visa USA
|
||||
{ CV_VISA, "A000000098" }, // Debit Card
|
||||
{ CV_VISA, "A0000000980848" }, // Debit Card
|
||||
{ CV_VISA, "A000000098" }, // Debit Card
|
||||
{ CV_VISA, "A0000000980848" }, // Debit Card
|
||||
// Mastercard International
|
||||
{ CV_MASTERCARD, "A00000000401" }, // MasterCard PayPass
|
||||
{ CV_MASTERCARD, "A0000000041010" }, // MasterCard Credit
|
||||
|
@ -66,6 +66,7 @@ static const TAIDList AIDlist [] = {
|
|||
{ CV_MASTERCARD, "A0000000046000" }, // Cirrus
|
||||
{ CV_MASTERCARD, "A0000000048002" }, // SecureCode Auth EMV-CAP
|
||||
{ CV_MASTERCARD, "A0000000049999" }, // MasterCard PayPass
|
||||
{ CV_MASTERCARD, "B012345678" }, // Maestro TEST Used for development
|
||||
// American Express
|
||||
{ CV_AMERICANEXPRESS, "A000000025" },
|
||||
{ CV_AMERICANEXPRESS, "A0000000250000" },
|
||||
|
@ -82,11 +83,41 @@ static const TAIDList AIDlist [] = {
|
|||
// JCB CO., LTD.
|
||||
{ CV_JCB, "A00000006510" }, // JCB
|
||||
{ CV_JCB, "A0000000651010" }, // JCB J Smart Credit
|
||||
// Switch Card Services Ltd.
|
||||
{ CV_SWITCH, "A0000000050001" }, // Maestro UK
|
||||
{ CV_SWITCH, "A0000000050002" }, // Solo
|
||||
// Diners Club International Ltd.
|
||||
{ CV_DINERS, "A0000001523010" }, // Discover, Pulse D Pas Discover Card
|
||||
{ CV_DINERS, "A0000001524010" }, // Discover, Discover Debit Common Card
|
||||
// Other
|
||||
{ CV_OTHER, "A0000001544442" }, // Banricompras Debito - Banrisul - Banco do Estado do Rio Grande do SUL - S.A.
|
||||
{ CV_OTHER, "F0000000030001" }, // BRADESCO
|
||||
{ CV_OTHER, "A0000005241010" }, // RuPay - RuPay
|
||||
{ CV_OTHER, "D5780000021010" } // Bankaxept - Bankaxept
|
||||
{ CV_OTHER, "A00000002401" }, // Midland Bank Plc - Self Service
|
||||
{ CV_OTHER, "A0000000291010" }, // LINK Interchange Network Ltd - Link / American Express
|
||||
{ CV_OTHER, "A00000006900" }, // Société Européenne de Monnaie Electronique SEME - Moneo
|
||||
{ CV_OTHER, "A000000077010000021000000000003B" }, // Oberthur Technologies France - Visa AEPN
|
||||
{ CV_OTHER, "A0000001211010" }, // PBS Danmark A/S - Denmark - Dankort (VISA GEM Vision) - Danish domestic debit card
|
||||
{ CV_OTHER, "A0000001410001" }, // Associazione Bancaria Italiana - Italy - PagoBANCOMAT - CoGeBan Consorzio BANCOMAT (Italian domestic debit card)
|
||||
{ CV_OTHER, "A0000001544442" }, // Banricompras Debito - Banrisul - Banco do Estado do Rio Grande do SUL - S.A.
|
||||
{ CV_OTHER, "A000000172950001" }, // Financial Information Service Co. Ltd. - Taiwan - BAROC Financial Application Taiwan- The Bankers Association of the Republic of China
|
||||
{ CV_OTHER, "A0000001850002" }, // Post Office Limited - United Kingdom - UK Post Office Account card
|
||||
{ CV_OTHER, "A0000002281010" }, // Saudi Arabian Monetary Agency (SAMA) - Kingdom of Saudi Arabia - SPAN (M/Chip) - SPAN2 (Saudi Payments Network) - Saudi Arabia domestic credit/debit card (Saudi Arabia Monetary Agency)
|
||||
{ CV_OTHER, "A0000002282010" }, // Saudi Arabian Monetary Agency (SAMA) - Kingdom of Saudi Arabia - SPAN (VIS) - SPAN2 (Saudi Payments Network) - Saudi Arabia domestic credit/debit card (Saudi Arabia Monetary Agency)
|
||||
{ CV_OTHER, "A0000002771010" }, // Interac Association - Canada - INTERAC - Canadian domestic credit/debit card
|
||||
{ CV_OTHER, "A00000031510100528" }, // Currence Holding/PIN BV - The Netherlands- Currence PuC
|
||||
{ CV_OTHER, "A0000003156020" }, // Currence Holding/PIN BV - The Netherlands - Chipknip
|
||||
{ CV_OTHER, "A0000003591010028001" }, // Euro Alliance of Payment Schemes s.c.r.l. (EAPS) - Belgium - Girocard EAPS - ZKA (Germany)
|
||||
{ CV_OTHER, "A0000003710001" }, // Verve - Nigeria - InterSwitch Verve Card - Nigerian local switch company
|
||||
{ CV_OTHER, "A0000004540010" }, // eTranzact - Nigeria - Etranzact Genesis Card - Nigerian local switch company
|
||||
{ CV_OTHER, "A0000004540011" }, // eTranzact - Nigeria - Etranzact Genesis Card 2 - Nigerian local switch company
|
||||
{ CV_OTHER, "A0000004766C" }, // Google - United States - GOOGLE_PAYMENT_AID
|
||||
{ CV_OTHER, "A0000005241010" }, // RuPay - India - RuPay - RuPay (India)
|
||||
{ CV_OTHER, "A0000006723010" }, // TROY - Turkey - TROY chip credit card - Turkey's Payment Method
|
||||
{ CV_OTHER, "A0000006723020" }, // TROY - Turkey - TROY chip debit card - Turkey's Payment Method
|
||||
{ CV_OTHER, "A0000007705850" }, // Indian Oil Corporation Limited - India - XTRAPOWER Fleet Card Program - Indian Oil’s Pre Paid Program
|
||||
{ CV_OTHER, "D27600002545500100" }, // ZKA - Germany - Girocard - ZKA Girocard (Geldkarte) (Germany)
|
||||
{ CV_OTHER, "D4100000030001" }, // KS X 6923/6924 (T-Money, South Korea and Snapper+, Wellington, New Zealand)
|
||||
{ CV_OTHER, "D5280050218002" }, // The Netherlands - ? - (Netherlands)
|
||||
{ CV_OTHER, "D5780000021010" }, // Bankaxept Norway Bankaxept Norwegian domestic debit card
|
||||
{ CV_OTHER, "F0000000030001" }, // BRADESCO - Brazilian Bank Banco Bradesco
|
||||
};
|
||||
static const size_t AIDlistLen = sizeof(AIDlist) / sizeof(TAIDList);
|
||||
|
||||
|
@ -403,6 +434,8 @@ int EMVSearchPSE(EMVCommandChannel channel, bool ActivateField, bool LeaveFieldO
|
|||
int res;
|
||||
bool fileFound = false;
|
||||
|
||||
char *PSE_or_PPSE = PSENum == 1 ? "PSE" : "PPSE";
|
||||
|
||||
// select PPSE
|
||||
res = EMVSelectPSE(channel, ActivateField, true, PSENum, data, sizeof(data), &datalen, &sw);
|
||||
|
||||
|
@ -452,7 +485,7 @@ int EMVSearchPSE(EMVCommandChannel channel, bool ActivateField, bool LeaveFieldO
|
|||
if (tsfi) {
|
||||
struct tlvdb *tsfitmp = tlvdb_find_path(tsfi, (tlv_tag_t[]) {0x70, 0x61, 0x00});
|
||||
if (!tsfitmp) {
|
||||
PrintAndLogEx(FAILED, "SFI 0x%02d don't have records.", sfidatalen[ui]);
|
||||
PrintAndLogEx(FAILED, "SFI 0x%02d doesn't have any records.", sfidatalen[ui]);
|
||||
continue;
|
||||
}
|
||||
res = EMVCheckAID(channel, decodeTLV, tsfitmp, tlv);
|
||||
|
@ -472,14 +505,14 @@ int EMVSearchPSE(EMVCommandChannel channel, bool ActivateField, bool LeaveFieldO
|
|||
}
|
||||
|
||||
if (!fileFound)
|
||||
PrintAndLogEx(FAILED, "PPSE don't have records.");
|
||||
PrintAndLogEx(FAILED, "PPSE doesn't have any records.");
|
||||
|
||||
tlvdb_free(t);
|
||||
} else {
|
||||
PrintAndLogEx(WARNING, "PPSE ERROR: Can't get TLV from response.");
|
||||
PrintAndLogEx(WARNING, "%s ERROR: Can't get TLV from response.", PSE_or_PPSE);
|
||||
}
|
||||
} else {
|
||||
PrintAndLogEx(WARNING, "PPSE ERROR: Can't select PPSE AID. Error: %d", res);
|
||||
PrintAndLogEx(WARNING, "%s ERROR: Can't select PPSE AID. Error: %d", PSE_or_PPSE, res);
|
||||
}
|
||||
|
||||
if (!LeaveFieldON)
|
||||
|
@ -798,7 +831,7 @@ int trDDA(EMVCommandChannel channel, bool decodeTLV, struct tlvdb *tlv) {
|
|||
return 4;
|
||||
}
|
||||
|
||||
PrintAndLogEx(NORMAL, "\n* * Calc DDOL");
|
||||
PrintAndLogEx(NORMAL, "\n* Calc DDOL");
|
||||
const struct tlv *ddol_tlv = tlvdb_get(tlv, 0x9f49, NULL);
|
||||
if (!ddol_tlv) {
|
||||
ddol_tlv = &default_ddol_tlv;
|
||||
|
@ -816,7 +849,7 @@ int trDDA(EMVCommandChannel channel, bool decodeTLV, struct tlvdb *tlv) {
|
|||
|
||||
PrintAndLogEx(NORMAL, "DDOL data[%d]: %s", ddol_data_tlv->len, sprint_hex(ddol_data_tlv->value, ddol_data_tlv->len));
|
||||
|
||||
PrintAndLogEx(NORMAL, "\n* * Internal Authenticate");
|
||||
PrintAndLogEx(NORMAL, "\n* Internal Authenticate");
|
||||
int res = EMVInternalAuthenticate(channel, true, (uint8_t *)ddol_data_tlv->value, ddol_data_tlv->len, buf, sizeof(buf), &len, &sw, NULL);
|
||||
if (res) {
|
||||
PrintAndLogEx(WARNING, "Internal Authenticate error(%d): %4x. Exit...", res, sw);
|
||||
|
@ -843,7 +876,7 @@ int trDDA(EMVCommandChannel channel, bool decodeTLV, struct tlvdb *tlv) {
|
|||
tlvdb_free(t80);
|
||||
|
||||
if (decodeTLV) {
|
||||
PrintAndLogEx(NORMAL, "* * * Decode response format 1:");
|
||||
PrintAndLogEx(NORMAL, "* * Decode response format 1:");
|
||||
TLVPrintFromTLV(dda_db);
|
||||
}
|
||||
}
|
||||
|
@ -934,7 +967,7 @@ int trCDA(struct tlvdb *tlv, struct tlvdb *ac_tlv, struct tlv *pdol_data_tlv, st
|
|||
|
||||
struct emv_pk *icc_pk = emv_pki_recover_icc_cert(issuer_pk, tlv, sda_tlv);
|
||||
if (!icc_pk) {
|
||||
PrintAndLogEx(WARNING, "Error: ICC setrificate not found. Exit.");
|
||||
PrintAndLogEx(WARNING, "Error: ICC certificate not found. Exit.");
|
||||
emv_pk_free(pk);
|
||||
emv_pk_free(issuer_pk);
|
||||
return 2;
|
||||
|
@ -976,7 +1009,7 @@ int trCDA(struct tlvdb *tlv, struct tlvdb *ac_tlv, struct tlv *pdol_data_tlv, st
|
|||
PrintAndLogEx(NORMAL, "CDA verified OK.");
|
||||
tlvdb_add(tlv, idn_db);
|
||||
} else {
|
||||
PrintAndLogEx(NORMAL, "\nERROR: CDA verify error");
|
||||
PrintAndLogEx(ERR, "\nERROR: CDA verify error");
|
||||
}
|
||||
|
||||
emv_pk_free(pk);
|
||||
|
@ -989,14 +1022,14 @@ int RecoveryCertificates(struct tlvdb *tlvRoot, json_t *root) {
|
|||
|
||||
struct emv_pk *pk = get_ca_pk(tlvRoot);
|
||||
if (!pk) {
|
||||
PrintAndLog("ERROR: Key not found. Exit.");
|
||||
PrintAndLogEx(ERR, "ERROR: Key not found. Exit.");
|
||||
return 1;
|
||||
}
|
||||
|
||||
struct emv_pk *issuer_pk = emv_pki_recover_issuer_cert(pk, tlvRoot);
|
||||
if (!issuer_pk) {
|
||||
emv_pk_free(pk);
|
||||
PrintAndLog("WARNING: Issuer certificate not found. Exit.");
|
||||
PrintAndLogEx(WARNING, "WARNING: Issuer certificate not found. Exit.");
|
||||
return 2;
|
||||
}
|
||||
PrintAndLogEx(SUCCESS, "Issuer PK recovered. RID %02hhx:%02hhx:%02hhx:%02hhx:%02hhx IDX %02hhx CSN %02hhx:%02hhx:%02hhx",
|
||||
|
|
|
@ -94,7 +94,7 @@ int ExecuteCryptoTests(bool verbose) {
|
|||
res = roca_self_test();
|
||||
if (res) TestFail = true;
|
||||
|
||||
PrintAndLog("\n--------------------------");
|
||||
PrintAndLogEx(NORMAL, "\n--------------------------");
|
||||
|
||||
if (TestFail)
|
||||
PrintAndLogEx(FAILED, "\tTest(s) [ %s ]", _RED_("FAIL"));
|
||||
|
|
|
@ -405,13 +405,13 @@ int loadFileJSON(const char *preferredName, const char *suffix, void *data, size
|
|||
|
||||
root = json_load_file(fileName, 0, &error);
|
||||
if (!root) {
|
||||
PrintAndLog("ERROR: json " _YELLOW_("%s") " error on line %d: %s", fileName, error.line, error.text);
|
||||
PrintAndLogEx(ERR, "ERROR: json " _YELLOW_("%s") " error on line %d: %s", fileName, error.line, error.text);
|
||||
retval = 2;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!json_is_object(root)) {
|
||||
PrintAndLog("ERROR: Invalid json " _YELLOW_("%s") " format. root must be an object.", fileName);
|
||||
PrintAndLogEx(ERR, "ERROR: Invalid json " _YELLOW_("%s") " format. root must be an object.", fileName);
|
||||
retval = 3;
|
||||
goto out;
|
||||
}
|
||||
|
|
|
@ -164,7 +164,7 @@ int CalculateMAC(mf4Session *session, MACType_t mtype, uint8_t blockNum, uint8_t
|
|||
}
|
||||
|
||||
if (verbose)
|
||||
PrintAndLog("MAC data[%d]: %s", macdatalen, sprint_hex(macdata, macdatalen));
|
||||
PrintAndLogEx(NORMAL, "MAC data[%d]: %s", macdatalen, sprint_hex(macdata, macdatalen));
|
||||
|
||||
return aes_cmac8(NULL, session->Kmac, macdata, mac, macdatalen);
|
||||
}
|
||||
|
@ -285,7 +285,7 @@ int MifareAuth4(mf4Session *session, uint8_t *keyn, uint8_t *key, bool activateF
|
|||
DropField();
|
||||
|
||||
if (verbose)
|
||||
PrintAndLog("");
|
||||
PrintAndLogEx(NORMAL, "");
|
||||
|
||||
if (session) {
|
||||
session->Authenticated = true;
|
||||
|
|
|
@ -44,8 +44,6 @@ extern int PlotGridX, PlotGridY, PlotGridXdefault, PlotGridYdefault, CursorCPos,
|
|||
extern bool GridLocked;
|
||||
extern bool showDemod;
|
||||
|
||||
//extern uint8_t g_debugMode;
|
||||
|
||||
extern pthread_mutex_t print_lock;
|
||||
|
||||
void iceIIR_Butterworth(int *data, const size_t len);
|
||||
|
|
|
@ -128,13 +128,13 @@ int FillBuffer(uint8_t *data, size_t maxDataLength, size_t *dataLength, ...) {
|
|||
va_start(valist, dataLength);
|
||||
|
||||
uint8_t *vdata = NULL;
|
||||
size_t vlength = 0;
|
||||
|
||||
do {
|
||||
vdata = va_arg(valist, uint8_t *);
|
||||
if (!vdata)
|
||||
break;
|
||||
|
||||
vlength = va_arg(valist, size_t);
|
||||
size_t vlength = va_arg(valist, size_t);
|
||||
if (*dataLength + vlength > maxDataLength) {
|
||||
va_end(valist);
|
||||
return 1;
|
||||
|
@ -650,12 +650,10 @@ https://github.com/ApertureLabsLtd/RFIDler/blob/master/firmware/Pic32/RFIDler.X/
|
|||
int hextobinarray(char *target, char *source) {
|
||||
int length, i, count = 0;
|
||||
char *start = source;
|
||||
char x;
|
||||
|
||||
length = strlen(source);
|
||||
// process 4 bits (1 hex digit) at a time
|
||||
while (length--) {
|
||||
x = *(source++);
|
||||
char x = *(source++);
|
||||
// capitalize
|
||||
if (x >= 'a' && x <= 'f')
|
||||
x -= 32;
|
||||
|
|
Loading…
Reference in a new issue