utils: Fix BER-TLV tag decode for multi-byte tags

We cannot simply skip anything that has 0xFF as first byte to detect
the padding after the end of a TLV object:

0xFF may very well be a valid first octet of a multi-octet TAG:

Tags of private class (11) with constructed (1) payload will have 0xFF
as first octet.

So let's expand the check to only detect padding in case of either only
a single byte FF being left, or two FF following each other [with
whatever suffix].

Change-Id: I5d64ce9ef1d973804daabae0b15c2e2349e6fab9
This commit is contained in:
Harald Welte 2021-10-21 13:46:59 +02:00
parent 5895380a45
commit 9a75410a88
1 changed files with 2 additions and 1 deletions

View File

@ -173,7 +173,8 @@ def bertlv_parse_tag_raw(binary:bytes) -> Tuple[int, bytes]:
Returns:
Tuple of (tag:int, remainder:bytes)
"""
if binary[0] == 0xff:
# check for FF padding at the end, as customary in SIM card files
if binary[0] == 0xff and len(binary) == 1 or binary[0] == 0xff and binary[1] == 0xff:
return None, binary
tag = binary[0] & 0x1f
if tag <= 30: