parse dg13 (all user information stored)

This commit is contained in:
nganhkhoa 2023-03-08 12:40:00 +07:00
parent c46e8e8277
commit ce7a132ae2
2 changed files with 144 additions and 0 deletions

View File

@ -442,6 +442,125 @@ void Connector::set_user_data(bytes mrz) {
}
}
void Connector::set_user_info(bytes dg13) {
// auto bio = BIO_new_mem_buf(dg13.data(), dg13.size());
const unsigned char* dg13ptr = dg13.data() + 4;
auto typ = d2i_ASN1_SEQUENCE_ANY(nullptr, &dg13ptr, dg13.size() - 4);
if (typ == nullptr && sk_ASN1_TYPE_num(typ) != 3) {
throw "Expect a sequence in dg13";
}
auto info_set = sk_ASN1_TYPE_value(typ, 2);
if (info_set->type != V_ASN1_SET) {
throw "Expect a set in dg13";
}
const unsigned char* info_ptr = info_set->value.set->data;
auto set = d2i_ASN1_SET_ANY(nullptr, &info_ptr, info_set->value.set->length);
for (size_t i = 0; i < sk_ASN1_TYPE_num(set); i++) {
if (i == 13) {
// intentionally left blank
continue;
}
auto tmp = sk_ASN1_TYPE_value(set, i);
const unsigned char* tmp_ptr = tmp->value.sequence->data;
auto info_wrapper = d2i_ASN1_SEQUENCE_ANY(nullptr, &tmp_ptr, tmp->value.sequence->length);
if (i == 12) {
// family members, sequence
for (size_t n = 1; n < sk_ASN1_TYPE_num(info_wrapper); n++) {
auto member_wrapper = sk_ASN1_TYPE_value(info_wrapper, n);
const unsigned char* tmp_ptr = member_wrapper->value.sequence->data;
auto member_seq = d2i_ASN1_SEQUENCE_ANY(nullptr, &tmp_ptr, member_wrapper->value.sequence->length);
auto member = sk_ASN1_TYPE_value(member_seq, 0);
std::string name = (const char*)ASN1_STRING_get0_data(member->value.printablestring);
switch (n) {
case 1:
passport.fatherName = name;
break;
case 2:
passport.motherName = name;
break;
default:
break;
}
}
continue;
}
auto info = sk_ASN1_TYPE_value(info_wrapper, 1);
// we have utf8string and printablestring but they are equal,
// internal struct of openssl have the same offset
std::string data = (const char*)ASN1_STRING_get0_data(info->value.printablestring);
switch (i) {
case 0:
passport.documentFullNumber = data;
break;
case 1:
passport.fullName = data;
break;
case 2:
passport.birthdateStr = data;
break;
case 3:
passport.genderStr = data;
break;
case 4:
passport.nationalityStr = data;
break;
case 5:
passport.ethnicity = data;
break;
case 6:
passport.belief = data;
break;
case 7:
passport.hometown = data;
break;
case 8:
passport.permanentAddress = data;
break;
case 9:
passport.faceFeature = data;
break;
case 10:
passport.cardIssueDate = data;
break;
case 11:
passport.expiryDateStr = data;
break;
case 14:
passport.other1 = data;
break;
case 15:
passport.other2 = data;
}
}
LOGI("documentFullNumber: %s", passport.documentFullNumber.c_str());
LOGI("fullName: %s", passport.fullName.c_str());
LOGI("birthdateStr: %s", passport.birthdateStr.c_str());
LOGI("genderStr: %s", passport.genderStr.c_str());
LOGI("nationalityStr: %s", passport.nationalityStr.c_str());
LOGI("ethnicity: %s", passport.ethnicity.c_str());
LOGI("belief: %s", passport.belief.c_str());
LOGI("hometown: %s", passport.hometown.c_str());
LOGI("permanentAddress: %s", passport.permanentAddress.c_str());
LOGI("faceFeature: %s", passport.faceFeature.c_str());
LOGI("cardIssueDate: %s", passport.cardIssueDate.c_str());
LOGI("expiryDateStr: %s", passport.expiryDateStr.c_str());
LOGI("fatherName: %s", passport.fatherName.c_str());
LOGI("motherName: %s", passport.motherName.c_str());
LOGI("other1: %s", passport.other1.c_str());
LOGI("other2: %s", passport.other2.c_str());
}
void Connector::set_user_picture(bytes dg2) {
auto pattern1 = bytes{0xFF, 0xD8, 0xFF, 0xE0};
auto pattern2 = bytes{0x00, 0x00, 0x00, 0x0C, 0x6A, 0x50};
@ -486,6 +605,8 @@ void Connector::readEFDG13() {
SHA256(content.data(), content.size(), digest.data());
LOGI("FILE DG13 size %d", content.size());
logBytes("FILE DG13 sha256 %s", digest);
logBytes("DG13 content %s", content);
set_user_info(content);
calculatedDigests[13] = digest;
}
void Connector::readEFDG14() {
@ -494,6 +615,7 @@ void Connector::readEFDG14() {
SHA256(content.data(), content.size(), digest.data());
LOGI("FILE DG14 size %d", content.size());
logBytes("FILE DG14 sha256 %s", digest);
logBytes("DG14 content %s", content);
calculatedDigests[14] = digest;
}
void Connector::readEFDG15() {

View File

@ -13,6 +13,7 @@
#include "des.h"
struct PassportData {
// mrz, dg1
std::string country;
std::string documentNumber;
std::string gender;
@ -23,7 +24,27 @@ struct PassportData {
time_t birthDate;
time_t expiryDate;
// dg2
bytes portrait;
// dg13
std::string documentFullNumber;
std::string fullName;
std::string birthdateStr;
std::string genderStr;
std::string nationalityStr;
std::string ethnicity;
std::string belief;
std::string hometown;
std::string permanentAddress;
std::string faceFeature;
std::string cardIssueDate;
std::string expiryDateStr;
std::string fatherName;
std::string motherName;
std::string other1;
std::string other2;
};
class TLV {
@ -244,6 +265,7 @@ private:
bytes readBinary(size_t offset, size_t length);
void set_user_data(bytes data);
void set_user_info(bytes data);
void set_user_picture(bytes data);
std::unordered_map<int, bytes> calculatedDigests;