fileystem: fix ADF selection
When the ADF is selected, then this is done by the AID. At the moment
only the first 7 bytes of the AID are used to select the ADF.
sysmo-isim-sja2 tolerates this, but sysmo-usim-sjs1 does not. The Cards
class already has methods to deal with this problem. The method
select_adf_by_aid takes an ADF name and completes the AID from an
internal list. This can be extended to support partial hexadecimal AIDs
as well.
Change-Id: If99b143ae5ff42a889c52e8023084692e709e1b1
Related: OS#4963
diff --git a/pySim/cards.py b/pySim/cards.py
index 857d0b6..5eb2884 100644
--- a/pySim/cards.py
+++ b/pySim/cards.py
@@ -224,21 +224,21 @@
# Select ADF.U/ISIM in the Card using its full AID
def select_adf_by_aid(self, adf="usim"):
- # Check for valid ADF name
- if adf not in ["usim", "isim"]:
- return None
-
- # First (known) halves of the U/ISIM AID
- aid_map = {}
- aid_map["usim"] = "a0000000871002"
- aid_map["isim"] = "a0000000871004"
-
- for aid in self._aids:
- if aid_map[adf] in aid:
- (res, sw) = self._scc.select_adf(aid)
- return sw
-
- return None
+ # Find full AID by partial AID:
+ if is_hex(adf):
+ for aid in self._aids:
+ if len(aid) >= len(adf) and adf == aid[0:len(adf)]:
+ return self._scc.select_adf(aid)
+ # Find full AID by application name:
+ elif adf in ["usim", "isim"]:
+ # First (known) halves of the U/ISIM AID
+ aid_map = {}
+ aid_map["usim"] = "a0000000871002"
+ aid_map["isim"] = "a0000000871004"
+ for aid in self._aids:
+ if aid_map[adf] in aid:
+ return self._scc.select_adf(aid)
+ return (None, None)
# Erase the contents of a file
def erase_binary(self, ef):
@@ -1335,7 +1335,8 @@
self._scc.update_binary('6f20', p['opc'], 17)
# update EF-USIM_AUTH_KEY in ADF.ISIM
- if '9000' == self.select_adf_by_aid(adf="isim"):
+ data, sw = self.select_adf_by_aid(adf="isim")
+ if sw == '9000':
if p.get('ki'):
self._scc.update_binary('af20', p['ki'], 1)
if p.get('opc'):
@@ -1382,7 +1383,8 @@
if sw != '9000':
print("Programming IMPU failed with code %s"%sw)
- if '9000' == self.select_adf_by_aid():
+ data, sw = self.select_adf_by_aid(adf="usim")
+ if sw == '9000':
# update EF-USIM_AUTH_KEY in ADF.USIM
if p.get('ki'):
self._scc.update_binary('af20', p['ki'], 1)