def _eraseAll ():
     data, sw1, sw2 = self.session.sendCommandAPDU([0xff, 0x00, 0x00, 0x00, 0x08, 0xd4, 0x40, 0x01, 0x90, 0xfc, 0x00, 0x00, 0x00])
     if sw1 != 0x61:
         return False
     elif sw1 == 0x61 and sw2 != 0:
         data, sw1, sw2 = self.getAnswer (sw2)
         dfdata, dfsw1, dfsw2 = errors.evaluateResponse (data)
         return errors.isOpOk (dfsw1, dfsw2)
 def _selectApplication ():
     data, sw1, sw2 = self.session.sendCommandAPDU([0xff, 0x00, 0x00, 0x00, 0x0c,
                                                    0xd4, 0x40, 0x01, 0x90, 0x5a,
                                                    0x00, 0x00, 0x03]
                                                 + [aid, 0x00, 0x00] + [0x00])
     if sw1 != 0x61:
         return False
     else:
         data, sw1, sw2 = self.getAnswer (sw2)
         dfdata, dfsw1, dfsw2 = errors.evaluateResponse (data)
         return errors.isOpOk (dfsw1, dfsw2)
 def _createApplication ():
     data, sw1, sw2 = self.session.sendCommandAPDU([0xff, 0x00, 0x00, 0x00, 0x0e,
                                                    0xd4, 0x40, 0x01, 0x90, 0xca,
                                                    0x00, 0x00, 0x05]
                                                 + [aid, 0x00, 0x00]
                                                 + [keySetup]
                                                 + [numKeys] + [0x00])
     if sw1 != 0x61:
         return False
     elif sw1 == 0x61:
         data, sw1, sw2 = self.getAnswer (sw2)
         dfdata, dfsw1, dfsw2 = errors.evaluateResponse (data)
         return errors.isOpOk (dfsw1, dfsw2)
    def auth(self, key = 16*'00', key_num=0x00):
        """Authentification process
        
        Do the authentification 1st step, get the tag nonce and do byte shifting
        """
        sys.stdout.write("Authenticating... ")
        cmd = toBytes ("FF 00 00 00 0A D4 40 01 90 0A 00 00 01")
        cmd.append(key_num)
        cmd.append(0x00)
        data, sw1, sw2 = self.session.sendCommandAPDU( cmd )
        if sw1!=0x61 or sw2!=0x0F:
            sys.stdout.write("[Fail]\n")
            return False
        
        data, sw1, sw2 = self.getAnswer (sw2)
        dfdata, dfsw1, dfsw2 = errors.evaluateResponse (data)
        if (dfsw1 != 0x91):
            sys.stdout.write('[Fail]\n')
            return False

        n_t = crc.mergeList(dfdata)
        n2_t = unhexlify( n_t )
        response, nr = challenge.generateResponse(n2_t, key)
        
        cmd = "FF 00 00 00 19 D4 40 01 90 AF 00 00 10"
        cmd += hexlify(response)
        cmd += "00"
        data, sw1, sw2 = self.session.sendCommandAPDU( toBytes(cmd) )
        if sw1!=0x61 or sw2!=0x0F:
            sys.stdout.write("[Fail]\n")
            return False
        
        data, sw1, sw2 = self.getAnswer (sw2)

        dfdata, dfsw1, dfsw2 = errors.evaluateResponse (data)
        if not errors.isOpOk (dfsw1, dfsw2):
            sys.stdout.write('[Fail]\n')
            return False

        n2_r = crc.mergeList(dfdata)

        if challenge.verifyResponse(n2_r, nr, key):
            sys.stdout.write("[Done]\n")
        else:
            sys.stdout.write("[Fail]\n")