mirror of
https://gitea.osmocom.org/sim-card/pysim.git
synced 2026-03-16 18:38:32 +03:00
personalization: refactor SdKey
Refactor SdKey (and subclasses) to the new ConfigurableParameter implementation style, keeping the same implementation. But duly note that this implementation does not work! It correctly patches pe.decoded[], but that gets overridden by ProfileElementSD._pre_encode(). For a fix, see I07dfc378705eba1318e9e8652796cbde106c6a52. Change-Id: I427ea851bfa28b2b045e70a19a9e35d361f0d393
This commit is contained in:
@@ -378,44 +378,37 @@ class SmspTpScAddr(ConfigurableParameter):
|
|||||||
# re-generate the pe.decoded member from the File instance
|
# re-generate the pe.decoded member from the File instance
|
||||||
pe.file2pe(f_smsp)
|
pe.file2pe(f_smsp)
|
||||||
|
|
||||||
class SdKey(ConfigurableParameter, metaclass=ClassVarMeta):
|
class SdKey(BinaryParam, metaclass=ClassVarMeta):
|
||||||
"""Configurable Security Domain (SD) Key. Value is presented as bytes."""
|
"""Configurable Security Domain (SD) Key. Value is presented as bytes."""
|
||||||
# these will be set by derived classes
|
# these will be set by subclasses
|
||||||
key_type = None
|
key_type = None
|
||||||
key_id = None
|
key_id = None
|
||||||
kvn = None
|
kvn = None
|
||||||
key_usage_qual = None
|
key_usage_qual = None
|
||||||
permitted_len = []
|
|
||||||
|
|
||||||
def validate(self):
|
@classmethod
|
||||||
if not isinstance(self.input_value, (io.BytesIO, bytes, bytearray)):
|
def _apply_sd(cls, pe: ProfileElement, value):
|
||||||
raise ValueError('Value must be of bytes-like type')
|
|
||||||
if self.permitted_len:
|
|
||||||
if len(self.input_value) not in self.permitted_len:
|
|
||||||
raise ValueError('Value length must be %s' % self.permitted_len)
|
|
||||||
self.value = self.input_value
|
|
||||||
|
|
||||||
def _apply_sd(self, pe: ProfileElement):
|
|
||||||
assert pe.type == 'securityDomain'
|
assert pe.type == 'securityDomain'
|
||||||
for key in pe.decoded['keyList']:
|
for key in pe.decoded['keyList']:
|
||||||
if key['keyIdentifier'][0] == self.key_id and key['keyVersionNumber'][0] == self.kvn:
|
if key['keyIdentifier'][0] == cls.key_id and key['keyVersionNumber'][0] == cls.kvn:
|
||||||
assert len(key['keyComponents']) == 1
|
assert len(key['keyComponents']) == 1
|
||||||
key['keyComponents'][0]['keyData'] = self.value
|
key['keyComponents'][0]['keyData'] = value
|
||||||
return
|
return
|
||||||
# Could not find matching key to patch, create a new one
|
# Could not find matching key to patch, create a new one
|
||||||
key = {
|
key = {
|
||||||
'keyUsageQualifier': bytes([self.key_usage_qual]),
|
'keyUsageQualifier': bytes([cls.key_usage_qual]),
|
||||||
'keyIdentifier': bytes([self.key_id]),
|
'keyIdentifier': bytes([cls.key_id]),
|
||||||
'keyVersionNumber': bytes([self.kvn]),
|
'keyVersionNumber': bytes([cls.kvn]),
|
||||||
'keyComponents': [
|
'keyComponents': [
|
||||||
{ 'keyType': bytes([self.key_type]), 'keyData': self.value },
|
{ 'keyType': bytes([cls.key_type]), 'keyData': value },
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
pe.decoded['keyList'].append(key)
|
pe.decoded['keyList'].append(key)
|
||||||
|
|
||||||
def apply(self, pes: ProfileElementSequence):
|
@classmethod
|
||||||
|
def apply_val(cls, pes: ProfileElementSequence, value):
|
||||||
for pe in pes.get_pes_for_type('securityDomain'):
|
for pe in pes.get_pes_for_type('securityDomain'):
|
||||||
self._apply_sd(pe)
|
cls._apply_sd(pe, value)
|
||||||
|
|
||||||
class SdKeyScp80_01(SdKey, kvn=0x01, key_type=0x88, permitted_len=[16,24,32]): # AES key type
|
class SdKeyScp80_01(SdKey, kvn=0x01, key_type=0x88, permitted_len=[16,24,32]): # AES key type
|
||||||
pass
|
pass
|
||||||
|
|||||||
Reference in New Issue
Block a user