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')
+
+
+