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>