def update(self, observable, actions):

        (addedcards, removedcards) = actions

        for card in addedcards:
            logger.info("+ Inserted: %s", toHexString(card.atr))

            connection = card.createConnection()
            connection.connect()

            # This will log raw card traffic to console
            connection.addObserver(ConsoleCardConnectionObserver())
      
            # connection object itself is CardConnectionDecorator wrapper
            # and we need to address the underlying connection object
            # directly
            logger.info("Opened connection %s", connection.component)
            desfire = DESFire(PCSCDevice(connection.component))
            key_setting=desfire.getKeySetting()
            logger.info('Auth Key %d',0)
            desfire.authenticate(0,key_setting)
            info=desfire.getCardVersion()
            logger.info(info)
            logger.info('Format card')
            desfire.formatCard()
            logger.info('Create application with ID 00AE16')
            desfire.createApplication("00 AE 16",[DESFireKeySettings.KS_ALLOW_CHANGE_MK,DESFireKeySettings.KS_LISTING_WITHOUT_MK,DESFireKeySettings.KS_CONFIGURATION_CHANGEABLE],14,DESFireKeyType.DF_KEY_AES)
            logger.info('Select application with ID 00AE16')
            desfire.selectApplication('00 AE 16')
            default_key=desfire.createKeySetting('00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00',0,DESFireKeyType.DF_KEY_AES,[])            
            app_key=desfire.createKeySetting('00 10 20 31 40 50 60 70 80 90 A0 B0 B0 A0 90 80',0,DESFireKeyType.DF_KEY_AES,[])
            logger.info('Auth Key %d',0)
            desfire.authenticate(0,default_key)
            logger.info('Cange Key %d',0)
            desfire.changeKey(0,app_key,default_key)
            logger.info('Auth Key %d',0)
            desfire.authenticate(0,app_key)
            desfire.changeKeySettings([ DESFireKeySettings.KS_ALLOW_CHANGE_MK, DESFireKeySettings.KS_CONFIGURATION_CHANGEABLE, DESFireKeySettings.KS_CHANGE_KEY_WITH_KEY_1])
            app_key_1=desfire.createKeySetting('11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF 00',0,DESFireKeyType.DF_KEY_AES,[])
            logger.info('Cange Key %d',1)
            desfire.changeKey(1,app_key_1,default_key)
            logger.info('Auth Key %d',1)
            desfire.authenticate(1,app_key_1)
            app_key_2=desfire.createKeySetting('22 33 44 55 66 77 88 99 AA BB CC DD EE FF 00 11',0,DESFireKeyType.DF_KEY_AES,[])
            logger.info('Cange Key %d',2)
            desfire.changeKey(2,app_key_2,default_key)
            app_key_3=desfire.createKeySetting('33 44 55 66 77 88 99 AA BB CC DD EE FF 00 11 22',0,DESFireKeyType.DF_KEY_AES,[])
            logger.info('Cange Key %d',3)
            desfire.changeKey(3,app_key_3,default_key)
            app_key_4=desfire.createKeySetting('44 55 66 77 88 99 AA BB CC DD EE FF 00 11 22 33',0,DESFireKeyType.DF_KEY_AES,[])
            logger.info('Cange Key %d',4)
            desfire.changeKey(4,app_key_4,default_key)
            logger.info('Auth Key %d',0)
            desfire.authenticate(0,app_key)
            filePerm=DESFireFilePermissions()
            filePerm.setPerm(0x04,0x03,0x0F,0x02) # key 4 read, key3 write, no key read and write, key2 change permissions
            logger.info('Creat File with ID %d and %d byte',0,32)
            desfire.createStdDataFile(0,filePerm,32) # file Id 0, length 32 byte
            logger.info('Auth Key %d',3)
            desfire.authenticate(3,app_key_3)
            write='00 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20'
            logger.info('Data write %s',write)
            desfire.writeFileData(0,0,32,write)
            logger.info('Auth Key %d',4)
            desfire.authenticate(4,app_key_4)
            read=desfire.readFileData(0,0,32)
            logger.info('Data read %s',byte_array_to_human_readable_hex(read))
Exemple #2
0
class MyObserver(CardObserver):

    desfire = None

    @catch_gracefully()
    def update(self, observable, actions):

        (addedcards, removedcards) = actions

        for card in addedcards:
            logger.info("+ Inserted: %s", toHexString(card.atr))

            connection = card.createConnection()
            connection.connect()

            # This will log raw card traffic to console
            connection.addObserver(ConsoleCardConnectionObserver())
            # connection object itself is CardConnectionDecorator wrapper
            # and we need to address the underlying connection object
            # directly
            self.desfire = DESFire(PCSCDevice(connection.component))
            while True:
                num = int(
                    input("""
10. Authenticate
----------------------------
20. Get card information
21. Format card
----------------------------
30. Create application
31. Select applicatino
32. List application
----------------------------
40. Change key
41. Get key settings
42. Change key settings
----------------------------
50. Craete file
51. List files 
52. Write file
53. Read file
90. Exit
"""))
                if num == 90:
                    break
                elif num == 10:
                    self.auth()
                elif num == 20:
                    self.getCardInfo()
                elif num == 21:
                    self.formatCard()
                elif num == 30:
                    self.createApplication()
                elif num == 31:
                    self.selectApplication()
                elif num == 32:
                    self.listApplication()
                elif num == 40:
                    self.changeKey()
                elif num == 41:
                    self.getKeySettings()
                elif num == 42:
                    self.changeKeySettings()
                elif num == 50:
                    self.createFile()
                elif num == 51:
                    self.listFiles()
                elif num == 52:
                    self.writeFile()
                elif num == 53:
                    self.readFile()

    def auth(self):
        key = self.desfire.getKeySetting()
        key.setKey(input('Key: '))
        self.desfire.authenticate(int(input('Key pos: ')), key)

    def getCardInfo(self):
        print(self.desfire.getCardVersion())

    def formatCard(self):
        self.desfire.formatCard()

    def createApplication(self):
        aid = input('App id: ')
        size = int(input('Number keys: '))
        i = 1
        l = list()
        print('Set Settings(y/n):')
        for s in DESFireKeySettings:
            if input(s.name + ': ') == 'y':
                l += [s]
            if i == 4:
                break
            i += 1
        k = int(input('Select key for change othor keys: '))
        v = input('Select Enryption(2K3DES,№K3DES,AES): ')
        l += [DESFireKeySettings(k << 4)]
        self.desfire.createApplication(aid, l, size,
                                       DESFireKeyType['DF_KEY_' + v])

    def changeKey(self):
        i = int(input('Key pos: '))
        old_key = self.desfire.getKeySetting()
        new_key = copy.copy(old_key)
        old_key.setKey(input('Old key: '))
        new_key.setKey(input('New key: '))
        self.desfire.changeKey(i, new_key, old_key)

    def selectApplication(self):
        self.desfire.selectApplication(input('Application id: '))

    def listApplication(self):
        for ids in self.desfire.getApplicationIDs():
            print(byte_array_to_human_readable_hex(ids))

    def changeKeySettings(self):
        i = 1
        l = list()
        print('Set Settings(y/n):')
        for s in DESFireKeySettings:
            if input(s.name + ': ') == 'y':
                l += [s]
            if i == 4:
                break
            i += 1
        k = int(input('Select key for change othor keys: '))
        l += [DESFireKeySettings(k << 4)]
        self.desfire.changeKeySettings(l)

    def getKeySettings(self):
        print(self.desfire.getKeySetting())

    def createFile(self):
        filePerm = DESFireFilePermissions()
        filePerm.setPerm(
            int(input('Read key number: ')), int(intput('Write key number')),
            int(input('read/write key number: ')),
            int(input('Change permmision key number: '))
        )  # key 4 read, key3 write, no key read and write, key2 change permissions
        self.desfire.createStdDataFile(
            int(input('File id: ')), filePerm,
            int(input('File lenght: ')))  # file Id 0, length 32 byte

    def writeFile(self):
        self.desfire.writeFileData(int(input('File id: ')),
                                   int(input('Offset')),
                                   int(input('Length: ')), input('Data: '))

    def readFile(self):
        print(
            byte_array_to_human_readable_hex(
                self.desfire.readFileData(int(input('File id: ')),
                                          int(input('Offset')),
                                          int(input('Length: ')))))

    def getFileSettings(self):
        self.desfire.getFileSettings(int(input('File id: ')))

    def listFiles(self):
        print(self.desfire.getFileIDs())
def Test_DES():
    """
        *** GetCardVersion()
        TX CMAC:  50 20 EC 82 60 86 DF 12
        Sending:  00 00 FF 04 FC <D4 40 01 60> 8B 00
        Response: 00 00 FF 0B F5 <D5 41 00 AF 04 01 01 01 00 1A 05> 15 00 AA AA AA AA AA AA AA AA
        Sending:  00 00 FF 04 FC <D4 40 01 AF> 3C 00
        Response: 00 00 FF 0B F5 <D5 41 00 AF 04 01 01 01 04 1A 05> 11 00 AA AA AA AA AA AA AA AA
        Sending:  00 00 FF 04 FC <D4 40 01 AF> 3C 00
        Response: 00 00 FF 1A E6 <D5 41 00 00 04 06 3F 72 63 34 80 BA 45 19 E3 20 49 13 CD C8 10 BA FA 40 17 59> 98 00
        RX CMAC:  CD C8 10 BA FA 40 17 59
        """

    print('Test Des')
    reader = DummyPCSCDevice()

    reader = DummyPCSCDevice()
    #Auth
    reader.addResponse('45', [
        '00 0F 01', '00 0F 02 25 DD 8D 77 31 B1 CF D5',
        '00 0D 02 61 3F B2 D3 F4 53 D2 E4'
    ])
    reader.addResponse(
        '1A 00', ['AF 5D 99 4C E0 85 F2 40 89', 'AF 84 76 D1 CF 30 24 B7 C7'])
    reader.addResponse('AF 21 D0 AD 5F 2F D9 74 54 A7 46 CC 80 56 7F 1B 1C',
                       ['00 91 3C 6D ED 84 22 1C 41'])
    #Get Card information
    reader.addResponse('60', ['AF 04 01 01 01 00 1A 05'])
    reader.addResponse('AF', [
        'AF 04 01 01 01 04 1A 05',
        '00 04 06 3F 72 63 34 80 BA 45 19 E3 20 49 13 CD C8 10 BA FA 40 17 59'
    ])
    #Format Card
    reader.addResponse('FC', ['00 9C 2C 81 3A 06 5C 45 F7'])
    #Create Application 2 Key 2K3DES
    reader.addResponse('CA 16 DE 00 0F 02', ['00 0A 13 79 B0 1D 85 AD 47'])
    #Create Application 1 Key 2K3DES
    reader.addResponse('CA CC BB AA 0F 01', ['00 F1 1A C0 73 8E F8 38 78'])
    #Create Application AES
    reader.addResponse('CA 16 AE 00 0F 82', ['00 3B 68 D7 2A 3B E0 D2 0C'])
    #Create Application 3K3DES
    reader.addResponse('CA 24 DE 00 0F 42', ['00 5D 73 AE 52 87 A1 BB E4'])
    #Get Application IDS
    reader.addResponse('6A', [
        '00 16 DE 00 24 DE 00 16 AE 00 CC BB AA 27 39 15 4E 26 30 D6 50',
        '00 16 DE 00 24 DE 00 16 AE 00 52 0E 51 E0 0A F0 6D 5E'
    ])
    #Delete Application
    reader.addResponse('DA CC BB AA', ['00 A9 AF 19 05 22 92 F6 62'])
    #Select Application
    reader.addResponse('5A 16 DE 00', ['00'])
    #Authenticate 2
    reader.addResponse('AF DA C6 7A B7 43 76 3D C9 FA F8 A0 AE 50 4E 80 C5',
                       ['00 13 E9 E4 FA 43 88 BF 16'])
    #Cange Key Setting
    reader.addResponse('54 27 88 28 05 FC 3F D4 9D',
                       ['00 A6 28 37 83 74 27 0A CD'])

    desfire = DESFire(reader)
    key_setting = desfire.getKeySetting()
    desfire.authenticate(0, key_setting, '84 9B 36 C5 F8 BF 4A 09')
    desfire.getCardVersion()
    desfire.formatCard()
    desfire.createApplication("00 DE 16", [
        DESFireKeySettings.KS_ALLOW_CHANGE_MK,
        DESFireKeySettings.KS_LISTING_WITHOUT_MK,
        DESFireKeySettings.KS_CREATE_DELETE_WITHOUT_MK,
        DESFireKeySettings.KS_CONFIGURATION_CHANGEABLE
    ], 2, DESFireKeyType.DF_KEY_2K3DES)
    desfire.createApplication("00 DE 24", [
        DESFireKeySettings.KS_ALLOW_CHANGE_MK,
        DESFireKeySettings.KS_LISTING_WITHOUT_MK,
        DESFireKeySettings.KS_CREATE_DELETE_WITHOUT_MK,
        DESFireKeySettings.KS_CONFIGURATION_CHANGEABLE
    ], 2, DESFireKeyType.DF_KEY_3K3DES)
    desfire.createApplication("00 AE 16", [
        DESFireKeySettings.KS_ALLOW_CHANGE_MK,
        DESFireKeySettings.KS_LISTING_WITHOUT_MK,
        DESFireKeySettings.KS_CREATE_DELETE_WITHOUT_MK,
        DESFireKeySettings.KS_CONFIGURATION_CHANGEABLE
    ], 2, DESFireKeyType.DF_KEY_AES)
    desfire.createApplication("AA BB CC", [
        DESFireKeySettings.KS_ALLOW_CHANGE_MK,
        DESFireKeySettings.KS_LISTING_WITHOUT_MK,
        DESFireKeySettings.KS_CREATE_DELETE_WITHOUT_MK,
        DESFireKeySettings.KS_CONFIGURATION_CHANGEABLE
    ], 1, DESFireKeyType.DF_KEY_2K3DES)
    desfire.getApplicationIDs()
    desfire.deleteApplication("AA BB CC")
    desfire.getApplicationIDs()
    desfire.selectApplication('00 DE 16')
    key_setting.setKey('00 00 00 00 00 00 00 00')
    desfire.authenticate(0, key_setting, '49 EC 63 DE CD E0 07 72')
    desfire.getKeySetting()
    desfire.changeKeySettings([
        DESFireKeySettings.KS_ALLOW_CHANGE_MK,
        DESFireKeySettings.KS_CREATE_DELETE_WITHOUT_MK,
        DESFireKeySettings.KS_CONFIGURATION_CHANGEABLE
    ])
    desfire.getKeySetting()

    print('[+] Test_DES Succsess')