initialize
diff --git a/src/pbocfunc.py b/src/pbocfunc.py
new file mode 100644
index 0000000..f21bf37
--- /dev/null
+++ b/src/pbocfunc.py
@@ -0,0 +1,131 @@
+#! /usr/bin/env python

+# vim: tabstop=4

+

+import pyDes, codecs

+

+

+

+def desencrypt(key, data, m=pyDes.ECB):

+    k = pyDes.des(key, pad=None, padmode=pyDes.PAD_NORMAL, mode=m)

+    return k.encrypt(data) 

+    

+def desdecrypt(key, data, m=pyDes.ECB):

+    k = pyDes.des(key, pad=None, padmode=pyDes.PAD_NORMAL, mode=m)

+    return k.decrypt(data) 

+

+def tripledesencrypt(key, data, m=pyDes.ECB):

+    k = pyDes.triple_des(key, pad=None, padmode=pyDes.PAD_NORMAL, mode=m)

+    return k.encrypt(data)

+    

+def tripledesdecrypt(key, data, m=pyDes.ECB):

+    k = pyDes.triple_des(key, pad=None, padmode=pyDes.PAD_NORMAL, mode=m)

+    return k.decrypt(data)

+

+

+def desencrypthex(key, data):

+    k = pyDes.des(codecs.decode(key, 'hex'), pad=None, padmode=pyDes.PAD_NORMAL)

+    e = k.encrypt(codecs.decode(data, 'hex')) 

+    return codecs.encode(e, 'hex')

+

+def tripledesencrypthex(key, data):

+    k = pyDes.triple_des(codecs.decode(key, 'hex'), pad=None, padmode=pyDes.PAD_NORMAL)

+    e1 = k.encrypt(codecs.decode(data, 'hex'))

+    return codecs.encode(e1, 'hex')

+

+def DataNot(data):

+    r = ''

+    for a in data:

+        r = r + chr((~ord(a)) & 0xFF)

+    return r

+        

+def PadCardPhyNo(phyno):

+    r = ''

+    if len(phyno) < 8:

+        pad = "\x80\x00\x00\x00\x00\x00\x00\x00"

+        l = 8 - len(phyno)

+        r = phyno + pad[:l]

+    elif len(phyno) == 8:

+        r = phyno

+    else:

+        r = phyno[:8]

+    return r

+    

+def PadCardPhyNoHex(phyno):

+    return codecs.encode(PadCardPhyNo(codecs.decode(phyno, 'hex')), 'hex')

+    

+def PbocDeliveryKey(factor, key):

+    cipherdatanot = ''

+    cipherdata = PadCardPhyNo(factor)

+    

+    print "factor is [%s]" % codecs.encode(cipherdata, 'hex')

+

+    if len(key) == 8: # singledes delivery

+        k1 = desencrypt(key, cipherdata)

+        return k1

+    elif len(key) == 16:

+        cipherdatanot = DataNot(cipherdata)

+        

+        k1 = tripledesencrypt(key, cipherdata)

+        k2 = tripledesencrypt(key, cipherdatanot)

+        

+        return k1 + k2

+    else:

+        raise ValueError('key length error')

+    

+def PbocDeliveryKeyHex(factor, key):

+    f = codecs.decode(factor, 'hex')

+    k = codecs.decode(key, 'hex')

+    k1 = PbocDeliveryKey(f, k)

+    return codecs.encode(k1, 'hex')

+   

+

+def CalcMac3DES(data, initdata, key):

+    datalen = len(data)

+    k = pyDes.des(key[:8], pad=None, padmode=pyDes.PAD_NORMAL)

+

+    for i in range(datalen / 8):

+        m = ""

+        for j in range(len(initdata)):

+            m = m + chr(ord(initdata[j]) ^ ord(data[i * 8 + j]))

+

+        initdata = m

+        x = k.encrypt(initdata)

+        initdata = x

+

+

+    k1 = pyDes.des(key[8:], pad=None, padmode=pyDes.PAD_NORMAL)

+    n = k1.decrypt(initdata)

+    initdata = k.encrypt(n)

+    return initdata

+    

+def CalcMac3DESHex(data, initdata, key):

+    d = codecs.decode(data, 'hex')

+    id = codecs.decode(initdata, 'hex')

+    k = codecs.decode(key, 'hex')

+    k1 = CalcMac3DES(d, id, k)

+    return codecs.encode(k1, 'hex')

+    

+def CalcMacDES(data, initdata, key):

+    datalen = len(data)

+    k = pyDes.des(key, pad=None, padmode=pyDes.PAD_NORMAL)

+    

+    for i in range(datalen / 8):

+        m = ""

+        for j in range(len(initdata)):

+            m = m + chr(ord(initdata[j]) ^ ord(data[i * 8 + j]))

+

+        initdata = m

+        x = k.encrypt(initdata)

+        initdata = x

+        

+    return initdata

+        

+def CalcMacDESHex(data, initdata, key):

+    d = codecs.decode(data, 'hex')

+    id = codecs.decode(initdata, 'hex')

+    k = codecs.decode(key, 'hex')

+    k1 = CalcMacDES(d, id, k)

+    return codecs.encode(k1, 'hex')

+    

+

+