feat: read euicc info
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
39
resimulate/models/euicc_info_2.py
Normal file
39
resimulate/models/euicc_info_2.py
Normal 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})"
|
||||
Reference in New Issue
Block a user