mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2026-07-21 00:58:10 -07:00
MRTD Show month as text
This commit is contained in:
@@ -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';
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user