Use render

* Add transactions menu item
* Use nfc assets for country/currency/aid
* remove deprecated render
This commit is contained in:
Nikita Vostokov
2024-01-28 22:45:26 +00:00
parent 786f3568c0
commit 1074af905c
9 changed files with 105 additions and 992 deletions

View File

@@ -75,7 +75,7 @@ static void nfc_scene_read_success_on_enter_emv(NfcApp* instance) {
// }
const NfcProtocolSupportBase nfc_protocol_support_emv = {
.features = NfcProtocolFeatureNone,
.features = NfcProtocolFeatureMoreInfo,
.scene_info =
{

View File

@@ -1,6 +1,7 @@
#include "emv_render.h"
#include "../iso14443_4a/iso14443_4a_render.h"
#include "nfc/nfc_app_i.h"
void nfc_render_emv_info(const EmvData* data, NfcProtocolFormatType format_type, FuriString* str) {
nfc_render_emv_name(data->emv_application.name, str);
@@ -17,10 +18,18 @@ void nfc_render_emv_data(const EmvData* data, FuriString* str) {
void nfc_render_emv_pan(const uint8_t* data, const uint8_t len, FuriString* str) {
if(len == 0) return;
furi_string_cat_printf(str, "PAN: ");
for(uint8_t i = 0; i < len; i += 2) {
furi_string_cat_printf(str, "%02X%02X ", data[i], data[i + 1]);
FuriString* card_number = furi_string_alloc();
for(uint8_t i = 0; i < len; i++) {
if((i % 2 == 0) && (i != 0)) furi_string_cat_printf(card_number, " ");
furi_string_cat_printf(card_number, "%02X", data[i]);
}
// Cut padding 'F' from card number
furi_string_trim(card_number, "F");
furi_string_cat(str, card_number);
furi_string_free(card_number);
furi_string_cat_printf(str, "\n");
}
@@ -29,16 +38,27 @@ void nfc_render_emv_expired(const EmvApplication* apl, FuriString* str) {
furi_string_cat_printf(str, "Exp: %02X/%02X\n", apl->exp_month, apl->exp_year);
}
void nfc_render_emv_currency(const EmvApplication* apl, FuriString* str) {
UNUSED(apl);
UNUSED(str);
// nfc/assets/currency_code.nfc
void nfc_render_emv_currency(uint16_t cur_code, FuriString* str) {
if(!cur_code) return;
Storage* storage = furi_record_open(RECORD_STORAGE);
FuriString* currency_name = furi_string_alloc();
if(nfc_emv_parser_get_currency_name(storage, cur_code, currency_name)) {
furi_string_cat_printf(str, "Currency: %s\n", furi_string_get_cstr(currency_name));
}
furi_string_free(currency_name);
furi_record_close(RECORD_STORAGE);
}
void nfc_render_emv_country(const EmvApplication* apl, FuriString* str) {
UNUSED(apl);
UNUSED(str);
// nfc/assets/country_code.nfc
void nfc_render_emv_country(uint16_t country_code, FuriString* str) {
if(!country_code) return;
Storage* storage = furi_record_open(RECORD_STORAGE);
FuriString* country_name = furi_string_alloc();
if(nfc_emv_parser_get_country_name(storage, country_code, country_name)) {
furi_string_cat_printf(str, "Country: %s\n", furi_string_get_cstr(country_name));
}
furi_string_free(country_name);
furi_record_close(RECORD_STORAGE);
}
void nfc_render_emv_name(const char* data, FuriString* str) {
@@ -50,28 +70,48 @@ void nfc_render_emv_name(const char* data, FuriString* str) {
void nfc_render_emv_application(const EmvApplication* apl, FuriString* str) {
const uint8_t len = apl->aid_len;
if(len) {
furi_string_cat_printf(str, "AID: ");
for(uint8_t i = 0; i < len; i++) furi_string_cat_printf(str, "%02X", apl->aid[i]);
// nfc/assets/aid.nfc
} else {
furi_string_cat_printf(str, "No Pay Application found");
if(!len) {
furi_string_cat_printf(str, "No Pay Application found\n");
return;
}
furi_string_cat_printf(str, "AID: ");
Storage* storage = furi_record_open(RECORD_STORAGE);
FuriString* aid_name = furi_string_alloc();
if(nfc_emv_parser_get_aid_name(storage, apl->aid, len, aid_name)) {
furi_string_cat_printf(str, "%s", furi_string_get_cstr(aid_name));
} else {
for(uint8_t i = 0; i < len; i++) furi_string_cat_printf(str, "%02X", apl->aid[i]);
}
furi_string_cat_printf(str, "\n");
furi_string_free(aid_name);
furi_record_close(RECORD_STORAGE);
}
void nfc_render_emv_transactions(const EmvApplication* apl, FuriString* str) {
const uint8_t len = apl->active_tr;
if(!len) {
furi_string_cat_printf(str, "No transaction info\n");
return;
}
furi_string_cat_printf(str, "Transactions:\n");
Storage* storage = furi_record_open(RECORD_STORAGE);
FuriString* tmp = furi_string_alloc();
//furi_string_cat_printf(str, "Transactions:\n");
for(int i = 0; i < len; i++) {
if(!apl->trans[i].amount) continue;
// transaction counter
furi_string_cat_printf(str, "\e#%d: ", apl->trans[i].atc);
// Print transaction amount
uint8_t* a = (uint8_t*)&apl->trans[i].amount;
furi_string_cat_printf(str, "%d: ", apl->trans[i].atc);
bool top = true;
for(int x = 0; x < 6; x++) {
// cents
if(x == 5) {
furi_string_cat_printf(str, ".%02X", a[x]);
break;
@@ -85,31 +125,46 @@ void nfc_render_emv_transactions(const EmvApplication* apl, FuriString* str) {
}
}
}
// TODO to string
furi_string_cat_printf(str, " %x\n", apl->trans[i].currency);
// TODO to string
if(apl->trans[i].country)
furi_string_cat_printf(str, "country: %x\n", apl->trans[i].country);
if(apl->trans[i].currency) {
furi_string_set_str(tmp, "UNK");
nfc_emv_parser_get_currency_name(storage, apl->trans[i].currency, tmp);
furi_string_cat_printf(str, " %s\n", furi_string_get_cstr(tmp));
}
if(apl->trans[i].country) {
furi_string_set_str(tmp, "UNK");
nfc_emv_parser_get_country_name(storage, apl->trans[i].country, tmp);
furi_string_cat_printf(str, "Country: %s\n", furi_string_get_cstr(tmp));
}
if(apl->trans[i].date)
furi_string_cat_printf(
str,
"%02lx/%02lx/%02lx ",
apl->trans[i].date >> 16,
(apl->trans[i].date >> 8) & 0xff,
apl->trans[i].date & 0xff);
if(apl->trans[i].time)
furi_string_cat_printf(
str,
"%02lx:%02lx:%02lx ",
"%02lx:%02lx:%02lx\n",
apl->trans[i].time & 0xff,
(apl->trans[i].time >> 8) & 0xff,
apl->trans[i].time >> 16);
if(apl->trans[i].date)
furi_string_cat_printf(
str,
"%02lx/%02lx/%02lx\n",
apl->trans[i].date >> 16,
(apl->trans[i].date >> 8) & 0xff,
apl->trans[i].date & 0xff);
}
furi_string_free(tmp);
furi_record_close(RECORD_STORAGE);
}
void nfc_render_emv_extra(const EmvData* data, FuriString* str) {
nfc_render_emv_currency(data->emv_application.currency_code, str);
nfc_render_emv_country(data->emv_application.country_code, str);
nfc_render_emv_application(&data->emv_application, str);
// PIN try
// transactions counter
//nfc_render_emv_transactions(&data->emv_application, str);
}

View File

@@ -19,8 +19,8 @@ void nfc_render_emv_extra(const EmvData* data, FuriString* str);
void nfc_render_emv_expired(const EmvApplication* apl, FuriString* str);
void nfc_render_emv_country(const EmvApplication* apl, FuriString* str);
void nfc_render_emv_country(uint16_t country_code, FuriString* str);
void nfc_render_emv_currency(const EmvApplication* apl, FuriString* str);
void nfc_render_emv_currency(uint16_t cur_code, FuriString* str);
void nfc_render_emv_transactions(const EmvApplication* data, FuriString* str);