blob: 942ea185b487ae0bf3c72cbc535fff97f84e447e [file] [log] [blame]
#! /usr/bin/env python
# -*- coding: utf-8
# vim: tabstop=4
import pyDes
import 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 = [chr((~ord(a)) & 0xFF) for a in data]
return "".join(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')
# singledes delivery
if len(key) == 8:
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.append(chr(ord(initdata[j]) ^ ord(data[i * 8 + j])))
initdata = "".join(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.append(chr(ord(initdata[j]) ^ ord(data[i * 8 + j])))
initdata = "".join(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')
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')
def tlv_fetch_value(data):
datalen = len(data)
offset = 0
while offset < datalen:
t = ord(data[offset])
if t & 0x0F == 0x0F:
tag = data[offset:offset + 2]
offset += 2
else:
tag = data[offset]
offset += 1
t = ord(data[offset])
if t & 0x80 == 0x80:
vl = t & 0x7F
vlen = 0
for c in data[offset + 1:offset + 1 + vl]:
vlen = (vlen << 8) + ord(c)
offset += 1 + vl
else:
vlen = t & 0x7F
offset += 1
if datalen - offset < vlen:
raise ValueError(u"data length Error, tag [%s]length[%d]" % (
codecs.encode(tag, 'hex'), vlen))
value = data[offset:offset + vlen]
offset += vlen
yield (tag, value,)
def tlv_fetch_value_hex(data):
for n, v in tlv_fetch_value(codecs.decode(data, 'hex')):
yield (codecs.encode(n, 'hex'), codecs.encode(v, 'hex'))
def tlv_parse_value(data):
"""
分析 tlv 格式的数据
"""
result = {}
for n, v in tlv_fetch_value(data):
result.setdefault(n, v)
return result
def tlv_parse_value_hex(data):
"""
分析 tlv 格式的数据, data 是 hex 格式
"""
result = {}
for n, v in tlv_fetch_value(codecs.decode(data, 'hex')):
result.setdefault(codecs.encode(n, 'hex'), codecs.encode(v, 'hex'))
return result
def tlv_fetch_define(data):
"""
分析 tlv 定义(不包括数据)
"""
datalen = len(data)
offset = 0
while offset < datalen:
t = ord(data[offset])
if t & 0x0F == 0x0F:
tag = data[offset:offset + 2]
offset += 2
else:
tag = data[offset]
offset += 1
t = ord(data[offset])
if t & 0x80 == 0x80:
vl = t & 0x7F
vlen = 0
for c in data[offset + 1:offset + 1 + vl]:
vlen = (vlen << 8) + ord(c)
offset += 1 + vl
else:
vlen = t & 0x7F
offset += 1
yield (tag, vlen,)
def tlv_fetch_define_hex(data):
"""
分析 tlv 定义(不包括数据), data hex 格式
"""
for n, l in tlv_fetch_define(codecs.decode(data, 'hex')):
yield (codecs.encode(n, 'hex'), l)
def tlv_parse_define(data):
"""
分析 tlv 定义(不包括数据)
"""
result = {}
for n, l in tlv_fetch_define(data):
result.setdefault(n, l)
return result
def tlv_parse_define_hex(data):
"""
分析 tlv 定义(不包括数据), data hex 格式
"""
result = {}
for n, l in tlv_fetch_define(codecs.decode(data, 'hex')):
result.setdefault(codecs.encode(n, 'hex'), l)
return result
def extract_ec_data(data, tags):
offset = 0
datalen = len(data)
for tag in tags:
tag_len = len(tag)
if offset + tag_len > datalen:
break
if data[offset:offset + tag_len] != tag:
raise KeyError(u"Tag [%s] not found", codecs.encode(tag, 'hex'))
offset += tag_len
t = ord(data[offset])
if t & 0x80 == 0x80:
vl = t & 0x7F
vlen = 0
for c in data[offset + 1:offset + 1 + vl]:
vlen = (vlen << 8) + ord(c)
offset += 1 + vl
else:
vlen = t & 0x7F
offset += 1
if offset + vlen > datalen:
raise ValueError(u"data length error!tag[%s]length[%d]" % (
codecs.encode(tag, 'hex'), vlen))
value = data[offset:offset + vlen]
offset += vlen
yield (tag, value,)
def extract_ec_data_hex(data, tags):
t = [codecs.decode(a, 'hex') for a in tags]
for t, v in extract_ec_data(codecs.decode(data, 'hex'), t):
yield (codecs.encode(t, 'hex'), codecs.encode(v, 'hex'),)
def extract_ec_data_dict_hex(data, tags):
result = {}
for t, v in extract_ec_data_hex(data, tags):
result.setdefault(t, v)
return result