@li0ard/tsemrtd
Version:
simple library for eMRTD. supports browsers, node, bun and more!
77 lines (76 loc) • 3.14 kB
JavaScript
import { TLV } from "@li0ard/tinytlv";
import { TAGS } from "./consts/enums.js";
import { validateDataGroupTag, bytesToAscii, bytesToHex } from "./utils.js";
/**
* Class for working with DG12 (Additional document data)
*/
export class DG12 {
/**
* Get additional document data
* @param data Data of EF.DG12 file
*/
static load(data) {
const ISSUING_AUTHORITY_TAG = 0x5F19;
// yyyymmdd
const DATE_OF_ISSUE_TAG = 0x5F26;
// formatted per ICAO 9303 rules
const NAME_OF_OTHER_PERSON_ARRAY_TAG = 0xA0;
const NAME_OF_OTHER_PERSON_TAG = 0x5F1A;
const ENDORSEMENTS_AND_OBSERVATIONS_TAG = 0x5F1B;
const TAX_OR_EXIT_REQUIREMENTS_TAG = 0x5F1C;
// Image per ISO/IEC 10918
const IMAGE_OF_FRONT_TAG = 0x5F1D;
const IMAGE_OF_REAR_TAG = 0x5F1E;
// yyyymmddhhmmss
const DATE_AND_TIME_OF_PERSONALIZATION = 0x5F55;
const PERSONALIZATION_SYSTEM_SERIAL_NUMBER_TAG = 0x5F56;
let dateOfIssue = 0, issuingAuthority = "", namesOfOtherPersons = [], endorsements = "", taxAndExitReqs = "", imageOfFront = Uint8Array.from([]), imageOfRear = Uint8Array.from([]), dateOfPersonalization = 0, personalizationNumber = "";
const tlv = TLV.parse(data);
validateDataGroupTag(tlv, TAGS.DG12);
for (const i of tlv.childs) {
switch (parseInt(i.tag, 16)) {
case ISSUING_AUTHORITY_TAG:
issuingAuthority = bytesToAscii(i.byteValue);
break;
case DATE_OF_ISSUE_TAG:
dateOfIssue = parseInt(bytesToHex(i.byteValue));
break;
case NAME_OF_OTHER_PERSON_ARRAY_TAG:
for (const j of i.childs) {
if (parseInt(j.tag, 16) == NAME_OF_OTHER_PERSON_TAG)
namesOfOtherPersons.push(bytesToAscii(j.byteValue));
}
break;
case ENDORSEMENTS_AND_OBSERVATIONS_TAG:
endorsements = bytesToAscii(i.byteValue);
break;
case TAX_OR_EXIT_REQUIREMENTS_TAG:
taxAndExitReqs = bytesToAscii(i.byteValue);
break;
case IMAGE_OF_FRONT_TAG:
imageOfFront = i.byteValue;
break;
case IMAGE_OF_REAR_TAG:
imageOfRear = i.byteValue;
break;
case DATE_AND_TIME_OF_PERSONALIZATION:
dateOfPersonalization = parseInt(bytesToHex(i.byteValue));
break;
case PERSONALIZATION_SYSTEM_SERIAL_NUMBER_TAG:
personalizationNumber = bytesToAscii(i.byteValue);
break;
}
}
return {
dateOfIssue,
issuingAuthority,
namesOfOtherPersons,
endorsements,
taxAndExitReqs,
imageOfFront,
imageOfRear,
dateOfPersonalization,
personalizationNumber
};
}
}