]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - client/lualibs/read14a.lua
Code improved for less memory
[proxmark3-svn] / client / lualibs / read14a.lua
index 24021a1dcbfeae192d3b50567cb667dc13025c29..60fc0e683452fedb41f6064cb54ea1b1b76c381a 100644 (file)
@@ -2,7 +2,7 @@
        This is a library to read 14443a tags. It can be used something like this
 
        local reader = require('read14a')
        This is a library to read 14443a tags. It can be used something like this
 
        local reader = require('read14a')
-       result, err = reader.read1443a()
+       result, err = reader.read14443a()
        if not result then
                print(err)
                return
        if not result then
                print(err)
                return
@@ -20,11 +20,15 @@ local ISO14A_COMMAND = {
        ISO14A_RAW = 8,
        ISO14A_REQUEST_TRIGGER = 0x10,
        ISO14A_APPEND_CRC = 0x20,
        ISO14A_RAW = 8,
        ISO14A_REQUEST_TRIGGER = 0x10,
        ISO14A_APPEND_CRC = 0x20,
-       ISO14A_SET_TIMEOUT = 0x40
+       ISO14A_SET_TIMEOUT = 0x40,
+       ISO14A_NO_SELECT = 0x80,
+       ISO14A_TOPAZMODE = 0x100,
+       ISO14A_NO_RATS = 0x200
 }
 
 }
 
-local ISO14443a_TYPES = {}             
+local ISO14443a_TYPES = {}
 ISO14443a_TYPES[0x00] = "NXP MIFARE Ultralight | Ultralight C"
 ISO14443a_TYPES[0x00] = "NXP MIFARE Ultralight | Ultralight C"
+ISO14443a_TYPES[0x01] = "NXP MIFARE TNP3xxx Activision Game Appliance"
 ISO14443a_TYPES[0x04] = "NXP MIFARE (various !DESFire !DESFire EV1)"
 ISO14443a_TYPES[0x08] = "NXP MIFARE CLASSIC 1k | Plus 2k"
 ISO14443a_TYPES[0x09] = "NXP MIFARE Mini 0.3k"
 ISO14443a_TYPES[0x04] = "NXP MIFARE (various !DESFire !DESFire EV1)"
 ISO14443a_TYPES[0x08] = "NXP MIFARE CLASSIC 1k | Plus 2k"
 ISO14443a_TYPES[0x09] = "NXP MIFARE Mini 0.3k"
@@ -39,14 +43,14 @@ ISO14443a_TYPES[0x88] = "Infineon MIFARE CLASSIC 1K"
 ISO14443a_TYPES[0x98] = "Gemplus MPCOS"
 
 
 ISO14443a_TYPES[0x98] = "Gemplus MPCOS"
 
 
-local function tostring_1443a(sak)
+local function tostring_14443a(sak)
        return ISO14443a_TYPES[sak] or ("Unknown (SAK=%x)"):format(sak)
 end
 
        return ISO14443a_TYPES[sak] or ("Unknown (SAK=%x)"):format(sak)
 end
 
-local function parse1443a(data)
+local function parse14443a(data)
        --[[
 
        --[[
 
-       Based on this struct : 
+       Based on this struct :
 
        typedef struct {
                byte_t uid[10];
 
        typedef struct {
                byte_t uid[10];
@@ -62,14 +66,14 @@ local function parse1443a(data)
        local count,uid,uidlen, atqa, sak, ats_len, ats= bin.unpack('H10CH2CC',data)
        uid = uid:sub(1,2*uidlen)
        --print("uid, atqa, sak: ",uid, atqa, sak)
        local count,uid,uidlen, atqa, sak, ats_len, ats= bin.unpack('H10CH2CC',data)
        uid = uid:sub(1,2*uidlen)
        --print("uid, atqa, sak: ",uid, atqa, sak)
-       --print("TYPE: ", tostring_1443a(sak))
-       return { uid = uid, atqa  = atqa, sak = sak, name = tostring_1443a(sak)}
+       --print("TYPE: ", tostring_14443a(sak))
+       return { uid = uid, atqa  = atqa, sak = sak, name = tostring_14443a(sak)}
 end
 
 --- Sends a USBpacket to the device
 -- @param command - the usb packet to send
 end
 
 --- Sends a USBpacket to the device
 -- @param command - the usb packet to send
--- @param ignoreresponse - if set to true, we don't read the device answer packet 
---             which is usually recipe for fail. If not sent, the host will wait 2s for a 
+-- @param ignoreresponse - if set to true, we don't read the device answer packet
+--             which is usually recipe for fail. If not sent, the host will wait 2s for a
 --             response of type CMD_ACK
 -- @return     packet,nil if successfull
 --                     nil, errormessage if unsuccessfull
 --             response of type CMD_ACK
 -- @return     packet,nil if successfull
 --                     nil, errormessage if unsuccessfull
@@ -89,37 +93,41 @@ end
 
 -- This function does a connect and retrieves som einfo
 -- @param dont_disconnect - if true, does not disable the field
 
 -- This function does a connect and retrieves som einfo
 -- @param dont_disconnect - if true, does not disable the field
+-- @param no_rats - if true, skips ISO14443-4 select (RATS)
 -- @return if successfull: an table containing card info
 -- @return if unsuccessfull : nil, error
 -- @return if successfull: an table containing card info
 -- @return if unsuccessfull : nil, error
-local function read14443a(dont_disconnect)
+local function read14443a(dont_disconnect, no_rats)
        local command, result, info, err, data
 
        local command, result, info, err, data
 
-       command = Command:new{cmd = cmds.CMD_READER_ISO_14443a, 
+       command = Command:new{cmd = cmds.CMD_READER_ISO_14443a,
                                                                arg1 = ISO14A_COMMAND.ISO14A_CONNECT}
        if dont_disconnect then
                command.arg1 = command.arg1 + ISO14A_COMMAND.ISO14A_NO_DISCONNECT
        end
                                                                arg1 = ISO14A_COMMAND.ISO14A_CONNECT}
        if dont_disconnect then
                command.arg1 = command.arg1 + ISO14A_COMMAND.ISO14A_NO_DISCONNECT
        end
+       if no_rats then
+               command.arg1 = command.arg1 + ISO14A_COMMAND.ISO14A_NO_RATS
+       end
        local result,err = sendToDevice(command)
        if result then
                local count,cmd,arg0,arg1,arg2 = bin.unpack('LLLL',result)
        local result,err = sendToDevice(command)
        if result then
                local count,cmd,arg0,arg1,arg2 = bin.unpack('LLLL',result)
-               if arg0 == 0 then 
+               if arg0 == 0 then
                        return nil, "iso14443a card select failed"
                end
                data = string.sub(result,count)
                        return nil, "iso14443a card select failed"
                end
                data = string.sub(result,count)
-               info, err = parse1443a(data)
+               info, err = parse14443a(data)
        else
                err ="No response from card"
        end
 
        else
                err ="No response from card"
        end
 
-       if err then 
-               print(err) 
+       if err then
+               print(err)
                return nil, err
        end
        return info
 end
 
 ---
                return nil, err
        end
        return info
 end
 
 ---
--- Waits for a mifare card to be placed within the vicinity of the reader. 
+-- Waits for a mifare card to be placed within the vicinity of the reader.
 -- @return if successfull: an table containing card info
 -- @return if unsuccessfull : nil, error
 local function waitFor14443a()
 -- @return if successfull: an table containing card info
 -- @return if unsuccessfull : nil, error
 local function waitFor14443a()
@@ -131,14 +139,14 @@ local function waitFor14443a()
        end
        return nil, "Aborted by user"
 end
        end
        return nil, "Aborted by user"
 end
+
 local library = {
 local library = {
-       
-       read1443a = read14443a,
-       read    = read14443a,
+       read14443a = read14443a,
+       read = read14443a,
        waitFor14443a = waitFor14443a,
        waitFor14443a = waitFor14443a,
-       parse1443a = parse1443a,
+       parse14443a = parse14443a,
        sendToDevice = sendToDevice,
        ISO14A_COMMAND = ISO14A_COMMAND,
 }
 
        sendToDevice = sendToDevice,
        ISO14A_COMMAND = ISO14A_COMMAND,
 }
 
-return library
\ No newline at end of file
+return library
Impressum, Datenschutz