From 5544a0f7c9b213ac2d14d08e49dceb21ea4edd58 Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Mon, 4 Aug 2025 18:50:44 +0200 Subject: [PATCH] personalization: add int as input type for BinaryParameter Change-Id: I31d8142cb0847a8b291f8dc614d57cb4734f0190 --- pySim/esim/saip/personalization.py | 6 +- .../unittests/test_configurable_parameters.py | 37 +++++ .../unittests/xo/test_configurable_parameters | 144 ++++++++++++++++++ 3 files changed, 186 insertions(+), 1 deletion(-) diff --git a/pySim/esim/saip/personalization.py b/pySim/esim/saip/personalization.py index 1058dee0..6c603014 100644 --- a/pySim/esim/saip/personalization.py +++ b/pySim/esim/saip/personalization.py @@ -370,7 +370,7 @@ class IntegerParam(ConfigurableParameter): yield valdict class BinaryParam(ConfigurableParameter): - allow_types = (str, io.BytesIO, bytes, bytearray) + allow_types = (str, io.BytesIO, bytes, bytearray, int) allow_chars = '0123456789abcdefABCDEF' strip_chars = ' \t\r\n' default_source = param_source.RandomHexDigitSource @@ -378,6 +378,10 @@ class BinaryParam(ConfigurableParameter): @classmethod def validate_val(cls, val): # take care that min_len and max_len are applied to the binary length by converting to bytes first + if isinstance(val, int): + min_len, _max_len = cls.get_len_range() + val = '%0*d' % (min_len, val) + if isinstance(val, str): if cls.strip_chars is not None: val = ''.join(c for c in val if c not in cls.strip_chars) diff --git a/tests/unittests/test_configurable_parameters.py b/tests/unittests/test_configurable_parameters.py index 86ea199c..6ed0595c 100755 --- a/tests/unittests/test_configurable_parameters.py +++ b/tests/unittests/test_configurable_parameters.py @@ -87,6 +87,10 @@ class ConfigurableParameterTest(unittest.TestCase): val='12345678', expect_clean_val=b'12345678', expect_val='12345678'), + Paramtest(param_cls=p13n.Puk1, + val=int(12345678), + expect_clean_val=b'12345678', + expect_val='12345678'), Paramtest(param_cls=p13n.Puk2, val='12345678', @@ -105,6 +109,18 @@ class ConfigurableParameterTest(unittest.TestCase): val='12345678', expect_clean_val=b'12345678', expect_val='12345678'), + Paramtest(param_cls=p13n.Pin1, + val=int(1234), + expect_clean_val=b'1234\xff\xff\xff\xff', + expect_val='1234'), + Paramtest(param_cls=p13n.Pin1, + val=int(123456), + expect_clean_val=b'123456\xff\xff', + expect_val='123456'), + Paramtest(param_cls=p13n.Pin1, + val=int(12345678), + expect_clean_val=b'12345678', + expect_val='12345678'), Paramtest(param_cls=p13n.Adm1, val='1234', @@ -118,6 +134,10 @@ class ConfigurableParameterTest(unittest.TestCase): val='12345678', expect_clean_val=b'12345678', expect_val='12345678'), + Paramtest(param_cls=p13n.Adm1, + val=int(123456), + expect_clean_val=b'123456\xff\xff', + expect_val='123456'), Paramtest(param_cls=p13n.AlgorithmID, val='Milenage', @@ -132,6 +152,19 @@ class ConfigurableParameterTest(unittest.TestCase): expect_clean_val=3, expect_val='usim-test'), + Paramtest(param_cls=p13n.AlgorithmID, + val=1, + expect_clean_val=1, + expect_val='Milenage'), + Paramtest(param_cls=p13n.AlgorithmID, + val=2, + expect_clean_val=2, + expect_val='TUAK'), + Paramtest(param_cls=p13n.AlgorithmID, + val=3, + expect_clean_val=3, + expect_val='usim-test'), + Paramtest(param_cls=p13n.K, val='01020304050607080910111213141516', expect_clean_val=b'\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15\x16', @@ -148,6 +181,10 @@ class ConfigurableParameterTest(unittest.TestCase): val=io.BytesIO(b'\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15\x16'), expect_clean_val=b'\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15\x16', expect_val='01020304050607080910111213141516'), + Paramtest(param_cls=p13n.K, + val=int(11020304050607080910111213141516), + expect_clean_val=b'\x11\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15\x16', + expect_val='11020304050607080910111213141516'), Paramtest(param_cls=p13n.Opc, val='01020304050607080910111213141516', diff --git a/tests/unittests/xo/test_configurable_parameters b/tests/unittests/xo/test_configurable_parameters index 5d99375f..0c5c2d1d 100644 --- a/tests/unittests/xo/test_configurable_parameters +++ b/tests/unittests/xo/test_configurable_parameters @@ -19,6 +19,10 @@ ok: TS48v5_SAIP2.1A_NoBERTLV.der Puk1(val= '12345678':str) clean_val= b'12345678':bytearray read_back_val= {'PUK1': '12345678'}:{str} +ok: TS48v5_SAIP2.1A_NoBERTLV.der Puk1(val= 12345678:int) + clean_val= b'12345678':bytearray + read_back_val= {'PUK1': '12345678'}:{str} + ok: TS48v5_SAIP2.1A_NoBERTLV.der Puk2(val= '12345678':str) clean_val= b'12345678':bytearray read_back_val= {'PUK2': '12345678'}:{str} @@ -35,6 +39,18 @@ ok: TS48v5_SAIP2.1A_NoBERTLV.der Pin1(val= '12345678':str) clean_val= b'12345678':bytearray read_back_val= {'PIN1': '12345678'}:{str} +ok: TS48v5_SAIP2.1A_NoBERTLV.der Pin1(val= 1234:int) + clean_val= b'1234\xff\xff\xff\xff':bytearray + read_back_val= {'PIN1': '1234'}:{str} + +ok: TS48v5_SAIP2.1A_NoBERTLV.der Pin1(val= 123456:int) + clean_val= b'123456\xff\xff':bytearray + read_back_val= {'PIN1': '123456'}:{str} + +ok: TS48v5_SAIP2.1A_NoBERTLV.der Pin1(val= 12345678:int) + clean_val= b'12345678':bytearray + read_back_val= {'PIN1': '12345678'}:{str} + ok: TS48v5_SAIP2.1A_NoBERTLV.der Adm1(val= '1234':str) clean_val= b'1234\xff\xff\xff\xff':bytearray read_back_val= {'ADM1': '1234'}:{str} @@ -47,6 +63,10 @@ ok: TS48v5_SAIP2.1A_NoBERTLV.der Adm1(val= '12345678':str) clean_val= b'12345678':bytearray read_back_val= {'ADM1': '12345678'}:{str} +ok: TS48v5_SAIP2.1A_NoBERTLV.der Adm1(val= 123456:int) + clean_val= b'123456\xff\xff':bytearray + read_back_val= {'ADM1': '123456'}:{str} + ok: TS48v5_SAIP2.1A_NoBERTLV.der AlgorithmID(val= 'Milenage':str) clean_val= 1:int read_back_val= {'Algorithm': 'Milenage'}:{str} @@ -59,6 +79,18 @@ ok: TS48v5_SAIP2.1A_NoBERTLV.der AlgorithmID(val= 'usim-test':str) clean_val= 3:int read_back_val= {'Algorithm': 'usim-test'}:{str} +ok: TS48v5_SAIP2.1A_NoBERTLV.der AlgorithmID(val= 1:int) + clean_val= 1:int + read_back_val= {'Algorithm': 'Milenage'}:{str} + +ok: TS48v5_SAIP2.1A_NoBERTLV.der AlgorithmID(val= 2:int) + clean_val= 2:int + read_back_val= {'Algorithm': 'TUAK'}:{str} + +ok: TS48v5_SAIP2.1A_NoBERTLV.der AlgorithmID(val= 3:int) + clean_val= 3:int + read_back_val= {'Algorithm': 'usim-test'}:{str} + ok: TS48v5_SAIP2.1A_NoBERTLV.der K(val= '01020304050607080910111213141516':str) clean_val= b'\x01\x02\x03\x04\x05\x06\x07\x08\t\x10\x11\x12\x13\x14\x15\x16':bytes read_back_val= {'K': '01020304050607080910111213141516'}:{hexstr} @@ -75,6 +107,10 @@ ok: TS48v5_SAIP2.1A_NoBERTLV.der K(val= b'\x01\x02\x03\x04\x05\x06\x07\x08\t\x10 clean_val= b'\x01\x02\x03\x04\x05\x06\x07\x08\t\x10\x11\x12\x13\x14\x15\x16':bytes read_back_val= {'K': '01020304050607080910111213141516'}:{hexstr} +ok: TS48v5_SAIP2.1A_NoBERTLV.der K(val= 11020304050607080910111213141516:int) + clean_val= b'\x11\x02\x03\x04\x05\x06\x07\x08\t\x10\x11\x12\x13\x14\x15\x16':bytes + read_back_val= {'K': '11020304050607080910111213141516'}:{hexstr} + ok: TS48v5_SAIP2.1A_NoBERTLV.der Opc(val= '01020304050607080910111213141516':str) clean_val= b'\x01\x02\x03\x04\x05\x06\x07\x08\t\x10\x11\x12\x13\x14\x15\x16':bytes read_back_val= {'OPc': '01020304050607080910111213141516'}:{hexstr} @@ -111,6 +147,10 @@ ok: TS48v5_SAIP2.3_BERTLV_SUCI.der Puk1(val= '12345678':str) clean_val= b'12345678':bytearray read_back_val= {'PUK1': '12345678'}:{str} +ok: TS48v5_SAIP2.3_BERTLV_SUCI.der Puk1(val= 12345678:int) + clean_val= b'12345678':bytearray + read_back_val= {'PUK1': '12345678'}:{str} + ok: TS48v5_SAIP2.3_BERTLV_SUCI.der Puk2(val= '12345678':str) clean_val= b'12345678':bytearray read_back_val= {'PUK2': '12345678'}:{str} @@ -127,6 +167,18 @@ ok: TS48v5_SAIP2.3_BERTLV_SUCI.der Pin1(val= '12345678':str) clean_val= b'12345678':bytearray read_back_val= {'PIN1': '12345678'}:{str} +ok: TS48v5_SAIP2.3_BERTLV_SUCI.der Pin1(val= 1234:int) + clean_val= b'1234\xff\xff\xff\xff':bytearray + read_back_val= {'PIN1': '1234'}:{str} + +ok: TS48v5_SAIP2.3_BERTLV_SUCI.der Pin1(val= 123456:int) + clean_val= b'123456\xff\xff':bytearray + read_back_val= {'PIN1': '123456'}:{str} + +ok: TS48v5_SAIP2.3_BERTLV_SUCI.der Pin1(val= 12345678:int) + clean_val= b'12345678':bytearray + read_back_val= {'PIN1': '12345678'}:{str} + ok: TS48v5_SAIP2.3_BERTLV_SUCI.der Adm1(val= '1234':str) clean_val= b'1234\xff\xff\xff\xff':bytearray read_back_val= {'ADM1': '1234'}:{str} @@ -139,6 +191,10 @@ ok: TS48v5_SAIP2.3_BERTLV_SUCI.der Adm1(val= '12345678':str) clean_val= b'12345678':bytearray read_back_val= {'ADM1': '12345678'}:{str} +ok: TS48v5_SAIP2.3_BERTLV_SUCI.der Adm1(val= 123456:int) + clean_val= b'123456\xff\xff':bytearray + read_back_val= {'ADM1': '123456'}:{str} + ok: TS48v5_SAIP2.3_BERTLV_SUCI.der AlgorithmID(val= 'Milenage':str) clean_val= 1:int read_back_val= {'Algorithm': 'Milenage'}:{str} @@ -151,6 +207,18 @@ ok: TS48v5_SAIP2.3_BERTLV_SUCI.der AlgorithmID(val= 'usim-test':str) clean_val= 3:int read_back_val= {'Algorithm': 'usim-test'}:{str} +ok: TS48v5_SAIP2.3_BERTLV_SUCI.der AlgorithmID(val= 1:int) + clean_val= 1:int + read_back_val= {'Algorithm': 'Milenage'}:{str} + +ok: TS48v5_SAIP2.3_BERTLV_SUCI.der AlgorithmID(val= 2:int) + clean_val= 2:int + read_back_val= {'Algorithm': 'TUAK'}:{str} + +ok: TS48v5_SAIP2.3_BERTLV_SUCI.der AlgorithmID(val= 3:int) + clean_val= 3:int + read_back_val= {'Algorithm': 'usim-test'}:{str} + ok: TS48v5_SAIP2.3_BERTLV_SUCI.der K(val= '01020304050607080910111213141516':str) clean_val= b'\x01\x02\x03\x04\x05\x06\x07\x08\t\x10\x11\x12\x13\x14\x15\x16':bytes read_back_val= {'K': '01020304050607080910111213141516'}:{hexstr} @@ -167,6 +235,10 @@ ok: TS48v5_SAIP2.3_BERTLV_SUCI.der K(val= b'\x01\x02\x03\x04\x05\x06\x07\x08\t\x clean_val= b'\x01\x02\x03\x04\x05\x06\x07\x08\t\x10\x11\x12\x13\x14\x15\x16':bytes read_back_val= {'K': '01020304050607080910111213141516'}:{hexstr} +ok: TS48v5_SAIP2.3_BERTLV_SUCI.der K(val= 11020304050607080910111213141516:int) + clean_val= b'\x11\x02\x03\x04\x05\x06\x07\x08\t\x10\x11\x12\x13\x14\x15\x16':bytes + read_back_val= {'K': '11020304050607080910111213141516'}:{hexstr} + ok: TS48v5_SAIP2.3_BERTLV_SUCI.der Opc(val= '01020304050607080910111213141516':str) clean_val= b'\x01\x02\x03\x04\x05\x06\x07\x08\t\x10\x11\x12\x13\x14\x15\x16':bytes read_back_val= {'OPc': '01020304050607080910111213141516'}:{hexstr} @@ -203,6 +275,10 @@ ok: TS48v5_SAIP2.1B_NoBERTLV.der Puk1(val= '12345678':str) clean_val= b'12345678':bytearray read_back_val= {'PUK1': '12345678'}:{str} +ok: TS48v5_SAIP2.1B_NoBERTLV.der Puk1(val= 12345678:int) + clean_val= b'12345678':bytearray + read_back_val= {'PUK1': '12345678'}:{str} + ok: TS48v5_SAIP2.1B_NoBERTLV.der Puk2(val= '12345678':str) clean_val= b'12345678':bytearray read_back_val= {'PUK2': '12345678'}:{str} @@ -219,6 +295,18 @@ ok: TS48v5_SAIP2.1B_NoBERTLV.der Pin1(val= '12345678':str) clean_val= b'12345678':bytearray read_back_val= {'PIN1': '12345678'}:{str} +ok: TS48v5_SAIP2.1B_NoBERTLV.der Pin1(val= 1234:int) + clean_val= b'1234\xff\xff\xff\xff':bytearray + read_back_val= {'PIN1': '1234'}:{str} + +ok: TS48v5_SAIP2.1B_NoBERTLV.der Pin1(val= 123456:int) + clean_val= b'123456\xff\xff':bytearray + read_back_val= {'PIN1': '123456'}:{str} + +ok: TS48v5_SAIP2.1B_NoBERTLV.der Pin1(val= 12345678:int) + clean_val= b'12345678':bytearray + read_back_val= {'PIN1': '12345678'}:{str} + ok: TS48v5_SAIP2.1B_NoBERTLV.der Adm1(val= '1234':str) clean_val= b'1234\xff\xff\xff\xff':bytearray read_back_val= {'ADM1': '1234'}:{str} @@ -231,6 +319,10 @@ ok: TS48v5_SAIP2.1B_NoBERTLV.der Adm1(val= '12345678':str) clean_val= b'12345678':bytearray read_back_val= {'ADM1': '12345678'}:{str} +ok: TS48v5_SAIP2.1B_NoBERTLV.der Adm1(val= 123456:int) + clean_val= b'123456\xff\xff':bytearray + read_back_val= {'ADM1': '123456'}:{str} + ok: TS48v5_SAIP2.1B_NoBERTLV.der AlgorithmID(val= 'Milenage':str) clean_val= 1:int read_back_val= {'Algorithm': 'Milenage'}:{str} @@ -243,6 +335,18 @@ ok: TS48v5_SAIP2.1B_NoBERTLV.der AlgorithmID(val= 'usim-test':str) clean_val= 3:int read_back_val= {'Algorithm': 'usim-test'}:{str} +ok: TS48v5_SAIP2.1B_NoBERTLV.der AlgorithmID(val= 1:int) + clean_val= 1:int + read_back_val= {'Algorithm': 'Milenage'}:{str} + +ok: TS48v5_SAIP2.1B_NoBERTLV.der AlgorithmID(val= 2:int) + clean_val= 2:int + read_back_val= {'Algorithm': 'TUAK'}:{str} + +ok: TS48v5_SAIP2.1B_NoBERTLV.der AlgorithmID(val= 3:int) + clean_val= 3:int + read_back_val= {'Algorithm': 'usim-test'}:{str} + ok: TS48v5_SAIP2.1B_NoBERTLV.der K(val= '01020304050607080910111213141516':str) clean_val= b'\x01\x02\x03\x04\x05\x06\x07\x08\t\x10\x11\x12\x13\x14\x15\x16':bytes read_back_val= {'K': '01020304050607080910111213141516'}:{hexstr} @@ -259,6 +363,10 @@ ok: TS48v5_SAIP2.1B_NoBERTLV.der K(val= b'\x01\x02\x03\x04\x05\x06\x07\x08\t\x10 clean_val= b'\x01\x02\x03\x04\x05\x06\x07\x08\t\x10\x11\x12\x13\x14\x15\x16':bytes read_back_val= {'K': '01020304050607080910111213141516'}:{hexstr} +ok: TS48v5_SAIP2.1B_NoBERTLV.der K(val= 11020304050607080910111213141516:int) + clean_val= b'\x11\x02\x03\x04\x05\x06\x07\x08\t\x10\x11\x12\x13\x14\x15\x16':bytes + read_back_val= {'K': '11020304050607080910111213141516'}:{hexstr} + ok: TS48v5_SAIP2.1B_NoBERTLV.der Opc(val= '01020304050607080910111213141516':str) clean_val= b'\x01\x02\x03\x04\x05\x06\x07\x08\t\x10\x11\x12\x13\x14\x15\x16':bytes read_back_val= {'OPc': '01020304050607080910111213141516'}:{hexstr} @@ -295,6 +403,10 @@ ok: TS48v5_SAIP2.3_NoBERTLV.der Puk1(val= '12345678':str) clean_val= b'12345678':bytearray read_back_val= {'PUK1': '12345678'}:{str} +ok: TS48v5_SAIP2.3_NoBERTLV.der Puk1(val= 12345678:int) + clean_val= b'12345678':bytearray + read_back_val= {'PUK1': '12345678'}:{str} + ok: TS48v5_SAIP2.3_NoBERTLV.der Puk2(val= '12345678':str) clean_val= b'12345678':bytearray read_back_val= {'PUK2': '12345678'}:{str} @@ -311,6 +423,18 @@ ok: TS48v5_SAIP2.3_NoBERTLV.der Pin1(val= '12345678':str) clean_val= b'12345678':bytearray read_back_val= {'PIN1': '12345678'}:{str} +ok: TS48v5_SAIP2.3_NoBERTLV.der Pin1(val= 1234:int) + clean_val= b'1234\xff\xff\xff\xff':bytearray + read_back_val= {'PIN1': '1234'}:{str} + +ok: TS48v5_SAIP2.3_NoBERTLV.der Pin1(val= 123456:int) + clean_val= b'123456\xff\xff':bytearray + read_back_val= {'PIN1': '123456'}:{str} + +ok: TS48v5_SAIP2.3_NoBERTLV.der Pin1(val= 12345678:int) + clean_val= b'12345678':bytearray + read_back_val= {'PIN1': '12345678'}:{str} + ok: TS48v5_SAIP2.3_NoBERTLV.der Adm1(val= '1234':str) clean_val= b'1234\xff\xff\xff\xff':bytearray read_back_val= {'ADM1': '1234'}:{str} @@ -323,6 +447,10 @@ ok: TS48v5_SAIP2.3_NoBERTLV.der Adm1(val= '12345678':str) clean_val= b'12345678':bytearray read_back_val= {'ADM1': '12345678'}:{str} +ok: TS48v5_SAIP2.3_NoBERTLV.der Adm1(val= 123456:int) + clean_val= b'123456\xff\xff':bytearray + read_back_val= {'ADM1': '123456'}:{str} + ok: TS48v5_SAIP2.3_NoBERTLV.der AlgorithmID(val= 'Milenage':str) clean_val= 1:int read_back_val= {'Algorithm': 'Milenage'}:{str} @@ -335,6 +463,18 @@ ok: TS48v5_SAIP2.3_NoBERTLV.der AlgorithmID(val= 'usim-test':str) clean_val= 3:int read_back_val= {'Algorithm': 'usim-test'}:{str} +ok: TS48v5_SAIP2.3_NoBERTLV.der AlgorithmID(val= 1:int) + clean_val= 1:int + read_back_val= {'Algorithm': 'Milenage'}:{str} + +ok: TS48v5_SAIP2.3_NoBERTLV.der AlgorithmID(val= 2:int) + clean_val= 2:int + read_back_val= {'Algorithm': 'TUAK'}:{str} + +ok: TS48v5_SAIP2.3_NoBERTLV.der AlgorithmID(val= 3:int) + clean_val= 3:int + read_back_val= {'Algorithm': 'usim-test'}:{str} + ok: TS48v5_SAIP2.3_NoBERTLV.der K(val= '01020304050607080910111213141516':str) clean_val= b'\x01\x02\x03\x04\x05\x06\x07\x08\t\x10\x11\x12\x13\x14\x15\x16':bytes read_back_val= {'K': '01020304050607080910111213141516'}:{hexstr} @@ -351,6 +491,10 @@ ok: TS48v5_SAIP2.3_NoBERTLV.der K(val= b'\x01\x02\x03\x04\x05\x06\x07\x08\t\x10\ clean_val= b'\x01\x02\x03\x04\x05\x06\x07\x08\t\x10\x11\x12\x13\x14\x15\x16':bytes read_back_val= {'K': '01020304050607080910111213141516'}:{hexstr} +ok: TS48v5_SAIP2.3_NoBERTLV.der K(val= 11020304050607080910111213141516:int) + clean_val= b'\x11\x02\x03\x04\x05\x06\x07\x08\t\x10\x11\x12\x13\x14\x15\x16':bytes + read_back_val= {'K': '11020304050607080910111213141516'}:{hexstr} + ok: TS48v5_SAIP2.3_NoBERTLV.der Opc(val= '01020304050607080910111213141516':str) clean_val= b'\x01\x02\x03\x04\x05\x06\x07\x08\t\x10\x11\x12\x13\x14\x15\x16':bytes read_back_val= {'OPc': '01020304050607080910111213141516'}:{hexstr}