lua: more fix mix of spaces & tabs

This commit is contained in:
Philippe Teuwen 2019-03-09 10:40:45 +01:00
commit 2d1a077ae4
14 changed files with 1423 additions and 1423 deletions

View file

@ -1,78 +1,78 @@
--[[
local _errorcodes = {
SW_NO_ERROR = 0x9000,
SW_BYTES_REMAINING_00 = 0x6100, -- Response bytes remaining
SW_WARNING_STATE_UNCHANGED = 0x6200, -- Warning, card state unchanged =
SW_WRONG_LENGTH = 0x6700, -- : Wrong length
SW_WRONG_P1P2 = 0x6B00, -- : Incorrect parameters (P1,P2)
SW_CORRECT_LENGTH_00 = 0x6C00, -- : Correct Expected Length (Le)
SW_INS_NOT_SUPPORTED = 0x6D00, -- : INS value not supported
SW_CLA_NOT_SUPPORTED = 0x6E00, -- : CLA value not supported
SW_UNKNOWN = 0x6F00, -- : No precise diagnosis
SW_NO_ERROR = 0x9000,
SW_BYTES_REMAINING_00 = 0x6100, -- Response bytes remaining
SW_WARNING_STATE_UNCHANGED = 0x6200, -- Warning, card state unchanged =
SW_WRONG_LENGTH = 0x6700, -- : Wrong length
SW_WRONG_P1P2 = 0x6B00, -- : Incorrect parameters (P1,P2)
SW_CORRECT_LENGTH_00 = 0x6C00, -- : Correct Expected Length (Le)
SW_INS_NOT_SUPPORTED = 0x6D00, -- : INS value not supported
SW_CLA_NOT_SUPPORTED = 0x6E00, -- : CLA value not supported
SW_UNKNOWN = 0x6F00, -- : No precise diagnosis
SW_LOGICAL_CHANNEL_NOT_SUPPORTED = 0x6881, -- : Card does not support the operation on the specified logical channel
SW_SECURE_MESSAGING_NOT_SUPPORTED = 0x6882, -- : Card does not support secure messaging
SW_LAST_COMMAND_EXPECTED = 0x6883, -- : Last command in chain expected
SW_COMMAND_CHAINING_NOT_SUPPORTED = 0x6884, -- : Command chaining not supported
SW_LOGICAL_CHANNEL_NOT_SUPPORTED = 0x6881, -- : Card does not support the operation on the specified logical channel
SW_SECURE_MESSAGING_NOT_SUPPORTED = 0x6882, -- : Card does not support secure messaging
SW_LAST_COMMAND_EXPECTED = 0x6883, -- : Last command in chain expected
SW_COMMAND_CHAINING_NOT_SUPPORTED = 0x6884, -- : Command chaining not supported
SW_SECURITY_STATUS_NOT_SATISFIED = 0x6982, -- : Security condition not satisfied
SW_FILE_INVALID = 0x6983, -- : File invalid
SW_DATA_INVALID = 0x6984, -- : Data invalid
SW_CONDITIONS_NOT_SATISFIED = 0x6985, -- : Conditions of use not satisfied
SW_COMMAND_NOT_ALLOWED = 0x6986, -- : Command not allowed (no current EF)
SW_APPLET_SELECT_FAILED = 0x6999, -- : Applet selection failed
SW_SECURITY_STATUS_NOT_SATISFIED = 0x6982, -- : Security condition not satisfied
SW_FILE_INVALID = 0x6983, -- : File invalid
SW_DATA_INVALID = 0x6984, -- : Data invalid
SW_CONDITIONS_NOT_SATISFIED = 0x6985, -- : Conditions of use not satisfied
SW_COMMAND_NOT_ALLOWED = 0x6986, -- : Command not allowed (no current EF)
SW_APPLET_SELECT_FAILED = 0x6999, -- : Applet selection failed
SW_WRONG_DATA = 0x6A80, -- : Wrong data
SW_FUNC_NOT_SUPPORTED = 0x6A81, -- : Function not supported
SW_FILE_NOT_FOUND = 0x6A82, -- : File not found
SW_RECORD_NOT_FOUND = 0x6A83, -- : Record not found
SW_FILE_FULL = 0x6A84, -- : Not enough memory space in the file
SW_INCORRECT_P1P2 = 0x6A86, -- : Incorrect parameters (P1,P2)
SW_WRONG_DATA = 0x6A80, -- : Wrong data
SW_FUNC_NOT_SUPPORTED = 0x6A81, -- : Function not supported
SW_FILE_NOT_FOUND = 0x6A82, -- : File not found
SW_RECORD_NOT_FOUND = 0x6A83, -- : Record not found
SW_FILE_FULL = 0x6A84, -- : Not enough memory space in the file
SW_INCORRECT_P1P2 = 0x6A86, -- : Incorrect parameters (P1,P2)
}
--]]
local _errorcodes = {
SW_NO_ERROR = '9000',
SW_BYTES_REMAINING_00 = '6100', -- Response bytes remaining
SW_WARNING_STATE_UNCHANGED = '6200', -- Warning', card state unchanged =
SW_WRONG_LENGTH = '6700', -- : Wrong length
SW_WRONG_P1P2 = '6B00', -- : Incorrect parameters (P1,P2)
SW_CORRECT_LENGTH_00 = '6C00', -- : Correct Expected Length (Le)
SW_INS_NOT_SUPPORTED = '6D00', -- : INS value not supported
SW_CLA_NOT_SUPPORTED = '6E00', -- : CLA value not supported
SW_UNKNOWN = '6F00', -- : No precise diagnosis
SW_NO_ERROR = '9000',
SW_BYTES_REMAINING_00 = '6100', -- Response bytes remaining
SW_WARNING_STATE_UNCHANGED = '6200', -- Warning', card state unchanged =
SW_WRONG_LENGTH = '6700', -- : Wrong length
SW_WRONG_P1P2 = '6B00', -- : Incorrect parameters (P1,P2)
SW_CORRECT_LENGTH_00 = '6C00', -- : Correct Expected Length (Le)
SW_INS_NOT_SUPPORTED = '6D00', -- : INS value not supported
SW_CLA_NOT_SUPPORTED = '6E00', -- : CLA value not supported
SW_UNKNOWN = '6F00', -- : No precise diagnosis
SW_LOGICAL_CHANNEL_NOT_SUPPORTED = '6881', -- : Card does not support the operation on the specified logical channel
SW_SECURE_MESSAGING_NOT_SUPPORTED = '6882', -- : Card does not support secure messaging
SW_LAST_COMMAND_EXPECTED = '6883', -- : Last command in chain expected
SW_COMMAND_CHAINING_NOT_SUPPORTED = '6884', -- : Command chaining not supported
SW_LOGICAL_CHANNEL_NOT_SUPPORTED = '6881', -- : Card does not support the operation on the specified logical channel
SW_SECURE_MESSAGING_NOT_SUPPORTED = '6882', -- : Card does not support secure messaging
SW_LAST_COMMAND_EXPECTED = '6883', -- : Last command in chain expected
SW_COMMAND_CHAINING_NOT_SUPPORTED = '6884', -- : Command chaining not supported
SW_SECURITY_STATUS_NOT_SATISFIED = '6982', -- : Security condition not satisfied
SW_FILE_INVALID = '6983', -- : File invalid
SW_DATA_INVALID = '6984', -- : Data invalid
SW_CONDITIONS_NOT_SATISFIED = '6985', -- : Conditions of use not satisfied
SW_COMMAND_NOT_ALLOWED = '6986', -- : Command not allowed (no current EF)
SW_APPLET_SELECT_FAILED = '6999', -- : Applet selection failed
SW_SECURITY_STATUS_NOT_SATISFIED = '6982', -- : Security condition not satisfied
SW_FILE_INVALID = '6983', -- : File invalid
SW_DATA_INVALID = '6984', -- : Data invalid
SW_CONDITIONS_NOT_SATISFIED = '6985', -- : Conditions of use not satisfied
SW_COMMAND_NOT_ALLOWED = '6986', -- : Command not allowed (no current EF)
SW_APPLET_SELECT_FAILED = '6999', -- : Applet selection failed
SW_WRONG_DATA = '6A80', -- : Wrong data
SW_FUNC_NOT_SUPPORTED = '6A81', -- : Function not supported
SW_FILE_NOT_FOUND = '6A82', -- : File not found
SW_RECORD_NOT_FOUND = '6A83', -- : Record not found
SW_FILE_FULL = '6A84', -- : Not enough memory space in the file
SW_INCORRECT_P1P2 = '6A86', -- : Incorrect parameters (P1,P2)
SW_WRONG_DATA = '6A80', -- : Wrong data
SW_FUNC_NOT_SUPPORTED = '6A81', -- : Function not supported
SW_FILE_NOT_FOUND = '6A82', -- : File not found
SW_RECORD_NOT_FOUND = '6A83', -- : Record not found
SW_FILE_FULL = '6A84', -- : Not enough memory space in the file
SW_INCORRECT_P1P2 = '6A86', -- : Incorrect parameters (P1,P2)
}
local _reverse_lookup,k,v = {}
for k, v in pairs(_errorcodes) do
_reverse_lookup[v] = k
_reverse_lookup[v] = k
end
_errorcodes.tostring = function(command)
if(type(command) == 'string') then
return ("%s (%d)"):format(_reverse_lookup[command] or "ERROR UNDEFINED!", command)
end
if(type(command) == 'number') then
return ("%s (%d)"):format(_reverse_lookup[ tostring(command)] or "ERROR UNDEFINED!", command)
end
return ("Error, numeric or string argument expected, got : %s"):format(tostring(command))
if(type(command) == 'string') then
return ("%s (%d)"):format(_reverse_lookup[command] or "ERROR UNDEFINED!", command)
end
if(type(command) == 'number') then
return ("%s (%d)"):format(_reverse_lookup[ tostring(command)] or "ERROR UNDEFINED!", command)
end
return ("Error, numeric or string argument expected, got : %s"):format(tostring(command))
end
return _errorcodes

View file

@ -5,69 +5,69 @@ Handle Proxmark USB Commands
local _commands = require('usb_cmd')
local _reverse_lookup,k,v = {}
for k, v in pairs(_commands) do
_reverse_lookup[v] = k
end
_commands.tostring = function(command)
if(type(command) == 'number') then
return ("%s (%d)"):format(_reverse_lookup[command]or "ERROR UNDEFINED!", command)
end
return ("Error, numeric argument expected, got : %s"):format(tostring(command))
for k, v in pairs(_commands) do
_reverse_lookup[v] = k
end
_commands.tostring = function(command)
if(type(command) == 'number') then
return ("%s (%d)"):format(_reverse_lookup[command]or "ERROR UNDEFINED!", command)
end
return ("Error, numeric argument expected, got : %s"):format(tostring(command))
end
Command = {
new = function(self, o)
new = function(self, o)
local o = o or {} -- create object if user does not provide one
setmetatable(o, self) -- DIY inheritance a'la javascript
self.__index = self
local o = o or {} -- create object if user does not provide one
setmetatable(o, self) -- DIY inheritance a'la javascript
self.__index = self
o.cmd = o.cmd or _commands.CMD_UNKNOWN
o.arg1 = o.arg1 or 0
o.arg2 = o.arg2 or 0
o.arg3 = o.arg3 or 0
local data = o.data or "0"
o.cmd = o.cmd or _commands.CMD_UNKNOWN
o.arg1 = o.arg1 or 0
o.arg2 = o.arg2 or 0
o.arg3 = o.arg3 or 0
local data = o.data or "0"
if(type(data) == 'string') then
-- We need to check if it is correct length, otherwise pad it
local len = string.len(data)
if(len < 1024) then
--Should be 1024 hex characters to represent 512 bytes of data
data = data .. string.rep("0",1024 - len )
end
if(len > 1024) then
-- OOps, a bit too much data here
print( ( "WARNING: data size too large, was %s chars, will be truncated "):format(len) )
--
data = data:sub(1,1024)
end
else
print(("WARNING; data was NOT a (hex-) string, but was %s"):format(type(data)))
end
o.data = data
return o
end,
parse = function (packet)
local count, cmd, arg1, arg2, arg3, data = bin.unpack('LLLLH511', packet)
return Command:new{cmd = cmd, arg1 = arg1, arg2 = arg2, arg3 = arg3, data = data}
end
if(type(data) == 'string') then
-- We need to check if it is correct length, otherwise pad it
local len = string.len(data)
if(len < 1024) then
--Should be 1024 hex characters to represent 512 bytes of data
data = data .. string.rep("0",1024 - len )
end
if(len > 1024) then
-- OOps, a bit too much data here
print( ( "WARNING: data size too large, was %s chars, will be truncated "):format(len) )
--
data = data:sub(1,1024)
end
else
print(("WARNING; data was NOT a (hex-) string, but was %s"):format(type(data)))
end
o.data = data
return o
end,
parse = function (packet)
local count, cmd, arg1, arg2, arg3, data = bin.unpack('LLLLH511', packet)
return Command:new{cmd = cmd, arg1 = arg1, arg2 = arg2, arg3 = arg3, data = data}
end
}
function Command:__tostring()
local output = ("%s\r\nargs : (%s, %s, %s)\r\ndata:\r\n%s\r\n"):format(
_commands.tostring(self.cmd),
tostring(self.arg1),
tostring(self.arg2),
tostring(self.arg3),
tostring(self.data))
return output
local output = ("%s\r\nargs : (%s, %s, %s)\r\ndata:\r\n%s\r\n"):format(
_commands.tostring(self.cmd),
tostring(self.arg1),
tostring(self.arg2),
tostring(self.arg3),
tostring(self.data))
return output
end
function Command:getBytes()
--If a hex-string has been used
local data = self.data
local cmd = self.cmd
local arg1, arg2, arg3 = self.arg1, self.arg2, self.arg3
return bin.pack("LLLLH",cmd, arg1, arg2, arg3, data);
--If a hex-string has been used
local data = self.data
local cmd = self.cmd
local arg1, arg2, arg3 = self.arg1, self.arg2, self.arg3
return bin.pack("LLLLH",cmd, arg1, arg2, arg3, data);
end
return _commands

View file

@ -185,24 +185,24 @@ local _names = {
{"404", "9401", "0030", "earth", "legendary","Bash"},
{"416", "a001", "0030", "magic", "legendary", "Spyro"},
--{"", "", "0030", "magic", "legendary", "Deja Vu"},
--{"", "", "0030", "magic", "legendary", "Deja Vu"},
{"419", "a301", "0030", "tech", "legendary", "Trigger Happy"},
--{"", "", "0030", "tech", "legendary", "bouncer"},
--{"", "", "0030", "tech", "legendary", "jawbreaker"},
--{"", "", "0030", "tech", "legendary", "bouncer"},
--{"", "", "0030", "tech", "legendary", "jawbreaker"},
{"430", "ae01", "0030", "undead", "legendary", "Chop Chop"},
--{"", "", "0030", "undead", "legendary", "grim creeper"},
--{"", "", "0030", "undead", "legendary", "night shift"},
--{"", "", "0030", "undead", "legendary", "grim creeper"},
--{"", "", "0030", "undead", "legendary", "night shift"},
--{"", "", "0030", "air", "legendary", "blades"},
--{"", "", "0030", "air", "legendary", "jet vac"},
--{"", "", "0030", "air", "legendary", "Free Ranger"},
--{"", "", "0030", "life", "legendary", "stealth elf"},
--{"", "", "0030", "life", "legendary", "Bushwhack"},
--{"", "", "0030", "fire", "legendary", "ignitor"},
--{"", "", "0030", "water", "legendary", "slam bam"},
--{"", "", "0030", "water", "legendary", "chill"},
--{"", "", "0030", "air", "legendary", "blades"},
--{"", "", "0030", "air", "legendary", "jet vac"},
--{"", "", "0030", "air", "legendary", "Free Ranger"},
--{"", "", "0030", "life", "legendary", "stealth elf"},
--{"", "", "0030", "life", "legendary", "Bushwhack"},
--{"", "", "0030", "fire", "legendary", "ignitor"},
--{"", "", "0030", "water", "legendary", "slam bam"},
--{"", "", "0030", "water", "legendary", "chill"},
--{"", "", "0030", "", "legendary", "zoo lou"},
--{"", "", "0030", "", "legendary", "zoo lou"},
{"450", "c201", "0030", "air", "trapmaster", "Gusto"},
--{"450", "c201", "0234", "air", "trapmaster", "Special Gusto"},
@ -453,23 +453,23 @@ local _names = {
local function find( main, sub)
main = main:lower()
sub = sub:lower()
sub = sub:lower()
for k, v in pairs(_names) do
if ( v[2]:lower() == main and v[3]:lower() == sub) then
return v
end
end
return nil
if ( v[2]:lower() == main and v[3]:lower() == sub) then
return v
end
end
return nil
end
local function list()
print ("Type\tSub\tElement\tGame Name")
print (string.rep('=', 54))
print ("Type\tSub\tElement\tGame Name")
print (string.rep('=', 54))
for k, v in pairs(_names) do
print(("%s\t%s\t%s\t%-9s\t%s"):format(v[2],v[3],v[4], v[5], v[6] ))
end
print(("%s\t%s\t%s\t%-9s\t%s"):format(v[2],v[3],v[4], v[5], v[6] ))
end
end
return {
Find = find,
List = list,
Find = find,
List = list,
}

View file

@ -1,5 +1,5 @@
--[[
decimal, di edition, model name
decimal, di edition, model name
--]]
local _names = {
{"1000001","1","Mr. Incredible"},
@ -320,7 +320,7 @@ local _names = {
{"4000227","3","?? unknown ??"},
{"4000229","3","Quad Jumper"},
--[[
these below are Portals. Not to be used for tags.
these below are Portals. Not to be used for tags.
--]]
{"8032384","0","Infinity Base - 3DS"},
{"8032385","0","Infinity Base - Xbox"},
@ -332,21 +332,21 @@ local _names = {
local function find( main )
main = main:lower()
for k, v in pairs(_names) do
if ( v[1]:lower() == main ) then
return v
end
end
return nil
if ( v[1]:lower() == main ) then
return v
end
end
return nil
end
local function list()
print ("Type\tEdition\t Model name")
print (string.rep('=', 54))
print ("Type\tEdition\t Model name")
print (string.rep('=', 54))
for k, v in pairs(_names) do
print(("%s\t%s\t%s"):format(v[1],v[2],v[3] ))
end
print(("%s\t%s\t%s"):format(v[1],v[2],v[3] ))
end
end
return {
Find = find,
List = list,
Find = find,
List = list,
}

View file

@ -96,10 +96,10 @@ local function getopt(args, ostr)
if ostr:sub(1, 1) == ':' then return ':' end
return '?';
else arg = args[1] end
end
table.remove(args, 1);
place = 0;
end
end
table.remove(args, 1);
place = 0;
end
return optopt, arg;
end
end

View file

@ -15,21 +15,21 @@ local reader15693 = require('read15')
-- @return if successfull: an table containing card info
-- @return if unsuccessfull : nil, error
local function waitForTag()
print("Waiting for card... press any key to quit")
local readers = {reader14443A, reader14443B, reader15693}
local i = 0;
while not core.ukbhit() do
i = (i % 3) +1
r = readers[i]
print("Reading with ",i)
res, err = r.read()
if res then return res end
print(err)
-- err means that there was no response from card
end
return nil, "Aborted by user"
print("Waiting for card... press any key to quit")
local readers = {reader14443A, reader14443B, reader15693}
local i = 0;
while not core.ukbhit() do
i = (i % 3) +1
r = readers[i]
print("Reading with ",i)
res, err = r.read()
if res then return res end
print(err)
-- err means that there was no response from card
end
return nil, "Aborted by user"
end
return {
waitForTag = waitForTag,
waitForTag = waitForTag,
}

View file

@ -10,125 +10,125 @@ bin = require('bin')
local function dbg(args)
if type(args) == "table" then
local i = 1
while args[i] do
print("###", args[i])
i = i+1
end
else
print("###", args)
end
local i = 1
while args[i] do
print("###", args[i])
i = i+1
end
else
print("###", args)
end
end
---
-- This is only meant to be used when errors occur
local function oops(err)
print("ERROR: ",err)
return nil, err
print("ERROR: ",err)
return nil, err
end
local function save_HTML(javascript, filename)
-- Read the HTML-skel file
local skel = require("htmlskel")
html = skel.getHTML(javascript);
-- Read the HTML-skel file
local skel = require("htmlskel")
html = skel.getHTML(javascript);
-- Open the output file
-- Open the output file
local outfile = io.open(filename, "w")
if outfile == nil then
return oops(string.format("Could not write to file %s",tostring(filename)))
end
-- Write the data into it
outfile:write(html)
io.close(outfile)
local outfile = io.open(filename, "w")
if outfile == nil then
return oops(string.format("Could not write to file %s",tostring(filename)))
end
-- Write the data into it
outfile:write(html)
io.close(outfile)
-- Done
return filename
-- Done
return filename
end
local function save_TEXT(data,filename)
-- Open the output file
local outfile = io.open(filename, "w")
if outfile == nil then
return oops(string.format("Could not write to file %s",tostring(filename)))
end
-- Open the output file
local outfile = io.open(filename, "w")
if outfile == nil then
return oops(string.format("Could not write to file %s",tostring(filename)))
end
outfile:write(data)
io.close(outfile)
return filename
outfile:write(data)
io.close(outfile)
return filename
end
local function save_BIN(data, filename)
-- Open the output file
-- Open the output file
local outfile = io.open(filename, "wb")
if outfile == nil then
return oops(string.format("Could not write to file %s",tostring(filename)))
end
local outfile = io.open(filename, "wb")
if outfile == nil then
return oops(string.format("Could not write to file %s",tostring(filename)))
end
-- Write the data into it
local i = 1
while data[i] do
outfile:write(data[i])
i = i+1
end
-- Write the data into it
local i = 1
while data[i] do
outfile:write(data[i])
i = i+1
end
io.close(outfile)
return filename
io.close(outfile)
return filename
end
local function convert_ascii_dump_to_JS(infile)
local t = infile:read("*all")
local cleaned
local output = "[";
for line in string.gmatch(t, "[^\n]+") do
if string.byte(line,1) ~= string.byte("+",1) then
cleaned = (line or ''):gsub('%s+','')
output = output .. "'"..cleaned.."',\n"
local t = infile:read("*all")
local cleaned
local output = "[";
for line in string.gmatch(t, "[^\n]+") do
if string.byte(line,1) ~= string.byte("+",1) then
cleaned = (line or ''):gsub('%s+','')
output = output .. "'"..cleaned.."',\n"
end
end
output = output .. "]"
return output
end
output = output .. "]"
return output
end
local function convert_binary_dump_to_JS(infile, blockLen)
local bindata = infile:read("*all")
len = string.len(bindata)
local bindata = infile:read("*all")
len = string.len(bindata)
if len % blockLen ~= 0 then
return oops(("Bad data, length (%d) should be a multiple of blocklen (%d)"):format(len, blockLen))
end
if len % blockLen ~= 0 then
return oops(("Bad data, length (%d) should be a multiple of blocklen (%d)"):format(len, blockLen))
end
local _,hex = bin.unpack(("H%d"):format(len),bindata)
local _,hex = bin.unpack(("H%d"):format(len),bindata)
-- Now that we've converted binary data into hex, we doubled the size.
-- One byte, like 0xDE is now
-- the characters 'D' and 'E' : one byte each.
-- Thus:
blockLen = blockLen * 2
-- Now that we've converted binary data into hex, we doubled the size.
-- One byte, like 0xDE is now
-- the characters 'D' and 'E' : one byte each.
-- Thus:
blockLen = blockLen * 2
local js,i = "[";
for i = 1, string.len(hex),blockLen do
js = js .."'" ..string.sub(hex,i,i+blockLen -1).."',\n"
end
js = js .. "]"
return js
local js,i = "[";
for i = 1, string.len(hex),blockLen do
js = js .."'" ..string.sub(hex,i,i+blockLen -1).."',\n"
end
js = js .. "]"
return js
end
local function convert_ascii_dump_to_BIN(infile)
local t = infile:read("*all")
local cleaned
local output = {};
for line in string.gmatch(t, "[^\n]+") do
if string.byte(line) ~= string.byte("+") then
cleaned = (line or ''):gsub('%s+','')
for c in cleaned:gmatch('..') do
output[#output+1] = string.char( tonumber(c,16) )
end
end
end
return output
local t = infile:read("*all")
local cleaned
local output = {};
for line in string.gmatch(t, "[^\n]+") do
if string.byte(line) ~= string.byte("+") then
cleaned = (line or ''):gsub('%s+','')
for c in cleaned:gmatch('..') do
output[#output+1] = string.char( tonumber(c,16) )
end
end
end
return output
end
@ -138,18 +138,18 @@ end
-- @param output the file to write to
-- @return the name of the new file.
local function convert_eml_to_html(input, output)
input = input or 'dumpdata.eml'
output = output or input .. 'html'
input = input or 'dumpdata.eml'
output = output or input .. 'html'
local infile = io.open(input, "r")
if infile == nil then
return oops(string.format("Could not read file %s",tostring(input)))
end
local infile = io.open(input, "r")
if infile == nil then
return oops(string.format("Could not read file %s",tostring(input)))
end
-- Read file, get JS
local javascript = convert_ascii_dump_to_JS(infile)
io.close(infile)
return save_HTML(javascript, output )
-- Read file, get JS
local javascript = convert_ascii_dump_to_JS(infile)
io.close(infile)
return save_HTML(javascript, output )
end
--- Converts a binary dump into HTML/Javascript file
@ -157,46 +157,46 @@ end
-- @param output the file to write to
-- @param blockLen, the length of each block. Defaults to 16 bytes
local function convert_bin_to_html(input, output, blockLen)
input = input or 'dumpdata.bin'
blockLen = blockLen or 16
output = output or input .. 'html'
input = input or 'dumpdata.bin'
blockLen = blockLen or 16
output = output or input .. 'html'
local infile = io.open(input, "rb")
if infile == nil then
return oops(string.format("Could not read file %s",tostring(input)))
end
-- Read file, get JS
local javascript = convert_binary_dump_to_JS(infile, blockLen)
io.close(infile)
local infile = io.open(input, "rb")
if infile == nil then
return oops(string.format("Could not read file %s",tostring(input)))
end
-- Read file, get JS
local javascript = convert_binary_dump_to_JS(infile, blockLen)
io.close(infile)
return save_HTML(javascript, output )
return save_HTML(javascript, output )
end
--- Converts a eml dump into a binary file
-- @param input the file containing the eml-dump (defaults to dumpdata.eml)
-- @param output the file to write to ( defaults to dumpdata.bin)
local function convert_eml_to_bin(input, output)
input = input or 'dumpdata.eml'
output = output or 'dumpdata.bin'
input = input or 'dumpdata.eml'
output = output or 'dumpdata.bin'
local infile = io.open(input, "rb")
if infile == nil then
return oops(string.format("Could not read file %s",tostring(input)))
end
-- Read file, get BIN
local data = convert_ascii_dump_to_BIN(infile)
io.close(infile)
local infile = io.open(input, "rb")
if infile == nil then
return oops(string.format("Could not read file %s",tostring(input)))
end
-- Read file, get BIN
local data = convert_ascii_dump_to_BIN(infile)
io.close(infile)
return save_BIN(data, output )
return save_BIN(data, output )
end
return {
convert_bin_to_html = convert_bin_to_html,
convert_eml_to_html = convert_eml_to_html,
convert_eml_to_bin = convert_eml_to_bin,
convert_bin_to_html = convert_bin_to_html,
convert_eml_to_html = convert_eml_to_html,
convert_eml_to_bin = convert_eml_to_bin,
SaveAsBinary = save_BIN,
SaveAsText = save_TEXT,
SaveAsText = save_TEXT,
SaveAsBinary = save_BIN,
SaveAsText = save_TEXT,
SaveAsText = save_TEXT,
}

View file

@ -2,360 +2,360 @@ local skel_1 = [[
<html>
<head>
<script>
var dictionary = {}
function add(commaSeparated)
{
var fields = commaSeparated.split(",");
var manufacturerCode = fields[0];
var modelCode = fields[1];
var modelSubCode= fields[2];
var modelName = fields[3];
var ATQA = fields[4];
var SAK = fields[5];
<script>
var dictionary = {}
function add(commaSeparated)
{
var fields = commaSeparated.split(",");
var manufacturerCode = fields[0];
var modelCode = fields[1];
var modelSubCode= fields[2];
var modelName = fields[3];
var ATQA = fields[4];
var SAK = fields[5];
//In the data below, wrong endian is used. Mifare is
// written as "0004" instead of "0400", so we need to
// flip it
ATQA = ATQA.substr(2,4)+ATQA.substr(0,2)
//In the data below, wrong endian is used. Mifare is
// written as "0004" instead of "0400", so we need to
// flip it
ATQA = ATQA.substr(2,4)+ATQA.substr(0,2)
var info = {
modelCode : modelCode,
modelSubCode : modelSubCode,
modelName : modelName,
ATQA : ATQA,
SAK : SAK
}
console.log("Adding "+modelName+" , "+SAK)
var info = {
modelCode : modelCode,
modelSubCode : modelSubCode,
modelName : modelName,
ATQA : ATQA,
SAK : SAK
}
console.log("Adding "+modelName+" , "+SAK)
dictionary[ATQA] = dictionary[ATQA] || [];
dictionary[ATQA].push(info)
}
function lookup(atqa, sak)
{
if (!dictionary[atqa]) return "UNKNOWN";
dictionary[ATQA] = dictionary[ATQA] || [];
dictionary[ATQA].push(info)
}
function lookup(atqa, sak)
{
if (!dictionary[atqa]) return "UNKNOWN";
var possibleMatches = [];
for(var i = 0 ; i < dictionary[atqa].length ; i++)
{
var possibleMatches = [];
for(var i = 0 ; i < dictionary[atqa].length ; i++)
{
var info = dictionary[atqa][i];
console.log("Comparing "+sak+ " with "+ info.SAK);
if(sak && info.SAK == sak)//exact match
{
return info.modelName;
// possibleMatches.push(info.modelName);
}else //SAK unknown
{
possibleMatches.push(info.modelName);
}
}
if(possibleMatches.length > 0)
return possibleMatches.join(" or ");
return "UNKNOWN"
}
var info = dictionary[atqa][i];
console.log("Comparing "+sak+ " with "+ info.SAK);
if(sak && info.SAK == sak)//exact match
{
return info.modelName;
// possibleMatches.push(info.modelName);
}else //SAK unknown
{
possibleMatches.push(info.modelName);
}
}
if(possibleMatches.length > 0)
return possibleMatches.join(" or ");
return "UNKNOWN"
}
add("04,,,Mifare TNP3xxx Activision 1K,0f01,01");
add("04,,,Mifare Mini,0004,09");
add("04,,,Mifare Classic 1k/Mifare Plus(4 byte UID) 2K SL1,0004,08");
add("04,,,Mifare Plus (4 byte UID) 2K SL2,0004,10");
add("04,,,Mifare Plus (4 byte UID) 4K SL2,0004,11");
add("04,,,Mifare Plus (4 byte UID) 4K SL1,0004,18");
add("04,,,Mifare Plus (4 byte UID) 2K/4K SL3,0004,20");
add("04,,,Mifare Classic 4K,0002,18");
add("xx,,,NDEF Tags,0044,00 ");
add("04,,,Mifare Ultralight/UltralightC,0044,04");
add("04,,,Mifare Plus (7 byte UID) 2K SL1,0042,08");
add("04,,,Mifare Plus (7 byte UID) 2K SL1,0044,08");
add("04,,,Mifare Plus (7 byte UID) 4K SL1,0042,18");
add("04,,,Mifare Plus (7 byte UID) 4K SL1,0044,18");
add("04,,,Mifare Plus (7 byte UID),0042,10");
add("04,,,Mifare Plus (7 byte UID),0044,10");
add("04,,,Mifare Plus (7 byte UID),0042,11");
add("04,,,Mifare Plus (7 byte UID),0044,11");
add("04,,,Mifare Plus (7 byte UID),0042,20");
add("04,,,Mifare Plus (7 byte UID),0044,20");
add("04,,,Mifare DesFire / DesFire EV1,0344,20067577810280");
add("04,,,JCOP31,0304,283877B14A434F503331");
add("04,,,JCOP31 v2.4.1,0048,207877B1024A434F5076323431");
add("04,,,JCOP41 v2.2,0048,203833B14A434F503431563232");
add("04,,,JCOP41 v2.3.1,0004,283833B14A434F50343156323331");
add("05,,,Mifare Classic 1K,0004,88");
add("40,,,MPCOS,0002,98");
add("25,,,Topaz/Topaz512/Jewel,0C00,");
add("1D,,,FM1208SH01,0004,53");
add("1D,,,FM1208,0008,20");
add("Nokia,,,Mifare Classic 4K emulated by Nokia 6212,0002,38");
add("Nokia,,,Mifare Classic 4K emulated by Nokia 6131,0008,38");
add("04,,,Smart MX with Mifare 4K emulation,0002");
add("04,,,Smart MX with Mifare 4K emulation,0102");
add("04,,,Smart MX with Mifare 4K emulation,0202");
add("04,,,Smart MX with Mifare 4K emulation,0302");
add("04,,,Smart MX with Mifare 4K emulation,0402");
add("04,,,Smart MX with Mifare 4K emulation,0502");
add("04,,,Smart MX with Mifare 4K emulation,0602");
add("04,,,Smart MX with Mifare 4K emulation,0702");
add("04,,,Smart MX with Mifare 4K emulation,0802");
add("04,,,Smart MX with Mifare 4K emulation,0902");
add("04,,,Smart MX with Mifare 4K emulation,0A02");
add("04,,,Smart MX with Mifare 4K emulation,0B02");
add("04,,,Smart MX with Mifare 4K emulation,0C02");
add("04,,,Smart MX with Mifare 4K emulation,0D02");
add("04,,,Smart MX with Mifare 4K emulation,0E02");
add("04,,,Smart MX with Mifare 4K emulation,0F02");
add("04,,,Smart MX with Mifare 1K emulation,0004");
add("04,,,Smart MX with Mifare 1K emulation,0104");
add("04,,,Smart MX with Mifare 1K emulation,0204");
add("04,,,Smart MX with Mifare 1K emulation,0304");
add("04,,,Smart MX with Mifare 1K emulation,0404");
add("04,,,Smart MX with Mifare 1K emulation,0504");
add("04,,,Smart MX with Mifare 1K emulation,0604");
add("04,,,Smart MX with Mifare 1K emulation,0704");
add("04,,,Smart MX with Mifare 1K emulation,0804");
add("04,,,Smart MX with Mifare 1K emulation,0904");
add("04,,,Smart MX with Mifare 1K emulation,0A04");
add("04,,,Smart MX with Mifare 1K emulation,0B04");
add("04,,,Smart MX with Mifare 1K emulation,0C04");
add("04,,,Smart MX with Mifare 1K emulation,0D04");
add("04,,,Smart MX with Mifare 1K emulation,0E04");
add("04,,,Smart MX with Mifare 1K emulation,0F04");
add("04,,,Smart MX with 7 byte UID,0048");
add("04,,,Smart MX with 7 byte UID,0148");
add("04,,,Smart MX with 7 byte UID,0248");
add("04,,,Smart MX with 7 byte UID,0348");
add("04,,,Smart MX with 7 byte UID,0448");
add("04,,,Smart MX with 7 byte UID,0548");
add("04,,,Smart MX with 7 byte UID,0648");
add("04,,,Smart MX with 7 byte UID,0748");
add("04,,,Smart MX with 7 byte UID,0848");
add("04,,,Smart MX with 7 byte UID,0948");
add("04,,,Smart MX with 7 byte UID,0A48");
add("04,,,Smart MX with 7 byte UID,0B48");
add("04,,,Smart MX with 7 byte UID,0C48");
add("04,,,Smart MX with 7 byte UID,0D48");
add("04,,,Smart MX with 7 byte UID,0E48");
add("04,,,Smart MX with 7 byte UID,0F48");
</script>
add("04,,,Mifare TNP3xxx Activision 1K,0f01,01");
add("04,,,Mifare Mini,0004,09");
add("04,,,Mifare Classic 1k/Mifare Plus(4 byte UID) 2K SL1,0004,08");
add("04,,,Mifare Plus (4 byte UID) 2K SL2,0004,10");
add("04,,,Mifare Plus (4 byte UID) 4K SL2,0004,11");
add("04,,,Mifare Plus (4 byte UID) 4K SL1,0004,18");
add("04,,,Mifare Plus (4 byte UID) 2K/4K SL3,0004,20");
add("04,,,Mifare Classic 4K,0002,18");
add("xx,,,NDEF Tags,0044,00 ");
add("04,,,Mifare Ultralight/UltralightC,0044,04");
add("04,,,Mifare Plus (7 byte UID) 2K SL1,0042,08");
add("04,,,Mifare Plus (7 byte UID) 2K SL1,0044,08");
add("04,,,Mifare Plus (7 byte UID) 4K SL1,0042,18");
add("04,,,Mifare Plus (7 byte UID) 4K SL1,0044,18");
add("04,,,Mifare Plus (7 byte UID),0042,10");
add("04,,,Mifare Plus (7 byte UID),0044,10");
add("04,,,Mifare Plus (7 byte UID),0042,11");
add("04,,,Mifare Plus (7 byte UID),0044,11");
add("04,,,Mifare Plus (7 byte UID),0042,20");
add("04,,,Mifare Plus (7 byte UID),0044,20");
add("04,,,Mifare DesFire / DesFire EV1,0344,20067577810280");
add("04,,,JCOP31,0304,283877B14A434F503331");
add("04,,,JCOP31 v2.4.1,0048,207877B1024A434F5076323431");
add("04,,,JCOP41 v2.2,0048,203833B14A434F503431563232");
add("04,,,JCOP41 v2.3.1,0004,283833B14A434F50343156323331");
add("05,,,Mifare Classic 1K,0004,88");
add("40,,,MPCOS,0002,98");
add("25,,,Topaz/Topaz512/Jewel,0C00,");
add("1D,,,FM1208SH01,0004,53");
add("1D,,,FM1208,0008,20");
add("Nokia,,,Mifare Classic 4K emulated by Nokia 6212,0002,38");
add("Nokia,,,Mifare Classic 4K emulated by Nokia 6131,0008,38");
add("04,,,Smart MX with Mifare 4K emulation,0002");
add("04,,,Smart MX with Mifare 4K emulation,0102");
add("04,,,Smart MX with Mifare 4K emulation,0202");
add("04,,,Smart MX with Mifare 4K emulation,0302");
add("04,,,Smart MX with Mifare 4K emulation,0402");
add("04,,,Smart MX with Mifare 4K emulation,0502");
add("04,,,Smart MX with Mifare 4K emulation,0602");
add("04,,,Smart MX with Mifare 4K emulation,0702");
add("04,,,Smart MX with Mifare 4K emulation,0802");
add("04,,,Smart MX with Mifare 4K emulation,0902");
add("04,,,Smart MX with Mifare 4K emulation,0A02");
add("04,,,Smart MX with Mifare 4K emulation,0B02");
add("04,,,Smart MX with Mifare 4K emulation,0C02");
add("04,,,Smart MX with Mifare 4K emulation,0D02");
add("04,,,Smart MX with Mifare 4K emulation,0E02");
add("04,,,Smart MX with Mifare 4K emulation,0F02");
add("04,,,Smart MX with Mifare 1K emulation,0004");
add("04,,,Smart MX with Mifare 1K emulation,0104");
add("04,,,Smart MX with Mifare 1K emulation,0204");
add("04,,,Smart MX with Mifare 1K emulation,0304");
add("04,,,Smart MX with Mifare 1K emulation,0404");
add("04,,,Smart MX with Mifare 1K emulation,0504");
add("04,,,Smart MX with Mifare 1K emulation,0604");
add("04,,,Smart MX with Mifare 1K emulation,0704");
add("04,,,Smart MX with Mifare 1K emulation,0804");
add("04,,,Smart MX with Mifare 1K emulation,0904");
add("04,,,Smart MX with Mifare 1K emulation,0A04");
add("04,,,Smart MX with Mifare 1K emulation,0B04");
add("04,,,Smart MX with Mifare 1K emulation,0C04");
add("04,,,Smart MX with Mifare 1K emulation,0D04");
add("04,,,Smart MX with Mifare 1K emulation,0E04");
add("04,,,Smart MX with Mifare 1K emulation,0F04");
add("04,,,Smart MX with 7 byte UID,0048");
add("04,,,Smart MX with 7 byte UID,0148");
add("04,,,Smart MX with 7 byte UID,0248");
add("04,,,Smart MX with 7 byte UID,0348");
add("04,,,Smart MX with 7 byte UID,0448");
add("04,,,Smart MX with 7 byte UID,0548");
add("04,,,Smart MX with 7 byte UID,0648");
add("04,,,Smart MX with 7 byte UID,0748");
add("04,,,Smart MX with 7 byte UID,0848");
add("04,,,Smart MX with 7 byte UID,0948");
add("04,,,Smart MX with 7 byte UID,0A48");
add("04,,,Smart MX with 7 byte UID,0B48");
add("04,,,Smart MX with 7 byte UID,0C48");
add("04,,,Smart MX with 7 byte UID,0D48");
add("04,,,Smart MX with 7 byte UID,0E48");
add("04,,,Smart MX with 7 byte UID,0F48");
</script>
<style>
* {
background-color: #2F3440;
background-color:#232323;
color : #F5E5C0;
xtext-transform: uppercase;
font-size: 1.05em;
font-family: monospace,Arial;
}
table{
float:left;
border: 1px solid white;
}
td {
empty-cells: show;
}
td.blockzero, .turqoise{
color: rgb(140, 245, 193);
}
td.key_a, .yellow{
color : #F8CA4D;
}
td.key_b, .blue{
color : #3F5666;
}
td.accessconditions, .red{
color : #EA6045;
}
<style>
* {
background-color: #2F3440;
background-color:#232323;
color : #F5E5C0;
xtext-transform: uppercase;
font-size: 1.05em;
font-family: monospace,Arial;
}
table{
float:left;
border: 1px solid white;
}
td {
empty-cells: show;
}
td.blockzero, .turqoise{
color: rgb(140, 245, 193);
}
td.key_a, .yellow{
color : #F8CA4D;
}
td.key_b, .blue{
color : #3F5666;
}
td.accessconditions, .red{
color : #EA6045;
}
td.sectorhdr{
border-top: 1px solid white;
}
</style>
<script>
/** Jquery for the poor **/
function dc(x){return document.createElement(x)}
td.sectorhdr{
border-top: 1px solid white;
}
</style>
<script>
/** Jquery for the poor **/
function dc(x){return document.createElement(x)}
function tr(table){
var row = dc('tr');
table.appendChild(row);
return row;
}
function td(row, text){
var tdata = dc('td');
row.appendChild(tdata);
tdata.appendChild(document.createTextNode(text))
return tdata;
}
function tr(table){
var row = dc('tr');
table.appendChild(row);
return row;
}
function td(row, text){
var tdata = dc('td');
row.appendChild(tdata);
tdata.appendChild(document.createTextNode(text))
return tdata;
}
/**
* The identifiers that determine how to highlight data and present information
**/
var identifiers = [
function(data)
{
// Should be 32 characters long ( 16 bytes per block)
if(data[0].length != 32) { return false; }
// ... add more checks if necessary ...
/**
* The identifiers that determine how to highlight data and present information
**/
var identifiers = [
function(data)
{
// Should be 32 characters long ( 16 bytes per block)
if(data[0].length != 32) { return false; }
// ... add more checks if necessary ...
var info = {Type : "Mifare"}
info['Size'] = (data[0].length / 2 * data.length) + " Bytes";
info['UID'] = data[0].substring(0,8);
info['SAK'] = data[0].substring(10,12);
info['ATQA'] = data[0].substring(12,16);
var info = {Type : "Mifare"}
info['Size'] = (data[0].length / 2 * data.length) + " Bytes";
info['UID'] = data[0].substring(0,8);
info['SAK'] = data[0].substring(10,12);
info['ATQA'] = data[0].substring(12,16);
info['Name'] = lookup(info.ATQA, info.SAK);
return {info: info, highlighter : mifareHighlighter }
},
function(data)
{
// Should be 8 characters long ( 4 bytes per block)
if(data[0].length != 8) { return false; }
// ... add more checks if necessary ...
var info = {Type : "NDEF"}
info['Size'] = (data[0].length / 2 * data.length) + " Bytes";
info['Name'] = lookup(info.ATQA, info.SAK);
return {info: info, highlighter : mifareHighlighter }
},
function(data)
{
// Should be 8 characters long ( 4 bytes per block)
if(data[0].length != 8) { return false; }
// ... add more checks if necessary ...
var info = {Type : "NDEF"}
info['Size'] = (data[0].length / 2 * data.length) + " Bytes";
return {info: info, highlighter : ndefHighligheter }
},
return {info: info, highlighter : ndefHighligheter }
},
function(data)
{//This is the catch-all
return {info: {type : "Unknown"}, highlighter : noHighlighter}
}
]
function(data)
{//This is the catch-all
return {info: {type : "Unknown"}, highlighter : noHighlighter}
}
]
/**
* Helper function to convert bin-data into printable chars
**/
/**
* Helper function to convert bin-data into printable chars
**/
function to_ascii(hexval)
{
var intval = parseInt(hexval,16);
if(intval > 31 && intval < 127)
{
return String.fromCharCode(intval);
}
return ".";
}
function to_ascii(hexval)
{
var intval = parseInt(hexval,16);
if(intval > 31 && intval < 127)
{
return String.fromCharCode(intval);
}
return ".";
}
function loadIntoTable(data, info, ascii)
{
var t = dc("table")
for(var i = 0 ; i < data.length ; i++)
{
line = data[i];
var row = tr(t);
var bytes = line.match(/(.{1,2})/g);
for(var b = 0 ; b < bytes.length ; b++)
{
var elem = td(row, ascii ? to_ascii(bytes[b]) : bytes[b]);
info.highlighter.addClass(elem,i,b, bytes[b]);
}
}
document.body.appendChild(t);
}
function loadGeneralInfo(data, info)
{
var t = dc("table");
for (var key in info)
{
var row = tr(t);
td(row,key);
td(row,info[key]);
}
document.body.appendChild(t);
}
function loadIntoTable(data, info, ascii)
{
var t = dc("table")
for(var i = 0 ; i < data.length ; i++)
{
line = data[i];
var row = tr(t);
var bytes = line.match(/(.{1,2})/g);
for(var b = 0 ; b < bytes.length ; b++)
{
var elem = td(row, ascii ? to_ascii(bytes[b]) : bytes[b]);
info.highlighter.addClass(elem,i,b, bytes[b]);
}
}
document.body.appendChild(t);
}
function loadGeneralInfo(data, info)
{
var t = dc("table");
for (var key in info)
{
var row = tr(t);
td(row,key);
td(row,info[key]);
}
document.body.appendChild(t);
}
function handle(dump)
{
var data = dump.data;
var info = null;
for(var i = 0; i < identifiers.length && !info; i++)
info = identifiers[i](data);
function handle(dump)
{
var data = dump.data;
var info = null;
for(var i = 0; i < identifiers.length && !info; i++)
info = identifiers[i](data);
console.log(info);
console.log(info);
loadIntoTable(data, info, false);
loadIntoTable(data, info, true);
loadGeneralInfo(data, info.info);
loadIntoTable(data, info, false);
loadIntoTable(data, info, true);
loadGeneralInfo(data, info.info);
}
var noHighlighter = {
addClass : function(el ,line, byte)
{
return;
}
};
var ndefHighligheter = {
addClass : function(el ,line, byte, value)
{
if(line < 3)
{
el.className += " red";
}
if ( line == 3)
{
console.log(value);
if( byte == 0 && "e1" == value.toLowerCase()) el.className += " turqoise";
if( byte == 1 ) el.className += " yellow";
if( byte == 2 ) el.className += " blue";
return;
}
}
};
var mifareHighlighter = {
addClass : function(el ,line, byte)
{
if (line == 0)
{
el.className += " blockzero";
}
}
var noHighlighter = {
addClass : function(el ,line, byte)
{
return;
}
};
var ndefHighligheter = {
addClass : function(el ,line, byte, value)
{
if(line < 3)
{
el.className += " red";
}
if ( line == 3)
{
console.log(value);
if( byte == 0 && "e1" == value.toLowerCase()) el.className += " turqoise";
if( byte == 1 ) el.className += " yellow";
if( byte == 2 ) el.className += " blue";
return;
}
}
};
var mifareHighlighter = {
addClass : function(el ,line, byte)
{
if (line == 0)
{
el.className += " blockzero";
}
if(line < 128){
linesPerSector = 4;
} else {
//Quadruple size sectors
linesPerSector = 16;
line = line - 128;
}
if(line < 128){
linesPerSector = 4;
} else {
//Quadruple size sectors
linesPerSector = 16;
line = line - 128;
}
if(line % linesPerSector == 0)
{
el.className += " sectorhdr";
}
if(line % linesPerSector == (linesPerSector -1))
{
el.className += " sectortrailer";
if(byte == undefined)
{
return;
}
if(line % linesPerSector == 0)
{
el.className += " sectorhdr";
}
if(line % linesPerSector == (linesPerSector -1))
{
el.className += " sectortrailer";
if(byte == undefined)
{
return;
}
if(byte < 6) el.className += " key_a";
else if(byte < 10) el.className += " accessconditions";
else el.className += " key_b";
}
if(byte < 6) el.className += " key_a";
else if(byte < 10) el.className += " accessconditions";
else el.className += " key_b";
}
}
};
}
};
</script>
</script>
</head>
<body></body>
<script>
var x = { data :
var x = { data :
]]
local skel_2 = [[
};
handle(x);
</script>
};
handle(x);
</script>
</html>
]]
local function getHTML(data)
return skel_1 .. data .. skel_2
return skel_1 .. data .. skel_2
end
return {getHTML = getHTML}

View file

@ -1,5 +1,5 @@
--[[
This is an experimental lib.
This is an experimental lib.
--]]
local utils = require('utils')
@ -35,60 +35,60 @@ shifts[9]= { 0xD, 0xB, 0x0, 0x6, 0x6, 0x0, 0xB, 0xD, 0xA, 0xC, 0x7, 0x1, 0x1, 0x
shifts[10]= { 0xe, 0x1, 0x1, 0xe, 0x1, 0xe, 0xe, 0x1, 0x1, 0xe, 0xe, 0x1, 0xe, 0x1, 0x1, 0xe }
local function ApplyPermutationAndShifts( pos, value, nibble)
local shiftbytes = shifts[pos]
local shiftElem = shiftbytes[nibble+1] --one indexed
local shiftOne = shiftbytes[1]
local rs = bit32.bxor(value, shiftOne, shiftElem)
return rs
local shiftbytes = shifts[pos]
local shiftElem = shiftbytes[nibble+1] --one indexed
local shiftOne = shiftbytes[1]
local rs = bit32.bxor(value, shiftOne, shiftElem)
return rs
end
local function GetOne( uid, block )
if uid == nil then return nil, 'empty uid string' end
if #uid == 0 then return nil, 'empty uid string' end
if #uid ~= 8 then return nil, 'uid wrong length. Should be 4 hex bytes' end
if type(block) ~= 'number' then return nil, 'block is not number' end
if block > 16 or block < 0 then return nil, 'block is out-of-range' end
if uid == nil then return nil, 'empty uid string' end
if #uid == 0 then return nil, 'empty uid string' end
if #uid ~= 8 then return nil, 'uid wrong length. Should be 4 hex bytes' end
if type(block) ~= 'number' then return nil, 'block is not number' end
if block > 16 or block < 0 then return nil, 'block is out-of-range' end
local s = ('%s%02X'):format(uid,block)
local nibble1 = tonumber(s:sub(1,1),16) + 1
local s = ('%s%02X'):format(uid,block)
local nibble1 = tonumber(s:sub(1,1),16) + 1
local permuted = ''
for i = 1, #s do
local el_row = shifts[i]
local el_value = el_row[nibble1]
j = 1
while j <= i do
if i-j > 0 then
local nibble = tonumber(s:sub(j+1,j+1),16)
el_value = ApplyPermutationAndShifts(i-j, el_value, nibble)
end
j = j+1
end
permuted =('%s%X'):format(permuted,el_value)
end
local permuted = ''
for i = 1, #s do
local el_row = shifts[i]
local el_value = el_row[nibble1]
j = 1
while j <= i do
if i-j > 0 then
local nibble = tonumber(s:sub(j+1,j+1),16)
el_value = ApplyPermutationAndShifts(i-j, el_value, nibble)
end
j = j+1
end
permuted =('%s%X'):format(permuted,el_value)
end
permuted = 'C2'..permuted
local crc64numStr = utils.Crc64(permuted)
local keybytes = utils.ConvertAsciiToBytes(crc64numStr, true)
local key = utils.ConvertBytesToHex(keybytes)
return key:sub(1,12)
permuted = 'C2'..permuted
local crc64numStr = utils.Crc64(permuted)
local keybytes = utils.ConvertAsciiToBytes(crc64numStr, true)
local key = utils.ConvertBytesToHex(keybytes)
return key:sub(1,12)
end
local PreCalc =
{
GetAll = function(id)
if id == nil then return nil, 'empty string' end
if #id == 0 then return nil, 'empty string' end
if #id ~= 8 then return nil, 'wrong length. Should be 4 hex bytes' end
GetAll = function(id)
if id == nil then return nil, 'empty string' end
if #id == 0 then return nil, 'empty string' end
if #id ~= 8 then return nil, 'wrong length. Should be 4 hex bytes' end
local list = '4b0b20107ccb'
for i = 1,15 do
local key, err = GetOne(id,i)
if not key then return oops(err) end
list = list..key
end
return list
end,
local list = '4b0b20107ccb'
for i = 1,15 do
local key, err = GetOne(id,i)
if not key then return oops(err) end
list = list..key
end
return list
end,
}
return PreCalc

View file

@ -1,29 +1,29 @@
--[[
This is a library to read 14443a tags. It can be used something like this
This is a library to read 14443a tags. It can be used something like this
local reader = require('read14a')
result, err = reader.read14443a()
if not result then
print(err)
return
end
print(result.name)
local reader = require('read14a')
result, err = reader.read14443a()
if not result then
print(err)
return
end
print(result.name)
--]]
-- Loads the commands-library
local cmds = require('commands')
local TIMEOUT = 2000 -- Shouldn't take longer than 2 seconds
local ISO14A_COMMAND = {
ISO14A_CONNECT = 1,
ISO14A_NO_DISCONNECT = 2,
ISO14A_APDU = 4,
ISO14A_RAW = 8,
ISO14A_REQUEST_TRIGGER = 0x10,
ISO14A_APPEND_CRC = 0x20,
ISO14A_SET_TIMEOUT = 0x40,
ISO14A_NO_SELECT = 0x80,
ISO14A_TOPAZMODE = 0x100,
ISO14A_NO_RATS = 0x200
ISO14A_CONNECT = 1,
ISO14A_NO_DISCONNECT = 2,
ISO14A_APDU = 4,
ISO14A_RAW = 8,
ISO14A_REQUEST_TRIGGER = 0x10,
ISO14A_APPEND_CRC = 0x20,
ISO14A_SET_TIMEOUT = 0x40,
ISO14A_NO_SELECT = 0x80,
ISO14A_TOPAZMODE = 0x100,
ISO14A_NO_RATS = 0x200
}
local ISO14443a_TYPES = {}
@ -45,50 +45,50 @@ ISO14443a_TYPES[0x98] = "Gemplus MPCOS"
local function tostring_14443a(sak)
return ISO14443a_TYPES[sak] or ("Unknown (SAK=%x)"):format(sak)
return ISO14443a_TYPES[sak] or ("Unknown (SAK=%x)"):format(sak)
end
local function parse14443a(data)
--[[
--[[
Based on this struct :
Based on this struct :
typedef struct {
byte_t uid[10];
byte_t uidlen;
byte_t atqa[2];
byte_t sak;
byte_t ats_len;
byte_t ats[256];
} __attribute__((__packed__)) iso14a_card_select_t;
typedef struct {
byte_t uid[10];
byte_t uidlen;
byte_t atqa[2];
byte_t sak;
byte_t ats_len;
byte_t ats[256];
} __attribute__((__packed__)) iso14a_card_select_t;
--]]
--]]
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_14443a(sak), data = 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_14443a(sak), data = data}
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
-- response of type CMD_ACK
-- @return packet,nil if successfull
-- nil, errormessage if unsuccessfull
-- 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
local function sendToDevice(command, ignoreresponse)
--core.clearCommandBuffer()
local err = core.SendCommand(command:getBytes())
if err then
print(err)
return nil, err
end
if ignoreresponse then return nil,nil end
--core.clearCommandBuffer()
local err = core.SendCommand(command:getBytes())
if err then
print(err)
return nil, err
end
if ignoreresponse then return nil,nil end
local response = core.WaitForResponseTimeout(cmds.CMD_ACK, TIMEOUT)
return response,nil
local response = core.WaitForResponseTimeout(cmds.CMD_ACK, TIMEOUT)
return response,nil
end
-- This function does a connect and retrieves som einfo
@ -96,34 +96,34 @@ end
-- @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
local command, result, info, err, data
command = Command:new{cmd = cmds.CMD_READER_ISO_14443a, arg1 = ISO14A_COMMAND.ISO14A_CONNECT }
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
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 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
if err then
print(err)
return nil, err
end
return info
if err then
print(err)
return nil, err
end
return info
end
---
@ -131,20 +131,20 @@ end
-- @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"
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
local library = {
read = read14443a,
waitFor14443a = waitFor14443a,
parse14443a = parse14443a,
sendToDevice = sendToDevice,
ISO14A_COMMAND = ISO14A_COMMAND,
read = read14443a,
waitFor14443a = waitFor14443a,
parse14443a = parse14443a,
sendToDevice = sendToDevice,
ISO14A_COMMAND = ISO14A_COMMAND,
}
return library

View file

@ -1,13 +1,13 @@
--[[
This is a library to read 14443b tags. It can be used something like this
This is a library to read 14443b tags. It can be used something like this
local reader = require('read14b')
result, err = reader.select1443b()
if not result then
print(err)
return
end
print(result.name)
local reader = require('read14b')
result, err = reader.select1443b()
if not result then
print(err)
return
end
print(result.name)
--]]
-- Loads the commands-library
@ -15,56 +15,56 @@ local cmds = require('commands')
local utils = require('utils')
local TIMEOUT = 2500
local ISO14B_COMMAND = {
ISO14B_CONNECT = 1,
ISO14B_DISCONNECT = 2,
ISO14B_APDU = 4,
ISO14B_RAW = 8,
ISO14B_REQUEST_TRIGGER = 0x10,
ISO14B_APPEND_CRC = 0x20,
ISO14B_SELECT_STD = 0x40,
ISO14B_SELECT_SR = 0x80,
ISO14B_CONNECT = 1,
ISO14B_DISCONNECT = 2,
ISO14B_APDU = 4,
ISO14B_RAW = 8,
ISO14B_REQUEST_TRIGGER = 0x10,
ISO14B_APPEND_CRC = 0x20,
ISO14B_SELECT_STD = 0x40,
ISO14B_SELECT_SR = 0x80,
}
local function parse1443b(data)
--[[
--[[
Based on this struct :
Based on this struct :
typedef struct {
byte_t uid[10];
byte_t uidlen;
byte_t atqb[7];
byte_t chipid;
byte_t cid;
} __attribute__((__packed__)) iso14b_card_select_t;
typedef struct {
byte_t uid[10];
byte_t uidlen;
byte_t atqb[7];
byte_t chipid;
byte_t cid;
} __attribute__((__packed__)) iso14b_card_select_t;
--]]
--]]
local count, uid, uidlen, atqb, chipid, cid = bin.unpack('H10CH7CC',data)
uid = uid:sub(1, 2*uidlen)
return { uid = uid, uidlen = uidlen, atqb = atqb, chipid = chipid, cid = cid }
local count, uid, uidlen, atqb, chipid, cid = bin.unpack('H10CH7CC',data)
uid = uid:sub(1, 2*uidlen)
return { uid = uid, uidlen = uidlen, atqb = atqb, chipid = chipid, cid = cid }
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
-- response of type CMD_ACK
-- @return packet,nil if successfull
-- nil, errormessage if unsuccessfull
-- 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
local function sendToDevice(cmd, ignoreresponse)
--core.clearCommandBuffer()
local bytes = cmd:getBytes()
local count,c,arg0,arg1,arg2 = bin.unpack('LLLL',bytes)
local err = core.SendCommand(cmd:getBytes())
if err then
print('ERROR',err)
return nil, err
end
if ignoreresponse then return nil,nil end
--core.clearCommandBuffer()
local bytes = cmd:getBytes()
local count,c,arg0,arg1,arg2 = bin.unpack('LLLL',bytes)
local err = core.SendCommand(cmd:getBytes())
if err then
print('ERROR',err)
return nil, err
end
if ignoreresponse then return nil,nil end
local response = core.WaitForResponseTimeout(cmds.CMD_ACK, TIMEOUT)
return response,nil
local response = core.WaitForResponseTimeout(cmds.CMD_ACK, TIMEOUT)
return response,nil
end
--- Picks out and displays the data read from a tag
-- Specifically, takes a usb packet, converts to a Command
@ -73,10 +73,10 @@ end
-- and displays the data
-- @param usbpacket the data received from the device
local function showData(usbpacket)
local response = Command.parse(usbpacket)
local len = response.arg2 * 2
local data = string.sub(response.data, 0, len);
print("<< ",data)
local response = Command.parse(usbpacket)
local len = response.arg2 * 2
local data = string.sub(response.data, 0, len);
print("<< ",data)
end
@ -85,50 +85,50 @@ end
-- @return if unsuccessfull : nil, error
local function read14443b(disconnect)
local command, result, info, err, data
local command, result, info, err, data
local flags = ISO14B_COMMAND.ISO14B_CONNECT +
ISO14B_COMMAND.ISO14B_SELECT_STD
local flags = ISO14B_COMMAND.ISO14B_CONNECT +
ISO14B_COMMAND.ISO14B_SELECT_STD
if disconnect then
print('DISCONNECT')
flags = flags + ISO14B_COMMAND.ISO14B_DISCONNECT
end
if disconnect then
print('DISCONNECT')
flags = flags + ISO14B_COMMAND.ISO14B_DISCONNECT
end
command = Command:new{cmd = cmds.CMD_ISO_14443B_COMMAND, arg1 = flags}
local result, err = sendToDevice(command, false)
if result then
local count,cmd,arg0,arg1,arg2 = bin.unpack('LLLL',result)
if arg0 == 0 then
data = string.sub(result, count)
info, err = parse1443b(data)
else
err = "iso14443b card select failed"
end
else
err = "No response from card"
end
command = Command:new{cmd = cmds.CMD_ISO_14443B_COMMAND, arg1 = flags}
local result, err = sendToDevice(command, false)
if result then
local count,cmd,arg0,arg1,arg2 = bin.unpack('LLLL',result)
if arg0 == 0 then
data = string.sub(result, count)
info, err = parse1443b(data)
else
err = "iso14443b card select failed"
end
else
err = "No response from card"
end
if err then
print(err)
return nil, err
end
return info
if err then
print(err)
return nil, err
end
return info
end
--PING / PONG - Custom Anticollison for Navigo.
-- AA / BB ?!?
-- local ping = ('BA00')
-- result, err = sendRaw(ping, 1, 1)
-- if result then
-- resp = Command.parse( result )
-- if arg1 == 0 then
-- return nil, "iso14443b card - PING/PONG failed"
-- end
-- showData(result)
-- resp = Command.parse( result )
-- if arg1 == 0 then
-- return nil, "iso14443b card - PING/PONG failed"
-- end
-- showData(result)
-- else
-- err = "No response from card"
-- print(err)
-- return nil, err
-- err = "No response from card"
-- print(err)
-- return nil, err
-- end
@ -137,22 +137,22 @@ end
-- @return if successfull: an table containing card info
-- @return if unsuccessfull : nil, error
local function waitFor14443b()
print("Waiting for card... press any key to quit")
while not core.ukbhit() do
res, err = read14443b(false)
if res then return res end
-- err means that there was no response from card
end
return nil, "Aborted by user"
print("Waiting for card... press any key to quit")
while not core.ukbhit() do
res, err = read14443b(false)
if res then return res end
-- err means that there was no response from card
end
return nil, "Aborted by user"
end
local library = {
read = read14443b,
waitFor14443b = waitFor14443b,
parse1443b = parse1443b,
sendToDevice = sendToDevice,
showData = showData,
ISO14B_COMMAND = ISO14B_COMMAND,
read = read14443b,
waitFor14443b = waitFor14443b,
parse1443b = parse1443b,
sendToDevice = sendToDevice,
showData = showData,
ISO14B_COMMAND = ISO14B_COMMAND,
}
return library

View file

@ -1,13 +1,13 @@
--[[
This is a library to read 15693 tags. It can be used something like this
This is a library to read 15693 tags. It can be used something like this
local reader = require('read15')
local info, err = reader.read()
if not info then
print(err)
return
end
print(info.UID)
local reader = require('read15')
local info, err = reader.read()
if not info then
print(err)
return
end
print(info.UID)
--]]
-- Loads the commands-library
@ -19,60 +19,60 @@ local TIMEOUT = 2000 -- Shouldn't take longer than 2 seconds
--- 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
-- response of type CMD_ACK
-- @return packet,nil if successfull
-- nil, errormessage if unsuccessfull
-- 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
local function sendToDevice(command, ignoreresponse)
local err = core.SendCommand(command:getBytes())
if err then
print(err)
return nil, err
end
if ignoreresponse then return nil, nil end
local err = core.SendCommand(command:getBytes())
if err then
print(err)
return nil, err
end
if ignoreresponse then return nil, nil end
local response = core.WaitForResponseTimeout(cmds.CMD_ACK, TIMEOUT)
return response, nil
local response = core.WaitForResponseTimeout(cmds.CMD_ACK, TIMEOUT)
return response, nil
end
local function errorString15693(number)
local errors = {}
errors[0x01] = "The command is not supported"
errors[0x02] = "The command is not recognised"
errors[0x03] = "The option is not supported."
errors[0x0f] = "Unknown error."
errors[0x10] = "The specified block is not available (doesnt exist)."
errors[0x11] = "The specified block is already -locked and thus cannot be locked again"
errors[0x12] = "The specified block is locked and its content cannot be changed."
errors[0x13] = "The specified block was not successfully programmed."
errors[0x14] = "The specified block was not successfully locked."
local errors = {}
errors[0x01] = "The command is not supported"
errors[0x02] = "The command is not recognised"
errors[0x03] = "The option is not supported."
errors[0x0f] = "Unknown error."
errors[0x10] = "The specified block is not available (doesnt exist)."
errors[0x11] = "The specified block is already -locked and thus cannot be locked again"
errors[0x12] = "The specified block is locked and its content cannot be changed."
errors[0x13] = "The specified block was not successfully programmed."
errors[0x14] = "The specified block was not successfully locked."
return errors[number] or "Reserved for Future Use or Custom command error."
return errors[number] or "Reserved for Future Use or Custom command error."
end
local function parse15693(data)
local bytes = utils.ConvertAsciiToBytes(data)
local tmp = utils.ConvertAsciiToHex(data)
local bytes = utils.ConvertAsciiToBytes(data)
local tmp = utils.ConvertAsciiToHex(data)
-- define ISO15_CRC_CHECK 0F47
local crcStr = utils.Crc15(tmp, #tmp)
-- define ISO15_CRC_CHECK 0F47
local crcStr = utils.Crc15(tmp, #tmp)
if string.sub(crcStr, #crcStr - 3) ~= '470F' then
print("CRC", crc )
return nil, "CRC failed"
end
if string.sub(crcStr, #crcStr - 3) ~= '470F' then
print("CRC", crc )
return nil, "CRC failed"
end
if bytes[1] % 2 == 1 then
-- Above is a poor-mans bit check:
-- recv[0] & ISO15_RES_ERROR //(0x01)
local err = "Tag returned error %i: %s"
err = string.format(err, bytes[1], errorString15693(bytes[1]))
return nil, err
end
local uid = utils.ConvertBytesToHex( bytes, true )
uid = uid:sub(5, #uid-4)
return { uid = uid, }
if bytes[1] % 2 == 1 then
-- Above is a poor-mans bit check:
-- recv[0] & ISO15_RES_ERROR //(0x01)
local err = "Tag returned error %i: %s"
err = string.format(err, bytes[1], errorString15693(bytes[1]))
return nil, err
end
local uid = utils.ConvertBytesToHex( bytes, true )
uid = uid:sub(5, #uid-4)
return { uid = uid, }
end
-- This function does a connect and retrieves som info
@ -83,62 +83,62 @@ local function read15693(slow, dont_readresponse)
--[[
We start by trying this command:
MANDATORY (present in ALL iso15693 tags) command (the example below is sent to a tag different from the above one):
We start by trying this command:
MANDATORY (present in ALL iso15693 tags) command (the example below is sent to a tag different from the above one):
pm3> hf 15 info u
UID=E007C1A257394244
Tag Info: Texas Instrument; Tag-it HF-I Standard; 8x32bit
pm3>
pm3> hf 15 info u
UID=E007C1A257394244
Tag Info: Texas Instrument; Tag-it HF-I Standard; 8x32bit
pm3>
From which we obtain less information than the above one.
From which we obtain less information than the above one.
"260100" means
0x26
-- #define ISO15_REQ_SUBCARRIER_SINGLE 0x00 // Tag should respond using one subcarrier (ASK)
-- #define ISO15_REQ_DATARATE_HIGH 0x02 // Tag should respond using high data rate
-- #define ISO15_REQ_NONINVENTORY 0x00
0x01
inventory
0x00
"260100" means
0x26
-- #define ISO15_REQ_SUBCARRIER_SINGLE 0x00 // Tag should respond using one subcarrier (ASK)
-- #define ISO15_REQ_DATARATE_HIGH 0x02 // Tag should respond using high data rate
-- #define ISO15_REQ_NONINVENTORY 0x00
0x01
inventory
0x00
--]]
--]]
local command, result, info, err, data
local command, result, info, err, data
data = utils.Crc15("260100")
data = utils.Crc15("260100")
command = Command:new{cmd = cmds.CMD_ISO_15693_COMMAND,
arg1 = #data / 2,
arg2 = 1,
arg3 = 1,
data = data}
command = Command:new{cmd = cmds.CMD_ISO_15693_COMMAND,
arg1 = #data / 2,
arg2 = 1,
arg3 = 1,
data = data}
if slow then
command.arg2 = 0
end
if dont_readresponse then
command.arg3 = 0
end
if slow then
command.arg2 = 0
end
if dont_readresponse then
command.arg3 = 0
end
local result, err = sendToDevice(command, dont_readresponse)
if not result then
print(err)
return nil, "15693 identify: no answer"
end
local result, err = sendToDevice(command, dont_readresponse)
if not result then
print(err)
return nil, "15693 identify: no answer"
end
local count, cmd, len, arg2, arg3 = bin.unpack('LLLL', result)
if len > 0 then
data = string.sub(result, count, count+len-1)
info, err = parse15693(data)
if err then
print(err)
return nil, err
end
return info
else
return nil, "Failed to get response"
end
local count, cmd, len, arg2, arg3 = bin.unpack('LLLL', result)
if len > 0 then
data = string.sub(result, count, count+len-1)
info, err = parse15693(data)
if err then
print(err)
return nil, err
end
return info
else
return nil, "Failed to get response"
end
end
---
@ -146,19 +146,19 @@ end
-- @return if successfull: an table containing card info
-- @return if unsuccessfull : nil, error
local function waitFor15693()
print("Waiting for card... press any key to quit")
while not core.ukbhit() do
res, err = read15693()
if res then return res end
-- err means that there was no response from card
end
return nil, "Aborted by user"
print("Waiting for card... press any key to quit")
while not core.ukbhit() do
res, err = read15693()
if res then return res end
-- err means that there was no response from card
end
return nil, "Aborted by user"
end
local library = {
read = read15693,
waitFor15693 = waitFor15693,
parse15693 = parse15693,
sendToDevice = sendToDevice,
read = read15693,
waitFor15693 = waitFor15693,
parse15693 = parse15693,
sendToDevice = sendToDevice,
}
return library

View file

@ -112,13 +112,13 @@ m[0x7D]='SATO Vicinity Australia'
m[0x7E]='Holtek Taiwan'
return {
lookupManufacturer = function (value)
if type(value) == 'string' then
local v = tonumber(value, 16)
print(string.format("WARNING: lookupManufacturer expects numeric value, converted %s into %x", value,v))
value = v
end
lookupManufacturer = function (value)
if type(value) == 'string' then
local v = tonumber(value, 16)
print(string.format("WARNING: lookupManufacturer expects numeric value, converted %s into %x", value,v))
value = v
end
return m[value] or "no tag-info available"
end,
return m[value] or "no tag-info available"
end,
}

View file

@ -1,429 +1,429 @@
--[[
This may be moved to a separate library at some point (Holiman)
This may be moved to a separate library at some point (Holiman)
--]]
local Utils =
{
-- Asks the user for Yes or No
confirm = function(message, ...)
local answer
message = message .. " [y/n] ?"
repeat
io.write(message)
io.flush()
answer = io.read()
if answer == 'Y' or answer == "y" then
return true
elseif answer == 'N' or answer == 'n' then
return false
end
until false
end,
---
-- Asks the user for input
input = function (message , default)
local answer
if default ~= nil then
message = message .. " (default: ".. default.. " )"
end
message = message .." \n > "
io.write(message)
io.flush()
answer = io.read()
if answer == '' then answer = default end
-- Asks the user for Yes or No
confirm = function(message, ...)
local answer
message = message .. " [y/n] ?"
repeat
io.write(message)
io.flush()
answer = io.read()
if answer == 'Y' or answer == "y" then
return true
elseif answer == 'N' or answer == 'n' then
return false
end
until false
end,
---
-- Asks the user for input
input = function (message , default)
local answer
if default ~= nil then
message = message .. " (default: ".. default.. " )"
end
message = message .." \n > "
io.write(message)
io.flush()
answer = io.read()
if answer == '' then answer = default end
return answer
end,
return answer
end,
------------ FILE READING
ReadDumpFile = function (filename)
------------ FILE READING
ReadDumpFile = function (filename)
filename = filename or 'dumpdata.bin'
if #filename == 0 then
return nil, 'Filename length is zero'
end
filename = filename or 'dumpdata.bin'
if #filename == 0 then
return nil, 'Filename length is zero'
end
infile = io.open(filename, "rb")
if infile == nil then
return nil, string.format("Could not read file %s",filename)
end
local t = infile:read("*all")
io.close(infile)
len = string.len(t)
local _,hex = bin.unpack(("H%d"):format(len),t)
return hex
end,
infile = io.open(filename, "rb")
if infile == nil then
return nil, string.format("Could not read file %s",filename)
end
local t = infile:read("*all")
io.close(infile)
len = string.len(t)
local _,hex = bin.unpack(("H%d"):format(len),t)
return hex
end,
------------ FILE WRITING (EML)
--- Writes an eml-file.
-- @param uid - the uid of the tag. Used in filename
-- @param blockData. Assumed to be on the format {'\0\1\2\3,'\b\e\e\f' ...,
-- that is, blockData[row] contains a string with the actual data, not ascii hex representation
-- return filename if all went well,
-- @reurn nil, error message if unsuccessfulls
WriteDumpFile = function(uid, blockData)
local destination = string.format("%s.eml", uid)
local file = io.open(destination, "w")
if file == nil then
return nil, string.format("Could not write to file %s", destination)
end
local rowlen = string.len(blockData[1])
------------ FILE WRITING (EML)
--- Writes an eml-file.
-- @param uid - the uid of the tag. Used in filename
-- @param blockData. Assumed to be on the format {'\0\1\2\3,'\b\e\e\f' ...,
-- that is, blockData[row] contains a string with the actual data, not ascii hex representation
-- return filename if all went well,
-- @reurn nil, error message if unsuccessfulls
WriteDumpFile = function(uid, blockData)
local destination = string.format("%s.eml", uid)
local file = io.open(destination, "w")
if file == nil then
return nil, string.format("Could not write to file %s", destination)
end
local rowlen = string.len(blockData[1])
for i,block in ipairs(blockData) do
if rowlen ~= string.len(block) then
prlog(string.format("WARNING: Dumpdata seems corrupted, line %d was not the same length as line 1",i))
end
for i,block in ipairs(blockData) do
if rowlen ~= string.len(block) then
prlog(string.format("WARNING: Dumpdata seems corrupted, line %d was not the same length as line 1",i))
end
local formatString = string.format("H%d", string.len(block))
local _,hex = bin.unpack(formatString,block)
file:write(hex.."\n")
end
file:close()
return destination
end,
local formatString = string.format("H%d", string.len(block))
local _,hex = bin.unpack(formatString,block)
file:write(hex.."\n")
end
file:close()
return destination
end,
------------ string split function
Split = function( inSplitPattern, outResults )
if not outResults then
outResults = {}
end
local start = 1
local splitStart, splitEnd = string.find( self, inSplitPattern, start )
while splitStart do
table.insert( outResults, string.sub( self, start, splitStart-1 ) )
start = splitEnd + 1
splitStart, splitEnd = string.find( self, inSplitPattern, start )
end
table.insert( outResults, string.sub( self, start ) )
return outResults
end,
------------ string split function
Split = function( inSplitPattern, outResults )
if not outResults then
outResults = {}
end
local start = 1
local splitStart, splitEnd = string.find( self, inSplitPattern, start )
while splitStart do
table.insert( outResults, string.sub( self, start, splitStart-1 ) )
start = splitEnd + 1
splitStart, splitEnd = string.find( self, inSplitPattern, start )
end
table.insert( outResults, string.sub( self, start ) )
return outResults
end,
----ISO14443-B CRC
Crc14b = function(s)
if s == nil then return nil end
if #s == 0 then return nil end
if type(s) == 'string' then
local utils = require('utils')
return utils.ConvertAsciiToHex(
core.iso14443b_crc(s)
)
end
return nil
end,
----ISO15693 CRC
Crc15 = function(s)
if s == nil then return nil end
if #s == 0 then return nil end
if type(s) == 'string' then
local utils = require('utils')
return utils.ConvertAsciiToHex(
core.iso15693_crc(s)
)
end
return nil
end,
----ISO14443-B CRC
Crc14b = function(s)
if s == nil then return nil end
if #s == 0 then return nil end
if type(s) == 'string' then
local utils = require('utils')
return utils.ConvertAsciiToHex(
core.iso14443b_crc(s)
)
end
return nil
end,
----ISO15693 CRC
Crc15 = function(s)
if s == nil then return nil end
if #s == 0 then return nil end
if type(s) == 'string' then
local utils = require('utils')
return utils.ConvertAsciiToHex(
core.iso15693_crc(s)
)
end
return nil
end,
------------ CRC-8 Legic checksums
-- Takes a hex string and calculates a crc8
Crc8Legic = function(s)
if s == nil then return nil end
if #s == 0 then return nil end
if type(s) == 'string' then
local utils = require('utils')
local asc = utils.ConvertHexToAscii(s)
local hash = core.crc8legic(asc)
return hash
end
return nil
end,
------------ CRC-8 Legic checksums
-- Takes a hex string and calculates a crc8
Crc8Legic = function(s)
if s == nil then return nil end
if #s == 0 then return nil end
if type(s) == 'string' then
local utils = require('utils')
local asc = utils.ConvertHexToAscii(s)
local hash = core.crc8legic(asc)
return hash
end
return nil
end,
------------ CRC-16 ccitt checksums
-- Takes a hex string and calculates a crc16
Crc16 = function(s)
if s == nil then return nil end
if #s == 0 then return nil end
if type(s) == 'string' then
local utils = require('utils')
local asc = utils.ConvertHexToAscii(s)
local hash = core.crc16(asc)
return hash
end
return nil
end,
------------ CRC-16 ccitt checksums
-- Takes a hex string and calculates a crc16
Crc16 = function(s)
if s == nil then return nil end
if #s == 0 then return nil end
if type(s) == 'string' then
local utils = require('utils')
local asc = utils.ConvertHexToAscii(s)
local hash = core.crc16(asc)
return hash
end
return nil
end,
------------ CRC-64 ecma checksums
-- Takes a hex string and calculates a crc64 ecma hash
Crc64 = function(s)
if s == nil then return nil end
if #s == 0 then return nil end
if type(s) == 'string' then
local utils = require('utils')
local asc = utils.ConvertHexToAscii(s)
local hash = core.crc64(asc)
return hash
end
return nil
end,
------------ CRC-64 ecma 182 checksums
-- Takes a hex string and calculates a crc64 ecma182 hash
Crc64_ecma182 = function(s)
if s == nil then return nil end
if #s == 0 then return nil end
if type(s) == 'string' then
local utils = require('utils')
local asc = utils.ConvertHexToAscii(s)
local hash = core.crc64_ecma182(asc)
return hash
end
return nil
end,
------------ CRC-64 ecma checksums
-- Takes a hex string and calculates a crc64 ecma hash
Crc64 = function(s)
if s == nil then return nil end
if #s == 0 then return nil end
if type(s) == 'string' then
local utils = require('utils')
local asc = utils.ConvertHexToAscii(s)
local hash = core.crc64(asc)
return hash
end
return nil
end,
------------ CRC-64 ecma 182 checksums
-- Takes a hex string and calculates a crc64 ecma182 hash
Crc64_ecma182 = function(s)
if s == nil then return nil end
if #s == 0 then return nil end
if type(s) == 'string' then
local utils = require('utils')
local asc = utils.ConvertHexToAscii(s)
local hash = core.crc64_ecma182(asc)
return hash
end
return nil
end,
------------ SHA1 hash
-- Takes a string and calculates a SHA1 hash
Sha1 = function(s)
if s == nil then return nil end
if #s == 0 then return nil end
if type(s) == 'string' then
return core.sha1(s)
end
return nil
end,
-- Takes a hex string and calculates a SHA1 hash
Sha1Hex = function(s)
if s == nil then return nil end
if #s == 0 then return nil end
if type(s) == 'string' then
local utils = require('utils')
local asc = utils.ConvertHexToAscii(s)
local hash = core.sha1(asc)
return hash
end
return nil
end,
------------ SHA1 hash
-- Takes a string and calculates a SHA1 hash
Sha1 = function(s)
if s == nil then return nil end
if #s == 0 then return nil end
if type(s) == 'string' then
return core.sha1(s)
end
return nil
end,
-- Takes a hex string and calculates a SHA1 hash
Sha1Hex = function(s)
if s == nil then return nil end
if #s == 0 then return nil end
if type(s) == 'string' then
local utils = require('utils')
local asc = utils.ConvertHexToAscii(s)
local hash = core.sha1(asc)
return hash
end
return nil
end,
-- input parameter is a string
-- Swaps the endianess and returns a number,
-- IE: 'cd7a' -> '7acd' -> 0x7acd
SwapEndianness = function(s, len)
if s == nil then return nil end
if #s == 0 then return '' end
if type(s) ~= 'string' then return nil end
-- input parameter is a string
-- Swaps the endianess and returns a number,
-- IE: 'cd7a' -> '7acd' -> 0x7acd
SwapEndianness = function(s, len)
if s == nil then return nil end
if #s == 0 then return '' end
if type(s) ~= 'string' then return nil end
local retval = 0
if len == 16 then
local t = s:sub(3,4)..s:sub(1,2)
retval = tonumber(t,16)
elseif len == 24 then
local t = s:sub(5,6)..s:sub(3,4)..s:sub(1,2)
retval = tonumber(t,16)
elseif len == 32 then
local t = s:sub(7,8)..s:sub(5,6)..s:sub(3,4)..s:sub(1,2)
retval = tonumber(t,16)
end
return retval
end,
local retval = 0
if len == 16 then
local t = s:sub(3,4)..s:sub(1,2)
retval = tonumber(t,16)
elseif len == 24 then
local t = s:sub(5,6)..s:sub(3,4)..s:sub(1,2)
retval = tonumber(t,16)
elseif len == 32 then
local t = s:sub(7,8)..s:sub(5,6)..s:sub(3,4)..s:sub(1,2)
retval = tonumber(t,16)
end
return retval
end,
-- input parameter is a string
-- Swaps the endianess and returns a string,
-- IE: 'cd7a' -> '7acd' -> 0x7acd
SwapEndiannessStr = function(s, len)
if s == nil then return nil end
if #s == 0 then return '' end
if type(s) ~= 'string' then return nil end
-- input parameter is a string
-- Swaps the endianess and returns a string,
-- IE: 'cd7a' -> '7acd' -> 0x7acd
SwapEndiannessStr = function(s, len)
if s == nil then return nil end
if #s == 0 then return '' end
if type(s) ~= 'string' then return nil end
local retval
if len == 16 then
retval = s:sub(3,4)..s:sub(1,2)
elseif len == 24 then
retval = s:sub(5,6)..s:sub(3,4)..s:sub(1,2)
elseif len == 32 then
retval = s:sub(7,8)..s:sub(5,6)..s:sub(3,4)..s:sub(1,2)
end
return retval
end,
------------ CONVERSIONS
local retval
if len == 16 then
retval = s:sub(3,4)..s:sub(1,2)
elseif len == 24 then
retval = s:sub(5,6)..s:sub(3,4)..s:sub(1,2)
elseif len == 32 then
retval = s:sub(7,8)..s:sub(5,6)..s:sub(3,4)..s:sub(1,2)
end
return retval
end,
------------ CONVERSIONS
--
-- Converts DECIMAL to HEX
--
-- Converts DECIMAL to HEX
ConvertDecToHex = function(IN)
local B,K,OUT,I,D = 16, "0123456789ABCDEF", "", 0
while IN > 0 do
I = I+1
IN, D = math.floor(IN/B), math.modf(IN, B) + 1
OUT = string.sub(K, D, D)..OUT
end
return OUT
end,
---
-- Convert Byte array to string of hex
ConvertBytesToHex = function(bytes, reverse)
if bytes == nil then return '' end
if #bytes == 0 then return '' end
local s={}
if reverse then
local j=1
for i = #bytes, 1, -1 do
s[i] = string.format("%02X", bytes[j])
j = j + 1
end
else
for i = 1, #bytes do
s[i] = string.format("%02X", bytes[i])
end
end
return table.concat(s)
end,
-- Convert byte array to string with ascii
local B,K,OUT,I,D = 16, "0123456789ABCDEF", "", 0
while IN > 0 do
I = I+1
IN, D = math.floor(IN/B), math.modf(IN, B) + 1
OUT = string.sub(K, D, D)..OUT
end
return OUT
end,
---
-- Convert Byte array to string of hex
ConvertBytesToHex = function(bytes, reverse)
if bytes == nil then return '' end
if #bytes == 0 then return '' end
local s={}
if reverse then
local j=1
for i = #bytes, 1, -1 do
s[i] = string.format("%02X", bytes[j])
j = j + 1
end
else
for i = 1, #bytes do
s[i] = string.format("%02X", bytes[i])
end
end
return table.concat(s)
end,
-- Convert byte array to string with ascii
ConvertBytesToAscii = function(bytes)
if bytes == nil then return '' end
if #bytes == 0 then return '' end
local s={}
for i = 1, #(bytes) do
s[i] = string.char(bytes[i])
end
return table.concat(s)
end,
ConvertHexToBytes = function(s)
local t={}
if s == nil then return t end
if #s == 0 then return t end
for k in s:gmatch"(%x%x)" do
table.insert(t,tonumber(k,16))
end
return t
end,
ConvertAsciiToBytes = function(s, reverse)
local t = {}
if s == nil then return t end
if #s == 0 then return t end
if bytes == nil then return '' end
if #bytes == 0 then return '' end
local s={}
for i = 1, #(bytes) do
s[i] = string.char(bytes[i])
end
return table.concat(s)
end,
ConvertHexToBytes = function(s)
local t={}
if s == nil then return t end
if #s == 0 then return t end
for k in s:gmatch"(%x%x)" do
table.insert(t,tonumber(k,16))
end
return t
end,
ConvertAsciiToBytes = function(s, reverse)
local t = {}
if s == nil then return t end
if #s == 0 then return t end
for k in s:gmatch"(.)" do
table.insert(t, string.byte(k))
end
for k in s:gmatch"(.)" do
table.insert(t, string.byte(k))
end
if not reverse then
return t
end
if not reverse then
return t
end
local rev = {}
if reverse then
for i = #t, 1,-1 do
table.insert(rev, t[i] )
end
end
return rev
end,
local rev = {}
if reverse then
for i = #t, 1,-1 do
table.insert(rev, t[i] )
end
end
return rev
end,
ConvertHexToAscii = function(s, useSafechars)
if s == nil then return '' end
if #s == 0 then return '' end
local t={}
for k in s:gmatch"(%x%x)" do
ConvertHexToAscii = function(s, useSafechars)
if s == nil then return '' end
if #s == 0 then return '' end
local t={}
for k in s:gmatch"(%x%x)" do
local n = tonumber(k,16)
local c
if useSafechars and ( (n < 32) or (n == 127) ) then
c = '.';
else
c = string.char(n)
end
table.insert(t,c)
end
return table.concat(t)
end,
local n = tonumber(k,16)
local c
if useSafechars and ( (n < 32) or (n == 127) ) then
c = '.';
else
c = string.char(n)
end
table.insert(t,c)
end
return table.concat(t)
end,
ConvertAsciiToHex = function(s)
if s == nil then return '' end
if #s == 0 then return '' end
local t={}
for k in s:gmatch"(.)" do
table.insert(t, string.format("%02X", string.byte(k)))
end
return table.concat(t)
end,
ConvertAsciiToHex = function(s)
if s == nil then return '' end
if #s == 0 then return '' end
local t={}
for k in s:gmatch"(.)" do
table.insert(t, string.format("%02X", string.byte(k)))
end
return table.concat(t)
end,
hexlify = function(s)
local u = require('utils')
return u.ConvertAsciiToHex(s)
end,
hexlify = function(s)
local u = require('utils')
return u.ConvertAsciiToHex(s)
end,
Chars2num = function(s)
Chars2num = function(s)
return (s:byte(1)*16777216)+(s:byte(2)*65536)+(s:byte(3)*256)+(s:byte(4))
end,
end,
-- use length of string to determine 8,16,32,64 bits
bytes_to_int = function(str,endian,signed)
local t = {str:byte(1, -1)}
if endian == "big" then --reverse bytes
local tt = {}
for k = 1, #t do
tt[#t-k+1] = t[k]
end
t = tt
end
local n = 0
for k = 1, #t do
n = n + t[k] * 2^((k-1) * 8)
end
if signed then
n = (n > 2^(#t*8-1) -1) and (n - 2^(#t*8)) or n -- if last bit set, negative.
end
return n
end,
-- use length of string to determine 8,16,32,64 bits
bytes_to_int = function(str,endian,signed)
local t = {str:byte(1, -1)}
if endian == "big" then --reverse bytes
local tt = {}
for k = 1, #t do
tt[#t-k+1] = t[k]
end
t = tt
end
local n = 0
for k = 1, #t do
n = n + t[k] * 2^((k-1) * 8)
end
if signed then
n = (n > 2^(#t*8-1) -1) and (n - 2^(#t*8)) or n -- if last bit set, negative.
end
return n
end,
-- a simple implementation of a sleep command. Thanks to Mosci
-- takes number of seconds to sleep
Sleep = function(n)
local clock = os.clock
local t0 = clock()
while clock() - t0 <= n do end
return nil
end,
-- a simple implementation of a sleep command. Thanks to Mosci
-- takes number of seconds to sleep
Sleep = function(n)
local clock = os.clock
local t0 = clock()
while clock() - t0 <= n do end
return nil
end,
-- function convertStringToBytes(str)
-- local bytes = {}
-- local strLength = string.len(str)
-- for i=1,strLength do
-- table.insert(bytes, string.byte(str, i))
-- end
-- function convertStringToBytes(str)
-- local bytes = {}
-- local strLength = string.len(str)
-- for i=1,strLength do
-- table.insert(bytes, string.byte(str, i))
-- end
-- return bytes
-- return bytes
-- end
-- function convertBytesToString(bytes)
-- local bytesLength = table.getn(bytes)
-- local str = ""
-- for i=1,bytesLength do
-- str = str .. string.char(bytes[i])
-- end
-- local bytesLength = table.getn(bytes)
-- local str = ""
-- for i=1,bytesLength do
-- str = str .. string.char(bytes[i])
-- end
-- return str
-- return str
-- end
-- function convertHexStringToBytes(str)
-- local bytes = {}
-- local strLength = string.len(str)
-- for k=2,strLength,2 do
-- local hexString = "0x" .. string.sub(str, (k - 1), k)
-- table.insert(bytes, hex.to_dec(hexString))
-- end
-- local bytes = {}
-- local strLength = string.len(str)
-- for k=2,strLength,2 do
-- local hexString = "0x" .. string.sub(str, (k - 1), k)
-- table.insert(bytes, hex.to_dec(hexString))
-- end
-- return bytes
-- return bytes
-- end
-- function convertBytesToHexString(bytes)
-- local str = ""
-- local bytesLength = table.getn(bytes)
-- for i=1,bytesLength do
-- local hexString = string.sub(hex.to_hex(bytes[i]), 3)
-- if string.len(hexString) == 1 then
-- hexString = "0" .. hexString
-- end
-- str = str .. hexString
-- end
-- local str = ""
-- local bytesLength = table.getn(bytes)
-- for i=1,bytesLength do
-- local hexString = string.sub(hex.to_hex(bytes[i]), 3)
-- if string.len(hexString) == 1 then
-- hexString = "0" .. hexString
-- end
-- str = str .. hexString
-- end
-- return str
-- return str
-- end
}