Changed html template, in order to make it more generic and be usable on other types of data than mifare, now supports different highlighters. Implemented are NDEF and Mifare

This commit is contained in:
martin.holst@gmail.com 2013-10-30 18:21:42 +00:00
parent a00411152f
commit 62a95012e9

View file

@ -1,12 +1,147 @@
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];
//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)
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 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 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;
text-transform: uppercase;
xtext-transform: uppercase;
font-size: 1.05em;
font-family: monospace,Arial;
}
@ -14,19 +149,19 @@ local skel_1 = [[
float:left;
border: 1px solid white;
}
td{
empty-cells : show;
td {
empty-cells: show;
}
td.blockzero {
td.blockzero, .turqoise{
color: rgb(140, 245, 193);
}
td.key_a{
td.key_a, .yellow{
color : #F8CA4D;
}
td.key_b{
td.key_b, .blue{
color : #3F5666;
}
td.accessconditions{
td.accessconditions, .red{
color : #EA6045;
}
@ -35,66 +170,61 @@ local skel_1 = [[
}
</style>
<script>
/** Jquery for the poor **/
function dc(x){return document.createElement(x)}
function addClass(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 % 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";
}
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 loadMifare(data)
{
var data = data.data;
var t = dc("table")
for(var i = 0 ; i < data.length ; i++)
/**
* The identifiers that determine how to highlight data and present information
**/
var identifiers = [
function(data)
{
line = data[i];
var tr = dc("tr");
t.appendChild(tr);
addClass(tr,i);
var bytes = line.match(/(.{1,2})/g);
for(var b = 0 ; b < bytes.length ; b++)
{
var td = dc('td');
tr.appendChild(td);
td.appendChild(document.createTextNode(bytes[b]));
addClass(td,i,b);
}
// 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);
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 }
},
function(data)
{//This is the catch-all
return {info: {type : "Unknown"}, highlighter : noHighlighter}
}
document.body.appendChild(t);
}
]
/**
* Helper function to convert bin-data into printable chars
**/
function to_ascii(hexval)
{
var intval = parseInt(hexval,16);
@ -105,51 +235,125 @@ local skel_1 = [[
return ".";
}
function loadAscii(data)
function loadIntoTable(data, info, ascii)
{
var data = data.data;
var t = dc("table")
for(var i = 0 ; i < data.length ; i++)
{
line = data[i];
var tr = dc("tr");
t.appendChild(tr);
var row = tr(t);
var bytes = line.match(/(.{1,2})/g);
for(var b = 0 ; b < bytes.length ; b++)
{
var td = dc('td');
tr.appendChild(td);
td.appendChild(document.createTextNode(to_ascii(bytes[b])))
addClass(td,i,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 load(data)
function loadGeneralInfo(data, info)
{
loadMifare(data);
loadAscii(data);
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);
console.log(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";
}
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(byte < 6) el.className += " key_a";
else if(byte < 10) el.className += " accessconditions";
else el.className += " key_b";
}
}
};
</script>
</head>
<body>
</body>
<script>
(function(){
var x = {
data :
var x = { data :
]]
local skel_2 = [[
}
load(x);
})();
};
handle(x);
</script>
</html>
]]
local function getHTML(data)
return skel_1 .. data .. skel_2