laforge has submitted this change. ( 
https://gerrit.osmocom.org/c/pysim/+/39743?usp=email )

Change subject: personalization: refactor Puk
......................................................................

personalization: refactor Puk

Implement abstract DecimalHexParam, and use it to refactor Puk1 and Puk2
to the new ConfigurableParameter implementation style.

DecimalHexParam will also be used for Pin and Adm soon.

Change-Id: I271e6c030c890778ab7af9ab3bc7997e22018f6a
---
M pySim/esim/saip/personalization.py
1 file changed, 39 insertions(+), 20 deletions(-)

Approvals:
  laforge: Looks good to me, approved
  Jenkins Builder: Verified




diff --git a/pySim/esim/saip/personalization.py 
b/pySim/esim/saip/personalization.py
index ecc0b76..462add6 100644
--- a/pySim/esim/saip/personalization.py
+++ b/pySim/esim/saip/personalization.py
@@ -234,6 +234,27 @@
         return super().validate_val(val)


+class DecimalHexParam(DecimalParam):
+    """The input value is decimal digits. The decimal value is stored such 
that each hexadecimal digit represents one
+    decimal digit, useful for various PIN type parameters.
+
+    Optionally, the value is stored with padding, for example: rpad = 8 would 
store '123' as '123fffff'. This is also
+    common in PIN type parameters.
+    """
+    rpad = None
+    rpad_char = 'f'
+
+    @classmethod
+    def validate_val(cls, val):
+        val = super().validate_val(val)
+        val = ''.join('%02x' % ord(x) for x in val)
+        if cls.rpad is not None:
+            c = cls.rpad_char
+            val = rpad(val, cls.rpad, c)
+        # a DecimalHexParam subclass expects the apply_val() input to be a 
bytes instance ready for the pes
+        return h2b(val)
+
+
 class Iccid(DecimalParam):
     """ICCID Parameter. Input: string of decimal digits.
     If the string of digits is only 18 digits long, add a Luhn check digit."""
@@ -415,34 +436,32 @@
     filtered = list(filter(lambda x: x.type == wanted_type, l))
     return filtered[0]

-class Puk(ConfigurableParameter, metaclass=ClassVarMeta):
+class Puk(DecimalHexParam):
     """Configurable PUK (Pin Unblock Code). String ASCII-encoded digits."""
+    allow_len = 8
+    rpad = 16
     keyReference = None
-    def validate(self):
-        if isinstance(self.input_value, int):
-            self.value = '%08d' % self.input_value
-        else:
-            self.value = self.input_value
-        # FIXME: valid length?
-        if not self.value.isdecimal():
-            raise ValueError('PUK must only contain decimal digits')

-    def apply(self, pes: ProfileElementSequence):
-        puk = ''.join(['%02x' % (ord(x)) for x in self.value])
-        padded_puk = rpad(puk, 16)
+    @classmethod
+    def apply_val(cls, pes: ProfileElementSequence, val):
+        val_bytes = val
         mf_pes = pes.pes_by_naa['mf'][0]
         pukCodes = obtain_singleton_pe_from_pelist(mf_pes, 'pukCodes')
         for pukCode in pukCodes.decoded['pukCodes']:
-            if pukCode['keyReference'] == self.keyReference:
-                pukCode['pukValue'] = h2b(padded_puk)
+            if pukCode['keyReference'] == cls.keyReference:
+                pukCode['pukValue'] = val_bytes
                 return
-        raise ValueError('cannot find pukCode')
-class Puk1(Puk, keyReference=0x01):
-    pass
-class Puk2(Puk, keyReference=0x81):
-    pass
+        raise ValueError("input template UPP has unexpected structure:"
+                         f" cannot find pukCode with 
keyReference={cls.keyReference}")

-class Pin(ConfigurableParameter, metaclass=ClassVarMeta):
+class Puk1(Puk):
+    keyReference = 0x01
+
+class Puk2(Puk):
+    keyReference = 0x81
+
+
+class Pin(ConfigurableParameter,metaclass=ClassVarMeta):
     """Configurable PIN (Personal Identification Number).  String of digits."""
     keyReference = None
     def validate(self):

--
To view, visit https://gerrit.osmocom.org/c/pysim/+/39743?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings?usp=email

Gerrit-MessageType: merged
Gerrit-Project: pysim
Gerrit-Branch: master
Gerrit-Change-Id: I271e6c030c890778ab7af9ab3bc7997e22018f6a
Gerrit-Change-Number: 39743
Gerrit-PatchSet: 15
Gerrit-Owner: neels <[email protected]>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: laforge <[email protected]>

Reply via email to