This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
laforge gerrit-no-reply at lists.osmocom.orglaforge has uploaded this change for review. ( https://gerrit.osmocom.org/c/pysim/+/24450 )
Change subject: utils: Add bertlv_encode_tag()
......................................................................
utils: Add bertlv_encode_tag()
We so far had decoders for BER-TLV tags, but no encoder yet.
Change-Id: I4183546bed9d6232ddcefad764f4e67afcf8b2ed
---
M pySim/utils.py
1 file changed, 45 insertions(+), 0 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/pysim refs/changes/50/24450/1
diff --git a/pySim/utils.py b/pySim/utils.py
index 74655d4..e4caadf 100644
--- a/pySim/utils.py
+++ b/pySim/utils.py
@@ -212,6 +212,51 @@
i += 1
return ({'class':cls, 'constructed':constructed, 'tag':tag}, binary[i:])
+def bertlv_encode_tag(t) -> bytes:
+ """Encode a single Tag value according to ITU-T X.690 8.1.2
+ """
+ def get_top7_bits(inp:int) -> Tuple[int, int]:
+ """Get top 7 bits of integer. Returns those 7 bits as integer and the remaining LSBs."""
+ remain_bits = inp.bit_length()
+ if remain_bits >= 7:
+ bitcnt = 7
+ else:
+ bitcnt = remain_bits
+ outp = inp >> (remain_bits - bitcnt)
+ remainder = inp & ~ (inp << (remain_bits - bitcnt))
+ return outp, remainder
+
+ if isinstance(t, int):
+ # FIXME: multiple byte tags
+ tag = t & 0x1f
+ constructed = True if t & 0x20 else False
+ cls = t >> 6
+ else:
+ tag = tdict['tag']
+ constructed = tdict['constructed']
+ cls = tdict['class']
+ if tag <= 30:
+ t = tag & 0x1f
+ if constructed:
+ t |= 0x20
+ t |= (cls & 3) << 6
+ return bytes([t])
+ else: # multi-byte tag
+ t = 0x1f;
+ if constructed:
+ t |= 0x20
+ t |= (cls & 3) << 6
+ tag_bytes = bytes([t])
+ remain = tag
+ while True:
+ t, remain = get_top7_bits(remain)
+ if remain:
+ t |= 0x80
+ tag_bytes.append(bytes[t])
+ if not remain:
+ break
+ return tag_bytes
+
def bertlv_parse_len(binary:bytes) -> Tuple[int, bytes]:
"""Parse a single Length value according to ITU-T X.690 8.1.3;
only the definite form is supported here.
--
To view, visit https://gerrit.osmocom.org/c/pysim/+/24450
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings
Gerrit-Project: pysim
Gerrit-Branch: master
Gerrit-Change-Id: I4183546bed9d6232ddcefad764f4e67afcf8b2ed
Gerrit-Change-Number: 24450
Gerrit-PatchSet: 1
Gerrit-Owner: laforge <laforge at osmocom.org>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20210529/0270844c/attachment.htm>