feat: read euicc info

This commit is contained in:
2025-02-04 01:11:38 +01:00
parent 84070bb84a
commit 78f77b5772
6 changed files with 63 additions and 12 deletions

View File

@@ -7,8 +7,9 @@ from pySim.profile import CardProfile
from pySim.ts_102_221 import CardProfileUICC
from pySim.utils import all_subclasses
from pySim.exceptions import SwMatchError
from pySim.euicc import CardApplicationISDR
from pySim.euicc import CardApplicationISDR, EuiccInfo2
from resimulate.models.euicc_info_2 import EuiccInfo2Data
from resimulate.util.enums import ISDR_AID
from resimulate.util.logger import log
@@ -23,7 +24,7 @@ class Card:
self.sim_link = sim_link
self.sim_card_commands = SimCardCommands(transport=sim_link)
def init_card(self, target_ids_r: ISDR_AID, timeout: int = 3) -> SimCardBase:
def init_card(self, target_isd_r: ISDR_AID, timeout: int = 3) -> SimCardBase:
self.sim_link.wait_for_card(timeout=timeout)
self.card = UiccCardBase(self.sim_card_commands)
@@ -55,25 +56,34 @@ class Card:
if self.generic_card:
self.card = UiccCardBase(self.sim_card_commands)
runtime_state = RuntimeState(self.card, self.profile)
self.runtime_state = RuntimeState(self.card, self.profile)
CardModel.apply_matching_models(self.sim_card_commands, runtime_state)
CardModel.apply_matching_models(self.sim_card_commands, self.runtime_state)
# inform the transport that we can do context-specific SW interpretation
self.sim_link.set_sw_interpreter(runtime_state)
self.sim_link.set_sw_interpreter(self.runtime_state)
# try to obtain the EID, if any
isd_r = runtime_state.mf.applications.get(target_ids_r.value, None)
isd_r = self.runtime_state.mf.applications.get(target_isd_r.value.lower(), None)
if isd_r:
runtime_state.lchan[0].select_file(isd_r)
self.runtime_state.lchan[0].select_file(isd_r)
try:
runtime_state.identity["EID"] = CardApplicationISDR.get_eid(
self.runtime_state.identity["EID"] = CardApplicationISDR.get_eid(
self.sim_card_commands
)
euicc_info_2 = CardApplicationISDR.store_data_tlv(
self.sim_card_commands, EuiccInfo2(), EuiccInfo2
)
self.euicc_info_2 = EuiccInfo2Data.from_list(
euicc_info_2.to_dict()["euicc_info2"]
)
except SwMatchError:
# has ISD-R but not a SGP.22/SGP.32 eUICC - maybe SGP.02?
pass
finally:
runtime_state.reset()
self.runtime_state.reset()
else:
log.warning("No ISD-R application found on card.")
return self.card

View File

@@ -13,7 +13,7 @@ from rich.text import Text
from resimulate.recording import Recording
from resimulate.util.enums import ISDR_AID
from resimulate.util.logger import log
from resimulate.util.tracer import Tracer
from resimulate.tracer import Tracer
class Recorder:

View File

@@ -77,8 +77,10 @@ class Replayer:
try:
pcsc_link = PcscSimLink() # PcscLink(device_index=self.device)
log.debug("PC/SC link initialized: %s", pcsc_link)
card = Card(pcsc_link).init_card(target_ids_r=self.target_isd_r_aid)
log.debug("Initialized card of type: %s", card.name)
card = Card(pcsc_link)
initialized_card = card.init_card(target_isd_r=self.target_isd_r_aid)
log.debug("Initialized card of type: %s", initialized_card.name)
log.debug("Card eUICC Info: %s", card.euicc_info_2)
except Exception as e:
log.error("Failed to initialize card: %s", e)
log.exception(e)

View File

@@ -0,0 +1,39 @@
from dataclasses import dataclass
@dataclass
class EuiccInfo2Data:
profile_version: str
svn: str
euicc_firmware_version: str
ext_card_resource: str
uicc_capability: str
ts102241_version: str
global_platform_version: str
rsp_capability: str
euicc_ci_pki_list_for_verification: list[dict[str, str]]
euicc_ci_pki_list_for_signing: list[dict[str, str]]
pp_version: str
sas_accreditation_number: str
@staticmethod
def from_list(obj: list[dict[str, str]]) -> "EuiccInfo2Data":
return EuiccInfo2Data(
profile_version=obj[0]["profile_version"],
svn=obj[1]["svn"],
euicc_firmware_version=obj[2]["euicc_firmware_ver"],
ext_card_resource=obj[3]["ext_card_resource"],
uicc_capability=obj[4]["uicc_capability"],
ts102241_version=obj[5]["ts102241_version"],
global_platform_version=obj[6]["global_platform_version"],
rsp_capability=obj[7]["rsp_capability"],
euicc_ci_pki_list_for_verification=obj[8][
"euicc_ci_pki_list_for_verification"
],
euicc_ci_pki_list_for_signing=obj[9]["euicc_ci_pki_list_for_signing"],
pp_version=obj[11]["pp_version"],
sas_accreditation_number=obj[12]["ss_acreditation_number"],
)
def __repr_rich__(self) -> str:
return f"EuiccInfo2(profile_version={self.profile_version!r}, svn={self.svn!r}, euicc_firmware_version={self.euicc_firmware_version!r}, ext_card_resource={self.ext_card_resource!r}, uicc_capability={self.uicc_capability!r}, ts102241_version={self.ts102241_version!r}, global_platform_version={self.global_platform_version!r}, rsp_capability={self.rsp_capability!r}, euicc_ci_pki_list_for_verification={self.euicc_ci_pki_list_for_verification!r}, euicc_ci_pki_list_for_signing={self.euicc_ci_pki_list_for_signing!r}, pp_version={self.pp_version!r}, sas_accreditation_number={self.sas_accreditation_number!r})"