diff --git a/cards/generic_card.py b/cards/generic_card.py index 4411d00..99a0e7b 100644 --- a/cards/generic_card.py +++ b/cards/generic_card.py @@ -5,10 +5,10 @@ DEBUG = True class Card: APDU_GET_RESPONSE = "\x00\xC0\x00\x00" + APDU_VERIFY_PIN = "\x00\x20\x00\x00" SW_OK = '\x90\x00' ATRS = [] DRIVER_NAME = "Generic" - COMMANDS = {} STATUS_WORDS = { SW_OK: "Normal execution" } @@ -24,6 +24,24 @@ class Card: self.last_sw = None self.sw_changed = False + def verify_pin(self, pin_number, pin_value): + apdu = self.APDU_VERIFY_PIN[:3] + chr(pin_number) + \ + chr(len(pin_value)) + pin_value + result = self.send_apdu(apdu) + return result == self.SW_OK + + def cmd_verify(self, *args): + if len(args) != 2: + raise TypeError, "Must give exactly two arguments: pin number and pin" + pin_number = int(args[0], 0) + pin_value = binascii.a2b_hex("".join(args[1].split())) + self.verify_pin(pin_number, pin_value) + + COMMANDS = { + "verify": (cmd_verify, "verify pin_number pin_value", + """Verify a PIN.""") + } + def _check_apdu(apdu): if len(apdu) < 4 or ((len(apdu) > 5) and len(apdu) != (ord(apdu[4])+5)): print "Cowardly refusing to send invalid APDU:\n ", utils.hexdump(apdu, indent=2) diff --git a/cyberflex-shell.py b/cyberflex-shell.py index 23e185f..dc31328 100755 --- a/cyberflex-shell.py +++ b/cyberflex-shell.py @@ -1,7 +1,8 @@ #!/usr/bin/env python # -*- coding: iso-8859-1 -*- -import pycsc, utils, cards, os, re, binascii, sys, exceptions +import pycsc, utils, cards, os, re, binascii, sys, exceptions, traceback +print_backtrace = False try: import readline @@ -130,6 +131,8 @@ if __name__ == "__main__": if exctype == exceptions.SystemExit: raise exctype, value print "%s: %s" % (exctype, value) + if print_backtrace: + traceback.print_tb(sys.exc_info()[2]) elif COMMANDS.has_key(cmd.lower()): cmdspec = COMMANDS[cmd.lower()] @@ -140,6 +143,8 @@ if __name__ == "__main__": if exctype == exceptions.SystemExit: raise exctype, value print "%s: %s" % (exctype, value) + if print_backtrace: + traceback.print_tb(sys.exc_info()[2]) elif apduregex.match(line): ## Might be an APDU @@ -150,6 +155,8 @@ if __name__ == "__main__": except Exception: exctype, value = sys.exc_info()[:2] print "%s: %s" % (exctype, value) + if print_backtrace: + traceback.print_tb(sys.exc_info()[2]) else: print "Unknown command"