#! /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 and (t not in (0x4f, 0x8f)):
            tag = data[offset:offset + 2]
            offset += 2
        else:
            tag = data[offset]
            offset += 1
        if offset >= datalen:
            raise ValueError(u"data length error, cannot get tag length")
        t = ord(data[offset])
        if t & 0x80 == 0x80:
            vl = t & 0x7F
            if offset + 1 + vl >= datalen:
                raise ValueError(u"data length error, cannot get tag length")
            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],left[%d]" % (
                codecs.encode(tag, 'hex'), vlen, datalen - offset))
        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
