aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2011-03-23 23:22:20 +0100
committerHarald Welte <laforge@gnumonks.org>2011-03-23 23:22:20 +0100
commit976ac45ff8a13646744e12d27ecab27e9b3e79ab (patch)
treedd7ed99cc16aca02f5611fdf8e71f21e965138fe
parent8483d8a7ec8a1529839ac6a657f1ec4352f5ee4a (diff)
Add new "GRCard" module for the (HZCOS based?) grcard.cn SIMHEADmaster
This sim is re-programmable and we add commands for setting Ki, PIN, A3/A8 algorithm, ...
-rw-r--r--cards/grcard_sim_card.py56
1 files changed, 56 insertions, 0 deletions
diff --git a/cards/grcard_sim_card.py b/cards/grcard_sim_card.py
new file mode 100644
index 0000000..76526ed
--- /dev/null
+++ b/cards/grcard_sim_card.py
@@ -0,0 +1,56 @@
+import utils
+from gsm_card import *
+import building_blocks
+
+class GRCard_Card(GSM_Card):
+ DRIVER_NAME = ["GRCard"]
+ ATRS = [
+ ("3b991800118822334455667760", None),
+ ]
+
+ DF_ALGO = "\x27\x00"
+ EF_ALGO = "\x6f\x70"
+
+ APDU_ERASE_CARD = C_APDU(CLA=0x80, INS=0xFE, data="123456\x00\x00\x13\x01\xFF\x00\x00\x00\x00\x00\x00\x00\x00\xEA")
+ APDU_SET_KI = C_APDU(CLA=0x80, INS=0xD4, P1=0x02)
+ APDU_SET_PINPUK = C_APDU(CLA=0x80, INS=0xD4)
+
+ def cmd_set_algo(self, algo):
+ """Set the COMP128 version to be used as A3/A8 algorithm in the card."""
+ self.select_file(0, 0, self.DF_ALGO)
+ self.select_file(0, 0, self.EF_ALGO)
+ self.cmd_upd_binary(algo)
+
+ def cmd_erase_card(self):
+ """Erase the entire card including all DF and EF."""
+ self.send_apdu(self.APDU_ERASE_CARD)
+
+ def cmd_set_ki(self, ki):
+ """Set the Ki to be used by the A3/A8 algorithm."""
+ ki_bin = binascii.a2b_hex("".join(ki.split()))
+ apdu = C_APDU(self.APDU_SET_KI, data = ki_bin)
+ self.send_apdu(apdu)
+
+ def set_pin_puk(self, pin_num, pin, puk):
+ data_bin = self.pad(pin, 8) + self.pad(puk, 8)
+ apdu = C_APDU(self.APDU_SET_PINPUK, P2 = pin_num, data = data_bin)
+ self.send_apdu(apdu)
+
+ def cmd_set_pin_puk(self, pin_num, pin, puk):
+ """Set the PIN + PUK (1 or 2)."""
+ self.set_pin_puk(int(pin_num, 0), pin, puk)
+
+ def pad(self, data, padded_len):
+ topad = padded_len - len(data)
+ if topad <= 0:
+ return data
+ return data + ("\xFF" * topad)
+
+ COMMANDS = {}
+ COMMANDS.update(GSM_Card.COMMANDS)
+ COMMANDS.update({
+ "grcard_set_algo" : cmd_set_algo,
+ "grcard_erase_card" : cmd_erase_card,
+ "grcard_set_ki" : cmd_set_ki,
+ "grcard_set_pin_puk" : cmd_set_pin_puk,
+ })