X-Git-Url: http://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/e481bc32992b13b6fbbc31dffa9a8d63b393a952..6eeb5f1c29d33848c6a71703d02c8465237c7e7e:/client/lualibs/read14a.lua diff --git a/client/lualibs/read14a.lua b/client/lualibs/read14a.lua index 72c985e9..60fc0e68 100644 --- a/client/lualibs/read14a.lua +++ b/client/lualibs/read14a.lua @@ -2,7 +2,7 @@ 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 @@ -20,11 +20,15 @@ local ISO14A_COMMAND = { 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[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" @@ -39,14 +43,14 @@ ISO14443a_TYPES[0x88] = "Infineon MIFARE CLASSIC 1K" 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 -local function parse1443a(data) +local function parse14443a(data) --[[ - Based on this struct : + Based on this struct : 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) - --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 --- @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 @@ -87,40 +91,62 @@ local function sendToDevice(command, ignoreresponse) return response,nil end +-- 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 +local function read14443a(dont_disconnect, no_rats) + local command, result, info, err, data + + 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 + 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) + if arg0 == 0 then + return nil, "iso14443a card select failed" + end + data = string.sub(result,count) + info, err = parse14443a(data) + else + err ="No response from card" + end -local library = { - -- This function does a connect. - -- @param dont_disconnect - if true, does not disable the field - read1443a = function(dont_disconnect) - - local command, result, info, err, data + if err then + print(err) + return nil, err + end + return info +end - 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 - local result,err = sendToDevice(command) - if result then - local count,cmd,arg0,arg1,arg2 = bin.unpack('LLLL',result) - if arg0 == 0 then - return nil, "iso14443a card select failed" - end - data = string.sub(result,count) - info, err = parse1443a(data) - else - err ="No response from card" - end +--- +-- 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() + print("Waiting for card... press any key to quit") + while not core.ukbhit() do + res, err = read14443a() + if res then return res end + -- err means that there was no response from card + end + return nil, "Aborted by user" +end - if err then - print(err) - return nil, err - end - return info - end, - parse1443a = parse1443a, +local library = { + read14443a = read14443a, + read = read14443a, + waitFor14443a = waitFor14443a, + parse14443a = parse14443a, sendToDevice = sendToDevice, ISO14A_COMMAND = ISO14A_COMMAND, } -return library \ No newline at end of file +return library