laforge has submitted this change. ( https://gerrit.osmocom.org/c/pysim/+/35277?usp=email )
Change subject: usim: Properly decode/encode IPv4 + IPv6 addresses ......................................................................
usim: Properly decode/encode IPv4 + IPv6 addresses
use normal textual representation for IPv4 and IPv6 addresses
Change-Id: I2c6c377f4502af37639e555826c85d5dcf602f9b --- M pySim/construct.py M pySim/ts_31_102.py 2 files changed, 42 insertions(+), 3 deletions(-)
Approvals: fixeria: Looks good to me, approved Jenkins Builder: Verified
diff --git a/pySim/construct.py b/pySim/construct.py index af96b49..31caf0e 100644 --- a/pySim/construct.py +++ b/pySim/construct.py @@ -7,6 +7,7 @@ from pySim.utils import b2h, h2b, swap_nibbles import gsm0338 import codecs +import ipaddress
"""Utility code related to the integration of the 'construct' declarative parser."""
@@ -138,6 +139,32 @@ def _encode(self, obj, context, path): return obj.encode(self.codec, self.err)
+class Ipv4Adapter(Adapter): + """ + Encoder converts from 4 bytes to string representation (A.B.C.D). + Decoder converts from string representation (A.B.C.D) to four bytes. + """ + def _decode(self, obj, context, path): + ia = ipaddress.IPv4Address(obj) + return ia.compressed + + def _encode(self, obj, context, path): + ia = ipaddress.IPv4Address(obj) + return ia.packed + +class Ipv6Adapter(Adapter): + """ + Encoder converts from 16 bytes to string representation. + Decoder converts from string representation to 16 bytes. + """ + def _decode(self, obj, context, path): + ia = ipaddress.IPv6Address(obj) + return ia.compressed + + def _encode(self, obj, context, path): + ia = ipaddress.IPv6Address(obj) + return ia.packed +
def filter_dict(d, exclude_prefix='_'): """filter the input dict to ensure no keys starting with 'exclude_prefix' remain.""" diff --git a/pySim/ts_31_102.py b/pySim/ts_31_102.py index 74a2c4c..87bd8c7 100644 --- a/pySim/ts_31_102.py +++ b/pySim/ts_31_102.py @@ -875,14 +875,15 @@ class EF_ePDGId(TransparentEF): _test_de_encode = [ ( '801100657064672e6f736d6f636f6d2e6f7267', {'e_pdg_id': {"type_of_ePDG_address": "FQDN", "ePDG_address" : "epdg.osmocom.org" } } ), - ( '800501c0a8a001', {'e_pdg_id': {"type_of_ePDG_address": "IPv4", "ePDG_address" : "c0a8a001" } } ), + ( '800501c0a8a001', {'e_pdg_id': {"type_of_ePDG_address": "IPv4", "ePDG_address" : "192.168.160.1" } } ), + ( '80110220010db8000000000000000000000023', {'e_pdg_id': {"type_of_ePDG_address": "IPv6", "ePDG_address" : "2001:db8::23" } } ), ] class ePDGId(BER_TLV_IE, tag=0x80): _construct = Struct('type_of_ePDG_address'/Enum(Byte, FQDN=0, IPv4=1, IPv6=2), 'ePDG_address'/Switch(this.type_of_ePDG_address, {'FQDN': Utf8Adapter(GreedyBytes), - 'IPv4': HexAdapter(GreedyBytes), - 'IPv6': HexAdapter(GreedyBytes)})) + 'IPv4': Ipv4Adapter(GreedyBytes), + 'IPv6': Ipv6Adapter(GreedyBytes)}))
def __init__(self, fid='6ff3', sfid=None, name='EF.ePDGId', desc='Home ePDG Identifier', **kwargs): super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)