This commit is contained in:
RogueMaster
2022-10-28 23:06:17 -04:00
parent 9345f6fd6f
commit 5c219ee7e9
12 changed files with 441 additions and 305 deletions

View File

@@ -15,7 +15,7 @@ TlvInfo iso7816_tlv_parse(const uint8_t* data) {
tlv.tag = *(data++);
tlv.ber.constructed = ((tlv.tag & 0x20) != 0);
tlv.ber.class = (tlv.tag >> 6) & 0x03;
if ((tlv.tag & 0x1f) == 0x1f) {
if((tlv.tag & 0x1f) == 0x1f) {
// BER-TLV, multi byte tag
tlv.tag <<= 8;
tlv.tag |= *(data++);
@@ -33,19 +33,19 @@ TlvInfo iso7816_tlv_parse(const uint8_t* data) {
//TODO: check for invalid 'indefinite length'
tlv.length = *(data++);
if (tlv.length == 0xff) {
if(tlv.length == 0xff) {
// Simple-TLV 2 byte length
tlv.length = *(data++) << 8;
tlv.length += *(data++);
} else if(tlv.length > 0x7f) {
uint8_t length_bytes = tlv.length & 0x7f;
//printf("BER length of %d bytes\n", length_bytes);
if (length_bytes < 1 || length_bytes > 4) {
if(length_bytes < 1 || length_bytes > 4) {
//TODO: error: ISO7816 doesn't support more than 4 length bytes
return (TlvInfo){.tag = 0};
}
tlv.length = 0;
for(uint8_t i=0; i<length_bytes; ++i) {
for(uint8_t i = 0; i < length_bytes; ++i) {
//printf("byte %d: %02x\n", i, *data);
tlv.length <<= 8;
tlv.length |= *(data++);
@@ -57,7 +57,8 @@ TlvInfo iso7816_tlv_parse(const uint8_t* data) {
return tlv;
}
TlvInfo iso7816_tlv_select(const uint8_t* data, size_t length, const uint16_t tags[], size_t num_tags) {
TlvInfo
iso7816_tlv_select(const uint8_t* data, size_t length, const uint16_t tags[], size_t num_tags) {
TlvInfo tlv;
size_t offset = 0;
@@ -72,11 +73,12 @@ TlvInfo iso7816_tlv_select(const uint8_t* data, size_t length, const uint16_t ta
if(num_tags == 1) {
return tlv;
} else {
return iso7816_tlv_select(tlv.value, tlv.length, tags+1, num_tags - 1);
return iso7816_tlv_select(tlv.value, tlv.length, tags + 1, num_tags - 1);
}
}
offset = tlv.next - data; // TODO: use some length value of TlvInfo instead of this monstrosity
offset =
tlv.next - data; // TODO: use some length value of TlvInfo instead of this monstrosity
}
return (TlvInfo){.tag = 0x0000};