blob: 7c4fe906057ac793b0ac0072b3434a3c2cc8495e [file] [log] [blame]
Cheng Tangc92b3ea2012-07-02 17:29:24 +08001#! /usr/bin/env python
Cheng Tangc1b86be2012-09-24 11:18:36 +08002# -*- coding: utf-8
Cheng Tangc92b3ea2012-07-02 17:29:24 +08003# vim: tabstop=4
4
Cheng Tangc1b86be2012-09-24 11:18:36 +08005import pyDes
6import codecs
Cheng Tangc92b3ea2012-07-02 17:29:24 +08007
8
9def desencrypt(key, data, m=pyDes.ECB):
10 k = pyDes.des(key, pad=None, padmode=pyDes.PAD_NORMAL, mode=m)
Cheng Tangc1b86be2012-09-24 11:18:36 +080011 return k.encrypt(data)
12
13
Cheng Tangc92b3ea2012-07-02 17:29:24 +080014def desdecrypt(key, data, m=pyDes.ECB):
15 k = pyDes.des(key, pad=None, padmode=pyDes.PAD_NORMAL, mode=m)
Cheng Tangc1b86be2012-09-24 11:18:36 +080016 return k.decrypt(data)
17
Cheng Tangc92b3ea2012-07-02 17:29:24 +080018
19def tripledesencrypt(key, data, m=pyDes.ECB):
20 k = pyDes.triple_des(key, pad=None, padmode=pyDes.PAD_NORMAL, mode=m)
21 return k.encrypt(data)
Cheng Tangc1b86be2012-09-24 11:18:36 +080022
23
Cheng Tangc92b3ea2012-07-02 17:29:24 +080024def tripledesdecrypt(key, data, m=pyDes.ECB):
25 k = pyDes.triple_des(key, pad=None, padmode=pyDes.PAD_NORMAL, mode=m)
26 return k.decrypt(data)
27
28
29def desencrypthex(key, data):
30 k = pyDes.des(codecs.decode(key, 'hex'), pad=None, padmode=pyDes.PAD_NORMAL)
Cheng Tangc1b86be2012-09-24 11:18:36 +080031 e = k.encrypt(codecs.decode(data, 'hex'))
Cheng Tangc92b3ea2012-07-02 17:29:24 +080032 return codecs.encode(e, 'hex')
33
Cheng Tangc1b86be2012-09-24 11:18:36 +080034
Cheng Tangc92b3ea2012-07-02 17:29:24 +080035def tripledesencrypthex(key, data):
36 k = pyDes.triple_des(codecs.decode(key, 'hex'), pad=None, padmode=pyDes.PAD_NORMAL)
37 e1 = k.encrypt(codecs.decode(data, 'hex'))
38 return codecs.encode(e1, 'hex')
39
Cheng Tangc1b86be2012-09-24 11:18:36 +080040
Cheng Tangc92b3ea2012-07-02 17:29:24 +080041def DataNot(data):
Cheng Tangc1b86be2012-09-24 11:18:36 +080042 r = [chr((~ord(a)) & 0xFF) for a in data]
43 return "".join(r)
44
45
Cheng Tangc92b3ea2012-07-02 17:29:24 +080046def PadCardPhyNo(phyno):
47 r = ''
48 if len(phyno) < 8:
49 pad = "\x80\x00\x00\x00\x00\x00\x00\x00"
50 l = 8 - len(phyno)
51 r = phyno + pad[:l]
52 elif len(phyno) == 8:
53 r = phyno
54 else:
55 r = phyno[:8]
56 return r
Cheng Tangc1b86be2012-09-24 11:18:36 +080057
58
Cheng Tangc92b3ea2012-07-02 17:29:24 +080059def PadCardPhyNoHex(phyno):
60 return codecs.encode(PadCardPhyNo(codecs.decode(phyno, 'hex')), 'hex')
Cheng Tangc1b86be2012-09-24 11:18:36 +080061
62
Cheng Tangc92b3ea2012-07-02 17:29:24 +080063def PbocDeliveryKey(factor, key):
64 cipherdatanot = ''
65 cipherdata = PadCardPhyNo(factor)
Cheng Tangc92b3ea2012-07-02 17:29:24 +080066 print "factor is [%s]" % codecs.encode(cipherdata, 'hex')
67
Cheng Tangc1b86be2012-09-24 11:18:36 +080068 # singledes delivery
69 if len(key) == 8:
Cheng Tangc92b3ea2012-07-02 17:29:24 +080070 k1 = desencrypt(key, cipherdata)
71 return k1
72 elif len(key) == 16:
73 cipherdatanot = DataNot(cipherdata)
Cheng Tangc92b3ea2012-07-02 17:29:24 +080074 k1 = tripledesencrypt(key, cipherdata)
75 k2 = tripledesencrypt(key, cipherdatanot)
Cheng Tangc92b3ea2012-07-02 17:29:24 +080076 return k1 + k2
77 else:
78 raise ValueError('key length error')
Cheng Tangc1b86be2012-09-24 11:18:36 +080079
80
Cheng Tangc92b3ea2012-07-02 17:29:24 +080081def PbocDeliveryKeyHex(factor, key):
82 f = codecs.decode(factor, 'hex')
83 k = codecs.decode(key, 'hex')
84 k1 = PbocDeliveryKey(f, k)
85 return codecs.encode(k1, 'hex')
Cheng Tangc1b86be2012-09-24 11:18:36 +080086
Cheng Tangc92b3ea2012-07-02 17:29:24 +080087
88def CalcMac3DES(data, initdata, key):
89 datalen = len(data)
90 k = pyDes.des(key[:8], pad=None, padmode=pyDes.PAD_NORMAL)
Cheng Tangc92b3ea2012-07-02 17:29:24 +080091 for i in range(datalen / 8):
Cheng Tangc1b86be2012-09-24 11:18:36 +080092 m = []
Cheng Tangc92b3ea2012-07-02 17:29:24 +080093 for j in range(len(initdata)):
Cheng Tangc1b86be2012-09-24 11:18:36 +080094 m.append(chr(ord(initdata[j]) ^ ord(data[i * 8 + j])))
Cheng Tangc92b3ea2012-07-02 17:29:24 +080095
Cheng Tangc1b86be2012-09-24 11:18:36 +080096 initdata = "".join(m)
Cheng Tangc92b3ea2012-07-02 17:29:24 +080097 x = k.encrypt(initdata)
98 initdata = x
99
Cheng Tangc92b3ea2012-07-02 17:29:24 +0800100 k1 = pyDes.des(key[8:], pad=None, padmode=pyDes.PAD_NORMAL)
101 n = k1.decrypt(initdata)
102 initdata = k.encrypt(n)
103 return initdata
Cheng Tangc1b86be2012-09-24 11:18:36 +0800104
105
Cheng Tangc92b3ea2012-07-02 17:29:24 +0800106def CalcMac3DESHex(data, initdata, key):
107 d = codecs.decode(data, 'hex')
108 id = codecs.decode(initdata, 'hex')
109 k = codecs.decode(key, 'hex')
110 k1 = CalcMac3DES(d, id, k)
111 return codecs.encode(k1, 'hex')
Cheng Tangc1b86be2012-09-24 11:18:36 +0800112
113
Cheng Tangc92b3ea2012-07-02 17:29:24 +0800114def CalcMacDES(data, initdata, key):
115 datalen = len(data)
116 k = pyDes.des(key, pad=None, padmode=pyDes.PAD_NORMAL)
Cheng Tangc92b3ea2012-07-02 17:29:24 +0800117 for i in range(datalen / 8):
Cheng Tangc1b86be2012-09-24 11:18:36 +0800118 m = []
Cheng Tangc92b3ea2012-07-02 17:29:24 +0800119 for j in range(len(initdata)):
Cheng Tangc1b86be2012-09-24 11:18:36 +0800120 m.append(chr(ord(initdata[j]) ^ ord(data[i * 8 + j])))
121 initdata = "".join(m)
Cheng Tangc92b3ea2012-07-02 17:29:24 +0800122 x = k.encrypt(initdata)
123 initdata = x
Cheng Tangc1b86be2012-09-24 11:18:36 +0800124
Cheng Tangc92b3ea2012-07-02 17:29:24 +0800125 return initdata
Cheng Tangc1b86be2012-09-24 11:18:36 +0800126
127
Cheng Tangc92b3ea2012-07-02 17:29:24 +0800128def CalcMacDESHex(data, initdata, key):
129 d = codecs.decode(data, 'hex')
130 id = codecs.decode(initdata, 'hex')
131 k = codecs.decode(key, 'hex')
132 k1 = CalcMacDES(d, id, k)
133 return codecs.encode(k1, 'hex')
Cheng Tangc92b3ea2012-07-02 17:29:24 +0800134
Tang Cheng1aa15ee2012-09-06 10:12:23 +0800135
136def encrypt_m1key(inputkey):
137 statickey = codecs.decode('3230303530313331', 'hex')
138 key = codecs.decode(inputkey[:16], 'hex')
139 outkey = []
140 for i in range(8):
141 t1 = ord(key[i])
142 t2 = ord(statickey[i])
143 t = ((~t1) ^ t2) & 0xFF
144 outkey.append(chr(t))
145 return codecs.encode(''.join(outkey), 'hex')
Cheng Tangc1b86be2012-09-24 11:18:36 +0800146
147
148def tlv_fetch_value(data):
149 datalen = len(data)
150 offset = 0
151 while offset < datalen:
152 t = ord(data[offset])
Tang Chengc91a5fc2012-11-05 13:26:57 +0800153 if t & 0x0F == 0x0F and (t not in (0x4f, 0x8f)):
Cheng Tangc1b86be2012-09-24 11:18:36 +0800154 tag = data[offset:offset + 2]
155 offset += 2
156 else:
157 tag = data[offset]
158 offset += 1
Tang Chengc91a5fc2012-11-05 13:26:57 +0800159 if offset >= datalen:
160 raise ValueError(u"data length error, cannot get tag length")
Cheng Tangc1b86be2012-09-24 11:18:36 +0800161 t = ord(data[offset])
162 if t & 0x80 == 0x80:
163 vl = t & 0x7F
Tang Chengc91a5fc2012-11-05 13:26:57 +0800164 if offset + 1 + vl >= datalen:
165 raise ValueError(u"data length error, cannot get tag length")
Cheng Tangc1b86be2012-09-24 11:18:36 +0800166 vlen = 0
167 for c in data[offset + 1:offset + 1 + vl]:
168 vlen = (vlen << 8) + ord(c)
169 offset += 1 + vl
170 else:
171 vlen = t & 0x7F
172 offset += 1
173
174 if datalen - offset < vlen:
Tang Chengc91a5fc2012-11-05 13:26:57 +0800175 raise ValueError(u"data length Error, tag [%s]length[%d],left[%d]" % (
176 codecs.encode(tag, 'hex'), vlen, datalen - offset))
Cheng Tangc1b86be2012-09-24 11:18:36 +0800177 value = data[offset:offset + vlen]
178 offset += vlen
179 yield (tag, value,)
180
181
182def tlv_fetch_value_hex(data):
183 for n, v in tlv_fetch_value(codecs.decode(data, 'hex')):
184 yield (codecs.encode(n, 'hex'), codecs.encode(v, 'hex'))
185
186
187def tlv_parse_value(data):
188 """
189 分析 tlv 格式的数据
190 """
191 result = {}
192 for n, v in tlv_fetch_value(data):
193 result.setdefault(n, v)
194 return result
195
196
197def tlv_parse_value_hex(data):
198 """
199 分析 tlv 格式的数据, data 是 hex 格式
200 """
201 result = {}
202 for n, v in tlv_fetch_value(codecs.decode(data, 'hex')):
203 result.setdefault(codecs.encode(n, 'hex'), codecs.encode(v, 'hex'))
204 return result
205
206
207def tlv_fetch_define(data):
208 """
209 分析 tlv 定义(不包括数据)
210 """
211 datalen = len(data)
212 offset = 0
213 while offset < datalen:
214 t = ord(data[offset])
215 if t & 0x0F == 0x0F:
216 tag = data[offset:offset + 2]
217 offset += 2
218 else:
219 tag = data[offset]
220 offset += 1
221 t = ord(data[offset])
222 if t & 0x80 == 0x80:
223 vl = t & 0x7F
224 vlen = 0
225 for c in data[offset + 1:offset + 1 + vl]:
226 vlen = (vlen << 8) + ord(c)
227 offset += 1 + vl
228 else:
229 vlen = t & 0x7F
230 offset += 1
231 yield (tag, vlen,)
232
233
234def tlv_fetch_define_hex(data):
235 """
236 分析 tlv 定义(不包括数据), data hex 格式
237 """
238 for n, l in tlv_fetch_define(codecs.decode(data, 'hex')):
239 yield (codecs.encode(n, 'hex'), l)
240
241
242def tlv_parse_define(data):
243 """
244 分析 tlv 定义(不包括数据)
245 """
246 result = {}
247 for n, l in tlv_fetch_define(data):
248 result.setdefault(n, l)
249 return result
250
251
252def tlv_parse_define_hex(data):
253 """
254 分析 tlv 定义(不包括数据), data hex 格式
255 """
256 result = {}
257 for n, l in tlv_fetch_define(codecs.decode(data, 'hex')):
258 result.setdefault(codecs.encode(n, 'hex'), l)
259 return result
260
261
262def extract_ec_data(data, tags):
263 offset = 0
264 datalen = len(data)
265 for tag in tags:
266 tag_len = len(tag)
267 if offset + tag_len > datalen:
268 break
269 if data[offset:offset + tag_len] != tag:
270 raise KeyError(u"Tag [%s] not found", codecs.encode(tag, 'hex'))
271 offset += tag_len
272 t = ord(data[offset])
273 if t & 0x80 == 0x80:
274 vl = t & 0x7F
275 vlen = 0
276 for c in data[offset + 1:offset + 1 + vl]:
277 vlen = (vlen << 8) + ord(c)
278 offset += 1 + vl
279 else:
280 vlen = t & 0x7F
281 offset += 1
282 if offset + vlen > datalen:
283 raise ValueError(u"data length error!tag[%s]length[%d]" % (
284 codecs.encode(tag, 'hex'), vlen))
285 value = data[offset:offset + vlen]
286 offset += vlen
287 yield (tag, value,)
288
289
290def extract_ec_data_hex(data, tags):
291 t = [codecs.decode(a, 'hex') for a in tags]
292 for t, v in extract_ec_data(codecs.decode(data, 'hex'), t):
293 yield (codecs.encode(t, 'hex'), codecs.encode(v, 'hex'),)
294
295
296def extract_ec_data_dict_hex(data, tags):
297 result = {}
298 for t, v in extract_ec_data_hex(data, tags):
299 result.setdefault(t, v)
300 return result