]> cvs.zerfleddert.de Git - proxmark3-svn/blobdiff - client/scripts/tnp3dump.lua
Applied @icsom 's fixes from: https://github.com/icsom/proxmark3/commit/b57758249043...
[proxmark3-svn] / client / scripts / tnp3dump.lua
index 53822c7d5a5feb719ab1b41e302048494eca4463..f3d377f7129d0d5b8843b3dc6bec24186730e533 100644 (file)
@@ -5,8 +5,7 @@ local lib14a = require('read14a')
 local utils = require('utils')
 local md5 = require('md5')
 local dumplib = require('html_dumplib')
 local utils = require('utils')
 local md5 = require('md5')
 local dumplib = require('html_dumplib')
-local toyNames = require('default_toys')
-
+local toys = require('default_toys')
 
 example =[[
        script run tnp3dump
 
 example =[[
        script run tnp3dump
@@ -31,9 +30,7 @@ Arguments:
        -p             : Use the precalc to find all keys
        -o             : filename for the saved dumps
 ]]
        -p             : Use the precalc to find all keys
        -o             : filename for the saved dumps
 ]]
-
-local HASHCONSTANT = '20436F707972696768742028432920323031302041637469766973696F6E2E20416C6C205269676874732052657365727665642E20'
-
+local RANDOM = '20436F707972696768742028432920323031302041637469766973696F6E2E20416C6C205269676874732052657365727665642E20'
 local TIMEOUT = 2000 -- Shouldn't take longer than 2 seconds
 local DEBUG = false -- the debug flag
 local numBlocks = 64
 local TIMEOUT = 2000 -- Shouldn't take longer than 2 seconds
 local DEBUG = false -- the debug flag
 local numBlocks = 64
@@ -41,9 +38,7 @@ local numSectors = 16
 --- 
 -- A debug printout-function
 function dbg(args)
 --- 
 -- A debug printout-function
 function dbg(args)
-       if not DEBUG then
-               return
-       end
+       if not DEBUG then return end
        
     if type(args) == "table" then
                local i = 1
        
     if type(args) == "table" then
                local i = 1
@@ -59,6 +54,7 @@ end
 -- This is only meant to be used when errors occur
 function oops(err)
        print("ERROR: ",err)
 -- This is only meant to be used when errors occur
 function oops(err)
        print("ERROR: ",err)
+       return nil,err
 end
 --- 
 -- Usage help
 end
 --- 
 -- Usage help
@@ -97,16 +93,6 @@ local function waitCmd()
        return nil, "No response from device"
 end
 
        return nil, "No response from device"
 end
 
-local function computeCrc16(s)
-       local hash = core.crc16(utils.ConvertHexToAscii(s))     
-       return hash
-end
-
-local function reverseCrcBytes(crc)
-       crc2 = crc:sub(3,4)..crc:sub(1,2)
-       return tonumber(crc2,16)
-end
-
 local function main(args)
 
        print( string.rep('--',20) )
 local function main(args)
 
        print( string.rep('--',20) )
@@ -129,7 +115,7 @@ local function main(args)
                if o == "p" then usePreCalc = true end
                if o == "o" then outputTemplate = a end         
        end
                if o == "p" then usePreCalc = true end
                if o == "o" then outputTemplate = a end         
        end
-
+       
        -- validate input args.
        keyA =  keyA or '4b0b20107ccb'
        if #(keyA) ~= 12 then
        -- validate input args.
        keyA =  keyA or '4b0b20107ccb'
        if #(keyA) ~= 12 then
@@ -147,10 +133,6 @@ local function main(args)
 
        core.clearCommandBuffer()
        
 
        core.clearCommandBuffer()
        
-       if 0x01 ~= result.sak then -- NXP MIFARE TNP3xxx
-               return oops('This is not a TNP3xxx tag. aborting.')
-       end     
-
        -- Show tag info
        print((' Found tag %s'):format(result.name))
 
        -- Show tag info
        print((' Found tag %s'):format(result.name))
 
@@ -183,6 +165,8 @@ local function main(args)
        local block0, err = waitCmd()
        if err then return oops(err) end
        
        local block0, err = waitCmd()
        if err then return oops(err) end
        
+       core.clearCommandBuffer()
+       
        -- Read block 1
        cmd = Command:new{cmd = cmds.CMD_MIFARE_READBL, arg1 = 1,arg2 = 0,arg3 = 0, data = keyA}
        err = core.SendCommand(cmd:getBytes())
        -- Read block 1
        cmd = Command:new{cmd = cmds.CMD_MIFARE_READBL, arg1 = 1,arg2 = 0,arg3 = 0, data = keyA}
        err = core.SendCommand(cmd:getBytes())
@@ -190,14 +174,15 @@ local function main(args)
        local block1, err = waitCmd()
        if err then return oops(err) end
 
        local block1, err = waitCmd()
        if err then return oops(err) end
 
+       core.clearCommandBuffer()
+       
+       local tmpHash = block0..block1..'%02x'..RANDOM
+
        local key
        local pos = 0
        local blockNo
        local blocks = {}
        local key
        local pos = 0
        local blockNo
        local blocks = {}
-
-       print('Reading card data')
-       core.clearCommandBuffer()
-               
+       
        -- main loop
        io.write('Reading blocks > ')
        for blockNo = 0, numBlocks-1, 1 do
        -- main loop
        io.write('Reading blocks > ')
        for blockNo = 0, numBlocks-1, 1 do
@@ -207,6 +192,8 @@ local function main(args)
                        break
                end
        
                        break
                end
        
+               core.clearCommandBuffer()
+               
                pos = (math.floor( blockNo / 4 ) * 12)+1
                key = akeys:sub(pos, pos + 11 )
                cmd = Command:new{cmd = cmds.CMD_MIFARE_READBL, arg1 = blockNo ,arg2 = 0,arg3 = 0, data = key}
                pos = (math.floor( blockNo / 4 ) * 12)+1
                key = akeys:sub(pos, pos + 11 )
                cmd = Command:new{cmd = cmds.CMD_MIFARE_READBL, arg1 = blockNo ,arg2 = 0,arg3 = 0, data = key}
@@ -215,25 +202,24 @@ local function main(args)
                local blockdata, err = waitCmd()
                if err then return oops(err) end                
 
                local blockdata, err = waitCmd()
                if err then return oops(err) end                
 
+
                if  blockNo%4 ~= 3 then
                if  blockNo%4 ~= 3 then
+               
                        if blockNo < 8 then
                                -- Block 0-7 not encrypted
                        if blockNo < 8 then
                                -- Block 0-7 not encrypted
-                               blocks[blockNo+1] = ('%02d  :: %s'):format(blockNo,blockdata) 
+                               blocks[blockNo+1] = ('%02d  :: %s'):format(blockNo,blockdata)
                        else
                        else
-                               local base = ('%s%s%02x%s'):format(block0, block1, blockNo, HASHCONSTANT)       
-                               local baseStr = utils.ConvertHexToAscii(base)
-                               local md5hash = md5.sumhexa(baseStr)
-                               local aestest = core.aes(md5hash, blockdata)
-
-                               local hex = utils.ConvertAsciiToBytes(aestest)
-                               hex = utils.ConvertBytesToHex(hex)
-
                                -- blocks with zero not encrypted.
                                if string.find(blockdata, '^0+$') then
                                -- blocks with zero not encrypted.
                                if string.find(blockdata, '^0+$') then
-                                       blocks[blockNo+1] = ('%02d  :: %s'):format(blockNo,blockdata) 
+                                       blocks[blockNo+1] = ('%02d  :: %s'):format(blockNo,blockdata)
                                else
                                else
+                                       local baseStr = utils.ConvertHexToAscii(tmpHash:format(blockNo))
+                                       local key = md5.sumhexa(baseStr)
+                                       local aestest = core.aes128_decrypt(key, blockdata)
+                                       local hex = utils.ConvertAsciiToHex(aestest)
+                                       
                                        blocks[blockNo+1] = ('%02d  :: %s'):format(blockNo,hex)
                                        blocks[blockNo+1] = ('%02d  :: %s'):format(blockNo,hex)
-                                       io.write( blockNo..',')
+                                       io.write(blockNo..',')
                                end             
                        end
                else
                                end             
                        end
                else
@@ -251,42 +237,44 @@ local function main(args)
 
        for _,s in pairs(blocks) do
                local slice = s:sub(8,#s)
 
        for _,s in pairs(blocks) do
                local slice = s:sub(8,#s)
-               local str = utils.ConvertBytesToAscii(
-                                utils.ConvertHexToBytes(slice)
-                               )
+               local str = utils.ConvertHexToAscii(slice)
                emldata = emldata..slice..'\n'
                for c in (str):gmatch('.') do
                        bindata[#bindata+1] = c
                emldata = emldata..slice..'\n'
                for c in (str):gmatch('.') do
                        bindata[#bindata+1] = c
-               end
+               end             
        end 
        end 
+
+       print( string.rep('--',20) )
        
        local uid = block0:sub(1,8)
        
        local uid = block0:sub(1,8)
-       local itemtype = block1:sub(1,4)
+       local toytype = block1:sub(1,4)
        local cardidLsw = block1:sub(9,16)
        local cardidMsw = block1:sub(16,24)
        local cardid = block1:sub(9,24)
        local cardidLsw = block1:sub(9,16)
        local cardidMsw = block1:sub(16,24)
        local cardid = block1:sub(9,24)
-       local traptype = block1:sub(25,28)
+       local subtype = block1:sub(25,28)
        
        -- Write dump to files
        if not DEBUG then
        
        -- Write dump to files
        if not DEBUG then
-               local foo = dumplib.SaveAsBinary(bindata, outputTemplate..'_uid_'..uid..'.bin')
+               local foo = dumplib.SaveAsBinary(bindata, outputTemplate..'-'..uid..'.bin')
                print(("Wrote a BIN dump to:  %s"):format(foo))
                print(("Wrote a BIN dump to:  %s"):format(foo))
-               local bar = dumplib.SaveAsText(emldata, outputTemplate..'_uid_'..uid..'.eml')
+               local bar = dumplib.SaveAsText(emldata, outputTemplate..'-'..uid..'.eml')
                print(("Wrote a EML dump to:  %s"):format(bar))
        end
                print(("Wrote a EML dump to:  %s"):format(bar))
        end
+       
+       print( string.rep('--',20) )
+       -- Show info 
 
 
-       local itemtypename = toyNames[itemtype]
-       if itemtypename == nil then
-               itemtypename = toyNames[utils.SwapEndiannessStr(itemtype,16)]
+       local item = toys.Find(toytype, subtype)
+       if item then
+               print(('            ITEM TYPE : %s - %s (%s)'):format(item[6],item[5], item[4]) )
+       else
+               print(('            ITEM TYPE : 0x%s 0x%s'):format(toytype, subtype))
        end
        end
-       -- Show info 
-       print( string.rep('--',20) )
-       print( ('            ITEM TYPE : 0x%s - %s'):format(itemtype, itemtypename) )
-       print( (' Alter ego / traptype : 0x%s'):format(traptype) )
+
        print( ('                  UID : 0x%s'):format(uid) )
        print( ('               CARDID : 0x%s'):format(cardid ) )
        print( ('                  UID : 0x%s'):format(uid) )
        print( ('               CARDID : 0x%s'):format(cardid ) )
-       
        print( string.rep('--',20) )
        print( string.rep('--',20) )
-
+       
+       core.clearCommandBuffer()
 end
 main(args)
\ No newline at end of file
 end
 main(args)
\ No newline at end of file
Impressum, Datenschutz