|
From: <lu...@us...> - 2009-01-13 08:51:07
|
Revision: 249
http://pyscard.svn.sourceforge.net/pyscard/?rev=249&view=rev
Author: ludov
Date: 2009-01-13 08:51:04 +0000 (Tue, 13 Jan 2009)
Log Message:
-----------
sample to use a pinpad reader
Added Paths:
-----------
trunk/pyscard/src/smartcard/Examples/scard-api/sample_pinpad.py
Added: trunk/pyscard/src/smartcard/Examples/scard-api/sample_pinpad.py
===================================================================
--- trunk/pyscard/src/smartcard/Examples/scard-api/sample_pinpad.py (rev 0)
+++ trunk/pyscard/src/smartcard/Examples/scard-api/sample_pinpad.py 2009-01-13 08:51:04 UTC (rev 249)
@@ -0,0 +1,125 @@
+#! /usr/bin/env python
+"""
+Sample for python PCSC wrapper module: send a Control Code to a card or
+reader
+
+__author__ = "Ludovic Rousseau"
+
+Copyright 2009 Ludovic Rousseau
+Author: Ludovic Rousseau, mailto:lud...@fr...
+
+This file is part of pyscard.
+
+pyscard is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+pyscard is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with pyscard; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+"""
+
+from smartcard.scard import *
+from smartcard.util import toASCIIBytes
+
+def candoverifypin(hCard):
+ FEATURE_VERIFY_PIN_DIRECT = 6
+ return parse_get_feature_request(hCard, FEATURE_VERIFY_PIN_DIRECT)
+
+def candomodifypin(hCard):
+ FEATURE_MODIFY_PIN_DIRECT = 7
+ return parse_get_feature_request(hCard, FEATURE_MODIFY_PIN_DIRECT)
+
+def parse_get_feature_request(hCard, feature):
+ # check the reader can do a verify pin
+ CM_IOCTL_GET_FEATURE_REQUEST = SCARD_CTL_CODE(3400)
+ hresult, response = SCardControl(hcard, CM_IOCTL_GET_FEATURE_REQUEST, [])
+ if hresult!=SCARD_S_SUCCESS:
+ raise error, 'SCardControl failed: ' + SCardGetErrorMessage(hresult)
+ print response
+ while (len(response) > 0):
+ tag = response[0]
+ if (feature == tag):
+ return (((((response[2]<<8) + response[3])<<8) + response[4])<<8) + response[5]
+ response = response[6:]
+
+def verifypin(hCard, control=None):
+ if None==control:
+ control = candoverifypin(hCard)
+ if (None == control):
+ raise error, "Not a pinpad"
+ hresult, response = SCardControl(hcard, control, [])
+ if hresult!=SCARD_S_SUCCESS:
+ raise error, 'SCardControl failed: ' + SCardGetErrorMessage(hresult)
+ return hresult, response
+
+try:
+ hresult, hcontext = SCardEstablishContext( SCARD_SCOPE_USER )
+ if hresult!=0:
+ raise 'Failed to establish context: ' + SCardGetErrorMessage(hresult)
+ print 'Context established!'
+
+ try:
+ hresult, readers = SCardListReaders( hcontext, [] )
+ if hresult!=0:
+ raise error, 'Failed to list readers: ' + SCardGetErrorMessage(hresult)
+ print 'PCSC Readers:', readers
+
+ if len(readers)<1:
+ raise error, 'No smart card readers'
+
+ for zreader in readers:
+
+ print 'Trying to Control reader:', zreader
+
+ try:
+ hresult, hcard, dwActiveProtocol = SCardConnect(
+ hcontext, zreader, SCARD_SHARE_DIRECT, SCARD_PROTOCOL_T0 )
+ if hresult!=0:
+ raise error, 'Unable to connect: ' + SCardGetErrorMessage(hresult)
+ print 'Connected with active protocol', dwActiveProtocol
+
+ try:
+ cmd_verify = candoverifypin(hcard)
+ if (cmd_verify):
+ print "can do verify pin: 0x%08X" % cmd_verify
+
+ cmd_modify = candomodifypin(hcard)
+ if (cmd_modify):
+ print "can do modify pin: 0x%08X" % cmd_modify
+
+ (hresult, response) = verifypin(hcard, cmd_verify)
+ r = ""
+ for i in xrange(len(response)):
+ r += "%c" % response[i]
+ print 'Control:', r
+ finally:
+ hresult = SCardDisconnect( hcard, SCARD_UNPOWER_CARD )
+ if hresult!=0:
+ raise error, 'Failed to disconnect: ' + SCardGetErrorMessage(hresult)
+ print 'Disconnected'
+
+ except error, (message):
+ print error, message
+
+ finally:
+ hresult = SCardReleaseContext( hcontext )
+ if hresult!=SCARD_S_SUCCESS:
+ raise 'Failed to release context: ' + SCardGetErrorMessage(hresult)
+ print 'Released context.'
+
+except:
+ import sys
+ print sys.exc_info()[0], ':', sys.exc_info()[1]
+
+import sys
+if 'win32'==sys.platform:
+ print 'press Enter to continue'
+ sys.stdin.read(1)
+
Property changes on: trunk/pyscard/src/smartcard/Examples/scard-api/sample_pinpad.py
___________________________________________________________________
Added: svn:executable
+ *
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|