libgcns: C++ version

This commit is contained in:
giomba 2022-01-06 21:12:55 +01:00
parent 060d8ddb19
commit b965e20bfd
3 changed files with 108 additions and 2 deletions

View File

@ -2,9 +2,10 @@ cmake_minimum_required(VERSION 3.18)
project(gcns VERSION 1.0 DESCRIPTION "Italian healthcare smart card parsing utility")
add_library(gcns SHARED gcns.c)
set_target_properties(gcns PROPERTIES PUBLIC_HEADER gcns.h)
add_library(gcns SHARED gcns.c gcns.cpp)
target_include_directories(gcns PUBLIC ../.. .. .)
install(TARGETS gcns LIBRARY)
install(FILES gcns.h gcns.hpp DESTINATION include)
add_executable(main main.c ../tools/util.c)
target_link_libraries(main gcns opensc bsd)

71
src/gcns/gcns.cpp Normal file
View File

@ -0,0 +1,71 @@
#include "gcns.hpp"
#include <vector>
using namespace gcns;
PersonalData::PersonalData(const uint8_t* buffer, size_t len) {
std::vector<std::string> field;
// TODO check length at the beginning?
for (int i = 12; i < len;) {
if (buffer[i] == '\0') break;
std::string hexstring((const char*)&buffer[i], 2);
int len = std::stoi(hexstring, nullptr, 16);
i += 2;
std::string fieldData((const char*)&buffer[i], len);
i += len;
field.push_back(fieldData);
}
for (int i = 0; i < (int)field.size(); ++i) {
switch (i) {
case 0:
this->issue_date.year =
std::stoi(field[i].substr(4, 4), nullptr);
this->issue_date.month =
std::stoi(field[i].substr(2, 2), nullptr);
this->issue_date.day =
std::stoi(field[i].substr(0, 2), nullptr);
break;
case 1:
this->expiration_date.year =
std::stoi(field[i].substr(4, 4), nullptr);
this->expiration_date.month =
std::stoi(field[i].substr(2, 2), nullptr);
this->expiration_date.day =
std::stoi(field[i].substr(0, 2), nullptr);
break;
case 2:
this->family_name = field[i];
break;
case 3:
this->first_name = field[i];
break;
case 4:
this->birth_date.year =
std::stoi(field[i].substr(4, 4), nullptr);
this->birth_date.month =
std::stoi(field[i].substr(2, 2), nullptr);
this->birth_date.day =
std::stoi(field[i].substr(0, 2), nullptr);
break;
case 5:
this->gender = field[i] == "F" ? GENDER_FEMALE : GENDER_MALE;
break;
case 7:
this->fiscal_code = field[i];
break;
case 9:
this->birth_place = field[i];
break;
case 12:
this->residence_place = field[i];
break;
default:
break;
}
}
}

34
src/gcns/gcns.hpp Normal file
View File

@ -0,0 +1,34 @@
#ifndef GCNS_CPP
#define GCNS_CPP
#include <string>
namespace gcns {
enum Gender { GENDER_MALE, GENDER_FEMALE };
struct Date {
uint16_t year;
uint8_t month;
uint8_t day;
};
class PersonalData {
private:
std::string first_name;
std::string family_name;
std::string fiscal_code;
std::string birth_place;
Date birth_date;
std::string residence_place;
Gender gender;
Date issue_date;
Date expiration_date;
public:
PersonalData(const uint8_t* personal_data, size_t len);
};
} // namespace gcns
#endif