增加了打包接口
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