Created
July 26, 2018 16:09
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//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