neels has uploaded this change for review. ( 
https://gerrit.osmocom.org/c/pysim/+/39741?usp=email )


Change subject: [1/7] personalization: refactor: drop ClassVarMeta use
......................................................................

[1/7] personalization: refactor: drop ClassVarMeta use

Drop the ClassVarMeta/metaclass/ABCMeta stuff -- it doesn't seem to
serve any purpose that is not similarly achieved with plain python
inheritance.

Upcoming patches will use normal inheritance a lot more.

Note that most use of the ClassVarMeta was in the SdKey subclasses, and
that these currently don't actually work. See the fix in patch
I07dfc378705eba1318e9e8652796cbde106c6a52 .

Related: SYS#6768
Change-Id: I60ea8fd11fb438ec90ddb08b17b658cbb789c051
---
M pySim/esim/saip/personalization.py
1 file changed, 104 insertions(+), 66 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/pysim refs/changes/41/39741/1

diff --git a/pySim/esim/saip/personalization.py 
b/pySim/esim/saip/personalization.py
index 61973e7..e31382c 100644
--- a/pySim/esim/saip/personalization.py
+++ b/pySim/esim/saip/personalization.py
@@ -15,7 +15,6 @@
 # You should have received a copy of the GNU Affero General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.

-import abc
 import io
 from typing import List, Tuple

@@ -34,18 +33,7 @@
     file.append(('fillFileContent', new_content))
     return file

-class ClassVarMeta(abc.ABCMeta):
-    """Metaclass that puts all additional keyword-args into the class. We use 
this to have one
-    class definition for something like a PIN, and then have derived classes 
for PIN1, PIN2, ..."""
-    def __new__(metacls, name, bases, namespace, **kwargs):
-        #print("Meta_new_(metacls=%s, name=%s, bases=%s, namespace=%s, 
kwargs=%s)" % (metacls, name, bases, namespace, kwargs))
-        x = super().__new__(metacls, name, bases, namespace)
-        for k, v in kwargs.items():
-            setattr(x, k, v)
-        setattr(x, 'name', camel_to_snake(name))
-        return x
-
-class ConfigurableParameter(abc.ABC, metaclass=ClassVarMeta):
+class ConfigurableParameter:
     """Base class representing a part of the eSIM profile that is configurable 
during the
     personalization process (with dynamic data from elsewhere)."""
     def __init__(self, input_value):
@@ -105,7 +93,7 @@
         # TODO: DF.GSM_ACCESS if not linked?


-class SdKey(ConfigurableParameter, metaclass=ClassVarMeta):
+class SdKey(ConfigurableParameter):
     """Configurable Security Domain (SD) Key.  Value is presented as bytes."""
     # these will be set by derived classes
     key_type = None
@@ -144,59 +132,108 @@
         for pe in pes.get_pes_for_type('securityDomain'):
             self._apply_sd(pe)

-class SdKeyScp80_01(SdKey, kvn=0x01, key_type=0x88, permitted_len=[16,24,32]): 
# AES key type
-    pass
-class SdKeyScp80_01Kic(SdKeyScp80_01, key_id=0x01, key_usage_qual=0x18): # 
FIXME: ordering?
-    pass
-class SdKeyScp80_01Kid(SdKeyScp80_01, key_id=0x02, key_usage_qual=0x14):
-    pass
-class SdKeyScp80_01Kik(SdKeyScp80_01, key_id=0x03, key_usage_qual=0x48):
-    pass
+class SdKeyScp80_01(SdKey):
+    kvn = 0x01
+    key_type = 0x88 # AES key type
+    allow_len = (16,24,32)

-class SdKeyScp81_01(SdKey, kvn=0x81): # FIXME
-    pass
-class SdKeyScp81_01Psk(SdKeyScp81_01, key_id=0x01, key_type=0x85, 
key_usage_qual=0x3C):
-    pass
-class SdKeyScp81_01Dek(SdKeyScp81_01, key_id=0x02, key_type=0x88, 
key_usage_qual=0x48):
-    pass
+class SdKeyScp80_01Kic(SdKeyScp80_01):
+    key_id = 0x01
+    key_usage_qual = 0x18 # FIXME: ordering?

-class SdKeyScp02_20(SdKey, kvn=0x20, key_type=0x88, permitted_len=[16,24,32]): 
# AES key type
-    pass
-class SdKeyScp02_20Enc(SdKeyScp02_20, key_id=0x01, key_usage_qual=0x18):
-    pass
-class SdKeyScp02_20Mac(SdKeyScp02_20, key_id=0x02, key_usage_qual=0x14):
-    pass
-class SdKeyScp02_20Dek(SdKeyScp02_20, key_id=0x03, key_usage_qual=0x48):
-    pass
+class SdKeyScp80_01Kid(SdKeyScp80_01):
+    key_id = 0x02
+    key_usage_qual = 0x14

-class SdKeyScp03_30(SdKey, kvn=0x30, key_type=0x88, permitted_len=[16,24,32]): 
# AES key type
-    pass
-class SdKeyScp03_30Enc(SdKeyScp03_30, key_id=0x01, key_usage_qual=0x18):
-    pass
-class SdKeyScp03_30Mac(SdKeyScp03_30, key_id=0x02, key_usage_qual=0x14):
-    pass
-class SdKeyScp03_30Dek(SdKeyScp03_30, key_id=0x03, key_usage_qual=0x48):
-    pass
-
-class SdKeyScp03_31(SdKey, kvn=0x31, key_type=0x88, permitted_len=[16,24,32]): 
# AES key type
-    pass
-class SdKeyScp03_31Enc(SdKeyScp03_31, key_id=0x01, key_usage_qual=0x18):
-    pass
-class SdKeyScp03_31Mac(SdKeyScp03_31, key_id=0x02, key_usage_qual=0x14):
-    pass
-class SdKeyScp03_31Dek(SdKeyScp03_31, key_id=0x03, key_usage_qual=0x48):
-    pass
-
-class SdKeyScp03_32(SdKey, kvn=0x32, key_type=0x88, permitted_len=[16,24,32]): 
# AES key type
-    pass
-class SdKeyScp03_32Enc(SdKeyScp03_32, key_id=0x01, key_usage_qual=0x18):
-    pass
-class SdKeyScp03_32Mac(SdKeyScp03_32, key_id=0x02, key_usage_qual=0x14):
-    pass
-class SdKeyScp03_32Dek(SdKeyScp03_32, key_id=0x03, key_usage_qual=0x48):
-    pass
+class SdKeyScp80_01Kik(SdKeyScp80_01):
+    key_id = 0x03
+    key_usage_qual = 0x48


+class SdKeyScp81_01(SdKey):
+    kvn = 0x81 # FIXME
+
+class SdKeyScp81_01Psk(SdKeyScp81_01):
+    key_id = 0x01
+    key_type = 0x85
+    key_usage_qual = 0x3C
+
+class SdKeyScp81_01Dek(SdKeyScp81_01):
+    key_id = 0x02
+    key_type = 0x88
+    key_usage_qual = 0x48
+
+
+class SdKeyScp02_20(SdKey):
+    kvn = 0x20
+    key_type = 0x88 # AES key type
+    allow_len = (16,24,32)
+
+class SdKeyScp02_20Enc(SdKeyScp02_20):
+    key_id = 0x01
+    key_usage_qual = 0x18
+
+class SdKeyScp02_20Mac(SdKeyScp02_20):
+    key_id = 0x02
+    key_usage_qual = 0x14
+
+class SdKeyScp02_20Dek(SdKeyScp02_20):
+    key_id = 0x03
+    key_usage_qual = 0x48
+
+
+class SdKeyScp03_30(SdKey):
+    kvn = 0x30
+    key_type = 0x88 # AES key type
+    allow_len = (16,24,32)
+
+class SdKeyScp03_30Enc(SdKeyScp03_30):
+    key_id = 0x01
+    key_usage_qual = 0x18
+
+class SdKeyScp03_30Mac(SdKeyScp03_30):
+    key_id = 0x02
+    key_usage_qual = 0x14
+
+class SdKeyScp03_30Dek(SdKeyScp03_30):
+    key_id = 0x03
+    key_usage_qual = 0x48
+
+
+class SdKeyScp03_31(SdKey):
+    kvn = 0x31
+    key_type = 0x88 # AES key type
+    allow_len = (16,24,32)
+
+class SdKeyScp03_31Enc(SdKeyScp03_31):
+    key_id = 0x01
+    key_usage_qual = 0x18
+
+class SdKeyScp03_31Mac(SdKeyScp03_31):
+    key_id = 0x02
+    key_usage_qual = 0x14
+
+class SdKeyScp03_31Dek(SdKeyScp03_31):
+    key_id = 0x03
+    key_usage_qual = 0x48
+
+
+class SdKeyScp03_32(SdKey):
+    kvn = 0x32
+    key_type = 0x88 # AES key type
+    allow_len = (16,24,32)
+
+class SdKeyScp03_32Enc(SdKeyScp03_32):
+    key_id = 0x01
+    key_usage_qual = 0x18
+
+class SdKeyScp03_32Mac(SdKeyScp03_32):
+    key_id = 0x02
+    key_usage_qual = 0x14
+
+class SdKeyScp03_32Dek(SdKeyScp03_32):
+    key_id = 0x03
+    key_usage_qual = 0x48


 def obtain_singleton_pe_from_pelist(l: List[ProfileElement], wanted_type: str) 
-> ProfileElement:
@@ -208,7 +245,7 @@
     filtered = list(filter(lambda x: x.type == wanted_type, l))
     return filtered[0]

-class Puk(ConfigurableParameter, metaclass=ClassVarMeta):
+class Puk(ConfigurableParameter):
     """Configurable PUK (Pin Unblock Code). String ASCII-encoded digits."""
     keyReference = None
     def validate(self):
@@ -235,7 +272,7 @@
 class Puk2(Puk, keyReference=0x81):
     pass

-class Pin(ConfigurableParameter, metaclass=ClassVarMeta):
+class Pin(ConfigurableParameter):
     """Configurable PIN (Personal Identification Number).  String of digits."""
     keyReference = None
     def validate(self):
@@ -259,7 +296,8 @@
                  pinCode['pinValue'] = h2b(padded_pin)
                  return
         raise ValueError('cannot find pinCode')
-class AppPin(ConfigurableParameter, metaclass=ClassVarMeta):
+
+class AppPin(ConfigurableParameter):
     """Configurable PIN (Personal Identification Number).  String of digits."""
     keyReference = None
     def validate(self):
@@ -299,7 +337,7 @@
     pass


-class AlgoConfig(ConfigurableParameter, metaclass=ClassVarMeta):
+class AlgoConfig(ConfigurableParameter):
     """Configurable Algorithm parameter."""
     key = None
     def validate(self):

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

Gerrit-MessageType: newchange
Gerrit-Project: pysim
Gerrit-Branch: master
Gerrit-Change-Id: I60ea8fd11fb438ec90ddb08b17b658cbb789c051
Gerrit-Change-Number: 39741
Gerrit-PatchSet: 1
Gerrit-Owner: neels <nhofm...@sysmocom.de>

Reply via email to