def on_pb_ReadAllBlocks(self): self.Log('Read All Blocks:') k = calcCardKeyBs(self.reader) if not k: self.Log('Calc KeyBs err!', 1) return r = self.reader.FoundCard() if not r or not func.IsSwOk(r[1]): self.Log('FoundCard err!', 1) return for i in range(64): sec = i // 4 r = self.reader.LoadKey(4, sec, k[sec]) if not r or not func.IsSwOk(r[1]): self.Log('LoadKey %d %d %s err!' % (4, sec, k[sec]), 1) return r = self.reader.AuthKey(4, sec) if not r or not func.IsSwOk(r[1]): self.Log('AuthKey %d %d err!' % (4, sec), 1) return r = self.reader.ReadBlock(i) if not r or not func.IsSwOk(r[1]): self.Log('ReadBlock %d err!' % i, 1) return self.Log('%02d --- %s' % (i, r[2]), 1)
def calcCardKeyBs(reader): deskey = 'd463fee0c70007d598d4777badde94b0' loop = 0 sec1keya = '' while True: r = reader.FoundCard() if not r or not func.IsSwOk(r[1]): return False csn = r[2][6:] baCsn = bytes.fromhex(csn) if loop == 0: sec1keya = 'FF' * 6 elif loop == 1: sec1keya = '00' * 6 else: sec1keya = csn + csn[0:4] reader.LoadKey(1, 1, sec1keya) r = reader.AuthKey(1, 1) if not func.IsSwOk(r[1]): loop += 1 if loop > 2: return False continue r = reader.ReadBlock(4) if not func.IsSwOk(r[1]): return False block4 = bytes.fromhex(r[2]) break KeyBs = list(range(16)) if loop == 0: for i in range(16): KeyBs[i] = b'\xFF' * 6 else: cardtype = block4[13] factor = bytearray(8) for i in range(4): factor[i] = baCsn[i] for i in range(3): factor[4 + i] = block4[6 + i] if 0x90 == cardtype or 0x91 == cardtype or 0x92 == cardtype: for i in range(0, 3): factor[7] = i KeyBs[i] = des_ecb(bytes(factor), deskey) for i in range(3, 16): KeyBs[i] = KeyBs[2] else: for i in range(16): if i == 2: factor[7] = 0x10 elif i >= 3 and i <= 5: factor[7] = 0x03 elif i >= 7 and i <= 15: factor[7] = i + 10 else: factor[7] = i KeyBs[i] = des_ecb(bytes(factor), deskey) return tuple(map(lambda x: x[0:6], KeyBs))
def on_pb_SelectCard(self): csn = self.ui.le_Csn.text() self.Log('SelectCard ' + csn) r = self.reader.SelectCard(csn) if r and func.IsSwOk(r[1]): self.ui.le_Sak.setText(r[2]) self.Log(r, 1)
def on_pb_CpuPps(self): sendpps = self.ui.le_CpuPpsSend.text() self.Log('CpuPPS ' + sendpps) r = self.reader.CpuPPS(sendpps) if r and func.IsSwOk(r[1]): self.ui.le_CpuPpsRecv.setText(r[2]) self.Log(r, 1)
def on_pb_ClearCard(self): reply = QMessageBox.information(self, 'Caution', 'Sure to clear card?', QMessageBox.Yes | QMessageBox.No) if QMessageBox.No == reply: return self.Log('Clear Card:') blockdata = 'FFFFFFFFFFFFFF078069FFFFFFFFFFFF' k = calcCardKeyBs(self.reader) if not k: self.Log('Calc KeyBs err!', 1) return r = self.reader.FoundCard() if not r or not func.IsSwOk(r[1]): self.Log('FoundCard err!', 1) return for i in range(3, 64, 4): sec = i // 4 r = self.reader.LoadKey(4, sec, k[sec]) if not r or not func.IsSwOk(r[1]): self.Log('LoadKey %d %d %s err!' % (4, sec, k[sec]), 1) return while True: r = self.reader.AuthKey(4, sec) if not r or not func.IsSwOk(r[1]): self.Log('AuthKey %d %d err!' % (4, sec), 1) reply = QMessageBox.information( self, 'Caution', 'Yes to continue, No to Exit!', QMessageBox.Yes | QMessageBox.No) if QMessageBox.No == reply: return else: self.reader.FoundCard() continue r = self.reader.WriteBlock(i, blockdata) if not r or not func.IsSwOk(r[1]): self.Log('WriteBlock %d %s err!' % (i, blockdata), 1) reply = QMessageBox.information( self, 'Caution', 'Yes to continue, No to Exit!', QMessageBox.Yes | QMessageBox.No) if QMessageBox.No == reply: return else: self.reader.FoundCard() continue break self.Log('Wr%02d --- %s' % (i, blockdata), 1)
def on_pb_ReadBlock(self): blocknostr = self.ui.cob_BlockNo.currentText() blockno = int(blocknostr, 10) self.Log('ReadBlock ' + blocknostr) r = self.reader.ReadBlock(blockno) if r and func.IsSwOk(r[1]): self.ui.le_ReadBlock.setText(r[2]) self.Log(r, 1)
def on_pb_FoundCard(self): self.Log('SelectCard') r = self.reader.FoundCard() if r and func.IsSwOk(r[1]): self.ui.le_Atqa.setText(r[2][0:4]) self.ui.le_Sak.setText(r[2][4:6]) self.ui.le_Csn.setText(r[2][6:]) self.Log(r, 1)
def on_pb_ReadValue(self): blocknostr = self.ui.cob_BlockNo.currentText() blockno = int(blocknostr, 10) self.Log('ReadVal ' + blocknostr) r = self.reader.ReadVal(blockno) if r and func.IsSwOk(r[1]): v = int(r[2], 16) self.ui.le_ReadValue.setText('%d (0x%s)' % (v, r[2])) self.Log(r, 1)
def on_pb_ReadLkt4210Info(self): self.Log('DevReadLKT4210Info') r = self.reader.DevReadLKT4210Info() if r and func.IsSwOk(r[1]): self.ui.le_ReadLkt4210Info.setText(r[2]) self.Log(r, 1)
def on_pb_ReadSid(self): self.Log('DevReadSID') r = self.reader.DevReadSID() if r and func.IsSwOk(r[1]): self.ui.le_ReadSid.setText(r[2]) self.Log(r, 1)
def on_pb_CpuReset(self): self.Log('CpuReset') r = self.reader.CpuReset() if r and func.IsSwOk(r[1]): self.ui.le_CpuReset.setText(r[2]) self.Log(r, 1)
def on_pb_Anticol(self): self.Log('Anticol') r = self.reader.Anticoll() if r and func.IsSwOk(r[1]): self.ui.le_Csn.setText(r[2]) self.Log(r, 1)
def on_pb_RequestAll(self): self.Log('RequestAll') r = self.reader.Request(1) if r and func.IsSwOk(r[1]): self.ui.le_Atqa.setText(r[2]) self.Log(r, 1)
def isApduRspOK(r): if r and func.IsSwOk(r[1]): return True else: return False