Skip to content

Instantly share code, notes, and snippets.

@joostd
Created July 26, 2018 16:09
Show Gist options
  • Save joostd/2463fba35aaa5c6323827f95408eb91e to your computer and use it in GitHub Desktop.
Save joostd/2463fba35aaa5c6323827f95408eb91e to your computer and use it in GitHub Desktop.
Simple JShell script to read personal ID number from ICAO passport using jmrtd and scuba
//usr/bin/env jshell "$0" "$@"; exit $?
// install dependencies:
// wget https://repo1.maven.org/maven2/org/jmrtd/jmrtd/0.7.2/jmrtd-0.7.2.jar
// wget http://bouncycastle.org/download/bcprov-jdk15on-160.jar
// wget https://repo1.maven.org/maven2/net/sf/scuba/scuba-sc-j2se/0.0.18/scuba-sc-j2se-0.0.18.jar
// wget https://repo1.maven.org/maven2/net/sf/scuba/scuba-smartcards/0.0.18/scuba-smartcards-0.0.18.jar
/env --class-path scuba-sc-j2se-0.0.18.jar:scuba-smartcards-0.0.18.jar:jmrtd-0.7.2.jar:bcprov-jdk15on-160.jar
/env --add-modules java.smartcardio,java.xml.bind
import javax.smartcardio.TerminalFactory;
import javax.xml.bind.DatatypeConverter;
import net.sf.scuba.smartcards.CardService;
import org.jmrtd.BACKey;
import org.jmrtd.PassportService;
import org.jmrtd.lds.LDSFileUtil;
import org.jmrtd.lds.icao.DG1File;
import static org.jmrtd.PassportService.DEFAULT_MAX_BLOCKSIZE;
import static org.jmrtd.PassportService.NORMAL_MAX_TRANCEIVE_LENGTH;
import static org.jmrtd.PassportService.EF_DG1;
// create BAC key from MRZ data
var documentNumber = "N12345678";
var dateOfBirth = "991231";
var dateOfExpiry = "250228";
var key = new BACKey(documentNumber, dateOfBirth, dateOfExpiry);
System.out.println("BAC key: " + DatatypeConverter.printHexBinary(key.getKey()));
var ct = TerminalFactory.getDefault().terminals().list().get(0);
var cs = CardService.getInstance(ct);
var ps = new PassportService(cs, NORMAL_MAX_TRANCEIVE_LENGTH, DEFAULT_MAX_BLOCKSIZE, false, false);
ps.open();
// select A0000002471001 -- Biometric Passpord
ps.sendSelectApplet(false);
// perform Basic Access Control
ps.doBAC(key);
var is = ps.getInputStream(EF_DG1);
var dg1 = (DG1File) LDSFileUtil.getLDSFile(EF_DG1, is);
System.out.println(dg1.getMRZInfo().getPersonalNumber());
/exit
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment