/*
* ---------
* |.##> <##.| Open Smart Card Development Platform (www.openscdp.org)
* |# #|
* |# #| Copyright (c) 1999-2006 CardContact Software & System Consulting
* |'##> <##'| Andreas Schwier, 32429 Minden, Germany (www.cardcontact.de)
* ---------
*
* This file is part of OpenSCDP.
*
* OpenSCDP is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* OpenSCDP is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenSCDP; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
* Display the status of the MuscleCard Applet
*/
load("tools.js");
var reset = true;
var resp;
// If we still have a valid card handle, then we use GetStatus directly
if (typeof(card) != "undefined") {
try {
// Try MSCGetStatus
resp = card.sendApdu(0xB0, 0x3C, 0x00, 0x00, 0x05);
reset = false;
}
catch(e) {
// The card handle is no longer valid, e.g. the card
// has been removed or replaced
}
}
if (reset) {
var card = new Card(_scsh3.reader);
card.reset(Card.RESET_COLD);
// Select Applet
card.sendApdu(0x00, 0xA4, 0x04, 0x00, mcaid, [0x9000]);
resp = card.sendApdu(0xB0, 0x3C, 0x00, 0x00, 0x05);
}
if (card.SW == 0x9C05) {
print("Applet not initialized");
} else {
if (card.SW1 == 0x61) {
var rem = card.sendApdu(0x00, 0xC0, 0x00, 0x00, card.SW1);
resp = resp.concat(rem);
}
printStatus(resp);
// MSCListPINs
resp = card.sendApdu(0xB0, 0x48, 0x00, 0x00, 0x02, [0x9000]);
var v = resp.toUnsigned();
print("List PINs: " + accessMaskToString(v, "none", "all", ",") + " (" + v.toString(16) + ")");
print("-- List Objects ------------------------------------------------");
// MSCListObjects
resp = card.sendApdu(0xB0, 0x58, 0x00, 0x00, 0x0E);
while(resp.length > 0) {
// print(resp);
print(" Object Id : " + resp.bytes(0, 4));
var objid = resp.bytes(0, 4).toUnsigned();
var size = resp.bytes(4, 4).toUnsigned();
print(" Size : " + size);
var v = resp.bytes(8, 2).toUnsigned();
print(" Read Access : " + accessConditionToString(v) + " (" + v.toString(16) + ")");
var v = resp.bytes(10, 2).toUnsigned();
print(" Write Access : " + accessConditionToString(v) + " (" + v.toString(16) + ")");
var v = resp.bytes(12, 2).toUnsigned();
print(" Delete Access : " + accessConditionToString(v) + " (" + v.toString(16) + ")");
try {
var content = readObject(card, objid, 0, size);
print(content);
}
catch(e) {
if (e instanceof GPError) {
print("Error reading object - SW1/SW2 = " + e.reason.toString(16));
} else {
print("Exception reading object: " + e);
}
}
resp = card.sendApdu(0xB0, 0x58, 0x01, 0x00, 0x0E);
}
print("-- List Keys ---------------------------------------------------");
// MSCListKeys
resp = card.sendApdu(0xB0, 0x3A, 0x00, 0x00, 0x0B);
while(resp.length > 0) {
// print(resp);
print(" Key Number : " + resp.byteAt(0));
var v = resp.byteAt(1)
print(" Key Type : " + mckeytypes[v] + " (" + v + ")");
print(" Key Partner : " + resp.byteAt(2));
print(" Key Size : " + resp.bytes(3, 2).toUnsigned());
var v = resp.bytes(5, 2).toUnsigned();
print(" Read Access : " + accessConditionToString(v) + " (" + v.toString(16) + ")");
var v = resp.bytes(7, 2).toUnsigned();
print(" Write Access : " + accessConditionToString(v) + " (" + v.toString(16) + ")");
var v = resp.bytes(9, 2).toUnsigned();
print(" Use Access : " + accessConditionToString(v) + " (" + v.toString(16) + ")");
resp = card.sendApdu(0xB0, 0x3A, 0x01, 0x00, 0x0B);
}
}
© Copyright 2003 - 2013 CardContact Software & System Consulting, Minden, Germany
