explore.js
Summary
Explore an MRTD using Basic Access Control
var mrzlist = [ "L898902C<3UTO6908061F9406236ZE184226B<<<<<14",
"WG30004036UTO6007078M0511014<<<<<<<<<<<<<<06",
];
var mrz2 = mrzlist[0];
var bacforced = false;
load("tools.js");
load("tools/OutlineCore.js");
function OutlineLDS(card, id, name, profile) {
this.card = card;
this.id = id;
var view = new OutlineNode(name, true);
view.setUserObject(this);
view.setToolTip("Click right mouse button to select MRZ for BAC");
view.setContextMenu(mrzlist);
this.view = view;
this.profile = profile;
}
OutlineLDS.prototype.expandListener = function() {
if (this.expanded)
return;
var view = this.view;
var eflist = this.profile.EF;
try {
var df = new CardFile(this.card, this.id);
this.df = df;
var fcp = df.getFCPBytes();
if (fcp && (fcp.length > 1)) {
var fcpmodel = new OutlineFCP(fcp);
view.insert(fcpmodel.view);
}
this.card.sendApdu(0x00, 0xB0, 0x9E, 0x00, 0x01);
var secureChannel = null;
if (bacforced || (this.card.SW != 0x9000)) {
print("Trying BAC with MRZ2=" + mrz2);
var crypto = new Crypto();
var kenc = calculateBACKey(crypto, mrz2, 1);
var kmac = calculateBACKey(crypto, mrz2, 2);
crypto.encrypt(kenc, Crypto.DES_CBC, new ByteString("0000000000000000", HEX), new ByteString("0000000000000000", HEX));
secureChannel = openSecureChannel(this.card, crypto, kenc, kmac);
}
for (var i = 0; i < eflist.length; i++) {
var ef = new OutlineSMEF(this.df, eflist[i].name, eflist[i], secureChannel);
view.insert(ef.view);
}
}
catch(e) {
print(e);
}
this.expanded = true;
}
OutlineLDS.prototype.collapseListener = function() {
var view = this.view;
while(view.childs.length > 0) {
view.remove(view.childs[0]);
}
this.expanded = false;
}
OutlineLDS.prototype.actionListener = function(node, action) {
if (this.expanded) {
print("Please collapse and expand LDS to execute BAC again");
}
mrz2 = action;
print("Selected MRZ2 = " + mrz2);
bacforced = true;
}
function OutlineSMEF(df, name, profile, secureChannel) {
this.df = df;
this.secureChannel = secureChannel;
var view = new OutlineNode(name, true);
view.setIcon("document");
view.setUserObject(this);
this.view = view;
this.profile = profile;
}
OutlineSMEF.prototype.expandListener = function() {
if (this.expanded)
return;
var view = this.view;
var efdesc = this.profile;
try {
var ef = new CardFile(this.df, ":" + efdesc.fid);
if (this.secureChannel) {
ef.setCredential(CardFile.READ, Card.ALL, this.secureChannel);
}
}
catch(e) {
print(e);
return;
}
var isTransparent = true;
if (efdesc.fid.length > 2) {
var fcp = ef.getFCPBytes();
if (fcp && (fcp.length > 1)) {
var fcpmodel = new OutlineFCP(fcp);
view.insert(fcpmodel.view);
isTransparent = ef.isTransparent();
} else {
isTransparent = (efdesc.type == "T");
}
}
if (isTransparent) {
if (fcp) {
var filesize = ef.getLength();
if (filesize > 1024)
print("Please wait, reading " + filesize + " bytes...");
} else {
print("Please wait, reading card...");
}
try {
var bs = ef.readBinary();
}
catch(e) {
print(e);
this.expanded = true;
return;
}
print("Reading done...");
var bindata = new DataOutline(bs, efdesc.format);
view.insert(bindata.view);
} else {
for (var rec = 1; rec < 255; rec++) {
try {
ef.readRecord(rec);
var record = new OutlineRecord(ef, rec, efdesc);
view.insert(record.view);
}
catch(e) {
if ((e instanceof GPError) && (e.reason == 0x6A83))
break;
print(e);
break;
}
}
}
this.expanded = true;
}
function MRTDOutlineCard() {
var card = new Card(_scsh3.reader);
this.atr = card.reset(Card.RESET_COLD);
this.card = card;
this.view = new OutlineNode("ICAO MRTD");
this.view.model = this;
this.view.expand = function() { var model = this.model; model.expand() };
}
function MRTDOutlineCard_expand() {
if (this.expanded)
return;
var view = this.view;
var atrnode = new OutlineATR(this.atr);
view.insert(atrnode.view);
var struct_lds = GPXML.parse("lds.xml");
this.lds = new OutlineLDS(this.card, "#A0000002471001", "LDS", struct_lds);
view.insert(this.lds.view);
this.expanded = true;
}
MRTDOutlineCard.prototype.expand = MRTDOutlineCard_expand;
var mrtd = new MRTDOutlineCard();
mrtd.view.show();
Documentation generated by
JSDoc on Tue Sep 3 22:29:38 2013