From 424a3c14c557f1bc1900bbe51db9dfa75e9051fd Mon Sep 17 00:00:00 2001 From: hploetz Date: Tue, 10 Jun 2008 03:34:21 +0000 Subject: [PATCH] Make it possible for a card/application class to specify the P1 used for SELECT in the file case Add an Application class (and AID) for NFC Forum Tag Type 4 git-svn-id: svn+ssh://localhost/home/henryk/svn/cyberflex-shell/trunk@261 f711b948-2313-0410-aaa9-d29f33439f0b --- cards/generic_card.py | 2 ++ cards/iso_7816_4_card.py | 3 ++- cards/nfc_application.py | 37 +++++++++++++++++++++++++++++++++++++ cyberflex-shell.py | 3 ++- 4 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 cards/nfc_application.py diff --git a/cards/generic_card.py b/cards/generic_card.py index cdd39c2..1108b59 100644 --- a/cards/generic_card.py +++ b/cards/generic_card.py @@ -66,6 +66,8 @@ class Card: "\xD2\x76\x00\x00\x25\x46\x53\x02\x00": ("DF_FAHRSCHEIN_NEU", "Fahrschein", {"fid": "\xB0\x00"}), "\xD2\x76\x00\x00\x25\x48\x42\x02\x00": ("DF_BANKING_20" , "HBCI", {"fid": "\xA6\x00"}), "\xD2\x76\x00\x00\x25\x4E\x50\x01\x00": ("DF_NOTEPAD", "Notepad", {"fid": "\xA6\x10"}), + + "\xd2\x76\x00\x00\x85\x01\x00": ("NFC_TYPE_4", "NFC NDEF Application on tag type 4", {"alias": ("nfc",)}, ), } # Alias for DF_BOERSE_NEU APPLICATIONS["\xA0\x00\x00\x00\x59\x50\x41\x43\x45\x01\x00"] = APPLICATIONS["\xD2\x76\x00\x00\x25\x45\x50\x02\x00"] diff --git a/cards/iso_7816_4_card.py b/cards/iso_7816_4_card.py index 755676f..a6871d5 100644 --- a/cards/iso_7816_4_card.py +++ b/cards/iso_7816_4_card.py @@ -11,6 +11,7 @@ class ISO_7816_4_Card(building_blocks.Card_with_read_binary,Card): DRIVER_NAME = ["ISO 7816-4"] FID_MF = "\x3f\x00" + SELECT_FILE_P1 = 0x02 SELECT_P2 = 0x0 ## def can_handle(cls, card): @@ -47,7 +48,7 @@ class ISO_7816_4_Card(building_blocks.Card_with_read_binary,Card): def open_file(self, fid, p2 = None): "Open an EF under the current DF" if p2 is None: p2 = self.SELECT_P2 - return self.select_file(0x02, p2, fid) + return self.select_file(self.SELECT_FILE_P1, p2, fid) def cmd_open(self, file): "Open a file" diff --git a/cards/nfc_application.py b/cards/nfc_application.py new file mode 100644 index 0000000..5e80991 --- /dev/null +++ b/cards/nfc_application.py @@ -0,0 +1,37 @@ +from generic_application import Application +import struct, sha, binascii, os, datetime, sys, utils + + +class NFC_Application(Application): + DRIVER_NAME = ["NFC Type 4"] + SELECT_FILE_P1 = 0 + + AID_LIST = [ + "d2760000850100" + ] + + def cmd_parse_cc(self): + "Read and parse the CC (Capability Container) EF" + result = self.open_file("\xe1\x03") + if self.check_sw(result.sw): + contents, sw = self.read_binary_file() + if len(contents) > 0: + print utils.hexdump(contents,linelen=self.HEXDUMP_LINELEN) + + if len(contents) < 0xf: + print "Invalid CC EF, can't parse (too short: 0x%x bytes)" % len(contents) + else: + cclen, version, MLe, MLc, ndef_control_tlv = struct.unpack('>HBHH8s', contents[:0xf]) + + print " CC length: %i (0x%x)%s" % (cclen, cclen, cclen == 0xffff and ", RFU" or "") + print "Mapping version: %i.%i" % (version >> 4, version & 0xf) + print " Maximum Le: %i (0x%x)%s" % (MLe, MLe, MLe <= 0xe and ", RFU" or "") + print " Maximum Lc: %i (0x%x)%s" % (MLc, MLc, MLc == 0x0 and ", RFU" or "") + + print "NDEF File Control TLV: %s" % utils.hexdump(ndef_control_tlv, short=True) + if len(contents) > 0xf: + print "More TLV blocks: %s" % utils.hexdump(contents[0xf:], short=True) + + COMMANDS = { + "parse_cc": cmd_parse_cc, + } diff --git a/cyberflex-shell.py b/cyberflex-shell.py index b775f55..7d88ed9 100755 --- a/cyberflex-shell.py +++ b/cyberflex-shell.py @@ -217,7 +217,8 @@ class Cyberflex_Shell(Shell): "Parse a fancy APDU and print the result" apdu = utils.C_APDU.parse_fancy_apdu(*args) data = apdu.render() - self.card.last_result = utils.R_APDU(data+"\x00\x00") + if hasattr(self, "card"): + self.card.last_result = utils.R_APDU(data+"\x00\x00") print utils.hexdump(data) def _update_prompt(self):