emrtd: Employ a workaround for data length of 0x80

This is to make US passport hashes read properly.
https://wf.lavatech.top/ave-but-random/emrtd-data-quirks#EF_SOD
This commit is contained in:
Ave 2020-12-29 19:24:44 +03:00
commit a14b5f7b5f

View file

@ -217,6 +217,11 @@ static int emrtd_get_asn1_data_length(uint8_t *datain, int datainlen, int offset
PrintAndLogEx(DEBUG, "asn1 datalength, lenfield: %02X", lenfield);
if (lenfield <= 0x7f) {
return lenfield;
} else if (lenfield == 0x80) {
// TODO: 0x80 means indeterminate.
// Giving rest of the file is a workaround, nothing more, nothing less.
// More at https://letsencrypt.org/docs/a-warm-welcome-to-asn1-and-der/
return datainlen;
} else if (lenfield == 0x81) {
return ((int) * (datain + offset + 1));
} else if (lenfield == 0x82) {
@ -231,7 +236,7 @@ static int emrtd_get_asn1_field_length(uint8_t *datain, int datainlen, int offse
PrintAndLogEx(DEBUG, "asn1 fieldlength, datain: %s", sprint_hex_inrow(datain, datainlen));
int lenfield = (int) * (datain + offset);
PrintAndLogEx(DEBUG, "asn1 fieldlength, lenfield: %02X", lenfield);
if (lenfield <= 0x7F) {
if (lenfield <= 0x80) {
return 1;
} else if (lenfield == 0x81) {
return 2;