MRTD Reference MrtdData from MrtdApplication

This commit is contained in:
Chris van Marle
2022-10-27 19:56:45 +02:00
parent bd5b0da361
commit a629a39017
3 changed files with 21 additions and 20 deletions
+4 -4
View File
@@ -288,8 +288,8 @@ static bool nfc_worker_read_bank_card(NfcWorker* nfc_worker, FuriHalNfcTxRxConte
static bool nfc_worker_read_mrtd(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) {
bool read_success = false;
MrtdApplication* mrtd_app = mrtd_alloc_init(tx_rx);
MrtdData* mrtd_data = &nfc_worker->dev_data->mrtd_data;
MrtdApplication* mrtd_app = mrtd_alloc_init(tx_rx, mrtd_data);
if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) {
reader_analyzer_prepare_tx_rx(nfc_worker->reader_analyzer, tx_rx, false);
@@ -310,14 +310,14 @@ static bool nfc_worker_read_mrtd(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* t
break;
}
if(!mrtd_authenticate(mrtd_app, mrtd_data)) {
if(!mrtd_authenticate(mrtd_app)) {
// At least we're reading an MRTD and should the app switch to the NFC scenes
read_success = true;
break; // Authentication failed
}
mrtd_read_parse_file(mrtd_app, mrtd_data, EF.COM);
mrtd_read_parse_file(mrtd_app, mrtd_data, EF.DG1);
mrtd_read_parse_file(mrtd_app, EF.COM);
mrtd_read_parse_file(mrtd_app, EF.DG1);
read_success = true;
} while(false);
+13 -12
View File
@@ -389,7 +389,7 @@ bool parse_ef_dg1(EF_DG1_contents* DG1, const uint8_t* data, size_t length) {
return true;
}
bool mrtd_read_parse_file(MrtdApplication* app, MrtdData* mrtd_data, EFFile file) {
bool mrtd_read_parse_file(MrtdApplication* app, EFFile file) {
uint8_t buffer[100];
size_t buf_len;
@@ -414,13 +414,13 @@ bool mrtd_read_parse_file(MrtdApplication* app, MrtdData* mrtd_data, EFFile file
bool result = false;
if(file.file_id == EF.COM.file_id) {
result = parse_ef_com(&mrtd_data->files.EF_COM, buffer, buf_len);
result = parse_ef_com(&app->mrtd_data->files.EF_COM, buffer, buf_len);
FURI_LOG_D(TAG, "Parsed EF.COM");
} else if(file.file_id == EF.DIR.file_id) {
result = parse_ef_dir(&mrtd_data->files.EF_DIR, buffer, buf_len);
result = parse_ef_dir(&app->mrtd_data->files.EF_DIR, buffer, buf_len);
FURI_LOG_D(TAG, "Parsed EF.DIR");
} else if(file.file_id == EF.DG1.file_id) {
result = parse_ef_dg1(&mrtd_data->files.DG1, buffer, buf_len);
result = parse_ef_dg1(&app->mrtd_data->files.DG1, buffer, buf_len);
} else {
FURI_LOG_W(TAG, "Don't know how to parse file with id 0x%04X", file.file_id);
}
@@ -428,10 +428,11 @@ bool mrtd_read_parse_file(MrtdApplication* app, MrtdData* mrtd_data, EFFile file
return result;
}
MrtdApplication* mrtd_alloc_init(FuriHalNfcTxRxContext* tx_rx) {
MrtdApplication* mrtd_alloc_init(FuriHalNfcTxRxContext* tx_rx, MrtdData* mrtd_data) {
MrtdApplication* app = malloc(sizeof(MrtdApplication));
app->tx_rx = tx_rx;
app->mrtd_data = mrtd_data;
return app;
}
@@ -535,17 +536,17 @@ bool mrtd_bac(MrtdApplication* app, MrtdAuthData* auth) {
return true;
}
bool mrtd_authenticate(MrtdApplication* app, MrtdData* mrtd_data) {
MrtdAuthMethod method = mrtd_data->auth.method;
mrtd_data->auth_success = false;
mrtd_data->auth_method_used = MrtdAuthMethodNone;
bool mrtd_authenticate(MrtdApplication* app) {
MrtdAuthMethod method = app->mrtd_data->auth.method;
app->mrtd_data->auth_success = false;
app->mrtd_data->auth_method_used = MrtdAuthMethodNone;
FURI_LOG_D(TAG, "Auth method: %d", method);
switch(method) {
case MrtdAuthMethodAny:
//TODO: try PACE, then BAC. For now, fall through to just BAC
case MrtdAuthMethodBac:
mrtd_data->auth_success = mrtd_bac(app, &mrtd_data->auth);
mrtd_data->auth_method_used = MrtdAuthMethodBac;
app->mrtd_data->auth_success = mrtd_bac(app, &app->mrtd_data->auth);
app->mrtd_data->auth_method_used = MrtdAuthMethodBac;
break;
case MrtdAuthMethodPace:
FURI_LOG_E(TAG, "Auth method PACE not implemented");
@@ -555,7 +556,7 @@ bool mrtd_authenticate(MrtdApplication* app, MrtdData* mrtd_data) {
break;
}
if(!mrtd_data->auth_success) {
if(!app->mrtd_data->auth_success) {
return false;
}
+4 -4
View File
@@ -8,6 +8,7 @@
typedef struct {
FuriHalNfcTxRxContext* tx_rx;
MrtdData* mrtd_data;
uint16_t file_offset;
uint8_t ksenc[16];
uint8_t ksmac[16];
@@ -17,11 +18,10 @@ typedef struct {
} MrtdApplication;
//TODO: description
MrtdApplication* mrtd_alloc_init(FuriHalNfcTxRxContext* tx_rx);
void mrtd_test(MrtdApplication* app, MrtdData* mrtd_data); //TODO: remove
MrtdApplication* mrtd_alloc_init(FuriHalNfcTxRxContext* tx_rx, MrtdData* mrtd_data);
bool mrtd_select_app(MrtdApplication* app, AIDValue aid);
bool mrtd_authenticate(MrtdApplication* app, MrtdData* mrtd_data);
bool mrtd_read_parse_file(MrtdApplication* app, MrtdData* mrtd_data, EFFile file);
bool mrtd_authenticate(MrtdApplication* app);
bool mrtd_read_parse_file(MrtdApplication* app, EFFile file);
bool mrtd_auth_params_save(Storage* storage, DialogsApp* dialogs, MrtdAuthData* auth_data, const char* file_name);
bool mrtd_auth_params_save_file(Storage* storage, DialogsApp* dialogs, MrtdAuthData* auth_data, const char* file_name, const char* folder, const char* extension);