1 /*
  2  *  ---------
  3  * |.##> <##.|  Open Smart Card Development Platform (www.openscdp.org)
  4  * |#       #|  
  5  * |#       #|  Copyright (c) 1999-2013 CardContact Software & System Consulting
  6  * |'##> <##'|  Andreas Schwier, 32429 Minden, Germany (www.cardcontact.de)
  7  *  --------- 
  8  *
  9  *  This file is part of OpenSCDP.
 10  *
 11  *  OpenSCDP is free software; you can redistribute it and/or modify
 12  *  it under the terms of the GNU General Public License version 2 as
 13  *  published by the Free Software Foundation.
 14  *
 15  *  OpenSCDP is distributed in the hope that it will be useful,
 16  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 18  *  GNU General Public License for more details.
 19  *
 20  *  You should have received a copy of the GNU General Public License
 21  *  along with OpenSCDP; if not, write to the Free Software
 22  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 23  *
 24  *  Dump content of German contactless girogo card
 25  */
 26 
 27 
 28 function getIssuer(id) {
 29 	
 30 	switch(id) {
 31 		case 0x21:
 32 			return "�ffentlich rechtliche und private Banken";
 33 			break;
 34 		case 0x22:
 35 			return "Privat- und Gesch�ftsbanken";
 36 			break;
 37 		case 0x25:
 38 			return "Sparkassen";
 39 			break;
 40 		case 0x29:
 41 			return "Genossenschaftsbanken";
 42 			break;
 43 		default:
 44 			return "unknown";
 45 	}
 46 }
 47 
 48 
 49 function getConversionFactor(factor) {
 50 
 51 	switch (factor) {    
 52 		case 1:
 53 			return 0.01;
 54 		case 2:
 55 			return 0.1;		
 56 		case 4:
 57 			return 1.0;
 58 		case 8:
 59 			return 10.0;
 60 		case 16:
 61 			return 100.0;
 62 		case 32:
 63 			return 1000.0;
 64 	}
 65 }
 66 
 67 
 68 try	{
 69 	var card = new Card(_scsh3.reader);
 70 
 71 	var record;
 72 	
 73 	var mf = new CardFile(card, ":3F00");
 74 	var df_boerse = new CardFile(card, "#D27600002545500200");
 75 	
 76 	var ef_karte = new CardFile(df_boerse, ":17");
 77 	record = ef_karte.readRecord(1);
 78 
 79 	print("Kartennummer: " + record.bytes(4, 5).toString(HEX));
 80 	print("Herausgeber: " + getIssuer(record.byteAt(1)));
 81 	print("G�ltig seit: " + record.byteAt(14).toString(HEX) + "." + record.byteAt(13).toString(HEX) + "." + record.byteAt(12).toString(HEX));
 82 	print("G�ltig bis: " + record.byteAt(11).toString(HEX) + "/" + "20" + record.byteAt(10).toString(HEX));
 83 	var currency = record.bytes(17, 3).toString(ASCII);
 84 	print("W�hrung: " + currency);
 85 	var conversionFactor = getConversionFactor(record.byteAt(20));
 86 	
 87 	var ef_betrag = new CardFile(df_boerse, ":18");
 88 	record = ef_betrag.readRecord(1);
 89 	var balance = record.bytes(0, 3).toString(HEX).valueOf();
 90 	print("Aktuelles Guthaben: " + balance * conversionFactor + " " + currency);
 91 	
 92 	var ef_llog = new CardFile(df_boerse, ":1C");
 93 	var recordNo = 1;
 94 	record = ef_llog.readRecord(recordNo);
 95 	
 96 	print("Ladevorg�nge: ");
 97 	var counter = record.byteAt(2); // Number of load transactions
 98 	
 99 	while (counter-- >= 1) {
100 		print("(" + counter + ")");
101 		var date = record.bytes(24, 6);
102 		print(ByteString.valueOf(date.byteAt(3)).toString(HEX) + "." + ByteString.valueOf(date.byteAt(2)).toString(HEX) + "." + ByteString.valueOf(date.byteAt(0)).toString(HEX) + ByteString.valueOf(date.byteAt(1)).toString(HEX) + ", " + ByteString.valueOf(date.byteAt(4)).toString(HEX) + ":" + ByteString.valueOf(date.byteAt(5)).toString(HEX) + " Uhr");
103 		var amount = record.bytes(4, 3).toString(HEX).valueOf();
104 		var amountNew = record.bytes(7, 3).toString(HEX).valueOf();
105 		print("Betrag: " + amount * conversionFactor + " " + currency);
106 		print("Guthaben Neu: " + amountNew * conversionFactor + " " + currency);
107 		record = ef_llog.readRecord(++recordNo);
108 	}
109 	
110 	var ef_blog = new CardFile(df_boerse, ":1D");
111 	record = ef_blog.readRecord(1);
112 }
113 
114 catch(e) {
115 	print("Exception reading from card: " + e);
116 }
117