diff --git a/applications/main/nfc/scenes/nfc_scene_passport_read_auth.c b/applications/main/nfc/scenes/nfc_scene_passport_read_auth.c index 541ac3ee4..05f642eec 100644 --- a/applications/main/nfc/scenes/nfc_scene_passport_read_auth.c +++ b/applications/main/nfc/scenes/nfc_scene_passport_read_auth.c @@ -1,6 +1,22 @@ #include "../nfc_i.h" #include +const char months[13][4] = { + "---", + "JAN", + "FEB", + "MAR", + "APR", + "MAY", + "JUN", + "JUL", + "AUG", + "SEP", + "OCT", + "NOV", + "DEC", +}; + void nfc_scene_passport_read_auth_widget_callback(GuiButtonType result, InputType type, void* context) { Nfc* nfc = context; if(type == InputTypeShort) { @@ -55,9 +71,9 @@ void nfc_scene_passport_read_auth_on_enter(void* context) { string_cat_printf(temp_str, "Name: %s\n", DG1->name); string_cat_printf(temp_str, "DocNr: %s\n", DG1->docnr); string_cat_printf(temp_str, "Nationality: %s\n", DG1->nationality); - string_cat_printf(temp_str, "Birth Date: %s\n", DG1->birth_date); + string_cat_printf(temp_str, "Birth Date: %02d %s %02d\n", DG1->birth_date.day, months[DG1->birth_date.month], DG1->birth_date.year); string_cat_printf(temp_str, "Sex: %s\n", DG1->sex); - string_cat_printf(temp_str, "Expiry Date: %s\n", DG1->expiry_date); + string_cat_printf(temp_str, "Expiry Date: %02d %s %02d\n", DG1->expiry_date.day, months[DG1->expiry_date.month], DG1->expiry_date.year); /* char iso_type = FURI_BIT(data->sak, 5) ? '4' : '3'; diff --git a/lib/nfc/protocols/mrtd.c b/lib/nfc/protocols/mrtd.c index a8a3b2f94..2f10584ce 100644 --- a/lib/nfc/protocols/mrtd.c +++ b/lib/nfc/protocols/mrtd.c @@ -323,10 +323,12 @@ bool parse_ef_dg1(EF_DG1_contents* DG1, const uint8_t* data, size_t length) { mrzcpy(DG1->docnr, mrz, &idx, 9); idx += 1; // docnr check digit idx += 15; // optional data - mrzcpy(DG1->birth_date, mrz, &idx, 6); + mrtd_parse_date(&DG1->birth_date, mrz + idx); + idx += 6; // birth_date idx += 1; // birth date check digit mrzcpy(DG1->sex, mrz, &idx, 1); - mrzcpy(DG1->expiry_date, mrz, &idx, 6); + mrtd_parse_date(&DG1->expiry_date, mrz + idx); + idx += 6; // expiry_date idx += 1; // expiry date check digit mrzcpy(DG1->nationality, mrz, &idx, 3); idx += 11; // optional data @@ -342,10 +344,12 @@ bool parse_ef_dg1(EF_DG1_contents* DG1, const uint8_t* data, size_t length) { mrzcpy(DG1->docnr, mrz, &idx, 9); idx += 1; // docnr check digit mrzcpy(DG1->nationality, mrz, &idx, 3); - mrzcpy(DG1->birth_date, mrz, &idx, 6); + mrtd_parse_date(&DG1->birth_date, mrz + idx); + idx += 6; // birth_date idx += 1; // birth date check digit mrzcpy(DG1->sex, mrz, &idx, 1); - mrzcpy(DG1->expiry_date, mrz, &idx, 6); + mrtd_parse_date(&DG1->expiry_date, mrz + idx); + idx += 6; // expiry_date idx += 1; // expiry date check digit idx += 7; // optional data idx += 1; // check digit @@ -359,10 +363,12 @@ bool parse_ef_dg1(EF_DG1_contents* DG1, const uint8_t* data, size_t length) { mrzcpy(DG1->docnr, mrz, &idx, 9); idx += 1; // docnr check digit mrzcpy(DG1->nationality, mrz, &idx, 3); - mrzcpy(DG1->birth_date, mrz, &idx, 6); + mrtd_parse_date(&DG1->birth_date, mrz + idx); idx += 1; // birth date check digit + idx += 6; // birth_date mrzcpy(DG1->sex, mrz, &idx, 1); - mrzcpy(DG1->expiry_date, mrz, &idx, 6); + mrtd_parse_date(&DG1->expiry_date, mrz + idx); + idx += 6; // expiry_date idx += 1; // expiry date check digit idx += 14; // optional data idx += 1; // check digit @@ -453,9 +459,9 @@ void mrtd_test(MrtdApplication* app, MrtdData* mrtd_data) { mrtd_read_parse_file(app, mrtd_data, EF.DG1); - mrtd_read_dump(app, EF.DG2); - mrtd_read_dump(app, EF.DG14); - mrtd_read_dump(app, EF.DG15); + //mrtd_read_dump(app, EF.DG2); + //mrtd_read_dump(app, EF.DG14); + //mrtd_read_dump(app, EF.DG15); } MrtdApplication* mrtd_alloc_init(FuriHalNfcTxRxContext* tx_rx) { diff --git a/lib/nfc/protocols/mrtd_helpers.c b/lib/nfc/protocols/mrtd_helpers.c index 1ca76981e..7456830d1 100644 --- a/lib/nfc/protocols/mrtd_helpers.c +++ b/lib/nfc/protocols/mrtd_helpers.c @@ -40,6 +40,19 @@ void mrtd_print_date(char* output, MrtdDate* date) { output[5] = (date->day % 10) + '0'; } +uint8_t charval(char c) { + if(c >= '0' && c <= '9') { + return c - '0'; + } + return 0; +} + +void mrtd_parse_date(MrtdDate* date, const unsigned char* input) { + date->year = charval(input[0]) * 10 + charval(input[1]); + date->month = charval(input[2]) * 10 + charval(input[3]); + date->day = charval(input[4]) * 10 + charval(input[5]); +} + bool mrtd_bac_get_kmrz(MrtdAuthData* auth, char* output, uint8_t output_size) { uint8_t idx = 0; uint8_t docnr_length = strlen(auth->doc_number); diff --git a/lib/nfc/protocols/mrtd_helpers.h b/lib/nfc/protocols/mrtd_helpers.h index 18fe9f71f..83197d95e 100644 --- a/lib/nfc/protocols/mrtd_helpers.h +++ b/lib/nfc/protocols/mrtd_helpers.h @@ -122,11 +122,11 @@ typedef struct { uint8_t doctype[3]; uint8_t issuing_state[4]; uint8_t name[40]; + MrtdDate birth_date; uint8_t docnr[10]; uint8_t nationality[4]; - uint8_t birth_date[7]; uint8_t sex[2]; - uint8_t expiry_date[7]; + MrtdDate expiry_date; } EF_DG1_contents; uint8_t mrtd_bac_check_digit(const char* input, const uint8_t length); @@ -134,6 +134,8 @@ uint8_t mrtd_bac_check_digit(const char* input, const uint8_t length); //TODO: swap order, all other functions have output last void mrtd_print_date(char* output, MrtdDate* date); +void mrtd_parse_date(MrtdDate* date, const unsigned char* input); + bool mrtd_bac_get_kmrz(MrtdAuthData* auth, char* output, uint8_t output_size); bool mrtd_bac_keys_from_seed(const uint8_t* kseed, uint8_t* ksenc, uint8_t* ksmac);