ЭмЭрИкс_007
ЭмЭрИкс_007

Reputation: 156

How to read data from smart card using jmrtd and scuba

I'm trying to read data from ePassporta using jmrtd and scuba. But it doesn’t work. In Android, almost the same code works. And when reading from a smart card it doesn’t work.

My method for reading:

public static void reader() throws Exception {

        try {
            CardTerminal terminal =TerminalFactory.getDefault().terminals().list().get(0);
            CardService cs = CardService.getInstance(terminal);
            PassportService service = new PassportService(cs);
            service.open();
            BACKeySpec bacKey = new BACKey("12312312312312", "31121990", "311230");

            boolean paceSucceeded = false;
            try {
                CardAccessFile cardAccessFile = new CardAccessFile(service.getInputStream(PassportService.EF_CARD_ACCESS));
                Collection<PACEInfo> paceInfos = cardAccessFile.getPACEInfos();
                if (paceInfos != null && paceInfos.size() > 0) {
                    PACEInfo paceInfo = paceInfos.iterator().next();
                    service.doPACE(bacKey, paceInfo.getObjectIdentifier(), PACEInfo.toParameterSpec(paceInfo.getParameterId()));
                    paceSucceeded = true;
                } else {
                    paceSucceeded = true;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

            service.sendSelectApplet(paceSucceeded);

            if (!paceSucceeded) {
                try {
                    service.getInputStream(PassportService.EF_COM).read();
                } catch (Exception e) {
                    service.doBAC(bacKey);
                }
            }


            LDS lds = new LDS();


            CardFileInputStream dg1In = service.getInputStream(PassportService.EF_DG1);
            lds.add(PassportService.EF_DG1, dg1In, dg1In.getLength());
            DG1File dg1File = lds.getDG1File();

            System.out.println(dg1File.getMRZInfo().toString());


        } catch (CardServiceException e) {
            e.printStackTrace();
        }
    }

pom.xml

<dependency>
            <groupId>org.jmrtd</groupId>
            <artifactId>jmrtd</artifactId>
            <version>0.5.2</version>
        </dependency>
        <dependency>
            <groupId>net.sf.scuba</groupId>
            <artifactId>scuba-sc-j2se</artifactId>
            <version>0.0.13</version>
        </dependency>
        <dependency>
            <groupId>net.sf.scuba</groupId>
            <artifactId>scuba-smartcards</artifactId>
            <version>0.0.13</version>
        </dependency>

Stacktrace : add more text just for stack overflow to accept the question. added full stacktrace content. added full stacktrace content. added full stacktrace content. added full stacktrace content.

D:\Java\jdk\bin\java -Didea.launcher.port=7539 "-Didea.launcher.bin.path=C:\Program Files (x86)\JetBrains\IntelliJ IDEA 14.0\bin" -Dfile.encoding=UTF-8 -classpath "D:\Java\jdk\jre\lib\charsets.jar;D:\Java\jdk\jre\lib\deploy.jar;D:\Java\jdk\jre\lib\javaws.jar;D:\Java\jdk\jre\lib\jce.jar;D:\Java\jdk\jre\lib\jfr.jar;D:\Java\jdk\jre\lib\jfxswt.jar;D:\Java\jdk\jre\lib\jsse.jar;D:\Java\jdk\jre\lib\management-agent.jar;D:\Java\jdk\jre\lib\plugin.jar;D:\Java\jdk\jre\lib\resources.jar;D:\Java\jdk\jre\lib\rt.jar;D:\Java\jdk\jre\lib\ext\access-bridge-32.jar;D:\Java\jdk\jre\lib\ext\cldrdata.jar;D:\Java\jdk\jre\lib\ext\dnsns.jar;D:\Java\jdk\jre\lib\ext\jaccess.jar;D:\Java\jdk\jre\lib\ext\jfxrt.jar;D:\Java\jdk\jre\lib\ext\localedata.jar;D:\Java\jdk\jre\lib\ext\nashorn.jar;D:\Java\jdk\jre\lib\ext\sunec.jar;D:\Java\jdk\jre\lib\ext\sunjce_provider.jar;D:\Java\jdk\jre\lib\ext\sunmscapi.jar;D:\Java\jdk\jre\lib\ext\sunpkcs11.jar;D:\Java\jdk\jre\lib\ext\zipfs.jar;C:\Users\maksat\IdeaProjects\smart_card\target\classes;C:\Users\maksat\.m2\repository\org\jmrtd\jmrtd\0.5.2\jmrtd-0.5.2.jar;C:\Users\maksat\.m2\repository\org\bouncycastle\bcprov-jdk15on\1.52\bcprov-jdk15on-1.52.jar;C:\Users\maksat\.m2\repository\net\sf\scuba\scuba-sc-j2se\0.0.11\scuba-sc-j2se-0.0.11.jar;C:\Users\maksat\.m2\repository\net\sf\scuba\scuba-smartcards\0.0.9\scuba-smartcards-0.0.9.jar;C:\Program Files (x86)\JetBrains\IntelliJ IDEA 14.0\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain paket.ReadFromSmartCard
net.sf.scuba.smartcards.CardServiceException: File not found, CAPDU = 00A4020C02011C, RAPDU = 6A82 (SW = 0x6A82: FILE NOT FOUND)
    at org.jmrtd.PassportApduService.checkStatusWordAfterFileOperation(Unknown Source)
    at org.jmrtd.PassportApduService.sendSelectFile(Unknown Source)
    at org.jmrtd.PassportService.sendSelectFile(Unknown Source)
    at org.jmrtd.MRTDFileSystem.getFileInfo(Unknown Source)
    at org.jmrtd.MRTDFileSystem.getSelectedPath(Unknown Source)
    at net.sf.scuba.smartcards.CardFileInputStream.<init>(CardFileInputStream.java:56)
    at org.jmrtd.PassportService.getInputStream(Unknown Source)
    at paket.ReadFromSmartCard.sdvsdv(ReadFromSmartCard.java:121)
    at paket.ReadFromSmartCard.readData(ReadFromSmartCard.java:89)
    at paket.ReadFromSmartCard.main(ReadFromSmartCard.java:23)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
ноя 19, 2019 10:45:51 AM org.jmrtd.PassportService doBAC
WARNING: BAC failed for BAC key "21009199301195, 100993, 120229"
net.sf.scuba.smartcards.CardServiceException: Mutual authentication failed: expected length: 40 + 2, actual length: 2 (SW = 0x6985: CONDITIONS NOT SATISFIED)
    at org.jmrtd.PassportApduService.sendMutualAuth(Unknown Source)
    at org.jmrtd.PassportService.doBAC(Unknown Source)
    at org.jmrtd.PassportService.doBAC(Unknown Source)
    at paket.ReadFromSmartCard.sdvsdv(ReadFromSmartCard.java:140)
    at paket.ReadFromSmartCard.readData(ReadFromSmartCard.java:89)
    at paket.ReadFromSmartCard.main(ReadFromSmartCard.java:23)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)

Process finished with exit code 0

Upvotes: 2

Views: 2924

Answers (0)

Related Questions