X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/61caacda2b2ca58474d32e0e187f2e9d61aa47e9..bb42a03ef1318442fa0e8e2e07c7dbf8bd49fc96:/client/lualibs/htmlskel.lua?ds=sidebyside

diff --git a/client/lualibs/htmlskel.lua b/client/lualibs/htmlskel.lua
index 377e62d9..b468eb2d 100644
--- a/client/lualibs/htmlskel.lua
+++ b/client/lualibs/htmlskel.lua
@@ -1,12 +1,148 @@
 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 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;
-			text-transform: uppercase;
+			xtext-transform: uppercase;
 			font-size: 1.05em;
 			font-family: monospace,Arial;
 		}
@@ -14,16 +150,19 @@ local skel_1 = [[
 			float:left;
 			border: 1px solid white;
 		}
-		td.blockzero {
+		td {
+			empty-cells: show;
+		}
+		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;
 		}
 	
@@ -32,66 +171,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
+	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)
 		{
-			//Quadruple size sectors
-			linesPerSector = 16;
-			line = line - 128;
+			// 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);
 
-		if(line % linesPerSector == 0)
+			info['Name'] = lookup(info.ATQA, info.SAK);
+			return {info: info, highlighter : mifareHighlighter }
+		},
+		function(data)
 		{
-			el.className += " sectorhdr";
-		}
-		if(line % linesPerSector == (linesPerSector -1))
-		{
-			el.className += " sectortrailer";
-			if(byte == undefined)
-			{
-				return;
-			}		
+			// 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";
 
-			if(byte < 6) el.className += " key_a";
-			else if(byte < 11) el.className += " accessconditions";
-			else el.className += " key_b";
+			return {info: info, highlighter : ndefHighligheter }
+		}, 
+		function(data)
+		{//This is the catch-all
+			return {info: {type : "Unknown"}, highlighter : noHighlighter}
 		}
+	]
+	
 
-	}
-
+	/**
+	* Helper function to convert bin-data into printable chars
+	**/
 
-	function loadMifare(data)
-	{
-		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);
-			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);
-				}
-		}
-		document.body.appendChild(t);
-	}
 	function to_ascii(hexval)
 	{
 		var intval = parseInt(hexval,16);
@@ -102,51 +236,126 @@ 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 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 load(data)
+	function handle(dump)
 	{
-		loadMifare(data);
-		loadAscii(data);
+		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>
+<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