laforge has submitted this change. (
https://gerrit.osmocom.org/c/pysim/+/37537?usp=email
)
Change subject: pySim.apdu.global_platform: Decode the INSTALL command parameters
......................................................................
pySim.apdu.global_platform: Decode the INSTALL command parameters
Change-Id: I1c323c1cb1be504c6ad5b7efb0fa85d87eaa8cf7
---
M pySim/apdu/global_platform.py
M pySim/global_platform/__init__.py
2 files changed, 109 insertions(+), 1 deletion(-)
Approvals:
fixeria: Looks good to me, but someone else must approve
laforge: Looks good to me, approved
Jenkins Builder: Verified
diff --git a/pySim/apdu/global_platform.py b/pySim/apdu/global_platform.py
index bdba24e..894d864 100644
--- a/pySim/apdu/global_platform.py
+++ b/pySim/apdu/global_platform.py
@@ -1,7 +1,7 @@
# coding=utf-8
"""APDU definition/decoder of GlobalPLatform Card Spec (currently 2.1.1)
-(C) 2022 by Harald Welte <laforge(a)osmocom.org>
+(C) 2022-2024 by Harald Welte <laforge(a)osmocom.org>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -17,7 +17,11 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
+from construct import FlagsEnum, Struct
+from pySim.tlv import flatten_dict_lists
from pySim.apdu import ApduCommand, ApduCommandSet
+from pySim.construct import *
+from pySim.global_platform import InstallParameters
class GpDelete(ApduCommand, n='DELETE', ins=0xE4, cla=['8X',
'CX', 'EX']):
_apdu_case = 4
@@ -40,8 +44,29 @@
class GpGetStatus(ApduCommand, n='GET STATUS', ins=0xF2, cla=['8X',
'CX', 'EX']):
_apdu_case = 4
+# GPCS Section 11.5.2
class GpInstall(ApduCommand, n='INSTALL', ins=0xE6, cla=['8X',
'CX', 'EX']):
_apdu_case = 4
+ _construct_p1 = FlagsEnum(Byte, more_commands=0x80, for_registry_update=0x40,
+ for_personalization=0x20, for_extradition=0x10,
+ for_make_selectable=0x08, for_install=0x04, for_load=0x02)
+ _construct_p2 = Enum(Byte, no_info_provided=0x00, beginning_of_combined=0x01,
+ end_of_combined=0x03)
+ _construct = Struct('load_file_aid'/Prefixed(Int8ub, GreedyBytes),
+ 'module_aid'/Prefixed(Int8ub, GreedyBytes),
+ 'application_aid'/Prefixed(Int8ub, GreedyBytes),
+ 'privileges'/Prefixed(Int8ub, GreedyBytes),
+ 'install_parameters'/Prefixed(Int8ub, GreedyBytes), #
TODO: InstallParameters
+ 'install_token'/Prefixed(Int8ub, GreedyBytes))
+ def _decode_cmd(self):
+ # first use _construct* above
+ res = self._cmd_to_dict()
+ # then do TLV decode of install_parameters
+ ip = InstallParameters()
+ ip.from_tlv(res['body']['install_parameters'])
+ res['body']['install_parameters'] =
flatten_dict_lists(ip.to_dict())
+ return res
+
class GpLoad(ApduCommand, n='LOAD', ins=0xE8, cla=['8X', 'CX',
'EX']):
_apdu_case = 4
diff --git a/pySim/global_platform/__init__.py b/pySim/global_platform/__init__.py
index 0be316b..075a189 100644
--- a/pySim/global_platform/__init__.py
+++ b/pySim/global_platform/__init__.py
@@ -30,6 +30,80 @@
from pySim.filesystem import *
from pySim.tlv import *
from pySim.profile import CardProfile
+from pySim.ota import SimFileAccessAndToolkitAppSpecParams
+
+# GPCS Table 11-48 Load Parameter Tags
+class NonVolatileCodeMinMemoryReq(BER_TLV_IE, tag=0xC6):
+ _construct = GreedyInteger()
+
+# GPCS Table 11-48 Load Parameter Tags
+class VolatileMinMemoryReq(BER_TLV_IE, tag=0xC7):
+ _construct = GreedyInteger()
+
+# GPCS Table 11-48 Load Parameter Tags
+class NonVolatileDataMinMemoryReq(BER_TLV_IE, tag=0xC8):
+ _construct = GreedyInteger()
+
+# GPCS Table 11-49: Install Parameter Tags
+class GlobalServiceParams(BER_TLV_IE, tag=0xCB):
+ pass
+
+# GPCS Table 11-49: Install Parameter Tags
+class VolatileReservedMemory(BER_TLV_IE, tag=0xD7):
+ _construct = GreedyInteger()
+
+# GPCS Table 11-49: Install Parameter Tags
+class NonVolatileReservedMemory(BER_TLV_IE, tag=0xD8):
+ _construct = GreedyInteger()
+
+# GPCS Table 11-49: Install Parameter Tags
+class Ts102226SpecificParameter(BER_TLV_IE, tag=0xCA):
+ _construct = SimFileAccessAndToolkitAppSpecParams
+
+# GPCS Table 11-48 Load Parameter Tags
+class LoadFileDataBlockFormatId(BER_TLV_IE, tag=0xCD):
+ pass
+
+# GPCS Table 11-50: Make Selectable Parameter Tags
+class ImplicitSelectionParam(BER_TLV_IE, tag=0xCF):
+ pass
+
+# GPCS Table 11-48 Load Parameter Tags
+class LoadFileDtaBlockParameters(BER_TLV_IE, tag=0xDD):
+ pass
+
+# GPCS Table 11-48 Load Parameter Tags / 11-49: Install Parameter Tags
+class SystemSpecificParams(BER_TLV_IE, tag=0xEF,
+ nested=[NonVolatileCodeMinMemoryReq,
+ VolatileMinMemoryReq,
+ NonVolatileDataMinMemoryReq,
+ GlobalServiceParams,
+ VolatileReservedMemory,
+ NonVolatileReservedMemory,
+ Ts102226SpecificParameter,
+ LoadFileDataBlockFormatId,
+ ImplicitSelectionParam,
+ LoadFileDtaBlockParameters]):
+ pass
+
+# GPCS Table 11-49: Install Parameter Tags
+class ApplicationSpecificParams(BER_TLV_IE, tag=0xC9):
+ _construct = GreedyBytes
+
+class Ts102226SpecificTemplate(BER_TLV_IE, tag=0xEA):
+ pass
+
+class CrtForDigitalSignature(BER_TLV_IE, tag=0xB6):
+ # FIXME: nested
+ pass
+
+
+class InstallParameters(TLV_IE_Collection, nested=[ApplicationSpecificParams,
+ SystemSpecificParams,
+ Ts102226SpecificTemplate,
+ CrtForDigitalSignature]):
+ pass
+
sw_table = {
'Warnings': {
--
To view, visit
https://gerrit.osmocom.org/c/pysim/+/37537?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: pysim
Gerrit-Branch: master
Gerrit-Change-Id: I1c323c1cb1be504c6ad5b7efb0fa85d87eaa8cf7
Gerrit-Change-Number: 37537
Gerrit-PatchSet: 4
Gerrit-Owner: laforge <laforge(a)osmocom.org>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: dexter <pmaier(a)sysmocom.de>
Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Reviewer: laforge <laforge(a)osmocom.org>
Gerrit-MessageType: merged