增加了打包接口
diff --git a/tcutils/disttools.py b/tcutils/disttools.py
new file mode 100644
index 0000000..adf59ee
--- /dev/null
+++ b/tcutils/disttools.py
@@ -0,0 +1,41 @@
+# -*- coding: utf-8
+
+import sys
+import os
+from zipfile import ZipFile, ZIP_DEFLATED
+
+
+if sys.platform == 'win32':
+ build_path = 'build/exe.win32-2.6'
+else:
+ build_path = "build/exe"
+
+
+def _make_zip_file(args, dirname, names):
+ zip, build_dir, dist_version_name = args
+ # print "build dir : %s, %s" % (build_dir, dirname)
+ for file_name in names:
+ full_name = os.path.join(dirname, file_name)
+ if build_dir == dirname:
+ arcname = os.path.join(dist_version_name, file_name)
+ else:
+ d = dirname[len(build_dir) + 1:]
+ temp = os.path.join(dist_version_name, d)
+ arcname = os.path.join(temp, file_name)
+ zip.write(full_name, arcname)
+ print "zip file %s to %s" % (full_name, arcname)
+
+
+def make_dist(name, version, dist_dir='dist'):
+
+ dist_version_name = "%s-%s" % (name, version)
+ dist_name = os.path.join(dist_dir, dist_version_name + '.zip')
+ print "Make zip file ...[%s]" % os.path.relpath(dist_name)
+ zip_file_name = os.path.basename(dist_name)
+ zip_file_name = os.path.join(dist_dir, zip_file_name)
+ if not os.path.exists(dist_dir):
+ os.mkdir(dist_dir)
+ zip = ZipFile(zip_file_name, 'w', ZIP_DEFLATED)
+ build_dir = os.path.realpath(build_path)
+ os.path.walk(build_dir, _make_zip_file, (zip, build_dir, dist_version_name))
+ zip.close()
\ No newline at end of file
diff --git a/tcutils/pbocfunc.py b/tcutils/pbocfunc.py
index f21bf37..c6f6b86 100644
--- a/tcutils/pbocfunc.py
+++ b/tcutils/pbocfunc.py
@@ -126,6 +126,15 @@
k = codecs.decode(key, 'hex')
k1 = CalcMacDES(d, id, k)
return codecs.encode(k1, 'hex')
-
-
+
+def encrypt_m1key(inputkey):
+ statickey = codecs.decode('3230303530313331', 'hex')
+ key = codecs.decode(inputkey[:16], 'hex')
+ outkey = []
+ for i in range(8):
+ t1 = ord(key[i])
+ t2 = ord(statickey[i])
+ t = ((~t1) ^ t2) & 0xFF
+ outkey.append(chr(t))
+ return codecs.encode(''.join(outkey), 'hex')
diff --git a/tcutils/pyDecard.py b/tcutils/pyDecard.py
index 188e9a2..55774e6 100644
--- a/tcutils/pyDecard.py
+++ b/tcutils/pyDecard.py
@@ -7,13 +7,28 @@
from ctypes import *
import codecs
+
+def _b(v):
+ if isinstance(v, unicode):
+ return v.encode('latin_1')
+ else:
+ return v
+
+
class CardOperatorError(Exception):
- def __init__(self,msg):
- Exception.__init__(self,msg)
-
-class py_decard:
+ def __init__(self, msg):
+ Exception.__init__(self, msg)
+ self.msg = msg
+
+
+class py_decard(object):
+ # M1 卡密钥
+ KEY_A = 1
+ KEY_B = 2
+ # 寻卡模式
MODE_ALL = 1
MODE_IDLE = 0
+ #
ERROR_RET_NONE = 0
ERROR_RAISE_EXP = 1
dll_handle = None
@@ -23,67 +38,67 @@
@staticmethod
def _do_load_dll():
- if py_decard.dll_handle <> None:
+ if py_decard.dll_handle != None:
return
py_decard.dll_handle = windll.LoadLibrary(py_decard.dll_name)
@staticmethod
def setup(**kwdargs):
- if kwdargs.has_key("error_method"):
+ if 'error_method' in kwdargs:
py_decard.error_method = kwdargs["error_method"]
- ####################################################################
+####################################################################
def __init__(self):
py_decard._do_load_dll()
self.card_mode = 'contactless'
self.ic_port = 0
-
- def set_card_mode(self,mode='cotactless',icport=-1):
+
+ def set_card_mode(self, mode='cotactless', icport=-1):
self.card_mode = mode
- if self.card_mode <> 'contactless':
+ if self.card_mode != 'contactless':
self.ic_port = icport
-
- def setsamport(self,port):
+
+ def setsamport(self, port):
self.sam_port = self._get_sam_port(port)
ats_buffer = create_string_buffer('\000' * 256)
ats_len = c_char('\000')
-
- py_decard.dll_handle.dc_setcpu(py_decard.device_handle,self.sam_port)
- ret = py_decard.dll_handle.dc_cpureset(py_decard.device_handle,byref(ats_len),ats_buffer)
- if ret <> 0:
+
+ py_decard.dll_handle.dc_setcpu(py_decard.device_handle, self.sam_port)
+ ret = py_decard.dll_handle.dc_cpureset(py_decard.device_handle,
+ byref(ats_len), ats_buffer)
+ if ret != 0:
return self.error('CPUCard ats error')
l = ord(ats_len.value)
r = ats_buffer.raw[:l]
#print codecs.encode(r,'hex')
return r
-
- def error(self,error):
+
+ def error(self, error):
if py_decard.error_method == py_decard.ERROR_RET_NONE:
return None
raise CardOperatorError(error)
-
-
- def open_port(self,port,baud):
+
+ def open_port(self, port, baud):
if py_decard.dll_handle == None:
- raise RuntimeError( py_decard.dll_name + ' not load ')
- if py_decard.device_handle <> None:
+ raise RuntimeError(py_decard.dll_name + ' not load ')
+ if py_decard.device_handle != None:
return True
-
- dev_handle = py_decard.dll_handle.dc_init(port,baud)
+
+ dev_handle = py_decard.dll_handle.dc_init(port, baud)
if dev_handle <= 0:
return False
py_decard.device_handle = dev_handle
return True
-
+
def close_port(self):
if py_decard.device_handle == None:
return
py_decard.dll_handle.dc_exit(py_decard.device_handle)
py_decard.device_handle = None
-
+
def request_card(self):
if self.card_mode == 'contactless':
- py_decard.dll_handle.dc_reset(py_decard.device_handle,1)
+ py_decard.dll_handle.dc_reset(py_decard.device_handle, 1)
cardphyno = create_string_buffer('\000' * 64)
ret = py_decard.dll_handle.dc_card_hex(py_decard.device_handle,
py_decard.MODE_ALL,
@@ -93,30 +108,33 @@
return self.error('Request Card Error')
else:
return ''
-
+
def cpucard_ats(self):
ats_buffer = create_string_buffer('\000' * 256)
ats_len = c_char('\000')
if self.card_mode == 'contactless':
py_decard.dll_handle.dc_pro_reset.restype = c_short
- ret = py_decard.dll_handle.dc_pro_reset(py_decard.device_handle,byref(ats_len),ats_buffer)
- if ret <> 0:
+ ret = py_decard.dll_handle.dc_pro_reset(py_decard.device_handle,
+ byref(ats_len), ats_buffer)
+ if ret != 0:
return self.error('CPUCard ats error')
l = ord(ats_len.value)
r = ats_buffer.raw[:l]
#print codecs.encode(r,'hex')
return r
else:
- py_decard.dll_handle.dc_setcpu(py_decard.device_handle,self._get_sam_port(self.ic_port))
- ret = py_decard.dll_handle.dc_cpureset(py_decard.device_handle,byref(ats_len),ats_buffer)
- if ret <> 0:
+ py_decard.dll_handle.dc_setcpu(py_decard.device_handle,
+ self._get_sam_port(self.ic_port))
+ ret = py_decard.dll_handle.dc_cpureset(py_decard.device_handle,
+ byref(ats_len), ats_buffer)
+ if ret != 0:
return self.error('CPUCard ats error')
l = ord(ats_len.value)
r = ats_buffer.raw[:l]
#print codecs.encode(r,'hex')
- return r
-
- def _get_sam_port(self,port):
+ return r
+
+ def _get_sam_port(self, port):
if port == 1:
return 0x0c
elif port == 2:
@@ -127,24 +145,24 @@
return 0x0f
else:
self.error('samport error')
-
- def _do_apdu(self,command):
+
+ def _do_apdu(self, command):
response = create_string_buffer('\000' * 256)
resplen = c_char('\000')
if self.card_mode == 'contactless':
py_decard.dll_handle.dc_pro_commandlink.restype = c_short
- ret = py_decard.dll_handle.dc_pro_commandlink(py_decard.device_handle,len(command),
- command,byref(resplen),response,7,56)
+ ret = py_decard.dll_handle.dc_pro_commandlink(py_decard.device_handle, len(command),
+ command, byref(resplen), response, 7, 56)
else:
- ret = py_decard.dll_handle.dc_cpuapdu(py_decard.device_handle,len(command),
- command,byref(resplen),response)
-
- if ret <> 0:
- command_header = codecs.encode(command,'hex')
- return self.error('CPUCard apdu command : %s ,ret=%d' % (command_header,ret))
+ ret = py_decard.dll_handle.dc_cpuapdu(py_decard.device_handle, len(command),
+ command, byref(resplen), response)
+
+ if ret != 0:
+ command_header = codecs.encode(command, 'hex')
+ return self.error('CPUCard apdu command : %s ,ret=%d' % (command_header, ret))
return response.raw[:ord(resplen.value)]
- def cpucard_apdu(self,command):
+ def cpucard_apdu(self, command):
current_resp = self._do_apdu(command)
if ord(current_resp[-2]) == 0x61 and ord(current_resp[-1]) > 0x00:
cmd = '\x00\xC0\x00\x00' + current_resp[-1]
@@ -152,26 +170,26 @@
return self._do_apdu(cmd)
else:
return current_resp
-
- def cpucard_apdu_hex(self,command):
- cmd_result = command.replace(' ','')
- resp = self.cpucard_apdu(codecs.decode(cmd_result,'hex'))
+
+ def cpucard_apdu_hex(self, command):
+ cmd_result = command.replace(' ', '')
+ resp = self.cpucard_apdu(codecs.decode(cmd_result, 'hex'))
if resp == None:
return None
- return codecs.encode(resp,'hex').upper()
-
- def _do_sam_apdu(self,command):
+ return codecs.encode(resp, 'hex').upper()
+
+ def _do_sam_apdu(self, command):
response = create_string_buffer('\000' * 256)
resplen = c_char('\000')
- ret = py_decard.dll_handle.dc_cpuapdu(py_decard.device_handle,len(command),
- command,byref(resplen),response)
-
- if ret <> 0:
- command_header = codecs.encode(command,'hex')
- return self.error('CPUCard apdu command : %s ,ret=%d' % (command_header,ret))
+ ret = py_decard.dll_handle.dc_cpuapdu(py_decard.device_handle, len(command),
+ command, byref(resplen), response)
+
+ if ret != 0:
+ command_header = codecs.encode(command, 'hex')
+ return self.error('CPUCard apdu command : %s ,ret=%d' % (command_header, ret))
return response.raw[:ord(resplen.value)]
-
- def sam_apdu(self,command):
+
+ def sam_apdu(self, command):
current_resp = self._do_sam_apdu(command)
if ord(current_resp[-2]) == 0x61 and ord(current_resp[-1]) > 0x00:
cmd = '\x00\xC0\x00\x00' + current_resp[-1]
@@ -179,15 +197,42 @@
return self._do_sam_apdu(cmd)
else:
return current_resp
-
- def sam_apdu_hex(self,command):
- cmd_result = command.replace(' ','')
- resp = self.sam_apdu(codecs.decode(cmd_result,'hex'))
+
+ def sam_apdu_hex(self, command):
+ cmd_result = command.replace(' ', '')
+ resp = self.sam_apdu(codecs.decode(cmd_result, 'hex'))
if resp == None:
return None
- return codecs.encode(resp,'hex').upper()
-
-
+ return codecs.encode(resp, 'hex').upper()
+
def beep(self):
- py_decard.dll_handle.dc_beep(py_decard.device_handle,10)
-
+ py_decard.dll_handle.dc_beep(py_decard.device_handle, 10)
+
+ def auth_card(self, sectno, key, key_type):
+ assert key_type in (py_decard.KEY_A, py_decard.KEY_B), u"密钥类型错误"
+ if key_type == py_decard.KEY_A:
+ key_type = 0
+ else:
+ key_type = 4
+
+ r = py_decard.dll_handle.dc_authentication_pass(py_decard.device_handle,
+ key_type, sectno, key)
+ if r != 0:
+ return False
+ return True
+
+ def read_block(self, block_no):
+ data = create_string_buffer('\000' * 16)
+ r = py_decard.dll_handle.dc_read(py_decard.device_handle,
+ block_no, data)
+ if r != 0:
+ return None
+ return data.raw[:16]
+
+ def write_block(self, block_no, data):
+ data = _b(data)
+ r = py_decard.dll_handle.dc_write(py_decard.device_handle,
+ block_no, data)
+ if r != 0:
+ return False
+ return True