parse dg13 (all user information stored)
This commit is contained in:
parent
c46e8e8277
commit
ce7a132ae2
@ -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() {
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user