MRTD Show month as text

This commit is contained in:
Chris van Marle
2022-10-11 22:13:42 +02:00
parent d1a1cbff82
commit 6003f85601
4 changed files with 50 additions and 13 deletions
@@ -1,6 +1,22 @@
#include "../nfc_i.h"
#include <dolphin/dolphin.h>
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';
+15 -9
View File
@@ -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) {
+13
View File
@@ -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);
+4 -2
View File
@@ -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);