laforge has uploaded this change for review. ( 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(-) git pull ssh://gerrit.osmocom.org:29418/pysim refs/changes/37/37537/1 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 <lafo...@osmocom.org> +(C) 2022-2024 by Harald Welte <lafo...@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: 1 Gerrit-Owner: laforge <lafo...@osmocom.org> Gerrit-MessageType: newchange