X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/a3abb028978d98bf28676d3b4a98083db3b2912a..76a608af8e342b50718cfd0e53c0fa932304dbd9:/client/scripts/tnp3dump.lua

diff --git a/client/scripts/tnp3dump.lua b/client/scripts/tnp3dump.lua
index cd547e8a..613cf581 100644
--- a/client/scripts/tnp3dump.lua
+++ b/client/scripts/tnp3dump.lua
@@ -31,16 +31,14 @@ Arguments:
 	-o             : filename for the saved dumps
 ]]
 local RANDOM = '20436F707972696768742028432920323031302041637469766973696F6E2E20416C6C205269676874732052657365727665642E20'
-local TIMEOUT = 2000 -- Shouldn't take longer than 2 seconds
+local TIMEOUT = 2500 -- Shouldn't take longer than 2 seconds
 local DEBUG = false -- the debug flag
 local numBlocks = 64
 local numSectors = 16
 --- 
 -- 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
@@ -56,6 +54,7 @@ end
 -- This is only meant to be used when errors occur
 function oops(err)
 	print("ERROR: ",err)
+	return nil,err
 end
 --- 
 -- Usage help
@@ -81,17 +80,17 @@ local function readdumpkeys(infile)
 end
 
 local function waitCmd()
-	local response = core.WaitForResponseTimeout(cmds.CMD_ACK,TIMEOUT)
+	local response = core.WaitForResponseTimeout(cmds.CMD_ACK, TIMEOUT)
 	if response then
-		local count,cmd,arg0 = bin.unpack('LL',response)
+		local count, cmd, arg0 = bin.unpack('LL',response)
 		if(arg0==1) then
 			local count,arg1,arg2,data = bin.unpack('LLH511',response,count)
 			return data:sub(1,32)
 		else
-			return nil, "Couldn't read block.." 
+			return nil, "Couldn't read block.. ["..arg0.."]"
 		end
 	end
-	return nil, "No response from device"
+	return nil, 'No response from device'
 end
 
 local function main(args)
@@ -150,6 +149,7 @@ local function main(args)
 	if usePreCalc then
 		local pre = require('precalc')
 		akeys = pre.GetAll(result.uid)
+		dbg(akeys)
 	else
 		print('Loading dumpkeys.bin')
 		local hex, err = utils.ReadDumpFile(input)
@@ -160,38 +160,45 @@ local function main(args)
 	end
 	
 	-- Read block 0
-	cmd = Command:new{cmd = cmds.CMD_MIFARE_READBL, arg1 = 0,arg2 = 0,arg3 = 0, data = keyA}
+	dbg('Reading block 0')
+	cmd = Command:new{cmd = cmds.CMD_MIFARE_READBL, arg1 = 0, arg2 = 0, arg3 = 0, data = keyA}
 	err = core.SendCommand(cmd:getBytes())
 	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}
+	dbg('Reading block 1')
+	cmd = Command:new{cmd = cmds.CMD_MIFARE_READBL, arg1 = 1, arg2 = 0, arg3 = 0, data = keyA}
 	err = core.SendCommand(cmd:getBytes())
 	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 = {}
-
-	print('Reading card data')
-	core.clearCommandBuffer()
-		
+	
 	-- main loop
 	io.write('Reading blocks > ')
 	for blockNo = 0, numBlocks-1, 1 do
 
+		io.flush()
+		
 		if core.ukbhit() then
 			print("aborted by user")
 			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}
@@ -205,18 +212,19 @@ local function main(args)
 		
 			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
 				-- 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
 					local baseStr = utils.ConvertHexToAscii(tmpHash:format(blockNo))
 					local key = md5.sumhexa(baseStr)
 					local aestest = core.aes128_decrypt(key, blockdata)
-					local hex = utils.ConvertAsciiToBytes(aestest)					
-					hex = utils.ConvertBytesToHex(hex)
-					blocks[blockNo+1] = ('%02d  :: %s'):format(blockNo,hex)					
+					local hex = utils.ConvertAsciiToHex(aestest)
+					
+					blocks[blockNo+1] = ('%02d  :: %s'):format(blockNo,hex)
+					io.write(blockNo..',')
 				end		
 			end
 		else
@@ -234,9 +242,7 @@ local function main(args)
 
 	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
@@ -273,5 +279,7 @@ local function main(args)
 	print( ('                  UID : 0x%s'):format(uid) )
 	print( ('               CARDID : 0x%s'):format(cardid ) )
 	print( string.rep('--',20) )
+	
+	core.clearCommandBuffer()
 end
 main(args)
\ No newline at end of file